UNPKG

@knxcloud/lowcode-vue-simulator-renderer

Version:
1 lines 48.9 kB
{"version":3,"file":"vue-simulator-renderer.mjs","sources":["../src/simulator-view.ts","../src/buildin-components/leaf.ts","../src/buildin-components/slot.ts","../src/buildin-components/page.ts","../src/host.ts","../src/utils/get-client-rects.ts","../src/utils/comp-node.ts","../src/utils/check-node.ts","../src/utils/closest-node.ts","../src/utils/find-dom-nodes.ts","../src/utils/logger.ts","../src/utils/cursor.ts","../src/utils/navtive-selection.ts","../src/utils/deep-merge.ts","../src/utils/path.ts","../src/simulator.ts","../src/index.ts"],"sourcesContent":["import { ref, Suspense, type PropType } from 'vue';\nimport type { DocumentInstance, VueSimulatorRenderer } from './interface';\nimport { defineComponent, h, renderSlot } from 'vue';\nimport LowCodeRenderer from '@knxcloud/lowcode-vue-renderer';\nimport { RouterView } from 'vue-router';\n\nexport const Layout = defineComponent({\n props: {\n simulator: {\n type: Object as PropType<VueSimulatorRenderer>,\n required: true,\n },\n },\n render() {\n const { simulator, $slots } = this;\n const { layout, getComponent } = simulator;\n if (layout) {\n const { Component, props = {}, componentName } = layout;\n if (Component) {\n return h(Component, { ...props, key: 'layout', simulator } as any, $slots);\n }\n const ComputedComponent = componentName && getComponent(componentName);\n if (ComputedComponent) {\n return h(ComputedComponent, { ...props, key: 'layout', simulator }, $slots);\n }\n }\n return renderSlot($slots, 'default');\n },\n});\n\nexport const SimulatorRendererView = defineComponent({\n props: {\n simulator: {\n type: Object as PropType<VueSimulatorRenderer>,\n required: true,\n },\n },\n render() {\n const { simulator } = this;\n return h(Layout, { simulator }, () => {\n return h(RouterView, null, {\n default: ({ Component }) => {\n return Component && h(Suspense, null, () => h(Component));\n },\n });\n });\n },\n});\n\nexport const Renderer = defineComponent({\n props: {\n simulator: {\n type: Object as PropType<VueSimulatorRenderer>,\n required: true,\n },\n documentInstance: {\n type: Object as PropType<DocumentInstance>,\n required: true,\n },\n },\n setup: () => ({ renderer: ref() }),\n render() {\n const { documentInstance, simulator } = this;\n const { schema, scope, messages, appHelper, key } = documentInstance;\n const { designMode, device, locale, components, requestHandlersMap } = simulator;\n\n return h(LowCodeRenderer, {\n ref: 'renderer',\n key: key,\n scope: scope,\n schema: schema,\n locale: locale,\n device: device,\n messages: messages,\n appHelper: appHelper,\n components: components,\n designMode: designMode,\n requestHandlersMap: requestHandlersMap,\n disableCompMock: simulator.disableCompMock,\n thisRequiredInJSE: simulator.thisRequiredInJSE,\n getNode: (id) => documentInstance.getNode(id) as any,\n onCompGetCtx: (schema, ref) => documentInstance.mountInstance(schema.id!, ref),\n });\n },\n});\n","import { defineComponent, renderSlot } from 'vue';\n\nconst Leaf = defineComponent({\n name: 'Leaf',\n render() {\n return renderSlot(this.$slots, 'default');\n },\n});\n\nObject.assign(Leaf, {\n displayName: 'Leaf',\n componentMetadata: {\n componentName: 'Leaf',\n configure: {\n props: [\n {\n name: 'children',\n setter: 'StringSetter',\n },\n ],\n supports: false,\n },\n },\n});\n\nexport default Leaf;\n","import { defineComponent, h, renderSlot } from 'vue';\n\nconst Slot = defineComponent({\n render() {\n return renderSlot(this.$slots, 'default', this.$props, () => {\n return [h('div', { class: 'lc-container' })];\n });\n },\n});\n\nObject.assign(Slot, {\n displayName: 'Slot',\n componentMetadata: {\n componentName: 'Slot',\n configure: {\n props: [\n {\n name: '___title',\n title: '插槽标题',\n setter: 'StringSetter',\n defaultValue: '插槽容器',\n },\n {\n name: '___params',\n title: '插槽入参',\n setter: {\n componentName: 'ArraySetter',\n props: {\n itemSetter: {\n componentName: 'StringSetter',\n props: {\n placeholder: '参数名称',\n },\n },\n },\n },\n },\n ],\n component: {\n isContainer: true,\n disableBehaviors: '*',\n },\n supports: false,\n },\n },\n});\n\nexport default Slot;\n","import { defineComponent, h } from 'vue';\n\nconst Page = defineComponent((props, { slots }) => {\n return () => h('div', { class: 'lc-page', ...props }, slots);\n});\n\nObject.assign(Page, {\n displayName: 'Page',\n componentMetadata: {\n componentName: 'Page',\n configure: {\n supports: {\n style: true,\n className: true,\n },\n component: {\n isContainer: true,\n disableBehaviors: '*',\n },\n },\n },\n});\n\nexport default Page;\n","import type { BuiltinSimulatorHost } from '@alilc/lowcode-designer';\n\nexport const host: BuiltinSimulatorHost = (window as any).LCSimulatorHost;\n","import { isElement } from '@knxcloud/lowcode-utils';\n\n// a range for test TextNode clientRect\nconst cycleRange = document.createRange();\n\nexport function getClientRects(node: Element | Text) {\n if (!node.parentNode) return [];\n\n if (isElement(node)) {\n return [node.getBoundingClientRect()];\n }\n\n cycleRange.selectNode(node);\n return Array.from(cycleRange.getClientRects());\n}\n","import type { ComponentInternalInstance, VNode } from 'vue';\nimport type { ComponentInstance, ComponentRecord } from '../interface';\nimport { isProxy } from 'vue';\nimport { isNil, isObject } from '@knxcloud/lowcode-utils';\n\nconst SYMBOL_VDID = Symbol('_LCDocId');\nconst SYMBOL_VNID = Symbol('_LCNodeId');\nconst SYMBOL_VInstance = Symbol('_LCVueInstance');\nconst SYMBOL_RECORD_FLAG = Symbol('_LCVueCompRecord');\n\nexport interface VNodeHTMLElement extends HTMLElement {\n __vnode: VNode;\n __vueParentComponent: ComponentInternalInstance;\n}\n\nexport interface CompRootHTMLElement extends HTMLElement {\n [SYMBOL_VDID]: string;\n [SYMBOL_VNID]: string;\n [SYMBOL_VInstance]: ComponentInstance;\n}\n\nexport interface CompRootData {\n docId: string;\n nodeId: string;\n instance: ComponentInstance;\n}\n\nexport function isVNodeHTMLElement(el: unknown): el is VNodeHTMLElement {\n return isObject(el) && !isNil(el.__vueParentComponent);\n}\n\nexport function isCompRootHTMLElement(\n el: Element | null | undefined,\n): el is CompRootHTMLElement {\n return isObject(el) && SYMBOL_VDID in el;\n}\n\nexport function isComponentRecord(el: unknown): el is ComponentRecord {\n return isObject(el) && SYMBOL_RECORD_FLAG in el;\n}\n\nexport function isInternalInstance(el: unknown): el is ComponentInternalInstance {\n return isObject(el) && isProxy(el.proxy);\n}\n\nexport function createComponentRecord(did: string, nid: string, cid: number) {\n return {\n did,\n nid,\n cid,\n [SYMBOL_RECORD_FLAG]: true,\n };\n}\n\nexport function getCompRootData(el: CompRootHTMLElement): CompRootData {\n return {\n docId: el[SYMBOL_VDID],\n nodeId: el[SYMBOL_VNID],\n instance: el[SYMBOL_VInstance],\n };\n}\n\nexport function setCompRootData(el: CompRootHTMLElement, data: CompRootData): void {\n el[SYMBOL_VDID] = data.docId;\n el[SYMBOL_VNID] = data.nodeId;\n el[SYMBOL_VInstance] = data.instance;\n}\n","import { isObject } from '@knxcloud/lowcode-utils';\n\nexport function isCommentNode(el: Element | Text | Comment | Node): el is Comment {\n return el.nodeType === 8;\n}\n\nexport function isTextNode(el: Element | Text | Comment | Node): el is Text {\n return el.nodeType === 3;\n}\n\nexport function isDomNode(el: unknown): el is Element | Text {\n return (\n isObject(el) &&\n 'nodeType' in el &&\n (el.nodeType === Node.ELEMENT_NODE || el.nodeType === Node.TEXT_NODE)\n );\n}\n\nexport function isEmptyNode(el: Element | Text | Comment | Node): boolean {\n return isCommentNode(el) || (isTextNode(el) && el.nodeValue === '');\n}\n","import type { IPublicTypeNodeInstance as NodeInstance } from '@alilc/lowcode-types';\nimport type { ComponentInternalInstance } from 'vue';\nimport type { ComponentRecord } from '../interface';\nimport {\n getCompRootData,\n isVNodeHTMLElement,\n isCompRootHTMLElement,\n createComponentRecord,\n} from './comp-node';\n\nexport function getClosestNodeInstance(\n el: Element,\n specId: string | undefined,\n): NodeInstance<ComponentRecord> | null {\n if (!document.contains(el)) {\n return null;\n }\n return getClosestNodeInstanceByElement(el, specId);\n}\n\nexport function getClosestNodeInstanceByElement(\n el: Element,\n specId: string | undefined,\n): NodeInstance<ComponentRecord> | null {\n while (el) {\n if (isVNodeHTMLElement(el)) {\n const component = el.__vueParentComponent;\n return getClosestNodeInstanceByComponent(component, specId);\n }\n if (isCompRootHTMLElement(el)) {\n const { nodeId, docId, instance } = getCompRootData(el);\n if (!specId || specId === nodeId) {\n return {\n docId,\n nodeId,\n instance: createComponentRecord(docId, nodeId, instance.$.uid),\n };\n }\n }\n el = el.parentElement as Element;\n }\n\n return null;\n}\n\nexport function getClosestNodeInstanceByComponent(\n instance: ComponentInternalInstance | null,\n specId: string | undefined,\n): NodeInstance<ComponentRecord> | null {\n while (instance) {\n const el = instance.vnode.el as Element;\n if (el && isCompRootHTMLElement(el)) {\n const { nodeId, docId, instance } = getCompRootData(el);\n if (!specId || specId === nodeId) {\n return {\n docId,\n nodeId,\n instance: createComponentRecord(docId, nodeId, instance.$.uid),\n };\n }\n }\n instance = instance.parent;\n }\n return null;\n}\n","import type { ComponentInternalInstance, VNode } from 'vue';\nimport type { ComponentInstance } from '../interface';\nimport { isVNode } from 'vue';\nimport { isVNodeHTMLElement } from './comp-node';\nimport { isDomNode, isEmptyNode } from './check-node';\nimport { getClientRects } from './get-client-rects';\nimport { isArray } from '@knxcloud/lowcode-utils';\n\nexport function findDOMNodes(instance: ComponentInstance) {\n const els: (Element | Text)[] = [];\n\n const el: Element | Text = instance.$el;\n\n if (isEmptyNode(el)) {\n const internalInstance = instance.$;\n appendSiblingElement(els, internalInstance, el, (node) => {\n return node.previousSibling;\n });\n appendDescendantComponent(els, internalInstance);\n appendSiblingElement(els, internalInstance, el, (node) => {\n return node.nextSibling;\n });\n } else {\n els.push(el);\n }\n\n return els;\n}\n\nfunction appendSiblingElement(\n target: (Element | Text)[],\n instance: ComponentInternalInstance,\n el: Element | Text,\n next: (el: Node) => Node | null,\n) {\n let nextNode = next(el);\n while (nextNode) {\n if (isEmptyNode(nextNode)) {\n nextNode = next(nextNode);\n continue;\n }\n if (isVNodeHTMLElement(nextNode)) {\n const childInstance = nextNode.__vueParentComponent;\n if (isChildInstance(instance, childInstance)) {\n target.unshift(nextNode);\n nextNode = next(nextNode);\n continue;\n }\n }\n break;\n }\n}\n\nfunction appendDescendantComponent(\n target: (Element | Text)[],\n instance: ComponentInternalInstance,\n): boolean {\n const subNode = instance.subTree;\n const current = subNode.el as Element | Text;\n if (isValidElement(current)) {\n target.push(current);\n return true;\n }\n if (isArray(subNode.children) && subNode.children.length > 0) {\n return appendDescendantChildren(target, subNode.children as VNode<Element | Text>[]);\n } else if (subNode.component) {\n return appendDescendantComponent(target, subNode.component);\n }\n return false;\n}\n\nfunction appendDescendantChildren(\n target: (Element | Text)[],\n children: VNode[],\n): boolean {\n const validElements = children.map(({ el }) => el).filter(isValidElement);\n if (validElements.length > 0) {\n target.push(...validElements);\n return true;\n } else {\n return (\n children.length > 0 &&\n children.some((item) => {\n if (isArray(item.children) && item.children.length > 0) {\n return appendDescendantChildren(\n target,\n item.children.filter((child): child is VNode<Element | Text> =>\n isVNode(child),\n ),\n );\n } else if (item.component) {\n return appendDescendantComponent(target, item.component);\n }\n return false;\n })\n );\n }\n}\n\nfunction isValidElement(el: unknown): el is Element | Text {\n if (el && isDomNode(el) && !isEmptyNode(el)) {\n const rect = getClientRects(el);\n return rect.some((item) => item.width || item.height);\n }\n return false;\n}\n\nfunction isChildInstance(\n target: ComponentInternalInstance,\n source: ComponentInternalInstance | null,\n): boolean {\n if (source == null) return false;\n if (target.uid > source.uid) return false;\n if (target.uid === source.uid) return true;\n return isChildInstance(target, source.parent);\n}\n","export function warn(...messages: string[]): void {\n return console.warn('[vue-simulator-renderer]:', ...messages);\n}\n","class Cursor {\n private states = new Set<string>();\n\n setDragging(flag: boolean) {\n if (flag) {\n this.addState('dragging');\n } else {\n this.removeState('dragging');\n }\n }\n\n setXResizing(flag: boolean) {\n if (flag) {\n this.addState('x-resizing');\n } else {\n this.removeState('x-resizing');\n }\n }\n\n setYResizing(flag: boolean) {\n if (flag) {\n this.addState('y-resizing');\n } else {\n this.removeState('y-resizing');\n }\n }\n\n setCopy(flag: boolean) {\n if (flag) {\n this.addState('copy');\n } else {\n this.removeState('copy');\n }\n }\n\n isCopy() {\n return this.states.has('copy');\n }\n\n release() {\n for (const state of this.states) {\n this.removeState(state);\n }\n }\n\n addState(state: string) {\n if (!this.states.has(state)) {\n this.states.add(state);\n document.documentElement.classList.add(`lc-cursor-${state}`);\n }\n }\n\n private removeState(state: string) {\n if (this.states.has(state)) {\n this.states.delete(state);\n document.documentElement.classList.remove(`lc-cursor-${state}`);\n }\n }\n}\n\nexport const cursor = new Cursor();\n","let nativeSelectionEnabled = true;\nconst preventSelection = (e: Event) => {\n if (nativeSelectionEnabled) {\n return null;\n }\n e.preventDefault();\n e.stopPropagation();\n return false;\n};\ndocument.addEventListener('selectstart', preventSelection, true);\ndocument.addEventListener('dragstart', preventSelection, true);\n\nexport function setNativeSelection(enableFlag: boolean) {\n nativeSelectionEnabled = enableFlag;\n}\n","import { isObject } from '@knxcloud/lowcode-utils';\n\nexport function deepMerge<TL, TR>(o1: TL, o2: TR): TL & TR {\n if (isObject(o1) && isObject(o2)) {\n const result = Object.assign({}, o1);\n Object.keys(o2).forEach((key) => {\n Reflect.set(result, key, deepMerge(o1[key], o2[key]));\n });\n return result as TL & TR;\n }\n return (o2 ?? o1) as TL & TR;\n}\n","export function parseFileNameToPath(fileName: string): string {\n const path = fileName.endsWith('/index.vue')\n ? fileName.slice(0, fileName.length - 10)\n : fileName.replace(/\\.(\\w*)$/, '');\n\n return '/' + path.replace(/^\\//, '');\n}\n\nexport function parseFileNameToCompName(fileName: string): string {\n const path = parseFileNameToPath(fileName);\n return path.replace(/[/-_][\\w]/, (s) => s[1].toUpperCase());\n}\n","import type {\n IPublicTypeContainerSchema,\n IPublicModelDocumentModel,\n} from '@alilc/lowcode-types';\nimport {\n type Ref,\n createApp,\n ref,\n shallowRef,\n reactive,\n computed,\n markRaw,\n onUnmounted,\n shallowReactive,\n} from 'vue';\nimport * as VueRouter from 'vue-router';\nimport type {\n ComponentInstance,\n ComponentRecord,\n DocumentInstance,\n MixedComponent,\n SimulatorViewLayout,\n VueSimulatorRenderer,\n} from './interface';\nimport {\n config,\n LOWCODE_ROUTE_META,\n SchemaParser,\n setupLowCodeRouteGuard,\n} from '@knxcloud/lowcode-vue-renderer';\nimport {\n AssetLoader,\n buildUtils,\n buildComponents,\n getSubComponent,\n exportSchema,\n isArray,\n} from '@knxcloud/lowcode-utils';\nimport { Renderer, SimulatorRendererView } from './simulator-view';\nimport { Slot, Leaf, Page } from './buildin-components';\nimport { host } from './host';\nimport {\n cursor,\n deepMerge,\n findDOMNodes,\n getClientRects,\n getCompRootData,\n setCompRootData,\n getClosestNodeInstance,\n isComponentRecord,\n getClosestNodeInstanceByComponent,\n setNativeSelection,\n createComponentRecord,\n parseFileNameToPath,\n isVNodeHTMLElement,\n CompRootHTMLElement,\n} from './utils';\n\nObject.assign(window, { VueRouter });\n\nconst loader = new AssetLoader();\n\nconst builtinComponents = { Slot, Leaf, Page };\n\nexport interface ProjectContext {\n i18n: Record<string, object>;\n appHelper: {\n utils?: Record<string, unknown>;\n constants?: Record<string, unknown>;\n [x: string]: unknown;\n };\n suspense: boolean;\n}\n\nfunction createDocumentInstance(\n document: IPublicModelDocumentModel,\n context: ProjectContext,\n): DocumentInstance {\n /** 记录单个节点的组件实例列表 */\n const instancesMap = new Map<string, ComponentInstance[]>();\n /** 记录 vue 组件实例和组件 uid 的映射关系 */\n const vueInstanceMap = new Map<number, ComponentInstance>();\n\n const timestamp = ref(Date.now());\n\n const schema = computed<IPublicTypeContainerSchema>(() => {\n void timestamp.value;\n return (\n exportSchema(document) ?? {\n fileName: '/',\n componentName: 'Page',\n }\n );\n });\n\n const checkInstanceMounted = (instance: ComponentInstance | HTMLElement): boolean => {\n return '$' in instance ? instance.$.isMounted : !!instance;\n };\n\n const setHostInstance = (\n docId: string,\n nodeId: string,\n instances: ComponentInstance[] | null,\n ) => {\n const instanceRecords = !instances\n ? null\n : instances.map((inst) => createComponentRecord(docId, nodeId, inst.$.uid));\n host.setInstance(docId, nodeId, instanceRecords);\n };\n\n const getComponentInstance = (id: number) => {\n return vueInstanceMap.get(id);\n };\n\n const mountInstance = (id: string, instanceOrEl: ComponentInstance | HTMLElement) => {\n const docId = document.id;\n if (instanceOrEl == null) {\n let instances = instancesMap.get(id);\n if (instances) {\n instances = instances.filter(checkInstanceMounted);\n if (instances.length > 0) {\n instancesMap.set(id, instances);\n setHostInstance(docId, id, instances);\n } else {\n instancesMap.delete(id);\n setHostInstance(docId, id, null);\n }\n }\n return;\n }\n\n let el: CompRootHTMLElement;\n let instance: ComponentInstance;\n\n if ('$' in instanceOrEl) {\n instance = instanceOrEl;\n el = instance.$el;\n } else if (isVNodeHTMLElement(instanceOrEl)) {\n instance = instanceOrEl.__vueParentComponent.proxy!;\n // @ts-expect-error\n el = instanceOrEl;\n } else {\n return;\n }\n\n const origId = getCompRootData(el).nodeId;\n if (origId && origId !== id) {\n // 另外一个节点的 instance 在此被复用了,需要从原来地方卸载\n unmountInstance(origId, instance);\n }\n\n onUnmounted(() => unmountInstance(id, instance), instance.$);\n\n setCompRootData(el, {\n nodeId: id,\n docId: docId,\n instance: instance,\n });\n let instances = instancesMap.get(id);\n if (instances) {\n const l = instances.length;\n instances = instances.filter(checkInstanceMounted);\n let updated = instances.length !== l;\n if (!instances.includes(instance)) {\n instances.push(instance);\n updated = true;\n }\n if (!updated) return;\n } else {\n instances = [instance];\n }\n vueInstanceMap.set(instance.$.uid, instance);\n instancesMap.set(id, instances);\n setHostInstance(docId, id, instances);\n };\n\n const unmountInstance = (id: string, instance: ComponentInstance) => {\n const instances = instancesMap.get(id);\n if (instances) {\n const i = instances.indexOf(instance);\n if (i > -1) {\n const [instance] = instances.splice(i, 1);\n vueInstanceMap.delete(instance.$.uid);\n setHostInstance(document.id, id, instances);\n }\n }\n };\n\n const getNode: DocumentInstance['getNode'] = (id) => {\n // @ts-expect-error getNodeById 不存在,使用 getNode 代替,这里的 ts 类型声明不正确\n return id ? document.getNode(id) : null;\n };\n\n return reactive({\n id: computed(() => document.id),\n path: computed(() => parseFileNameToPath(schema.value.fileName ?? '')),\n get key() {\n return `${document.id}:${timestamp.value}`;\n },\n scope: computed(() => ({})),\n schema: schema,\n appHelper: computed(() => {\n const _schema = schema.value;\n\n const {\n utils: utilsInContext,\n constants: constantsInContext,\n ...otherHelpers\n } = context.appHelper;\n\n return {\n utils: {\n ...utilsInContext,\n ...buildUtils(host.libraryMap, Reflect.get(_schema, 'utils') ?? []),\n },\n constants: {\n ...constantsInContext,\n ...Reflect.get(_schema, 'constants'),\n },\n ...otherHelpers,\n };\n }),\n document: computed(() => document),\n messages: computed(() => deepMerge(context.i18n, Reflect.get(schema.value, 'i18n'))),\n instancesMap: computed(() => instancesMap),\n getNode,\n mountInstance,\n unmountInstance,\n getComponentInstance,\n rerender: () => {\n const now = Date.now();\n if (context.suspense) {\n Object.assign(timestamp, {\n _value: now,\n _rawValue: now,\n });\n } else {\n timestamp.value = now;\n }\n SchemaParser.cleanCachedModules();\n },\n }) as DocumentInstance;\n}\n\nfunction createSimulatorRenderer() {\n const layout: Ref<SimulatorViewLayout> = shallowRef({});\n const device: Ref<string> = shallowRef('default');\n const locale: Ref<string | undefined> = shallowRef();\n const autoRender = shallowRef(host.autoRender);\n const designMode: Ref<string> = shallowRef('design');\n const libraryMap: Ref<Record<string, string>> = shallowRef({});\n const components: Ref<Record<string, ComponentInstance>> = shallowRef({});\n const componentsMap: Ref<Record<string, MixedComponent>> = shallowRef({});\n const disableCompMock: Ref<boolean | string[]> = shallowRef(true);\n const requestHandlersMap: Ref<Record<string, CallableFunction>> = shallowRef({});\n const documentInstances: Ref<DocumentInstance[]> = shallowRef([]);\n const thisRequiredInJSE: Ref<boolean> = shallowRef(false);\n\n const context: ProjectContext = shallowReactive({\n i18n: {},\n appHelper: {\n utils: {},\n constants: {},\n },\n suspense: false,\n });\n\n const disposeFunctions: Array<() => void> = [];\n\n const documentInstanceMap = new Map<string, DocumentInstance>();\n\n function _buildComponents() {\n components.value = {\n ...builtinComponents,\n ...buildComponents(libraryMap.value, componentsMap.value),\n };\n }\n\n const simulator = reactive({\n config: markRaw(config),\n layout,\n device,\n locale,\n designMode,\n libraryMap,\n components,\n autoRender,\n componentsMap,\n disableCompMock,\n documentInstances,\n requestHandlersMap,\n thisRequiredInJSE,\n isSimulatorRenderer: true,\n }) as VueSimulatorRenderer;\n\n simulator.app = markRaw(createApp(SimulatorRendererView, { simulator }));\n simulator.router = markRaw(\n VueRouter.createRouter({\n history: VueRouter.createMemoryHistory('/'),\n routes: [],\n }),\n );\n\n simulator.getComponent = (componentName) => {\n const paths = componentName.split('.');\n const subs: string[] = [];\n while (paths.length > 0) {\n const component = components.value[componentName];\n if (component) {\n return getSubComponent(component, subs);\n }\n const sub = paths.pop();\n if (!sub) break;\n subs.unshift(sub);\n componentName = paths.join('.');\n }\n return null!;\n };\n\n simulator.getClosestNodeInstance = (el, specId) => {\n if (isComponentRecord(el)) {\n const { cid, did } = el;\n const documentInstance = documentInstanceMap.get(did);\n const instance = documentInstance?.getComponentInstance(cid) ?? null;\n return instance && getClosestNodeInstanceByComponent(instance.$, specId);\n }\n return getClosestNodeInstance(el, specId);\n };\n\n simulator.findDOMNodes = (instance: ComponentRecord) => {\n if (instance) {\n const { did, cid } = instance;\n const documentInstance = documentInstanceMap.get(did);\n const compInst = documentInstance?.getComponentInstance(cid);\n return compInst ? findDOMNodes(compInst) : null;\n }\n return null;\n };\n simulator.getComponent = (componentName) => components.value[componentName];\n\n simulator.getClientRects = (element) => getClientRects(element);\n simulator.setNativeSelection = (enable) => setNativeSelection(enable);\n simulator.setDraggingState = (state) => cursor.setDragging(state);\n simulator.setCopyState = (state) => cursor.setCopy(state);\n simulator.clearState = () => cursor.release();\n simulator.rerender = () => documentInstances.value.forEach((doc) => doc.rerender());\n simulator.dispose = () => {\n simulator.app.unmount();\n disposeFunctions.forEach((fn) => fn());\n };\n simulator.getCurrentDocument = () => {\n const crr = host.project.currentDocument;\n const docs = documentInstances.value;\n return crr ? docs.find((doc) => doc.id === crr.id) ?? null : null;\n };\n simulator.load = (assets) => loader.load(assets);\n simulator.loadAsyncLibrary = async (asyncLibraryMap) => {\n await loader.loadAsyncLibrary(asyncLibraryMap);\n _buildComponents();\n };\n\n let running = false;\n simulator.run = () => {\n if (running) return;\n running = true;\n const containerId = 'app';\n let container = document.getElementById(containerId);\n if (!container) {\n container = document.createElement('div');\n document.body.appendChild(container);\n container.id = containerId;\n }\n document.documentElement.classList.add('engine-page');\n document.body.classList.add('engine-document');\n simulator.app.use(simulator.router).mount(container);\n host.project.setRendererReady(simulator);\n };\n\n disposeFunctions.push(\n host.connect(simulator, () => {\n const config = host.project.get('config') || {};\n\n // sync layout config\n layout.value = config.layout ?? {};\n // sync disableCompMock\n disableCompMock.value = isArray(config.disableCompMock)\n ? config.disableCompMock\n : Boolean(config.disableCompMock);\n\n // todo: split with others, not all should recompute\n if (\n libraryMap.value !== host.libraryMap ||\n componentsMap.value !== host.designer.componentsMap\n ) {\n libraryMap.value = host.libraryMap || {};\n componentsMap.value = host.designer.componentsMap;\n _buildComponents();\n }\n\n locale.value = host.locale;\n\n // sync device\n device.value = host.device;\n\n // sync designMode\n designMode.value = host.designMode;\n\n // sync requestHandlersMap\n requestHandlersMap.value = host.requestHandlersMap ?? {};\n\n thisRequiredInJSE.value = host.thisRequiredInJSE ?? false;\n\n documentInstances.value.forEach((doc) => doc.rerender());\n\n setupLowCodeRouteGuard(simulator.router, {\n thisRequired: thisRequiredInJSE.value,\n scopePath: 'renderer.runtimeScope',\n });\n }),\n );\n\n disposeFunctions.push(\n host.autorun(async () => {\n const { router } = simulator;\n documentInstances.value = host.project.documents.map((doc) => {\n let documentInstance = documentInstanceMap.get(doc.id);\n if (!documentInstance) {\n // TODO: 类型不兼容 IDocumentModel to DocumentModel,暂时用类型强转处理\n documentInstance = createDocumentInstance(doc as any, context);\n documentInstanceMap.set(doc.id, documentInstance);\n } else if (router.hasRoute(documentInstance.id)) {\n router.removeRoute(documentInstance.id);\n }\n router.addRoute({\n name: documentInstance.id,\n path: documentInstance.path,\n meta: {\n [LOWCODE_ROUTE_META]: documentInstance.schema,\n },\n component: Renderer,\n props: ((doc, sim) => () => ({\n simulator: sim,\n documentInstance: doc,\n }))(documentInstance, simulator),\n });\n return documentInstance;\n });\n router.getRoutes().forEach((route) => {\n const id = route.name as string;\n const hasDoc = documentInstances.value.some((doc) => doc.id === id);\n if (!hasDoc) {\n router.removeRoute(id);\n documentInstanceMap.delete(id);\n }\n });\n const inst = simulator.getCurrentDocument();\n if (inst) {\n try {\n context.suspense = true;\n await router.replace({ name: inst.id, force: true });\n } finally {\n context.suspense = false;\n }\n }\n }),\n );\n\n host.componentsConsumer.consume(async (componentsAsset) => {\n if (componentsAsset) {\n await loader.load(componentsAsset);\n _buildComponents();\n }\n });\n\n host.injectionConsumer.consume((data) => {\n if (data.appHelper) {\n const { utils, constants, ...others } = data.appHelper;\n Object.assign(context.appHelper, {\n utils: isArray(utils) ? buildUtils(host.libraryMap, utils) : utils ?? {},\n constants: constants ?? {},\n ...others,\n });\n }\n context.i18n = data.i18n ?? {};\n });\n\n return simulator;\n}\n\nexport default createSimulatorRenderer();\n","import simulator from './simulator';\nimport { warn } from './utils';\nimport './index.less';\n\nconst win = window as any;\n\nif (typeof win !== 'undefined') {\n win.SimulatorRenderer = simulator;\n}\n\nwin.addEventListener('load', () => {\n if (!win.__VUE_HMR_RUNTIME__) {\n warn('检测到您正在使用 vue 运行时的生产环境版本');\n warn('这将导致画布的部分功能异常,请使用非生产环境版本代替');\n warn('https://unpkg.com/vue/dist/vue.runtime.global.js');\n }\n});\n\nwin.addEventListener('beforeunload', () => {\n win.LCSimulatorHost = null;\n win.SimulatorRenderer = null;\n simulator.dispose();\n});\n\nexport default simulator;\nexport * from '@knxcloud/lowcode-vue-renderer';\nexport {\n config as vueRendererConfig,\n default as VueRenderer,\n} from '@knxcloud/lowcode-vue-renderer';\nexport * from './interface';\n"],"names":["simulator","LowCodeRenderer","schema","ref","instance","document","instances","config","doc"],"mappings":"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"}