mechanica 1.0.24 → 1.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/plugin.js CHANGED
@@ -198,7 +198,7 @@ const getUniqueName = async (folder, fileName) => {
198
198
  let counter = 1;
199
199
  let newName = fileName;
200
200
  while (files.includes(newName)) {
201
- newName = `${name}(${counter})${ext}`;
201
+ newName = `${name}_${counter}${ext}`;
202
202
  counter++;
203
203
  }
204
204
  return newName;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../src/vitePlugin/collectBlocks.ts","../src/vitePlugin/parseDefineBlock.ts","../src/vitePlugin/editEntryCodeSsr.ts","../src/vitePlugin/vitePluginUtils.ts","../src/vitePlugin/query.ts","../src/vitePlugin/mechanicaServer.ts","../../common/utils/traverse.ts","../src/vitePlugin/vitePlugin.ts"],"sourcesContent":["import fs from 'fs'\r\nimport { join } from 'path'\r\n\r\ntype PluginContext = {\r\n resolve: (str: string) => Promise<{ id: string } | null>\r\n}\r\n\r\nexport const collectBlocks = async (ctx: PluginContext, dir: string, isDev: boolean) => {\r\n\r\n const lines: string[] = []\r\n const blockNames: string[] = []\r\n\r\n if (fs.existsSync(dir)) {\r\n const blocks = fs.readdirSync(dir, { recursive: true })\r\n\r\n let index = 0\r\n for (let blockPath of blocks) {\r\n if (typeof blockPath !== \"string\") continue\r\n if (!blockPath.endsWith(\".vue\")) continue\r\n\r\n const content = fs.readFileSync(join(dir, blockPath), \"utf-8\")\r\n if (!content.includes(\"defineBlock\")) continue\r\n\r\n const file = await ctx.resolve(`/src/blocks/${blockPath}?block`)\r\n if (!file) continue\r\n lines.push(`import block${index} from \"${file.id}\"`)\r\n blockNames.push(`block${index}`)\r\n \r\n index++\r\n }\r\n }\r\n\r\n // const curvesBuilder = await ctx.resolve('@curves_digital/builder/dev')\r\n // if (curvesBuilder) {\r\n // lines.push(`import { DevBlobBlock } from \"${curvesBuilder.id}\"`)\r\n // blockNames.push(\"DevBlobBlock\")\r\n // }\r\n\r\n lines.push(`export const blocksList = [${blockNames.join(\", \")}]`)\r\n lines.push(`export const blocksMap = new Map(blocksList.map(file => [ file.blockId, file ]))`)\r\n if (isDev) {\r\n lines.push(`\r\nlet onUpdate = () => {}\r\nexport const addUpdateListener = (callback) => {\r\n onUpdate = callback\r\n}\r\nimport.meta.hot?.accept(module => {\r\n onUpdate(module)\r\n module.addUpdateListener(onUpdate)\r\n})\r\n`)\r\n }\r\n\r\n return lines.join(\"\\n\")\r\n}","import { parse } from '@babel/parser'\r\nimport _generate from '@babel/generator'\r\nimport { Node, walk } from 'estree-walker'\r\n\r\nconst generate = (_generate as any)?.default ?? _generate\r\n\r\nconst getValue = (node: any, key: string) => {\r\n return node.properties.find((item: any) => item.key?.name === key)?.value ?? null\r\n}\r\n\r\nconst objectToNode = (obj: Record<string, any>, deep = true): { type: \"ObjectExpression\", properties: any[] } => {\r\n return {\r\n type: \"ObjectExpression\",\r\n properties: Object.entries(obj).map(([key, value]) => ({\r\n type: \"ObjectProperty\",\r\n key: { type: \"Identifier\", name: key },\r\n value: deep? valueToNode(value): value\r\n }))\r\n }\r\n}\r\n\r\nconst valueToNode = (value: any): any => {\r\n if (value === null) return { type: \"NullLiteral\" }\r\n if (typeof value === \"boolean\") return { type: \"BooleanLiteral\", value }\r\n if (typeof value === \"string\") return { type: \"StringLiteral\", value }\r\n if (Array.isArray(value)) return { type: \"ArrayExpression\", elements: value.map(item => valueToNode(item)) }\r\n if (typeof value === \"object\") return objectToNode(value)\r\n}\r\n\r\nexport const parseDefineBlock = (code: string, defaultId: string) => {\r\n\r\n const ast = parse(code, { sourceType: \"module\" })\r\n\r\n let defineBlockNode!: Node \r\n let defineComponentNode!: Node\r\n let toDelete!: Node\r\n const slotNames: string[] = []\r\n walk(ast.program as any, {\r\n enter(node) {\r\n if (node.type === 'CallExpression' && node.callee.type === 'Identifier') {\r\n if (node.callee.name === '_defineComponent') {\r\n defineComponentNode = node.arguments[0]\r\n }\r\n if (node.callee.name === 'defineBlock') {\r\n defineBlockNode = node\r\n }\r\n if (node.callee.name === '_renderSlot' || node.callee.name === '_ssrRenderSlot') {\r\n for (let arg of node.arguments as any) {\r\n if (arg.type === 'StringLiteral' && !slotNames.includes(arg.value)) {\r\n slotNames.push(arg.value)\r\n }\r\n }\r\n }\r\n }\r\n },\r\n leave(node) {\r\n if (node.type === 'VariableDeclarator' && defineBlockNode && node.init === defineBlockNode) {\r\n node.init = { type: \"Identifier\", name: \"__props\" }\r\n }\r\n if (node.type === 'ExpressionStatement' && defineBlockNode && node.expression === defineBlockNode) {\r\n toDelete = node\r\n }\r\n if (toDelete && (node.type ==='BlockStatement' || node.type === 'Program')) {\r\n const index = node.body.indexOf(toDelete as any)\r\n if (index >= 0) {\r\n node.body.splice(index, 1)\r\n }\r\n }\r\n }\r\n })\r\n\r\n if (defineBlockNode?.type !== 'CallExpression' || defineComponentNode?.type !== 'ObjectExpression') {\r\n return { ast, blockId: null }\r\n }\r\n const blockSchema = defineBlockNode.arguments[0]\r\n if (blockSchema.type !== 'ObjectExpression') {\r\n return { ast, blockId: null }\r\n }\r\n\r\n const blockId = getValue(blockSchema, \"id\")?.value as string ?? defaultId\r\n if (!blockId) {\r\n return { ast, blockId: null }\r\n }\r\n\r\n return {\r\n blockId,\r\n blockSchema,\r\n slotNames,\r\n ast,\r\n defineComponentNode\r\n }\r\n}\r\n\r\nexport const generateDefineBlock = (code: string, attachBlockSchema = true, defaultId: string) => {\r\n\r\n const { blockId, blockSchema, slotNames, ast, defineComponentNode } = parseDefineBlock(code, defaultId)\r\n if (blockId === null) {\r\n return generate(ast.program)\r\n }\r\n \r\n defineComponentNode.properties.push(...objectToNode({ blockId }).properties)\r\n\r\n if (attachBlockSchema) {\r\n const _slots = getValue(blockSchema, 'slots')\r\n if (!_slots && slotNames.length > 0) {\r\n blockSchema.properties.push(...objectToNode({\r\n slots: Object.fromEntries(slotNames.map(key => [ key, true ]))\r\n }).properties)\r\n }\r\n\r\n defineComponentNode.properties.push(\r\n ...objectToNode({ blockSchema }, false).properties,\r\n )\r\n }\r\n\r\n const props = getValue(blockSchema, 'props')\r\n const keys: string[] = props?.properties.map((item: any) => item.key?.name).filter((item: any) => !!item) ?? []\r\n\r\n if (keys.length > 0) {\r\n const existingProps = getValue(defineComponentNode, 'props')\r\n if (existingProps) { \r\n const obj = objectToNode(Object.fromEntries(keys.map(key => [ key, { type: null } ])))\r\n existingProps.properties.push(...obj.properties)\r\n } else {\r\n defineComponentNode.properties.push({\r\n type: \"ObjectProperty\",\r\n key: { type: \"Identifier\", name: \"props\" },\r\n value: valueToNode(keys)\r\n } as any)\r\n }\r\n }\r\n\r\n return generate(ast.program)\r\n}","import { join } from 'path'\r\nimport fs from 'fs'\r\n\r\ntype PluginOptions = {\r\n variables?: string\r\n}\r\n\r\nexport const editEntryCodeSsr = (sourceCode: string, options: PluginOptions) => {\r\n const variablesPath = join(process.cwd(), options.variables ?? \"src/variables.sass\")\r\n let code = sourceCode\r\n code = `import { renderToString } from \"vue/server-renderer\";\\n${code}`\r\n // code = `import { ssrContextKey } from \"vue\";\\n${code}`\r\n code = `export { blocksList } from \"virtual:builder-blocks\";\\n${code}`\r\n if (fs.existsSync(variablesPath)) {\r\n code = `export { default as variables } from \"/src/variables.sass?css-variables\";\\n${code}`\r\n } else {\r\n code = `export const variables = {}\\n${code}`\r\n }\r\n\r\n code = code.replace(/createApp/g, \"createSSRApp\")\r\n code = code.replace(/\\n\\s*createSSRApp(.+)/, \"\\nexport const app = createSSRApp$1\")\r\n code = code.replace(/\\.mount\\(.+?\\)/, \"\")\r\n\r\n// code = code + `\r\n// export const render = (state) => {\r\n// delete app._context.provides[ssrContextKey]\r\n// app._props.state = state\r\n// if (app.updateProps) app.updateProps()\r\n// return renderToString(app)\r\n// } \r\n// `\r\n\r\n code = code + `\r\nexport const render = () => {\r\n return renderToString(app)\r\n} \r\n\r\nexport const updateState = (state) => {\r\n app.updateProps(state)\r\n}\r\n\r\nexport const dataEntries = globalThis._dataEntries\r\n `\r\n\r\n // code = code.replace(\"window.state\", \"state\")\r\n\r\n return code\r\n}\r\n","import { join, parse } from \"path\"\r\nimport fs from 'fs'\r\n\r\nexport const getUniqueName = async (folder: string, fileName: string) => {\r\n\r\n const files = await fs.promises.readdir(folder)\r\n const { name, ext } = parse(fileName)\r\n\r\n let counter = 1\r\n let newName = fileName\r\n \r\n while (files.includes(newName)) {\r\n newName = `${name}(${counter})${ext}`\r\n counter++\r\n }\r\n\r\n return newName\r\n}","import fs from 'node:fs'\r\nimport { resolve, parse, join } from 'node:path'\r\n\r\nconst queryCache = new Map()\r\nexport const getQuery = async (key: string) => {\r\n if (queryCache.has(key)) {\r\n return queryCache.get(key)\r\n }\r\n const type = key.slice(0, key.indexOf(\".\"))\r\n const value = JSON.parse(key.slice(key.indexOf(\".\")+1))\r\n if (type === \"getPages\") {\r\n let pages = await getAvailablePages(value)\r\n if (value.folderName) {\r\n pages = pages.filter(item => item.folderPath === value.folderName)\r\n }\r\n for (let page of pages) {\r\n delete page.order\r\n delete (page as any).folderPath\r\n delete page.orderAfter\r\n }\r\n queryCache.set(key, pages)\r\n return pages\r\n }\r\n return {}\r\n}\r\n\r\nexport const resetPagesCache = async () => {\r\n queryCache.clear()\r\n}\r\n\r\nexport const getAvailablePages = async (options: any) => {\r\n if (!fs.existsSync(resolve(`.mech/pages`))) {\r\n return []\r\n }\r\n\r\n const pages = await fs.promises.readdir(resolve(`.mech/pages`), { recursive: true }) as string[]\r\n \r\n const arr = []\r\n for (let _path of pages) {\r\n const { name, dir } = parse(_path)\r\n if (!_path.endsWith(\".json\")) {\r\n continue\r\n }\r\n const pageData = JSON.parse(await fs.promises.readFile(join(`.mech/pages`, _path), \"utf-8\"))\r\n const path = `/${dir}/${name === 'index'? \"\": name}`.replace(\"//\", \"/\").replace(/\\/$/, \"\") || \"/\"\r\n\r\n const data: Record<string, any> = {}\r\n for (let item of (options.data ?? [])) {\r\n data[item.id] = pageData.data[item.id] ?? {} // TODO: passDefaultValue here\r\n }\r\n\r\n arr.push({ \r\n path, \r\n name: pageData.name ?? name, \r\n folderPath: dir === \"\"? null: dir, \r\n order: pageData.order ?? 0, \r\n orderAfter: pageData.orderAfter ?? null,\r\n ...data \r\n })\r\n }\r\n arr.sort((a, b) => {\r\n if (a.folderPath === b.folderPath) {\r\n if (a.orderAfter === b.path) return 1\r\n if (b.orderAfter === a.path) return -1\r\n if (a.order === b.order) {\r\n return (a.orderAfter ?? a.path).localeCompare((b.orderAfter ?? b.path))\r\n } else {\r\n return a.order - b.order\r\n }\r\n }\r\n if (!a.folderPath) return -1\r\n if (!b.folderPath) return 1\r\n return a.folderPath.localeCompare(b.folderPath)\r\n })\r\n \r\n return arr\r\n}\r\n","import { Connect } from \"vite\"\r\nimport { join, resolve } from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { getUniqueName } from './vitePluginUtils'\r\nimport { getAvailablePages, getQuery, resetPagesCache } from \"./query\"\r\n\r\nexport const getPagePath = (path: string) => {\r\n const normalizedPath = path.trim().replace(/\\/+$/, \"\").replace(/^\\/+/, \"\")\r\n let filePath\r\n if (fs.statSync(join(`.mech/pages`, normalizedPath), { throwIfNoEntry: false })?.isDirectory()) {\r\n filePath = normalizedPath + \"/index.json\"\r\n } else {\r\n filePath = normalizedPath + \".json\"\r\n }\r\n if (!filePath.startsWith(\"/\")) filePath = \"/\"+filePath\r\n\r\n return `.mech/pages` + filePath\r\n}\r\n\r\nexport const mechaniaServer: Connect.NextHandleFunction = async (req, res, next) => {\r\n if (req.url?.startsWith(\"/assets/\")) {\r\n const path = resolve(`.mech/${decodeURIComponent(req.url)}`)\r\n if (!fs.existsSync(path)) {\r\n res.statusCode = 404\r\n return res.end(`File ${req.url} not found`)\r\n }\r\n return fs.createReadStream(path).pipe(res)\r\n }\r\n const chunks = []\r\n for await (let chunk of req) {\r\n chunks.push(chunk)\r\n }\r\n const body = Buffer.concat(chunks)\r\n\r\n if (req.url === \"/upload\") {\r\n fs.mkdirSync(resolve(`.mech/assets`), { recursive: true })\r\n const sourceName = (req.headers[\"x-file-name\"] as string) ?? 'file'\r\n const fileName = await getUniqueName(resolve(`.mech/assets`), sourceName)\r\n await fs.promises.writeFile(resolve(`.mech/assets/${fileName}`), body)\r\n\r\n return res\r\n .setHeader(\"content-type\", \"application/json\")\r\n .end(JSON.stringify({ src: `/@mechanica/assets/${fileName}`, name: sourceName }))\r\n }\r\n\r\n if (req.url === \"/images\") {\r\n if (!fs.existsSync(resolve(\".mech/assets\"))) {\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify([]))\r\n return\r\n }\r\n const files = await fs.promises.readdir(resolve(\".mech/assets\"))\r\n\r\n const images = []\r\n for (let fileName of files) {\r\n images.push({ id: fileName.slice(0, fileName.lastIndexOf(\".\")), name: fileName, src: `/@mechanica/assets/${fileName}` })\r\n }\r\n\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(images))\r\n }\r\n\r\n if (req.url === \"/pages\") {\r\n // Create new page\r\n if (req.method === \"POST\") {\r\n const { path, name, folderId } = JSON.parse(body.toString(\"utf-8\"))\r\n if (!path || !name) {\r\n res.statusCode = 400\r\n res.setHeader(\"content-type\", \"application/json\").end(\"Wrong body request\")\r\n return\r\n }\r\n const folderPath = typeof folderId === \"string\"? `/${folderId}`: \"\"\r\n const filePath = getPagePath(folderPath+path.trim())\r\n\r\n if(fs.existsSync(filePath)) {\r\n res.statusCode = 400\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify({ error: { path: \"Page already exists\" } }))\r\n return\r\n }\r\n \r\n const parent = filePath.replace(/\\/.+/, \"\")\r\n await fs.promises.mkdir(parent, { recursive: true })\r\n\r\n const pageData = { content: [], data: {}, name, path }\r\n await fs.promises.writeFile(filePath, JSON.stringify(pageData, null, 2))\r\n resetPagesCache()\r\n\r\n Object.assign(pageData, { path: folderPath + path.trim() })\r\n\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(pageData))\r\n return\r\n } else if (req.method === \"GET\") {\r\n // Return list of pages\r\n const availablePages = await getAvailablePages({})\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(availablePages))\r\n } else {\r\n res.statusCode = 404\r\n return res.end(\"Method not found\")\r\n }\r\n }\r\n\r\n if (req.url?.startsWith(\"/pages\") && req.url.includes(\"?\")) {\r\n const path = new URLSearchParams(req.url.slice(req.url.indexOf(\"?\"))).get(\"path\")\r\n if (!path) {\r\n res.statusCode = 400\r\n return res.setHeader(\"content-type\", \"application/json\").end(\"Wrong request\")\r\n }\r\n\r\n const { title, description, name, path: newPath } = JSON.parse(body.toString(\"utf-8\"))\r\n const filePath = getPagePath(path)\r\n \r\n const pageData = fs.existsSync(filePath) ? \r\n JSON.parse(fs.readFileSync(filePath, \"utf-8\")) :\r\n { content: [], data: {} }\r\n \r\n pageData.name = name\r\n pageData.meta = { title, description }\r\n await fs.promises.writeFile(filePath, JSON.stringify(pageData, null, 2))\r\n\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify({ success: true }))\r\n }\r\n\r\n if (req.url === \"/folders\") {\r\n const files = await fs.promises.readdir(`.mech/pages`, { withFileTypes: true })\r\n const arr = []\r\n for (let file of files) {\r\n if (file.isDirectory()) {\r\n arr.push({ id: file.name, path: \"/\"+file.name, name: file.name })\r\n }\r\n }\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(arr))\r\n return\r\n }\r\n\r\n if (req.url?.startsWith(\"/save\") && req.url.includes(\"?\")) {\r\n const path = new URLSearchParams(req.url.slice(req.url.indexOf(\"?\"))).get(\"path\")\r\n if (!path) {\r\n res.statusCode = 400\r\n return res.end(\"Wrong request\")\r\n }\r\n\r\n const filePath = getPagePath(path)\r\n const obj = JSON.parse(body.toString(\"utf-8\"))\r\n const pageData = fs.existsSync(filePath) ? \r\n JSON.parse(fs.readFileSync(filePath, \"utf-8\")) :\r\n { content: [], data: {} }\r\n Object.assign(pageData, { content: obj.content, data: obj.data })\r\n\r\n if (obj.data) {\r\n resetPagesCache()\r\n }\r\n\r\n await fs.promises.writeFile(filePath, JSON.stringify(pageData, null, 2))\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify({ success: true }))\r\n }\r\n\r\n if (req.url?.startsWith(\"/query\") && req.url.includes(\"?\")) {\r\n const key = new URLSearchParams(req.url.slice(req.url.indexOf(\"?\"))).get(\"q\")!\r\n const resp = await getQuery(key)\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(resp))\r\n }\r\n\r\n res.statusCode = 400\r\n return res.end(`Route ${req.originalUrl} not found`)\r\n \r\n}","export const traverse = <T extends { children?: T[] }>(\r\n obj: T, \r\n callback: (obj: T, indent: number, parent: T | null) => void, \r\n indent = 0, \r\n parent: T | null = null\r\n) => {\r\n\r\n callback(obj, indent, parent)\r\n if (obj.children) {\r\n for (let child of obj.children) {\r\n traverse(child, callback, indent+1, obj)\r\n }\r\n }\r\n}\r\n\r\nexport const traverseObject = (obj: any, callback: (obj: any, key?: string | number, parent?: any) => void, key?: string | number, parent?: any) => {\r\n if (obj === null || obj === undefined) return;\r\n\r\n callback(obj, key, parent)\r\n if (Array.isArray(obj)) {\r\n let index = 0\r\n for (let item of obj) {\r\n traverseObject(item, callback, index, obj)\r\n index++\r\n }\r\n return\r\n }\r\n if (typeof obj === \"object\") {\r\n for (let [ key, value ] of Object.entries(obj)) {\r\n traverseObject(value, callback, key, obj)\r\n }\r\n return\r\n }\r\n}\r\n\r\nexport const getValueByPath = (data: any, key: string) => {\r\n let resp = data\r\n for (let prop of key.split('.')) {\r\n resp = resp[prop]\r\n if (!resp) return resp\r\n }\r\n return resp\r\n}\r\n\r\nexport const passDataToHTML = (html: string, data: any) => {\r\n let resp = \"\"\r\n let lastIndex = 0\r\n for (let place of html.matchAll(/{{.+}}/g)){ \r\n resp += html.slice(lastIndex, place.index) + (getValueByPath(data, place[0].slice(2, -2)) ?? \"\")\r\n lastIndex = place.index + place[0].length\r\n }\r\n\r\n resp += html.slice(lastIndex)\r\n\r\n return resp\r\n}","import { normalizePath, Plugin, ViteDevServer } from 'vite'\r\nimport { collectBlocks } from './collectBlocks'\r\nimport { generateDefineBlock } from './parseDefineBlock'\r\nimport { join, parse, resolve } from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { editEntryCodeSsr } from './editEntryCodeSsr'\r\nimport type { DataEntryScope } from '../../../common/types'\r\nimport { getPagePath, mechaniaServer } from './mechanicaServer'\r\nimport { passDataToHTML } from '../../../common/utils/traverse'\r\n\r\ntype PluginOptions = {\r\n entrySsr?: string,\r\n variables?: string,\r\n pages?: string\r\n}\r\n\r\nconst blockListModuleId = 'virtual:builder-blocks'\r\nconst resolvedBlockListModuleId = '\\0'+blockListModuleId\r\n\r\nconst mechanicaPlugin = (options: PluginOptions = {}): Plugin => {\r\n\r\n let isDev = true\r\n let isSsr = false\r\n let isBuild = false\r\n let server: ViteDevServer\r\n \r\n const blocksDir = normalizePath(join(process.cwd(), \"src/blocks\"))\r\n\r\n const triggerHotUpdate = (server: ViteDevServer) => {\r\n const module = server.moduleGraph.getModuleById(resolvedBlockListModuleId)\r\n if (module) {\r\n // TODO: обновлять модуль, только если изменилась схема\r\n\r\n // server.moduleGraph.invalidateModule(module)\r\n // server.ws.send({\r\n // type: \"update\",\r\n // updates: Array.from(module.importers.values()).map(mod => ({\r\n // type: \"js-update\",\r\n // timestamp: Date.now(),\r\n // path: mod.url,\r\n // acceptedPath: mod.url\r\n // }))\r\n // })\r\n\r\n return module\r\n }\r\n }\r\n\r\n let mechanicaConfig = {}\r\n if (fs.existsSync(`.mech/config.json`)) {\r\n const data = fs.readFileSync(`.mech/config.json`, \"utf-8\")\r\n Object.assign(mechanicaConfig, JSON.parse(data))\r\n }\r\n\r\n return {\r\n name: \"mechanica\",\r\n enforce: \"post\",\r\n [\"userOptions\" as any]: options,\r\n config(_config, env) {\r\n isDev = env.mode === 'development'\r\n isSsr = !!env.isSsrBuild\r\n isBuild = env.command === \"build\"\r\n\r\n return {\r\n optimizeDeps: {\r\n exclude: [ \"virtual:builder-blocks\", \"virtual:page\", \"mechanica/editor\", \"mechanica\" ]\r\n }\r\n }\r\n },\r\n buildStart() {\r\n this.addWatchFile(blocksDir)\r\n },\r\n transform(code, id) {\r\n const [path, query] = id.split('?');\r\n if (query === \"block\") {\r\n if (code.includes(\"type=script\")) {\r\n return {\r\n code: code.replace(\"type=script\", \"type=script&block=true&\"),\r\n map: null\r\n }\r\n }\r\n }\r\n if (code.includes(\"defineBlock\") && query.includes(\"block\")) {\r\n const name = parse(path).name\r\n return generateDefineBlock(code, isDev || isSsr, name)\r\n }\r\n if (query === 'ssr') {\r\n return { code: editEntryCodeSsr(code, options), map: null }\r\n }\r\n },\r\n resolveId(id) {\r\n if (id === blockListModuleId) return resolvedBlockListModuleId\r\n },\r\n async load(id) {\r\n if (id === resolvedBlockListModuleId) {\r\n return await collectBlocks(this, blocksDir, isDev)\r\n }\r\n },\r\n configureServer(_server) {\r\n server = _server\r\n\r\n // server.ws.on(\"mechanica:saveState\", (msg) => {\r\n // const obj = JSON.parse(msg)\r\n\r\n // createMechFolder()\r\n // const pageData = { content: obj.content }\r\n // fs.writeFileSync(resolve(`.mech/pages/${obj.dev.currentPage}.json`), JSON.stringify(pageData, null, 2))\r\n // })\r\n\r\n server.middlewares.use(\"/@mechanica\", mechaniaServer)\r\n\r\n },\r\n watchChange(id, change) {\r\n if (server && id.startsWith(blocksDir)) {\r\n if (server) {\r\n const module = server.moduleGraph.getModuleById(resolvedBlockListModuleId)\r\n if (module && (change.event === 'create' || change.event === 'delete')) {\r\n server.reloadModule(module)\r\n }\r\n }\r\n }\r\n },\r\n handleHotUpdate(ctx) {\r\n const { file, modules, server } = ctx\r\n if (file.startsWith(blocksDir)) {\r\n const module = server.moduleGraph.getModuleById(resolvedBlockListModuleId)\r\n if (module) {\r\n return [ ...modules, module ]\r\n }\r\n }\r\n },\r\n transformIndexHtml: {\r\n order: \"pre\",\r\n async handler(html, ctx) {\r\n if (!isDev && process.env.HTML_GENERATE !== \"true\") {\r\n return html\r\n }\r\n\r\n const isFile = /\\.\\w+$/.test(ctx.originalUrl!)\r\n \r\n if (isFile) {\r\n return html\r\n }\r\n \r\n let str = html\r\n if (isDev) {\r\n // if (!fs.existsSync(resolve(`.mech/pages/${currentPage}.json`))) {\r\n // return `<h1>Page ${currentPage} not found</h1>`\r\n // }\r\n \r\n let content: any[] = []\r\n let data = {}\r\n let dataEntryScopes: Record<string, DataEntryScope> = {}\r\n \r\n const filePath = getPagePath(ctx.originalUrl!)\r\n const pageData = fs.existsSync(filePath) ? \r\n JSON.parse(fs.readFileSync(filePath, \"utf-8\")) :\r\n { content: [], data: {} }\r\n\r\n content = pageData.content ?? []\r\n data = pageData.data ?? {}\r\n for (let key of Object.keys(data)) {\r\n dataEntryScopes[key] = \"page\"\r\n }\r\n\r\n str = passDataToHTML(str, data)\r\n\r\n // if (!pageData.id) {\r\n // pageData.id = -Math.trunc(Math.random() * 100000)\r\n // await fs.promises.writeFile(resolve(`.mech/pages/${currentPage}.json`), JSON.stringify(pageData, null, 2))\r\n // }\r\n\r\n const state = {\r\n content,\r\n data,\r\n dataEntryScopes,\r\n currentPage: {\r\n name: pageData.name ?? \"Новая страница\",\r\n path: ctx.originalUrl,\r\n meta: pageData.meta ?? {},\r\n id: pageData.id\r\n }\r\n }\r\n\r\n const stateStr = `\r\n <script>\r\n window.state=${JSON.stringify(state)}\r\n window.__mechanicaConfig__=${JSON.stringify(mechanicaConfig)}\r\n </script>\r\n <script type=\"module\">\r\n import 'mechanica/updater'\r\n // import 'mechanica/editor-dev'\r\n import 'mechanica/editor'\r\n import 'mechanica/editor.css'\r\n </script>\r\n `\r\n\r\n str = str.replace(\"<body>\", \"<body>\\n\" + stateStr)\r\n }\r\n return str\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default mechanicaPlugin"],"names":["_a","parse","fs","join","server"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["../src/vitePlugin/collectBlocks.ts","../src/vitePlugin/parseDefineBlock.ts","../src/vitePlugin/editEntryCodeSsr.ts","../src/vitePlugin/vitePluginUtils.ts","../src/vitePlugin/query.ts","../src/vitePlugin/mechanicaServer.ts","../../common/utils/traverse.ts","../src/vitePlugin/vitePlugin.ts"],"sourcesContent":["import fs from 'fs'\r\nimport { join } from 'path'\r\n\r\ntype PluginContext = {\r\n resolve: (str: string) => Promise<{ id: string } | null>\r\n}\r\n\r\nexport const collectBlocks = async (ctx: PluginContext, dir: string, isDev: boolean) => {\r\n\r\n const lines: string[] = []\r\n const blockNames: string[] = []\r\n\r\n if (fs.existsSync(dir)) {\r\n const blocks = fs.readdirSync(dir, { recursive: true })\r\n\r\n let index = 0\r\n for (let blockPath of blocks) {\r\n if (typeof blockPath !== \"string\") continue\r\n if (!blockPath.endsWith(\".vue\")) continue\r\n\r\n const content = fs.readFileSync(join(dir, blockPath), \"utf-8\")\r\n if (!content.includes(\"defineBlock\")) continue\r\n\r\n const file = await ctx.resolve(`/src/blocks/${blockPath}?block`)\r\n if (!file) continue\r\n lines.push(`import block${index} from \"${file.id}\"`)\r\n blockNames.push(`block${index}`)\r\n \r\n index++\r\n }\r\n }\r\n\r\n // const curvesBuilder = await ctx.resolve('@curves_digital/builder/dev')\r\n // if (curvesBuilder) {\r\n // lines.push(`import { DevBlobBlock } from \"${curvesBuilder.id}\"`)\r\n // blockNames.push(\"DevBlobBlock\")\r\n // }\r\n\r\n lines.push(`export const blocksList = [${blockNames.join(\", \")}]`)\r\n lines.push(`export const blocksMap = new Map(blocksList.map(file => [ file.blockId, file ]))`)\r\n if (isDev) {\r\n lines.push(`\r\nlet onUpdate = () => {}\r\nexport const addUpdateListener = (callback) => {\r\n onUpdate = callback\r\n}\r\nimport.meta.hot?.accept(module => {\r\n onUpdate(module)\r\n module.addUpdateListener(onUpdate)\r\n})\r\n`)\r\n }\r\n\r\n return lines.join(\"\\n\")\r\n}","import { parse } from '@babel/parser'\r\nimport _generate from '@babel/generator'\r\nimport { Node, walk } from 'estree-walker'\r\n\r\nconst generate = (_generate as any)?.default ?? _generate\r\n\r\nconst getValue = (node: any, key: string) => {\r\n return node.properties.find((item: any) => item.key?.name === key)?.value ?? null\r\n}\r\n\r\nconst objectToNode = (obj: Record<string, any>, deep = true): { type: \"ObjectExpression\", properties: any[] } => {\r\n return {\r\n type: \"ObjectExpression\",\r\n properties: Object.entries(obj).map(([key, value]) => ({\r\n type: \"ObjectProperty\",\r\n key: { type: \"Identifier\", name: key },\r\n value: deep? valueToNode(value): value\r\n }))\r\n }\r\n}\r\n\r\nconst valueToNode = (value: any): any => {\r\n if (value === null) return { type: \"NullLiteral\" }\r\n if (typeof value === \"boolean\") return { type: \"BooleanLiteral\", value }\r\n if (typeof value === \"string\") return { type: \"StringLiteral\", value }\r\n if (Array.isArray(value)) return { type: \"ArrayExpression\", elements: value.map(item => valueToNode(item)) }\r\n if (typeof value === \"object\") return objectToNode(value)\r\n}\r\n\r\nexport const parseDefineBlock = (code: string, defaultId: string) => {\r\n\r\n const ast = parse(code, { sourceType: \"module\" })\r\n\r\n let defineBlockNode!: Node \r\n let defineComponentNode!: Node\r\n let toDelete!: Node\r\n const slotNames: string[] = []\r\n walk(ast.program as any, {\r\n enter(node) {\r\n if (node.type === 'CallExpression' && node.callee.type === 'Identifier') {\r\n if (node.callee.name === '_defineComponent') {\r\n defineComponentNode = node.arguments[0]\r\n }\r\n if (node.callee.name === 'defineBlock') {\r\n defineBlockNode = node\r\n }\r\n if (node.callee.name === '_renderSlot' || node.callee.name === '_ssrRenderSlot') {\r\n for (let arg of node.arguments as any) {\r\n if (arg.type === 'StringLiteral' && !slotNames.includes(arg.value)) {\r\n slotNames.push(arg.value)\r\n }\r\n }\r\n }\r\n }\r\n },\r\n leave(node) {\r\n if (node.type === 'VariableDeclarator' && defineBlockNode && node.init === defineBlockNode) {\r\n node.init = { type: \"Identifier\", name: \"__props\" }\r\n }\r\n if (node.type === 'ExpressionStatement' && defineBlockNode && node.expression === defineBlockNode) {\r\n toDelete = node\r\n }\r\n if (toDelete && (node.type ==='BlockStatement' || node.type === 'Program')) {\r\n const index = node.body.indexOf(toDelete as any)\r\n if (index >= 0) {\r\n node.body.splice(index, 1)\r\n }\r\n }\r\n }\r\n })\r\n\r\n if (defineBlockNode?.type !== 'CallExpression' || defineComponentNode?.type !== 'ObjectExpression') {\r\n return { ast, blockId: null }\r\n }\r\n const blockSchema = defineBlockNode.arguments[0]\r\n if (blockSchema.type !== 'ObjectExpression') {\r\n return { ast, blockId: null }\r\n }\r\n\r\n const blockId = getValue(blockSchema, \"id\")?.value as string ?? defaultId\r\n if (!blockId) {\r\n return { ast, blockId: null }\r\n }\r\n\r\n return {\r\n blockId,\r\n blockSchema,\r\n slotNames,\r\n ast,\r\n defineComponentNode\r\n }\r\n}\r\n\r\nexport const generateDefineBlock = (code: string, attachBlockSchema = true, defaultId: string) => {\r\n\r\n const { blockId, blockSchema, slotNames, ast, defineComponentNode } = parseDefineBlock(code, defaultId)\r\n if (blockId === null) {\r\n return generate(ast.program)\r\n }\r\n \r\n defineComponentNode.properties.push(...objectToNode({ blockId }).properties)\r\n\r\n if (attachBlockSchema) {\r\n const _slots = getValue(blockSchema, 'slots')\r\n if (!_slots && slotNames.length > 0) {\r\n blockSchema.properties.push(...objectToNode({\r\n slots: Object.fromEntries(slotNames.map(key => [ key, true ]))\r\n }).properties)\r\n }\r\n\r\n defineComponentNode.properties.push(\r\n ...objectToNode({ blockSchema }, false).properties,\r\n )\r\n }\r\n\r\n const props = getValue(blockSchema, 'props')\r\n const keys: string[] = props?.properties.map((item: any) => item.key?.name).filter((item: any) => !!item) ?? []\r\n\r\n if (keys.length > 0) {\r\n const existingProps = getValue(defineComponentNode, 'props')\r\n if (existingProps) { \r\n const obj = objectToNode(Object.fromEntries(keys.map(key => [ key, { type: null } ])))\r\n existingProps.properties.push(...obj.properties)\r\n } else {\r\n defineComponentNode.properties.push({\r\n type: \"ObjectProperty\",\r\n key: { type: \"Identifier\", name: \"props\" },\r\n value: valueToNode(keys)\r\n } as any)\r\n }\r\n }\r\n\r\n return generate(ast.program)\r\n}","import { join } from 'path'\r\nimport fs from 'fs'\r\n\r\ntype PluginOptions = {\r\n variables?: string\r\n}\r\n\r\nexport const editEntryCodeSsr = (sourceCode: string, options: PluginOptions) => {\r\n const variablesPath = join(process.cwd(), options.variables ?? \"src/variables.sass\")\r\n let code = sourceCode\r\n code = `import { renderToString } from \"vue/server-renderer\";\\n${code}`\r\n // code = `import { ssrContextKey } from \"vue\";\\n${code}`\r\n code = `export { blocksList } from \"virtual:builder-blocks\";\\n${code}`\r\n if (fs.existsSync(variablesPath)) {\r\n code = `export { default as variables } from \"/src/variables.sass?css-variables\";\\n${code}`\r\n } else {\r\n code = `export const variables = {}\\n${code}`\r\n }\r\n\r\n code = code.replace(/createApp/g, \"createSSRApp\")\r\n code = code.replace(/\\n\\s*createSSRApp(.+)/, \"\\nexport const app = createSSRApp$1\")\r\n code = code.replace(/\\.mount\\(.+?\\)/, \"\")\r\n\r\n// code = code + `\r\n// export const render = (state) => {\r\n// delete app._context.provides[ssrContextKey]\r\n// app._props.state = state\r\n// if (app.updateProps) app.updateProps()\r\n// return renderToString(app)\r\n// } \r\n// `\r\n\r\n code = code + `\r\nexport const render = () => {\r\n return renderToString(app)\r\n} \r\n\r\nexport const updateState = (state) => {\r\n app.updateProps(state)\r\n}\r\n\r\nexport const dataEntries = globalThis._dataEntries\r\n `\r\n\r\n // code = code.replace(\"window.state\", \"state\")\r\n\r\n return code\r\n}\r\n","import { join, parse } from \"path\"\r\nimport fs from 'fs'\r\n\r\nexport const getUniqueName = async (folder: string, fileName: string) => {\r\n\r\n const files = await fs.promises.readdir(folder)\r\n const { name, ext } = parse(fileName)\r\n\r\n let counter = 1\r\n let newName = fileName\r\n \r\n while (files.includes(newName)) {\r\n newName = `${name}_${counter}${ext}`\r\n counter++\r\n }\r\n\r\n return newName\r\n}","import fs from 'node:fs'\r\nimport { resolve, parse, join } from 'node:path'\r\n\r\nconst queryCache = new Map()\r\nexport const getQuery = async (key: string) => {\r\n if (queryCache.has(key)) {\r\n return queryCache.get(key)\r\n }\r\n const type = key.slice(0, key.indexOf(\".\"))\r\n const value = JSON.parse(key.slice(key.indexOf(\".\")+1))\r\n if (type === \"getPages\") {\r\n let pages = await getAvailablePages(value)\r\n if (value.folderName) {\r\n pages = pages.filter(item => item.folderPath === value.folderName)\r\n }\r\n for (let page of pages) {\r\n delete page.order\r\n delete (page as any).folderPath\r\n delete page.orderAfter\r\n }\r\n queryCache.set(key, pages)\r\n return pages\r\n }\r\n return {}\r\n}\r\n\r\nexport const resetPagesCache = async () => {\r\n queryCache.clear()\r\n}\r\n\r\nexport const getAvailablePages = async (options: any) => {\r\n if (!fs.existsSync(resolve(`.mech/pages`))) {\r\n return []\r\n }\r\n\r\n const pages = await fs.promises.readdir(resolve(`.mech/pages`), { recursive: true }) as string[]\r\n \r\n const arr = []\r\n for (let _path of pages) {\r\n const { name, dir } = parse(_path)\r\n if (!_path.endsWith(\".json\")) {\r\n continue\r\n }\r\n const pageData = JSON.parse(await fs.promises.readFile(join(`.mech/pages`, _path), \"utf-8\"))\r\n const path = `/${dir}/${name === 'index'? \"\": name}`.replace(\"//\", \"/\").replace(/\\/$/, \"\") || \"/\"\r\n\r\n const data: Record<string, any> = {}\r\n for (let item of (options.data ?? [])) {\r\n data[item.id] = pageData.data[item.id] ?? {} // TODO: passDefaultValue here\r\n }\r\n\r\n arr.push({ \r\n path, \r\n name: pageData.name ?? name, \r\n folderPath: dir === \"\"? null: dir, \r\n order: pageData.order ?? 0, \r\n orderAfter: pageData.orderAfter ?? null,\r\n ...data \r\n })\r\n }\r\n arr.sort((a, b) => {\r\n if (a.folderPath === b.folderPath) {\r\n if (a.orderAfter === b.path) return 1\r\n if (b.orderAfter === a.path) return -1\r\n if (a.order === b.order) {\r\n return (a.orderAfter ?? a.path).localeCompare((b.orderAfter ?? b.path))\r\n } else {\r\n return a.order - b.order\r\n }\r\n }\r\n if (!a.folderPath) return -1\r\n if (!b.folderPath) return 1\r\n return a.folderPath.localeCompare(b.folderPath)\r\n })\r\n \r\n return arr\r\n}\r\n","import { Connect } from \"vite\"\r\nimport { join, resolve } from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { getUniqueName } from './vitePluginUtils'\r\nimport { getAvailablePages, getQuery, resetPagesCache } from \"./query\"\r\n\r\nexport const getPagePath = (path: string) => {\r\n const normalizedPath = path.trim().replace(/\\/+$/, \"\").replace(/^\\/+/, \"\")\r\n let filePath\r\n if (fs.statSync(join(`.mech/pages`, normalizedPath), { throwIfNoEntry: false })?.isDirectory()) {\r\n filePath = normalizedPath + \"/index.json\"\r\n } else {\r\n filePath = normalizedPath + \".json\"\r\n }\r\n if (!filePath.startsWith(\"/\")) filePath = \"/\"+filePath\r\n\r\n return `.mech/pages` + filePath\r\n}\r\n\r\nexport const mechaniaServer: Connect.NextHandleFunction = async (req, res, next) => {\r\n if (req.url?.startsWith(\"/assets/\")) {\r\n const path = resolve(`.mech/${decodeURIComponent(req.url)}`)\r\n if (!fs.existsSync(path)) {\r\n res.statusCode = 404\r\n return res.end(`File ${req.url} not found`)\r\n }\r\n return fs.createReadStream(path).pipe(res)\r\n }\r\n const chunks = []\r\n for await (let chunk of req) {\r\n chunks.push(chunk)\r\n }\r\n const body = Buffer.concat(chunks)\r\n\r\n if (req.url === \"/upload\") {\r\n fs.mkdirSync(resolve(`.mech/assets`), { recursive: true })\r\n const sourceName = (req.headers[\"x-file-name\"] as string) ?? 'file'\r\n const fileName = await getUniqueName(resolve(`.mech/assets`), sourceName)\r\n await fs.promises.writeFile(resolve(`.mech/assets/${fileName}`), body)\r\n\r\n return res\r\n .setHeader(\"content-type\", \"application/json\")\r\n .end(JSON.stringify({ src: `/@mechanica/assets/${fileName}`, name: sourceName }))\r\n }\r\n\r\n if (req.url === \"/images\") {\r\n if (!fs.existsSync(resolve(\".mech/assets\"))) {\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify([]))\r\n return\r\n }\r\n const files = await fs.promises.readdir(resolve(\".mech/assets\"))\r\n\r\n const images = []\r\n for (let fileName of files) {\r\n images.push({ id: fileName.slice(0, fileName.lastIndexOf(\".\")), name: fileName, src: `/@mechanica/assets/${fileName}` })\r\n }\r\n\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(images))\r\n }\r\n\r\n if (req.url === \"/pages\") {\r\n // Create new page\r\n if (req.method === \"POST\") {\r\n const { path, name, folderId } = JSON.parse(body.toString(\"utf-8\"))\r\n if (!path || !name) {\r\n res.statusCode = 400\r\n res.setHeader(\"content-type\", \"application/json\").end(\"Wrong body request\")\r\n return\r\n }\r\n const folderPath = typeof folderId === \"string\"? `/${folderId}`: \"\"\r\n const filePath = getPagePath(folderPath+path.trim())\r\n\r\n if(fs.existsSync(filePath)) {\r\n res.statusCode = 400\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify({ error: { path: \"Page already exists\" } }))\r\n return\r\n }\r\n \r\n const parent = filePath.replace(/\\/.+/, \"\")\r\n await fs.promises.mkdir(parent, { recursive: true })\r\n\r\n const pageData = { content: [], data: {}, name, path }\r\n await fs.promises.writeFile(filePath, JSON.stringify(pageData, null, 2))\r\n resetPagesCache()\r\n\r\n Object.assign(pageData, { path: folderPath + path.trim() })\r\n\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(pageData))\r\n return\r\n } else if (req.method === \"GET\") {\r\n // Return list of pages\r\n const availablePages = await getAvailablePages({})\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(availablePages))\r\n } else {\r\n res.statusCode = 404\r\n return res.end(\"Method not found\")\r\n }\r\n }\r\n\r\n if (req.url?.startsWith(\"/pages\") && req.url.includes(\"?\")) {\r\n const path = new URLSearchParams(req.url.slice(req.url.indexOf(\"?\"))).get(\"path\")\r\n if (!path) {\r\n res.statusCode = 400\r\n return res.setHeader(\"content-type\", \"application/json\").end(\"Wrong request\")\r\n }\r\n\r\n const { title, description, name, path: newPath } = JSON.parse(body.toString(\"utf-8\"))\r\n const filePath = getPagePath(path)\r\n \r\n const pageData = fs.existsSync(filePath) ? \r\n JSON.parse(fs.readFileSync(filePath, \"utf-8\")) :\r\n { content: [], data: {} }\r\n \r\n pageData.name = name\r\n pageData.meta = { title, description }\r\n await fs.promises.writeFile(filePath, JSON.stringify(pageData, null, 2))\r\n\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify({ success: true }))\r\n }\r\n\r\n if (req.url === \"/folders\") {\r\n const files = await fs.promises.readdir(`.mech/pages`, { withFileTypes: true })\r\n const arr = []\r\n for (let file of files) {\r\n if (file.isDirectory()) {\r\n arr.push({ id: file.name, path: \"/\"+file.name, name: file.name })\r\n }\r\n }\r\n res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(arr))\r\n return\r\n }\r\n\r\n if (req.url?.startsWith(\"/save\") && req.url.includes(\"?\")) {\r\n const path = new URLSearchParams(req.url.slice(req.url.indexOf(\"?\"))).get(\"path\")\r\n if (!path) {\r\n res.statusCode = 400\r\n return res.end(\"Wrong request\")\r\n }\r\n\r\n const filePath = getPagePath(path)\r\n const obj = JSON.parse(body.toString(\"utf-8\"))\r\n const pageData = fs.existsSync(filePath) ? \r\n JSON.parse(fs.readFileSync(filePath, \"utf-8\")) :\r\n { content: [], data: {} }\r\n Object.assign(pageData, { content: obj.content, data: obj.data })\r\n\r\n if (obj.data) {\r\n resetPagesCache()\r\n }\r\n\r\n await fs.promises.writeFile(filePath, JSON.stringify(pageData, null, 2))\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify({ success: true }))\r\n }\r\n\r\n if (req.url?.startsWith(\"/query\") && req.url.includes(\"?\")) {\r\n const key = new URLSearchParams(req.url.slice(req.url.indexOf(\"?\"))).get(\"q\")!\r\n const resp = await getQuery(key)\r\n return res.setHeader(\"content-type\", \"application/json\").end(JSON.stringify(resp))\r\n }\r\n\r\n res.statusCode = 400\r\n return res.end(`Route ${req.originalUrl} not found`)\r\n \r\n}","export const traverse = <T extends { children?: T[] }>(\r\n obj: T, \r\n callback: (obj: T, indent: number, parent: T | null) => void, \r\n indent = 0, \r\n parent: T | null = null\r\n) => {\r\n\r\n callback(obj, indent, parent)\r\n if (obj.children) {\r\n for (let child of obj.children) {\r\n traverse(child, callback, indent+1, obj)\r\n }\r\n }\r\n}\r\n\r\nexport const traverseObject = (obj: any, callback: (obj: any, key?: string | number, parent?: any) => void, key?: string | number, parent?: any) => {\r\n if (obj === null || obj === undefined) return;\r\n\r\n callback(obj, key, parent)\r\n if (Array.isArray(obj)) {\r\n let index = 0\r\n for (let item of obj) {\r\n traverseObject(item, callback, index, obj)\r\n index++\r\n }\r\n return\r\n }\r\n if (typeof obj === \"object\") {\r\n for (let [ key, value ] of Object.entries(obj)) {\r\n traverseObject(value, callback, key, obj)\r\n }\r\n return\r\n }\r\n}\r\n\r\nexport const getValueByPath = (data: any, key: string) => {\r\n let resp = data\r\n for (let prop of key.split('.')) {\r\n resp = resp[prop]\r\n if (!resp) return resp\r\n }\r\n return resp\r\n}\r\n\r\nexport const passDataToHTML = (html: string, data: any) => {\r\n let resp = \"\"\r\n let lastIndex = 0\r\n for (let place of html.matchAll(/{{.+}}/g)){ \r\n resp += html.slice(lastIndex, place.index) + (getValueByPath(data, place[0].slice(2, -2)) ?? \"\")\r\n lastIndex = place.index + place[0].length\r\n }\r\n\r\n resp += html.slice(lastIndex)\r\n\r\n return resp\r\n}","import { normalizePath, Plugin, ViteDevServer } from 'vite'\r\nimport { collectBlocks } from './collectBlocks'\r\nimport { generateDefineBlock } from './parseDefineBlock'\r\nimport { join, parse, resolve } from 'node:path'\r\nimport fs from 'node:fs'\r\nimport { editEntryCodeSsr } from './editEntryCodeSsr'\r\nimport type { DataEntryScope } from '../../../common/types'\r\nimport { getPagePath, mechaniaServer } from './mechanicaServer'\r\nimport { passDataToHTML } from '../../../common/utils/traverse'\r\n\r\ntype PluginOptions = {\r\n entrySsr?: string,\r\n variables?: string,\r\n pages?: string\r\n}\r\n\r\nconst blockListModuleId = 'virtual:builder-blocks'\r\nconst resolvedBlockListModuleId = '\\0'+blockListModuleId\r\n\r\nconst mechanicaPlugin = (options: PluginOptions = {}): Plugin => {\r\n\r\n let isDev = true\r\n let isSsr = false\r\n let isBuild = false\r\n let server: ViteDevServer\r\n \r\n const blocksDir = normalizePath(join(process.cwd(), \"src/blocks\"))\r\n\r\n const triggerHotUpdate = (server: ViteDevServer) => {\r\n const module = server.moduleGraph.getModuleById(resolvedBlockListModuleId)\r\n if (module) {\r\n // TODO: обновлять модуль, только если изменилась схема\r\n\r\n // server.moduleGraph.invalidateModule(module)\r\n // server.ws.send({\r\n // type: \"update\",\r\n // updates: Array.from(module.importers.values()).map(mod => ({\r\n // type: \"js-update\",\r\n // timestamp: Date.now(),\r\n // path: mod.url,\r\n // acceptedPath: mod.url\r\n // }))\r\n // })\r\n\r\n return module\r\n }\r\n }\r\n\r\n let mechanicaConfig = {}\r\n if (fs.existsSync(`.mech/config.json`)) {\r\n const data = fs.readFileSync(`.mech/config.json`, \"utf-8\")\r\n Object.assign(mechanicaConfig, JSON.parse(data))\r\n }\r\n\r\n return {\r\n name: \"mechanica\",\r\n enforce: \"post\",\r\n [\"userOptions\" as any]: options,\r\n config(_config, env) {\r\n isDev = env.mode === 'development'\r\n isSsr = !!env.isSsrBuild\r\n isBuild = env.command === \"build\"\r\n\r\n return {\r\n optimizeDeps: {\r\n exclude: [ \"virtual:builder-blocks\", \"virtual:page\", \"mechanica/editor\", \"mechanica\" ]\r\n }\r\n }\r\n },\r\n buildStart() {\r\n this.addWatchFile(blocksDir)\r\n },\r\n transform(code, id) {\r\n const [path, query] = id.split('?');\r\n if (query === \"block\") {\r\n if (code.includes(\"type=script\")) {\r\n return {\r\n code: code.replace(\"type=script\", \"type=script&block=true&\"),\r\n map: null\r\n }\r\n }\r\n }\r\n if (code.includes(\"defineBlock\") && query.includes(\"block\")) {\r\n const name = parse(path).name\r\n return generateDefineBlock(code, isDev || isSsr, name)\r\n }\r\n if (query === 'ssr') {\r\n return { code: editEntryCodeSsr(code, options), map: null }\r\n }\r\n },\r\n resolveId(id) {\r\n if (id === blockListModuleId) return resolvedBlockListModuleId\r\n },\r\n async load(id) {\r\n if (id === resolvedBlockListModuleId) {\r\n return await collectBlocks(this, blocksDir, isDev)\r\n }\r\n },\r\n configureServer(_server) {\r\n server = _server\r\n\r\n // server.ws.on(\"mechanica:saveState\", (msg) => {\r\n // const obj = JSON.parse(msg)\r\n\r\n // createMechFolder()\r\n // const pageData = { content: obj.content }\r\n // fs.writeFileSync(resolve(`.mech/pages/${obj.dev.currentPage}.json`), JSON.stringify(pageData, null, 2))\r\n // })\r\n\r\n server.middlewares.use(\"/@mechanica\", mechaniaServer)\r\n\r\n },\r\n watchChange(id, change) {\r\n if (server && id.startsWith(blocksDir)) {\r\n if (server) {\r\n const module = server.moduleGraph.getModuleById(resolvedBlockListModuleId)\r\n if (module && (change.event === 'create' || change.event === 'delete')) {\r\n server.reloadModule(module)\r\n }\r\n }\r\n }\r\n },\r\n handleHotUpdate(ctx) {\r\n const { file, modules, server } = ctx\r\n if (file.startsWith(blocksDir)) {\r\n const module = server.moduleGraph.getModuleById(resolvedBlockListModuleId)\r\n if (module) {\r\n return [ ...modules, module ]\r\n }\r\n }\r\n },\r\n transformIndexHtml: {\r\n order: \"pre\",\r\n async handler(html, ctx) {\r\n if (!isDev && process.env.HTML_GENERATE !== \"true\") {\r\n return html\r\n }\r\n\r\n const isFile = /\\.\\w+$/.test(ctx.originalUrl!)\r\n \r\n if (isFile) {\r\n return html\r\n }\r\n \r\n let str = html\r\n if (isDev) {\r\n // if (!fs.existsSync(resolve(`.mech/pages/${currentPage}.json`))) {\r\n // return `<h1>Page ${currentPage} not found</h1>`\r\n // }\r\n \r\n let content: any[] = []\r\n let data = {}\r\n let dataEntryScopes: Record<string, DataEntryScope> = {}\r\n \r\n const filePath = getPagePath(ctx.originalUrl!)\r\n const pageData = fs.existsSync(filePath) ? \r\n JSON.parse(fs.readFileSync(filePath, \"utf-8\")) :\r\n { content: [], data: {} }\r\n\r\n content = pageData.content ?? []\r\n data = pageData.data ?? {}\r\n for (let key of Object.keys(data)) {\r\n dataEntryScopes[key] = \"page\"\r\n }\r\n\r\n str = passDataToHTML(str, data)\r\n\r\n // if (!pageData.id) {\r\n // pageData.id = -Math.trunc(Math.random() * 100000)\r\n // await fs.promises.writeFile(resolve(`.mech/pages/${currentPage}.json`), JSON.stringify(pageData, null, 2))\r\n // }\r\n\r\n const state = {\r\n content,\r\n data,\r\n dataEntryScopes,\r\n currentPage: {\r\n name: pageData.name ?? \"Новая страница\",\r\n path: ctx.originalUrl,\r\n meta: pageData.meta ?? {},\r\n id: pageData.id\r\n }\r\n }\r\n\r\n const stateStr = `\r\n <script>\r\n window.state=${JSON.stringify(state)}\r\n window.__mechanicaConfig__=${JSON.stringify(mechanicaConfig)}\r\n </script>\r\n <script type=\"module\">\r\n import 'mechanica/updater'\r\n // import 'mechanica/editor-dev'\r\n import 'mechanica/editor'\r\n import 'mechanica/editor.css'\r\n </script>\r\n `\r\n\r\n str = str.replace(\"<body>\", \"<body>\\n\" + stateStr)\r\n }\r\n return str\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default mechanicaPlugin"],"names":["_a","parse","fs","join","server"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mechanica",
3
- "version": "1.0.24",
3
+ "version": "1.0.25",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "type": "module",