mechanica 1.0.0 → 1.0.1

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
@@ -6,6 +6,12 @@ import { parse } from "@babel/parser";
6
6
  import _generate from "@babel/generator";
7
7
  import { walk } from "estree-walker";
8
8
  const collectBlocks = async (ctx, dir, isDev) => {
9
+ if (!fs.existsSync(dir)) {
10
+ return `
11
+ export const blocksList = []
12
+ export const blocksMap = new Map()
13
+ `.trim();
14
+ }
9
15
  const lines = [];
10
16
  const blockNames = [];
11
17
  const blocks = fs.readdirSync(dir, { recursive: true });
@@ -186,6 +192,13 @@ const mechanicaPlugin = (options = {}) => {
186
192
  return module;
187
193
  }
188
194
  };
195
+ const getAvailablePages = () => {
196
+ if (!fs.existsSync(resolve(`.mech/pages`))) {
197
+ return [];
198
+ }
199
+ const pages = fs.readdirSync(resolve(`.mech/pages`));
200
+ return pages.map((path) => parse$1(path).name);
201
+ };
189
202
  return {
190
203
  name: "mechanica",
191
204
  enforce: "post",
@@ -287,8 +300,7 @@ const mechanicaPlugin = (options = {}) => {
287
300
  let str = html;
288
301
  if (isDev) {
289
302
  const currentPage = ((_a2 = ctx.originalUrl) == null ? void 0 : _a2.slice(1)) || "index";
290
- const pages = fs.readdirSync(resolve(`.mech/pages`));
291
- const availablePages = pages.map((path) => parse$1(path).name);
303
+ const availablePages = getAvailablePages();
292
304
  let content = [];
293
305
  if (availablePages.includes(currentPage)) {
294
306
  const pageData = fs.readFileSync(resolve(`.mech/pages/${currentPage}.json`), "utf-8");
@@ -307,6 +319,7 @@ const mechanicaPlugin = (options = {}) => {
307
319
  <\/script>
308
320
  <script type="module">
309
321
  import 'mechanica/editor'
322
+ import 'mechanica/style.css'
310
323
  <\/script>
311
324
  `;
312
325
  str = str.replace("<body>", "<body>\n" + stateStr);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["../src/vitePlugin/collectBlocks.ts","../src/vitePlugin/parseDefineBlock.ts","../src/vitePlugin/vitePluginUtils.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 const lines: string[] = []\r\n const blockNames: string[] = []\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 // 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 \r\n if (isDev) {\r\n lines.push(`\r\nimport.meta.hot?.accept(() => {\r\n \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, 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 { normalizePath, Plugin, ViteDevServer } from 'vite'\r\nimport { collectBlocks } from './collectBlocks'\r\nimport { generateDefineBlock } from './parseDefineBlock'\r\nimport { basename, join, parse, posix, resolve } from 'path'\r\nimport { uid, walkTree } from '../../../common/utils/blocks'\r\nimport fs from 'fs'\r\nimport { getUniqueName } from './vitePluginUtils'\r\n\r\ntype PluginOptions = {\r\n basePath?: string,\r\n entry?: 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 return {\r\n name: \"mechanica\",\r\n enforce: \"post\",\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\" ]\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 },\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\", async (req, res, next) => {\r\n if (req.url?.startsWith(\"/assets/\")) {\r\n const path = resolve(`.mech/${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 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 === \"/save\") {\r\n fs.mkdirSync(resolve(`.mech/pages`), { recursive: true })\r\n const obj = JSON.parse(body.toString(\"utf-8\"))\r\n const pageData = { content: obj.content }\r\n await fs.promises.writeFile(resolve(`.mech/pages/${obj.dev.currentPage}.json`), JSON.stringify(pageData, null, 2))\r\n }\r\n return\r\n })\r\n\r\n },\r\n watchChange(id, change) {\r\n if (server && id.startsWith(blocksDir)) {\r\n if (server) {\r\n const module = triggerHotUpdate(server)\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 = triggerHotUpdate(server)\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 let str = html\r\n if (isDev) {\r\n const currentPage = ctx.originalUrl?.slice(1) || 'index'\r\n const pages = fs.readdirSync(resolve(`.mech/pages`))\r\n const availablePages = pages.map(path => parse(path).name)\r\n\r\n let content: any[] = []\r\n if (availablePages.includes(currentPage)) {\r\n const pageData = fs.readFileSync(resolve(`.mech/pages/${currentPage}.json`), \"utf-8\")\r\n content = JSON.parse(pageData).content\r\n }\r\n\r\n const state = {\r\n content,\r\n dev: {\r\n currentPage,\r\n availablePages\r\n }\r\n }\r\n\r\n const stateStr = `\r\n <script>\r\n window.state=${JSON.stringify(state)}\r\n </script>\r\n <script type=\"module\">\r\n import 'mechanica/editor'\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","server"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["../src/vitePlugin/collectBlocks.ts","../src/vitePlugin/parseDefineBlock.ts","../src/vitePlugin/vitePluginUtils.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 if (!fs.existsSync(dir)) {\r\n return `\r\nexport const blocksList = []\r\nexport const blocksMap = new Map()\r\n `.trim()\r\n }\r\n\r\n const lines: string[] = []\r\n const blockNames: string[] = []\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 // 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 \r\n if (isDev) {\r\n lines.push(`\r\nimport.meta.hot?.accept(() => {\r\n \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, 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 { normalizePath, Plugin, ViteDevServer } from 'vite'\r\nimport { collectBlocks } from './collectBlocks'\r\nimport { generateDefineBlock } from './parseDefineBlock'\r\nimport { basename, join, parse, posix, resolve } from 'path'\r\nimport { uid, walkTree } from '../../../common/utils/blocks'\r\nimport fs from 'fs'\r\nimport { getUniqueName } from './vitePluginUtils'\r\n\r\ntype PluginOptions = {\r\n basePath?: string,\r\n entry?: 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 const getAvailablePages = (): string[] => {\r\n if (!fs.existsSync(resolve(`.mech/pages`))) {\r\n return []\r\n }\r\n const pages = fs.readdirSync(resolve(`.mech/pages`))\r\n return pages.map(path => parse(path).name)\r\n }\r\n\r\n return {\r\n name: \"mechanica\",\r\n enforce: \"post\",\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\" ]\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 },\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\", async (req, res, next) => {\r\n if (req.url?.startsWith(\"/assets/\")) {\r\n const path = resolve(`.mech/${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 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 === \"/save\") {\r\n fs.mkdirSync(resolve(`.mech/pages`), { recursive: true })\r\n const obj = JSON.parse(body.toString(\"utf-8\"))\r\n const pageData = { content: obj.content }\r\n await fs.promises.writeFile(resolve(`.mech/pages/${obj.dev.currentPage}.json`), JSON.stringify(pageData, null, 2))\r\n }\r\n return\r\n })\r\n\r\n },\r\n watchChange(id, change) {\r\n if (server && id.startsWith(blocksDir)) {\r\n if (server) {\r\n const module = triggerHotUpdate(server)\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 = triggerHotUpdate(server)\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 let str = html\r\n if (isDev) {\r\n const currentPage = ctx.originalUrl?.slice(1) || 'index'\r\n const availablePages = getAvailablePages()\r\n \r\n let content: any[] = []\r\n if (availablePages.includes(currentPage)) {\r\n const pageData = fs.readFileSync(resolve(`.mech/pages/${currentPage}.json`), \"utf-8\")\r\n content = JSON.parse(pageData).content\r\n }\r\n\r\n const state = {\r\n content,\r\n dev: {\r\n currentPage,\r\n availablePages\r\n }\r\n }\r\n\r\n const stateStr = `\r\n <script>\r\n window.state=${JSON.stringify(state)}\r\n </script>\r\n <script type=\"module\">\r\n import 'mechanica/editor'\r\n import 'mechanica/style.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","server"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mechanica",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "type": "module",