Ai
1 Star 0 Fork 0

2629878269/drag-snippet

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
vite.config.ts 3.81 KB
一键复制 编辑 原始数据 按行查看 历史
2629878269 提交于 2025-03-24 00:26 +08:00 . commit
import { defineConfig } from 'vite'
import fs, { writeFile } from 'fs/promises'
import vue from '@vitejs/plugin-vue'
import { BaseElementNode, ComponentNode, ElementTypes, NodeTypes, parse, transform } from '@vue/compiler-dom'
import MagicString from 'magic-string'
import { uid } from 'uid'
import { CodeHandlers } from './src/CodeHandlers'
const EXCLUDE_TAG = ["template", "script", "style"]
const NID = Symbol('nid')
const LCD = Symbol('lcd')
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
(() => {
const ids = {}
return {
name: 'drag-snippet',
apply: 'serve',
enforce: 'pre',
configureServer(http) {
http.ws.on('drag-snippet/move', async (data) => {
CodeHandlers.find(e => e.match.test(data.rel.file))?.move(data)
})
http.ws.on('drag-snippet/remove', async (data) => {
CodeHandlers.find(e => e.match.test(data.node.file))?.remove(data)
})
http.ws.on('drag-snippet/add', async (data) => {
CodeHandlers.find(e => e.match.test(data.rel.file))?.add(data)
})
http.ws.on('drag-snippet/edit', async (data) => {
CodeHandlers.find(e => e.match.test(data.node.file))?.edit(data)
})
},
transform(code, id, options) {
if (id.endsWith('.vue')) {
const s = new MagicString(code)
const w = new MagicString(code)
function getNid(e) {
let nid = e[NID] ??= e.props?.find(e => e.type == NodeTypes.ATTRIBUTE && e.name == 'lcd-id')?.value?.content
if (e.type == NodeTypes.ELEMENT && !nid) w.prependLeft(e.loc.start.offset + e.tag.length + 1, ` lcd-id="${nid = uid()}"`)
e[NID] = nid
return nid
}
const scopeId = ids[id] ??= uid()
transform(parse(code), {
nodeTransforms: [
node => {
if (node.type == NodeTypes.ROOT) {
const children = node.children.find(e => e.type == NodeTypes.ELEMENT && e.tag == 'template')?.children
children?.map(e => (e[LCD] ??= {}).root = true)
}
if (node.type != NodeTypes.ELEMENT) return
const el = node as BaseElementNode
if (EXCLUDE_TAG.includes(el.tag)) return
if (el.tagType == ElementTypes.ELEMENT || el.tagType == ElementTypes.COMPONENT) {
const nid = getNid(node)
if (node[LCD]?.root) {
s.prependLeft(el.loc.start.offset + el.tag.length + 1, ` .__v_root="true"`)
}
else {
const attrs = el[LCD] ??= {}
Object.assign(attrs, {
id: nid,
scopeId,
loc: { ...node.loc, source: void 0 },
children: el.children.map(e => getNid(e)).filter(e => e),
editable: el.children.length == 1 && el.children[0].type == NodeTypes.TEXT,
})
el.children.map(e => (e[LCD] ??= {}).parent = nid)
return () => {
s.prependLeft(el.loc.start.offset + el.tag.length + 1, ` key="${nid}" file-id="${scopeId}" .lcd='${JSON.stringify(attrs)}'`)
}
}
}
}
]
})
if (w.toString() != code) {
writeFile(id, w.toString())
}
return s.toString()
}
},
transformIndexHtml(html) {
return [
{ tag: 'script', attrs: { type: 'module', src: './src/inject.ts' }, injectTo: 'head' },
]
},
}
})()
],
})
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/httpsgiteecomepalserver/drag-snippet.git
git@gitee.com:httpsgiteecomepalserver/drag-snippet.git
httpsgiteecomepalserver
drag-snippet
drag-snippet
main

搜索帮助