mechanica 1.0.9 → 1.0.11

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/main.js CHANGED
@@ -20,7 +20,7 @@ const createRouter = (app, content, data) => {
20
20
  if (path.startsWith(baseUrl)) return path.slice(baseUrl.length);
21
21
  return path;
22
22
  };
23
- const currentRoute = shallowReactive({ path: removeBasePath(import.meta.env.SSR ? "" : document.location.pathname) });
23
+ const currentRoute = shallowReactive({ path: normalizePath(removeBasePath(document.location.pathname)) });
24
24
  const isNeedToRevalidatePage = (path) => {
25
25
  return !pagesMap.has(path);
26
26
  };
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sources":["../src/useRouter.ts","../src/createMechanica.ts","../src/renderBlocks.ts","../src/components/Content.ts","../src/defineData.ts","../src/components/RouterLink.ts","../src/components/SmartLink.ts","../src/utils/cn.ts","../src/useQuery.ts","../src/index.ts"],"sourcesContent":["import { App, inject, shallowReactive, ShallowRef } from \"vue\"\r\nimport { State } from \"../../common/types\"\r\nimport { MechanicaState } from \"./createMechanica\"\r\n\r\ntype PageData = {\r\n title: string\r\n}\r\n\r\nexport const createRouter = (app: App<any>, content: ShallowRef<State[\"content\"]>, data: State[\"data\"]) => {\r\n\r\n let baseUrl: string = (window as any).state?.baseUrl ?? \"\"\r\n if (baseUrl.endsWith('/')) {\r\n baseUrl = baseUrl.slice(0, -1)\r\n }\r\n const pagesMap = new Map<string, State & PageData>()\r\n const promisesMap = new Map<string, Promise<any>>()\r\n\r\n const normalizePath = (path: string) => {\r\n let newPath = baseUrl + path\r\n if (newPath.endsWith('/') && newPath !== '/') newPath = newPath.slice(0, -1)\r\n\r\n return newPath\r\n }\r\n const removeBasePath = (path: string) => {\r\n if (baseUrl === '') return path\r\n if (path.startsWith(baseUrl)) return path.slice(baseUrl.length)\r\n return path\r\n }\r\n\r\n const currentRoute = shallowReactive({ path: removeBasePath(import.meta.env.SSR? \"\": document.location.pathname) })\r\n\r\n const isNeedToRevalidatePage = (path: string) => {\r\n return !pagesMap.has(path)\r\n }\r\n\r\n const fetchPage = (normalizedPath: string) => {\r\n if (!isNeedToRevalidatePage(normalizedPath)) return\r\n const existingPromise = promisesMap.get(normalizedPath)\r\n if (existingPromise) return existingPromise\r\n\r\n const exec = async () => {\r\n const resp = await fetch(normalizedPath).then(resp => resp.text())\r\n\r\n const _state = resp.match(/window\\.state=({.+})/)?.[1]\r\n const state = _state && JSON.parse(_state)\r\n\r\n state.title = resp.match(/<title>(.+)<\\/title>/)?.[1]\r\n\r\n pagesMap.set(normalizedPath, state)\r\n }\r\n const promise = exec()\r\n promisesMap.set(normalizedPath, promise)\r\n promise.finally(() => promisesMap.delete(normalizedPath))\r\n return promise\r\n }\r\n\r\n const openPage = async (normalizedPath: string) => {\r\n await fetchPage(normalizedPath)\r\n const { content: newContent, data: newData, title } = pagesMap.get(normalizedPath)!\r\n \r\n for (let [ key, value ] of Object.entries(newData)) {\r\n Object.assign(data[key], value)\r\n }\r\n \r\n content.value = newContent\r\n currentRoute.path = normalizedPath\r\n if (import.meta.env.DEV) {\r\n const event = new Event(\"openpage\")\r\n Object.assign(event, { data: { content: content.value, data: data, dev: { currentPath: normalizedPath } } })\r\n window.document.dispatchEvent(event)\r\n }\r\n }\r\n\r\n const push = async (path: string) => {\r\n const normalizedPath = normalizePath(path)\r\n\r\n history.pushState({}, \"\", normalizedPath)\r\n await openPage(normalizedPath)\r\n }\r\n\r\n const onPopState = () => {\r\n openPage(document.location.pathname ?? '/')\r\n }\r\n\r\n if (!import.meta.env.SSR) {\r\n window.addEventListener(\"popstate\", onPopState)\r\n \r\n app.onUnmount(() => {\r\n window.removeEventListener(\"popstate\", onPopState)\r\n })\r\n }\r\n\r\n return {\r\n push,\r\n normalizePath,\r\n currentRoute\r\n }\r\n}\r\n\r\nexport const useRouter = () => {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n return mechanica.router\r\n}\r\n\r\nexport const useRoute = () => {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n return mechanica.router.currentRoute\r\n}","import type { State } from \"../../common/types\";\r\nimport { Plugin, ShallowRef, shallowRef } from \"vue\";\r\nimport { createRouter } from \"./useRouter\";\r\n\r\nexport type MechanicaState = {\r\n content: ShallowRef<State[\"content\"]>,\r\n data: State[\"data\"]\r\n router: ReturnType<typeof createRouter>\r\n}\r\n\r\nexport const createMechanica = (): Plugin => {\r\n\r\n return {\r\n install(app) {\r\n const content = shallowRef((window as any).state.content)\r\n const data = (window as any).state.data\r\n const router = createRouter(app, content, data)\r\n\r\n const mechanicaPlugin = {\r\n content,\r\n data,\r\n router\r\n }\r\n app.provide(\"mechanica\", mechanicaPlugin)\r\n\r\n if (!import.meta.env.SSR) {\r\n // @ts-ignore\r\n if (window.__MECHANICA_STATE__ === null) {\r\n // @ts-ignore\r\n window.__MECHANICA_STATE__ = mechanicaPlugin\r\n }\r\n }\r\n\r\n if (import.meta.env.SSR) {\r\n (app as any).updateProps = (state: State) => {\r\n mechanicaPlugin.content.value = state.content\r\n Object.assign(mechanicaPlugin.data, state.data)\r\n mechanicaPlugin.router = createRouter(app, mechanicaPlugin.content.value, mechanicaPlugin.data)\r\n }\r\n }\r\n\r\n app.onUnmount(() => {\r\n \r\n })\r\n }\r\n }\r\n}","import { h, VNode } from \"vue\"\r\nimport { blocksMap } from 'virtual:builder-blocks'\r\n\r\nexport const renderBlocks = (state: any[], baseKey?: string): (VNode | null)[] => {\r\n\r\n return state.map((item, index) => {\r\n if (item.vnode) {\r\n return item.vnode\r\n }\r\n\r\n const block = blocksMap.get(item.blockId)\r\n if (!block) return null\r\n\r\n const content = { ...item.data, key: baseKey? baseKey+index: item.id }\r\n\r\n if (!item.children) {\r\n return h(block, content)\r\n } \r\n\r\n let children: Record<string, any> = {}\r\n const slotsData = Array.isArray(item.children)? { default: item.children }: item.children\r\n\r\n for (let key in slotsData) {\r\n children[key] = () => renderBlocks(slotsData[key])\r\n }\r\n\r\n return h(block, content, children)\r\n })\r\n}\r\n","import { inject } from \"vue\"\r\nimport { renderBlocks } from \"../renderBlocks\"\r\nimport { MechanicaState } from \"../createMechanica\"\r\n\r\nconst Content = {\r\n props: [],\r\n setup () {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n return () => renderBlocks(mechanica.content.value)\r\n }\r\n}\r\n\r\nexport default Content","import { SchemaItem, SchemaType, unfoldSchema } from \"compact-json-schema\";\r\nimport { inject, isReactive, shallowReactive } from \"vue\";\r\nimport { MechanicaState } from \"./createMechanica\";\r\nimport { passDefaultValue } from \"../../common/utils/passDefaultValue\";\r\n\r\ndeclare global {\r\n var _dataEntries: any[]\r\n var _registerData: (setings: any) => void\r\n}\r\n\r\nif (import.meta.env.SSR) {\r\n if (!globalThis._dataEntries) {\r\n globalThis._dataEntries = []\r\n }\r\n globalThis._registerData = (settings) => globalThis._dataEntries.push(settings)\r\n}\r\n\r\ntype Settings<S extends string, T extends SchemaItem> = {\r\n id: S,\r\n title?: string,\r\n order?: number,\r\n props: T\r\n}\r\n\r\nexport type DataHook<S extends string, T extends SchemaItem> = {\r\n (): SchemaType<T>\r\n id: S\r\n}\r\n\r\nexport const defineData = <S extends string, T extends SchemaItem>(settings: Settings<S, T>): DataHook<S, T> => {\r\n\r\n if (import.meta.env.SSR || import.meta.env.DEV) {\r\n // @ts-ignore\r\n globalThis._registerData(settings)\r\n }\r\n\r\n const fn = (): SchemaType<T> => {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n \r\n if (import.meta.env.DEV) {\r\n mechanica.data[settings.id] = passDefaultValue(mechanica.data[settings.id], unfoldSchema(settings.props))\r\n }\r\n\r\n const data = mechanica.data[settings.id]\r\n if (import.meta.env.SSR) {\r\n return data\r\n }\r\n \r\n if (!isReactive(data)) {\r\n const reactiveData = shallowReactive(data)\r\n mechanica.data[settings.id] = reactiveData\r\n return reactiveData\r\n }\r\n return data\r\n }\r\n\r\n fn.id = settings.id\r\n fn.toJSON = function() { return { id: this.id } }\r\n return fn\r\n}","import { defineComponent, h, computed, useSlots } from 'vue'\r\nimport { useRouter } from '../useRouter'\r\n\r\nexport const RouterLink = defineComponent({\r\n name: 'RouterLink',\r\n props: {\r\n to: {\r\n type: String,\r\n required: true\r\n },\r\n activeClass: {\r\n type: String,\r\n default: undefined\r\n },\r\n ariaCurrentValue: {\r\n type: String,\r\n default: undefined\r\n }\r\n },\r\n setup(props) {\r\n const router = useRouter()\r\n const slots = useSlots()\r\n\r\n const onClick = (e: MouseEvent) => {\r\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return\r\n if (e.defaultPrevented) return\r\n if (e.button !== undefined && e.button !== 0) return\r\n if (e.currentTarget) {\r\n // @ts-expect-error getAttribute существует\r\n const target = e.currentTarget.getAttribute('target')\r\n if (/\\b_blank\\b/i.test(target)) return\r\n }\r\n\r\n e.preventDefault()\r\n router.push(props.to)\r\n }\r\n\r\n const linkProps = computed(() => {\r\n const obj: Record<string, any> = {\r\n href: router.normalizePath(props.to),\r\n onClick\r\n }\r\n\r\n if (props.to === router.currentRoute.path) {\r\n obj.class = props.activeClass ?? 'router-link-active'\r\n if (props.ariaCurrentValue) {\r\n obj['aria-current'] = props.ariaCurrentValue\r\n }\r\n }\r\n\r\n return obj\r\n })\r\n\r\n return () =>\r\n h('a', linkProps.value, slots.default ? slots.default() : [])\r\n }\r\n})\r\n","import { defineComponent, h, computed, useSlots } from 'vue'\r\nimport { RouterLink } from './RouterLink'\r\n\r\nexport const SmartLink = defineComponent({\r\n name: 'SmartLink',\r\n props: {\r\n url: { type: String, required: true },\r\n title: { type: String, default: undefined },\r\n external: { type: Boolean, default: false },\r\n openNewTab: { type: Boolean, default: false },\r\n activeClass: { type: String, default: undefined },\r\n ariaCurrentValue: { type: String, default: undefined }\r\n },\r\n setup(props) {\r\n const slots = useSlots()\r\n\r\n const bindProps = computed(() => {\r\n const { url, external, openNewTab, ...otherProps } = props\r\n // если external → <a>, иначе → <RouterLink>\r\n const obj = props.external\r\n ? { href: url }\r\n : { to: url, ...otherProps }\r\n\r\n if (openNewTab) {\r\n Object.assign(obj, { target: '_blank' })\r\n }\r\n return obj\r\n })\r\n\r\n return () =>\r\n h(\r\n props.external ? 'a' : RouterLink,\r\n bindProps.value as any,\r\n slots.default ? slots.default() : props.title\r\n )\r\n }\r\n})\r\n","/** Tool for fast create class\r\n * ```ts\r\n * cn({ aligment: 'left' }) -> 'aligment-left'\r\n * cn({ active: true }) -> 'active'\r\n * ```\r\n * */\r\nexport const cn = (props: Record<string, boolean | string>) => {\r\n\r\n const classes = []\r\n\r\n for (let [ key, value ] of Object.entries(props)) {\r\n if (!value && typeof value !== 'number') continue\r\n if (value === true) {\r\n classes.push(key)\r\n } else {\r\n classes.push(`${key}-${value}`)\r\n }\r\n }\r\n\r\n return classes.join(\" \")\r\n}\r\n\r\n/** Pick keys from object\r\n * ```\r\n * pick({ a: \"foo\", b: \"bar\" }, \"a\") -> { a: \"foo\" }\r\n * ```\r\n */\r\nexport const pick = <T extends object, K extends (keyof T)[]>(obj: T, ...args: K) => {\r\n return Object.fromEntries(Object.entries(obj).filter(entry => args.includes(entry[0] as keyof T))) as Pick<T, K[number]>\r\n}\r\n","import { onServerPrefetch, reactive } from \"vue\"\r\nimport { DataHook } from \"./defineData\"\r\n\r\nif (import.meta.env.SSR) {\r\n // @ts-ignore\r\n globalThis._queryEntries = []\r\n // @ts-ignore\r\n globalThis._registerQuery = (key) => _queryEntries.push(key)\r\n}\r\nif (import.meta.env.DEV) {\r\n // @ts-ignore\r\n globalThis._registerQuery = async (key, value) => {\r\n const resp = await fetch(`/@mechanica/query?q=${encodeURIComponent(key)}`)\r\n const obj = await resp.json()\r\n if (Array.isArray(obj)) {\r\n value.length = 0\r\n value.push(...obj)\r\n }\r\n }\r\n}\r\n\r\ntype PageFilter<T extends readonly DataHook<any, any>[]> = {\r\n folderName?: string\r\n folderId?: number\r\n data: T\r\n}\r\n\r\nexport function useQuery<const T extends readonly DataHook<any, any>[]>(\r\n type: \"getPages\",\r\n filter?: PageFilter<T>\r\n): ({ path: string } & {[K in T[number] as K[\"id\"]]: ReturnType<K> })[];\r\n\r\nexport function useQuery (type: \"fetch\", options: RequestInit & { url: string }): any\r\nexport function useQuery (type: \"getPages\" | \"fetch\", options?: any): any {\r\n\r\n const key = type + \".\" + JSON.stringify(options ?? {})\r\n \r\n if (import.meta.env.SSR) {\r\n const value = reactive(type === 'fetch'? {}: [])\r\n onServerPrefetch(async () => {\r\n // @ts-ignore\r\n const data = await globalThis.getQuery(key)\r\n if (Array.isArray(value)) {\r\n value.length = 0\r\n value.push(...data)\r\n }\r\n })\r\n return value\r\n } else if (import.meta.env.DEV) {\r\n const value = reactive(type === 'fetch'? {}: [])\r\n // @ts-ignore\r\n globalThis._registerQuery(key, value)\r\n return value\r\n }\r\n\r\n return (window as any).state.query?.[key] ?? (type === 'fetch'? {}: [])\r\n}","import { type SchemaItem, type SchemaType } from 'compact-json-schema'\r\n\r\nexport type { Page } from './types'\r\nexport { createMechanica } from './createMechanica'\r\nexport { default as Content } from './components/Content'\r\nexport { defineData } from './defineData'\r\nexport { RouterLink } from './components/RouterLink'\r\nexport { SmartLink } from './components/SmartLink'\r\nexport { useRouter } from './useRouter'\r\nexport { cn, pick } from './utils/cn'\r\nexport { useQuery } from './useQuery'\r\nimport { registerAliases } from '../../common/utils/schemaAliases'\r\nexport {}\r\n\r\ndeclare global {\r\n type ComponentInfo<T extends SchemaItem> = {\r\n id?: string,\r\n name?: string,\r\n order?: number,\r\n group?: string,\r\n props?: T\r\n }\r\n\r\n var defineBlock: <T extends SchemaItem = {}>(input: ComponentInfo<T>) => SchemaType<T>\r\n}\r\n\r\ndeclare module 'compact-json-schema' {\r\n export interface SchemaTypesMap {\r\n \"image\": { src: string, previewSrc?: string },\r\n \"file\": { src: string },\r\n \"color\": string,\r\n \"smartLink\": { url: string, title: string, external: boolean }\r\n \"richText\": Array<{ text: string, type?: string, styles?: Array<{ start: number, end: number, style: string }> }>\r\n }\r\n}\r\n\r\nif (import.meta.env.DEV || import.meta.env.SSR) {\r\n registerAliases()\r\n}\r\n"],"names":["resp","_a"],"mappings":";;;;AAQO,MAAM,eAAe,CAAC,KAAe,SAAuC,SAAwB;;AAEzG,MAAI,YAAmB,YAAe,UAAf,mBAAsB,YAAW;AACxD,MAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,cAAU,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC/B;AACA,QAAM,+BAAe,IAAA;AACrB,QAAM,kCAAkB,IAAA;AAExB,QAAM,gBAAgB,CAAC,SAAiB;AACtC,QAAI,UAAU,UAAU;AACxB,QAAI,QAAQ,SAAS,GAAG,KAAK,YAAY,IAAK,WAAU,QAAQ,MAAM,GAAG,EAAE;AAE3E,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,CAAC,SAAiB;AACvC,QAAI,YAAY,GAAI,QAAO;AAC3B,QAAI,KAAK,WAAW,OAAO,UAAU,KAAK,MAAM,QAAQ,MAAM;AAC9D,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,gBAAgB,EAAE,MAAM,eAAe,YAAY,IAAI,MAAK,KAAI,SAAS,SAAS,QAAQ,GAAG;AAElH,QAAM,yBAAyB,CAAC,SAAiB;AAC/C,WAAO,CAAC,SAAS,IAAI,IAAI;AAAA,EAC3B;AAEA,QAAM,YAAY,CAAC,mBAA2B;AAC5C,QAAI,CAAC,uBAAuB,cAAc,EAAG;AAC7C,UAAM,kBAAkB,YAAY,IAAI,cAAc;AACtD,QAAI,gBAAiB,QAAO;AAE5B,UAAM,OAAO,YAAY;;AACvB,YAAM,OAAO,MAAM,MAAM,cAAc,EAAE,KAAK,CAAAA,UAAQA,MAAK,MAAM;AAEjE,YAAM,UAASC,MAAA,KAAK,MAAM,sBAAsB,MAAjC,gBAAAA,IAAqC;AACpD,YAAM,QAAQ,UAAU,KAAK,MAAM,MAAM;AAEzC,YAAM,SAAQ,UAAK,MAAM,sBAAsB,MAAjC,mBAAqC;AAEnD,eAAS,IAAI,gBAAgB,KAAK;AAAA,IACpC;AACA,UAAM,UAAU,KAAA;AAChB,gBAAY,IAAI,gBAAgB,OAAO;AACvC,YAAQ,QAAQ,MAAM,YAAY,OAAO,cAAc,CAAC;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,mBAA2B;AACjD,UAAM,UAAU,cAAc;AAC9B,UAAM,EAAE,SAAS,YAAY,MAAM,SAAS,UAAU,SAAS,IAAI,cAAc;AAEjF,aAAS,CAAE,KAAK,KAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,aAAO,OAAO,KAAK,GAAG,GAAG,KAAK;AAAA,IAChC;AAEA,YAAQ,QAAQ;AAChB,iBAAa,OAAO;AACpB,QAAI,YAAY,IAAI,KAAK;AACvB,YAAM,QAAQ,IAAI,MAAM,UAAU;AAClC,aAAO,OAAO,OAAO,EAAE,MAAM,EAAE,SAAS,QAAQ,OAAO,MAAY,KAAK,EAAE,aAAa,eAAA,EAAe,GAAK;AAC3G,aAAO,SAAS,cAAc,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,OAAO,OAAO,SAAiB;AACnC,UAAM,iBAAiB,cAAc,IAAI;AAEzC,YAAQ,UAAU,IAAI,IAAI,cAAc;AACxC,UAAM,SAAS,cAAc;AAAA,EAC/B;AAEA,QAAM,aAAa,MAAM;AACvB,aAAS,SAAS,SAAS,YAAY,GAAG;AAAA,EAC5C;AAEA,MAAI,CAAC,YAAY,IAAI,KAAK;AACxB,WAAO,iBAAiB,YAAY,UAAU;AAE9C,QAAI,UAAU,MAAM;AAClB,aAAO,oBAAoB,YAAY,UAAU;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEO,MAAM,YAAY,MAAM;AAC7B,QAAM,YAAY,OAAO,WAAW;AACpC,SAAO,UAAU;AACnB;AC5FO,MAAM,kBAAkB,MAAc;AAE3C,SAAO;AAAA,IACL,QAAQ,KAAK;AACX,YAAM,UAAU,WAAY,OAAe,MAAM,OAAO;AACxD,YAAM,OAAQ,OAAe,MAAM;AACnC,YAAM,SAAS,aAAa,KAAK,SAAS,IAAI;AAE9C,YAAM,kBAAkB;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAEF,UAAI,QAAQ,aAAa,eAAe;AAExC,UAAI,CAAC,YAAY,IAAI,KAAK;AAExB,YAAI,OAAO,wBAAwB,MAAM;AAEvC,iBAAO,sBAAsB;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,YAAY,IAAI,KAAK;AACtB,YAAY,cAAc,CAAC,UAAiB;AAC3C,0BAAgB,QAAQ,QAAQ,MAAM;AACtC,iBAAO,OAAO,gBAAgB,MAAM,MAAM,IAAI;AAC9C,0BAAgB,SAAS,aAAa,KAAK,gBAAgB,QAAQ,OAAO,gBAAgB,IAAI;AAAA,QAChG;AAAA,MACF;AAEA,UAAI,UAAU,MAAM;AAAA,MAEpB,CAAC;AAAA,IACH;AAAA,EAAA;AAEJ;AC3CO,MAAM,eAAe,CAAC,OAAc,YAAuC;AAEhF,SAAO,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,QAAI,KAAK,OAAO;AACd,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,QAAQ,UAAU,IAAI,KAAK,OAAO;AACxC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,UAAU,EAAE,GAAG,KAAK,MAAM,KAA6B,KAAK,GAAA;AAElE,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO,EAAE,OAAO,OAAO;AAAA,IACzB;AAEA,QAAI,WAAgC,CAAA;AACpC,UAAM,YAAY,MAAM,QAAQ,KAAK,QAAQ,IAAG,EAAE,SAAS,KAAK,SAAA,IAAY,KAAK;AAEjF,aAAS,OAAO,WAAW;AACzB,eAAS,GAAG,IAAI,MAAM,aAAa,UAAU,GAAG,CAAC;AAAA,IACnD;AAEA,WAAO,EAAE,OAAO,SAAS,QAAQ;AAAA,EACnC,CAAC;AACH;ACxBA,MAAM,UAAU;AAAA,EACd,OAAO,CAAA;AAAA,EACP,QAAS;AACP,UAAM,YAAY,OAAO,WAAW;AACpC,WAAO,MAAM,aAAa,UAAU,QAAQ,KAAK;AAAA,EACnD;AACF;ACAA,IAAI,YAAY,IAAI,KAAK;AACvB,MAAI,CAAC,WAAW,cAAc;AAC5B,eAAW,eAAe,CAAA;AAAA,EAC5B;AACA,aAAW,gBAAgB,CAAC,aAAa,WAAW,aAAa,KAAK,QAAQ;AAChF;AAcO,MAAM,aAAa,CAAyC,aAA6C;AAE9G,MAAI,YAAY,IAAI,OAAO,YAAY,IAAI,KAAK;AAE9C,eAAW,cAAc,QAAQ;AAAA,EACnC;AAEA,QAAM,KAAK,MAAqB;AAC9B,UAAM,YAAY,OAAO,WAAW;AAEpC,QAAI,YAAY,IAAI,KAAK;AACvB,gBAAU,KAAK,SAAS,EAAE,IAAI,iBAAiB,UAAU,KAAK,SAAS,EAAE,GAAG,aAAa,SAAS,KAAK,CAAC;AAAA,IAC1G;AAEA,UAAM,OAAO,UAAU,KAAK,SAAS,EAAE;AACvC,QAAI,YAAY,IAAI,KAAK;AACvB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,WAAW,IAAI,GAAG;AACrB,YAAM,eAAe,gBAAgB,IAAI;AACzC,gBAAU,KAAK,SAAS,EAAE,IAAI;AAC9B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,KAAG,KAAK,SAAS;AACjB,KAAG,SAAS,WAAW;AAAE,WAAO,EAAE,IAAI,KAAK,GAAA;AAAA,EAAK;AAChD,SAAO;AACT;ACxDO,MAAM,aAAa,gBAAgB;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,IAAI;AAAA,MACF,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,aAAa;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,IAEX,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,EACX;AAAA,EAEF,MAAM,OAAO;AACX,UAAM,SAAS,UAAA;AACf,UAAM,QAAQ,SAAA;AAEd,UAAM,UAAU,CAAC,MAAkB;AACjC,UAAI,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,SAAU;AACtD,UAAI,EAAE,iBAAkB;AACxB,UAAI,EAAE,WAAW,UAAa,EAAE,WAAW,EAAG;AAC9C,UAAI,EAAE,eAAe;AAEnB,cAAM,SAAS,EAAE,cAAc,aAAa,QAAQ;AACpD,YAAI,cAAc,KAAK,MAAM,EAAG;AAAA,MAClC;AAEA,QAAE,eAAA;AACF,aAAO,KAAK,MAAM,EAAE;AAAA,IACtB;AAEA,UAAM,YAAY,SAAS,MAAM;AAC/B,YAAM,MAA2B;AAAA,QAC/B,MAAM,OAAO,cAAc,MAAM,EAAE;AAAA,QACnC;AAAA,MAAA;AAGF,UAAI,MAAM,OAAO,OAAO,aAAa,MAAM;AACzC,YAAI,QAAQ,MAAM,eAAe;AACjC,YAAI,MAAM,kBAAkB;AAC1B,cAAI,cAAc,IAAI,MAAM;AAAA,QAC9B;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAED,WAAO,MACL,EAAE,KAAK,UAAU,OAAO,MAAM,UAAU,MAAM,QAAA,IAAY,EAAE;AAAA,EAChE;AACF,CAAC;ACrDM,MAAM,YAAY,gBAAgB;AAAA,EACvC,MAAM;AAAA,EACN,OAAO;AAAA,IACL,KAAK,EAAE,MAAM,QAAQ,UAAU,KAAA;AAAA,IAC/B,OAAO,EAAE,MAAM,QAAQ,SAAS,OAAA;AAAA,IAChC,UAAU,EAAE,MAAM,SAAS,SAAS,MAAA;AAAA,IACpC,YAAY,EAAE,MAAM,SAAS,SAAS,MAAA;AAAA,IACtC,aAAa,EAAE,MAAM,QAAQ,SAAS,OAAA;AAAA,IACtC,kBAAkB,EAAE,MAAM,QAAQ,SAAS,OAAA;AAAA,EAAU;AAAA,EAEvD,MAAM,OAAO;AACX,UAAM,QAAQ,SAAA;AAEd,UAAM,YAAY,SAAS,MAAM;AAC/B,YAAM,EAAE,KAAK,UAAU,YAAY,GAAG,eAAe;AAErD,YAAM,MAAM,MAAM,WACd,EAAE,MAAM,IAAA,IACR,EAAE,IAAI,KAAK,GAAG,WAAA;AAElB,UAAI,YAAY;AACd,eAAO,OAAO,KAAK,EAAE,QAAQ,UAAU;AAAA,MACzC;AACA,aAAO;AAAA,IACT,CAAC;AAED,WAAO,MACL;AAAA,MACE,MAAM,WAAW,MAAM;AAAA,MACvB,UAAU;AAAA,MACV,MAAM,UAAU,MAAM,QAAA,IAAY,MAAM;AAAA,IAAA;AAAA,EAE9C;AACF,CAAC;AC9BM,MAAM,KAAK,CAAC,UAA4C;AAE7D,QAAM,UAAU,CAAA;AAEhB,WAAS,CAAE,KAAK,KAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,QAAI,UAAU,MAAM;AAClB,cAAQ,KAAK,GAAG;AAAA,IAClB,OAAO;AACL,cAAQ,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,GAAG;AACzB;AAOO,MAAM,OAAO,CAA0C,QAAW,SAAY;AACnF,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAA,UAAS,KAAK,SAAS,MAAM,CAAC,CAAY,CAAC,CAAC;AACnG;AC1BA,IAAI,YAAY,IAAI,KAAK;AAEvB,aAAW,gBAAgB,CAAA;AAE3B,aAAW,iBAAiB,CAAC,QAAQ,cAAc,KAAK,GAAG;AAC7D;AACA,IAAI,YAAY,IAAI,KAAK;AAEvB,aAAW,iBAAiB,OAAO,KAAK,UAAU;AAChD,UAAM,OAAO,MAAM,MAAM,uBAAuB,mBAAmB,GAAG,CAAC,EAAE;AACzE,UAAM,MAAM,MAAM,KAAK,KAAA;AACvB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,YAAM,SAAS;AACf,YAAM,KAAK,GAAG,GAAG;AAAA,IACnB;AAAA,EACF;AACF;AAcO,SAAS,SAAU,MAA4B,SAAoB;;AAExE,QAAM,MAAM,OAAO,MAAM,KAAK,UAAU,WAAW,EAAE;AAErD,MAAI,YAAY,IAAI,KAAK;AACvB,UAAM,QAAQ,SAAS,SAAS,UAAS,CAAA,IAAI,CAAA,CAAE;AAC/C,qBAAiB,YAAY;AAE3B,YAAM,OAAO,MAAM,WAAW,SAAS,GAAG;AAC1C,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,SAAS;AACf,cAAM,KAAK,GAAG,IAAI;AAAA,MACpB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,WAAW,YAAY,IAAI,KAAK;AAC9B,UAAM,QAAQ,SAAS,SAAS,UAAS,CAAA,IAAI,CAAA,CAAE;AAE/C,eAAW,eAAe,KAAK,KAAK;AACpC,WAAO;AAAA,EACT;AAEA,WAAQ,YAAe,MAAM,UAArB,mBAA6B,UAAS,SAAS,UAAS,CAAA,IAAI;AACtE;ACpBA,IAAI,YAAY,IAAI,OAAO,YAAY,IAAI,KAAK;AAC9C,kBAAA;AACF;"}
1
+ {"version":3,"file":"main.js","sources":["../src/useRouter.ts","../src/createMechanica.ts","../src/renderBlocks.ts","../src/components/Content.ts","../src/defineData.ts","../src/components/RouterLink.ts","../src/components/SmartLink.ts","../src/utils/cn.ts","../src/useQuery.ts","../src/index.ts"],"sourcesContent":["import { App, inject, shallowReactive, ShallowRef } from \"vue\"\r\nimport { State } from \"../../common/types\"\r\nimport { MechanicaState } from \"./createMechanica\"\r\n\r\ntype PageData = {\r\n title: string\r\n}\r\n\r\nexport const createRouter = (app: App<any>, content: ShallowRef<State[\"content\"]>, data: State[\"data\"]) => {\r\n\r\n let baseUrl: string = (window as any).state?.baseUrl ?? \"\"\r\n if (baseUrl.endsWith('/')) {\r\n baseUrl = baseUrl.slice(0, -1)\r\n }\r\n const pagesMap = new Map<string, State & PageData>()\r\n const promisesMap = new Map<string, Promise<any>>()\r\n\r\n const normalizePath = (path: string) => {\r\n let newPath = baseUrl + path\r\n if (newPath.endsWith('/') && newPath !== '/') newPath = newPath.slice(0, -1)\r\n\r\n return newPath\r\n }\r\n const removeBasePath = (path: string) => {\r\n if (baseUrl === '') return path\r\n if (path.startsWith(baseUrl)) return path.slice(baseUrl.length)\r\n return path\r\n }\r\n\r\n const currentRoute = shallowReactive({ path: normalizePath(removeBasePath(document.location.pathname)) })\r\n\r\n const isNeedToRevalidatePage = (path: string) => {\r\n return !pagesMap.has(path)\r\n }\r\n\r\n const fetchPage = (normalizedPath: string) => {\r\n if (!isNeedToRevalidatePage(normalizedPath)) return\r\n const existingPromise = promisesMap.get(normalizedPath)\r\n if (existingPromise) return existingPromise\r\n\r\n const exec = async () => {\r\n const resp = await fetch(normalizedPath).then(resp => resp.text())\r\n\r\n const _state = resp.match(/window\\.state=({.+})/)?.[1]\r\n const state = _state && JSON.parse(_state)\r\n\r\n state.title = resp.match(/<title>(.+)<\\/title>/)?.[1]\r\n\r\n pagesMap.set(normalizedPath, state)\r\n }\r\n const promise = exec()\r\n promisesMap.set(normalizedPath, promise)\r\n promise.finally(() => promisesMap.delete(normalizedPath))\r\n return promise\r\n }\r\n\r\n const openPage = async (normalizedPath: string) => {\r\n await fetchPage(normalizedPath)\r\n const { content: newContent, data: newData, title } = pagesMap.get(normalizedPath)!\r\n \r\n for (let [ key, value ] of Object.entries(newData)) {\r\n Object.assign(data[key], value)\r\n }\r\n \r\n content.value = newContent\r\n currentRoute.path = normalizedPath\r\n if (import.meta.env.DEV) {\r\n const event = new Event(\"openpage\")\r\n Object.assign(event, { data: { content: content.value, data: data, dev: { currentPath: normalizedPath } } })\r\n window.document.dispatchEvent(event)\r\n }\r\n }\r\n\r\n const push = async (path: string) => {\r\n const normalizedPath = normalizePath(path)\r\n\r\n history.pushState({}, \"\", normalizedPath)\r\n await openPage(normalizedPath)\r\n }\r\n\r\n const onPopState = () => {\r\n openPage(document.location.pathname ?? '/')\r\n }\r\n\r\n if (!import.meta.env.SSR) {\r\n window.addEventListener(\"popstate\", onPopState)\r\n \r\n app.onUnmount(() => {\r\n window.removeEventListener(\"popstate\", onPopState)\r\n })\r\n }\r\n\r\n return {\r\n push,\r\n normalizePath,\r\n currentRoute\r\n }\r\n}\r\n\r\nexport const useRouter = () => {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n return mechanica.router\r\n}\r\n\r\nexport const useRoute = () => {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n return mechanica.router.currentRoute\r\n}","import type { State } from \"../../common/types\";\r\nimport { Plugin, ShallowRef, shallowRef } from \"vue\";\r\nimport { createRouter } from \"./useRouter\";\r\n\r\nexport type MechanicaState = {\r\n content: ShallowRef<State[\"content\"]>,\r\n data: State[\"data\"]\r\n router: ReturnType<typeof createRouter>\r\n}\r\n\r\nexport const createMechanica = (): Plugin => {\r\n\r\n return {\r\n install(app) {\r\n const content = shallowRef((window as any).state.content)\r\n const data = (window as any).state.data\r\n const router = createRouter(app, content, data)\r\n\r\n const mechanicaPlugin = {\r\n content,\r\n data,\r\n router\r\n }\r\n app.provide(\"mechanica\", mechanicaPlugin)\r\n\r\n if (!import.meta.env.SSR) {\r\n // @ts-ignore\r\n if (window.__MECHANICA_STATE__ === null) {\r\n // @ts-ignore\r\n window.__MECHANICA_STATE__ = mechanicaPlugin\r\n }\r\n }\r\n\r\n if (import.meta.env.SSR) {\r\n (app as any).updateProps = (state: State) => {\r\n mechanicaPlugin.content.value = state.content\r\n Object.assign(mechanicaPlugin.data, state.data)\r\n mechanicaPlugin.router = createRouter(app, mechanicaPlugin.content.value, mechanicaPlugin.data)\r\n }\r\n }\r\n\r\n app.onUnmount(() => {\r\n \r\n })\r\n }\r\n }\r\n}","import { h, VNode } from \"vue\"\r\nimport { blocksMap } from 'virtual:builder-blocks'\r\n\r\nexport const renderBlocks = (state: any[], baseKey?: string): (VNode | null)[] => {\r\n\r\n return state.map((item, index) => {\r\n if (item.vnode) {\r\n return item.vnode\r\n }\r\n\r\n const block = blocksMap.get(item.blockId)\r\n if (!block) return null\r\n\r\n const content = { ...item.data, key: baseKey? baseKey+index: item.id }\r\n\r\n if (!item.children) {\r\n return h(block, content)\r\n } \r\n\r\n let children: Record<string, any> = {}\r\n const slotsData = Array.isArray(item.children)? { default: item.children }: item.children\r\n\r\n for (let key in slotsData) {\r\n children[key] = () => renderBlocks(slotsData[key])\r\n }\r\n\r\n return h(block, content, children)\r\n })\r\n}\r\n","import { inject } from \"vue\"\r\nimport { renderBlocks } from \"../renderBlocks\"\r\nimport { MechanicaState } from \"../createMechanica\"\r\n\r\nconst Content = {\r\n props: [],\r\n setup () {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n return () => renderBlocks(mechanica.content.value)\r\n }\r\n}\r\n\r\nexport default Content","import { SchemaItem, SchemaType, unfoldSchema } from \"compact-json-schema\";\r\nimport { inject, isReactive, shallowReactive } from \"vue\";\r\nimport { MechanicaState } from \"./createMechanica\";\r\nimport { passDefaultValue } from \"../../common/utils/passDefaultValue\";\r\n\r\ndeclare global {\r\n var _dataEntries: any[]\r\n var _registerData: (setings: any) => void\r\n}\r\n\r\nif (import.meta.env.SSR) {\r\n if (!globalThis._dataEntries) {\r\n globalThis._dataEntries = []\r\n }\r\n globalThis._registerData = (settings) => globalThis._dataEntries.push(settings)\r\n}\r\n\r\ntype Settings<S extends string, T extends SchemaItem> = {\r\n id: S,\r\n title?: string,\r\n order?: number,\r\n props: T\r\n}\r\n\r\nexport type DataHook<S extends string, T extends SchemaItem> = {\r\n (): SchemaType<T>\r\n id: S\r\n}\r\n\r\nexport const defineData = <S extends string, T extends SchemaItem>(settings: Settings<S, T>): DataHook<S, T> => {\r\n\r\n if (import.meta.env.SSR || import.meta.env.DEV) {\r\n // @ts-ignore\r\n globalThis._registerData(settings)\r\n }\r\n\r\n const fn = (): SchemaType<T> => {\r\n const mechanica = inject(\"mechanica\") as MechanicaState\r\n \r\n if (import.meta.env.DEV) {\r\n mechanica.data[settings.id] = passDefaultValue(mechanica.data[settings.id], unfoldSchema(settings.props))\r\n }\r\n\r\n const data = mechanica.data[settings.id]\r\n if (import.meta.env.SSR) {\r\n return data\r\n }\r\n \r\n if (!isReactive(data)) {\r\n const reactiveData = shallowReactive(data)\r\n mechanica.data[settings.id] = reactiveData\r\n return reactiveData\r\n }\r\n return data\r\n }\r\n\r\n fn.id = settings.id\r\n fn.toJSON = function() { return { id: this.id } }\r\n return fn\r\n}","import { defineComponent, h, computed, useSlots } from 'vue'\r\nimport { useRouter } from '../useRouter'\r\n\r\nexport const RouterLink = defineComponent({\r\n name: 'RouterLink',\r\n props: {\r\n to: {\r\n type: String,\r\n required: true\r\n },\r\n activeClass: {\r\n type: String,\r\n default: undefined\r\n },\r\n ariaCurrentValue: {\r\n type: String,\r\n default: undefined\r\n }\r\n },\r\n setup(props) {\r\n const router = useRouter()\r\n const slots = useSlots()\r\n\r\n const onClick = (e: MouseEvent) => {\r\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return\r\n if (e.defaultPrevented) return\r\n if (e.button !== undefined && e.button !== 0) return\r\n if (e.currentTarget) {\r\n // @ts-expect-error getAttribute существует\r\n const target = e.currentTarget.getAttribute('target')\r\n if (/\\b_blank\\b/i.test(target)) return\r\n }\r\n\r\n e.preventDefault()\r\n router.push(props.to)\r\n }\r\n\r\n const linkProps = computed(() => {\r\n const obj: Record<string, any> = {\r\n href: router.normalizePath(props.to),\r\n onClick\r\n }\r\n\r\n if (props.to === router.currentRoute.path) {\r\n obj.class = props.activeClass ?? 'router-link-active'\r\n if (props.ariaCurrentValue) {\r\n obj['aria-current'] = props.ariaCurrentValue\r\n }\r\n }\r\n\r\n return obj\r\n })\r\n\r\n return () =>\r\n h('a', linkProps.value, slots.default ? slots.default() : [])\r\n }\r\n})\r\n","import { defineComponent, h, computed, useSlots } from 'vue'\r\nimport { RouterLink } from './RouterLink'\r\n\r\nexport const SmartLink = defineComponent({\r\n name: 'SmartLink',\r\n props: {\r\n url: { type: String, required: true },\r\n title: { type: String, default: undefined },\r\n external: { type: Boolean, default: false },\r\n openNewTab: { type: Boolean, default: false },\r\n activeClass: { type: String, default: undefined },\r\n ariaCurrentValue: { type: String, default: undefined }\r\n },\r\n setup(props) {\r\n const slots = useSlots()\r\n\r\n const bindProps = computed(() => {\r\n const { url, external, openNewTab, ...otherProps } = props\r\n // если external → <a>, иначе → <RouterLink>\r\n const obj = props.external\r\n ? { href: url }\r\n : { to: url, ...otherProps }\r\n\r\n if (openNewTab) {\r\n Object.assign(obj, { target: '_blank' })\r\n }\r\n return obj\r\n })\r\n\r\n return () =>\r\n h(\r\n props.external ? 'a' : RouterLink,\r\n bindProps.value as any,\r\n slots.default ? slots.default() : props.title\r\n )\r\n }\r\n})\r\n","/** Tool for fast create class\r\n * ```ts\r\n * cn({ aligment: 'left' }) -> 'aligment-left'\r\n * cn({ active: true }) -> 'active'\r\n * ```\r\n * */\r\nexport const cn = (props: Record<string, boolean | string>) => {\r\n\r\n const classes = []\r\n\r\n for (let [ key, value ] of Object.entries(props)) {\r\n if (!value && typeof value !== 'number') continue\r\n if (value === true) {\r\n classes.push(key)\r\n } else {\r\n classes.push(`${key}-${value}`)\r\n }\r\n }\r\n\r\n return classes.join(\" \")\r\n}\r\n\r\n/** Pick keys from object\r\n * ```\r\n * pick({ a: \"foo\", b: \"bar\" }, \"a\") -> { a: \"foo\" }\r\n * ```\r\n */\r\nexport const pick = <T extends object, K extends (keyof T)[]>(obj: T, ...args: K) => {\r\n return Object.fromEntries(Object.entries(obj).filter(entry => args.includes(entry[0] as keyof T))) as Pick<T, K[number]>\r\n}\r\n","import { onServerPrefetch, reactive } from \"vue\"\r\nimport { DataHook } from \"./defineData\"\r\n\r\nif (import.meta.env.SSR) {\r\n // @ts-ignore\r\n globalThis._queryEntries = []\r\n // @ts-ignore\r\n globalThis._registerQuery = (key) => _queryEntries.push(key)\r\n}\r\nif (import.meta.env.DEV) {\r\n // @ts-ignore\r\n globalThis._registerQuery = async (key, value) => {\r\n const resp = await fetch(`/@mechanica/query?q=${encodeURIComponent(key)}`)\r\n const obj = await resp.json()\r\n if (Array.isArray(obj)) {\r\n value.length = 0\r\n value.push(...obj)\r\n }\r\n }\r\n}\r\n\r\ntype PageFilter<T extends readonly DataHook<any, any>[]> = {\r\n folderName?: string\r\n folderId?: number\r\n data: T\r\n}\r\n\r\nexport function useQuery<const T extends readonly DataHook<any, any>[]>(\r\n type: \"getPages\",\r\n filter?: PageFilter<T>\r\n): ({ path: string } & {[K in T[number] as K[\"id\"]]: ReturnType<K> })[];\r\n\r\nexport function useQuery (type: \"fetch\", options: RequestInit & { url: string }): any\r\nexport function useQuery (type: \"getPages\" | \"fetch\", options?: any): any {\r\n\r\n const key = type + \".\" + JSON.stringify(options ?? {})\r\n \r\n if (import.meta.env.SSR) {\r\n const value = reactive(type === 'fetch'? {}: [])\r\n onServerPrefetch(async () => {\r\n // @ts-ignore\r\n const data = await globalThis.getQuery(key)\r\n if (Array.isArray(value)) {\r\n value.length = 0\r\n value.push(...data)\r\n }\r\n })\r\n return value\r\n } else if (import.meta.env.DEV) {\r\n const value = reactive(type === 'fetch'? {}: [])\r\n // @ts-ignore\r\n globalThis._registerQuery(key, value)\r\n return value\r\n }\r\n\r\n return (window as any).state.query?.[key] ?? (type === 'fetch'? {}: [])\r\n}","import { type SchemaItem, type SchemaType } from 'compact-json-schema'\r\n\r\nexport type { Page } from './types'\r\nexport { createMechanica } from './createMechanica'\r\nexport { default as Content } from './components/Content'\r\nexport { defineData } from './defineData'\r\nexport { RouterLink } from './components/RouterLink'\r\nexport { SmartLink } from './components/SmartLink'\r\nexport { useRouter } from './useRouter'\r\nexport { cn, pick } from './utils/cn'\r\nexport { useQuery } from './useQuery'\r\nimport { registerAliases } from '../../common/utils/schemaAliases'\r\nexport {}\r\n\r\ndeclare global {\r\n type ComponentInfo<T extends SchemaItem> = {\r\n id?: string,\r\n name?: string,\r\n order?: number,\r\n group?: string,\r\n props?: T\r\n }\r\n\r\n var defineBlock: <T extends SchemaItem = {}>(input: ComponentInfo<T>) => SchemaType<T>\r\n}\r\n\r\ndeclare module 'compact-json-schema' {\r\n export interface SchemaTypesMap {\r\n \"image\": { src: string, previewSrc?: string },\r\n \"file\": { src: string },\r\n \"color\": string,\r\n \"smartLink\": { url: string, title: string, external: boolean }\r\n \"richText\": Array<{ text: string, type?: string, styles?: Array<{ start: number, end: number, style: string }> }>\r\n }\r\n}\r\n\r\nif (import.meta.env.DEV || import.meta.env.SSR) {\r\n registerAliases()\r\n}\r\n"],"names":["resp","_a"],"mappings":"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"}
package/dist/plugin.js CHANGED
@@ -218,6 +218,7 @@ const getQuery = async (key) => {
218
218
  for (let page of pages) {
219
219
  delete page.order;
220
220
  delete page.folderPath;
221
+ delete page.orderAfter;
221
222
  }
222
223
  queryCache.set(key, pages);
223
224
  return pages;
@@ -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;\\n\")\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 }\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 getFilePath = (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 = getFilePath(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 = getFilePath(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 = getFilePath(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 { getFilePath, mechaniaServer } from './mechanicaServer'\r\nimport { passDataToHTML } from '../../../common/utils/traverse'\r\n\r\ntype PluginOptions = {\r\n basePath?: string,\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 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 = getFilePath(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 </script>\r\n <script type=\"module\">\r\n import 'mechanica/updater'\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;\\n\")\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 getFilePath = (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 = getFilePath(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 = getFilePath(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 = getFilePath(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 { getFilePath, mechaniaServer } from './mechanicaServer'\r\nimport { passDataToHTML } from '../../../common/utils/traverse'\r\n\r\ntype PluginOptions = {\r\n basePath?: string,\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 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 = getFilePath(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 </script>\r\n <script type=\"module\">\r\n import 'mechanica/updater'\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.9",
3
+ "version": "1.0.11",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -33,7 +33,7 @@
33
33
  "types": "./dist/main.d.ts"
34
34
  },
35
35
  "./editor": {
36
- "import": "./src/editor/editor.ts",
36
+ "import": "./dist/editor.js",
37
37
  "types": "./dist/editor.d.ts"
38
38
  },
39
39
  "./plugin": {