{"version":3,"sources":["jsdelivr-header.js","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/changeCaseCompat.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/types/core.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/types/deps.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/types/error.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/types/jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/const/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/const/file.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/const/generator.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/errors.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/schema.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/common.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/analyzer/componentAnalyzer.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/validate.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/parser/SchemaParser.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/resultHelper.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/generator/ChunkBuilder.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/generator/CodeBuilder.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/generator/ModuleBuilder.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/generator/ProjectBuilder.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/publisher/disk/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/publisher/disk/utils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/publisher/zip/utils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/publisher/zip/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/common/esmodule.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/common/styleImport.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/const.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerClass.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/compositeType.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/jsExpression.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/expressionParser.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/OrderedSet.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/changeCase.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/jsSlot.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/jsxHelpers.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/aopHelper.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/Scope.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/ScopeBindings.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerInitState.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerInjectContext.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/pathHelper.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerInjectUtils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerInjectDataSourceEngine.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerInjectConstants.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerInjectI18n.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerLifeCycle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/containerMethod.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/nodeToJSX.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/encodeJsxAttrString.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/jsx/handlers/transformThis2Context.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/jsx/util/isLiteralAtomicExpr.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/jsx/util/isSimpleStraightLiteral.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/jsx/handlers/transformJsExpression.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/react/reactCommonDeps.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/style/css.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/constants.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/i18n.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/utils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/templateHelper.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/abc.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/build.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/editorconfig.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/eslintignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/eslintrc.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/gitignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/jsconfig.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/prettierignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/prettierrc.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/README.md.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/src/layouts/BasicLayout/menuConfig.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/stylelintignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/stylelintrc.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/files/tsconfig.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/static-files.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/template/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/plugins/entry.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/plugins/entryHtml.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/plugins/globalStyle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/dataSource.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/plugins/packageJSON.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/plugins/router.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/postprocessor/prettier/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/solutions/icejs.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/gitignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/README.md.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/browserslistrc.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/typings.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/document.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Footer/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Footer/index.style.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Logo/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/Logo/index.style.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/components/PageNav/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/index.jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/files/src/layouts/BasicLayout/menuConfig.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/static-files.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/template/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/plugins/globalStyle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/plugins/packageJSON.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/plugins/layout.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/plugins/appConfig.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/format.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/theme.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/plugins/buildConfig.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/icejs3/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/solutions/icejs3.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/const.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerClass.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerLifeCycle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/debug.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerMethods.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerInitState.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerInjectContext.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerInjectDataSourceEngine.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/containerInjectUtils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/jsx.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/rax/commonDeps.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.eslintignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.eslintrc.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.gitignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.prettierignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.prettierrc.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.stylelintignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/.stylelintrc.js.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/jsconfig.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/README.md.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/files/tsconfig.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/static-files.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/template/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/plugins/entry.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/plugins/appConfig.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/plugins/buildConfig.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/plugins/entryDocument.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/plugins/globalStyle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/version.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/plugins/packageJSON.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/rax/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/solutions/rax-app.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/containerVue.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/nodeToTemplate.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/vue/util/isLiteralAtomicExpr.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/vue/util/isSimpleStraightLiteral.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/vue/handlers/transformThis2Context.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/core/vue/handlers/transformJsExpression.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/structuralPreprocess.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/template.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/vueCommonDeps.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/requestHandle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/apiImport.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/esmodule.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/containerInitVariable.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/containerLifeCycle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/containerInjectDataSourceEngine.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/convert/convert-function.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/containerMethod.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/convert/convert-variable.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/dataSourceMap.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/component/vue/routerSecond.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/env.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/eslintignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/eslintrc.yml.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/gitignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/npmrc.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/prettierignore.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/prettierrc.yml.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/index.html.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/postcss.config.cjs.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/tsconfig.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/tsconfig.node.json.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/vite.config.ts.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/css/global.scss.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/css/mixin.scss.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/css/theme.css.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/src/App.vue.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/src/main.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/src/vite-env.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/src/views/baseIndexA/welcome.vue.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/src/views/baseIndexA/tabs.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/files/src/utils/utils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/static-files.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/template/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/plugins/packageJSON.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/routerHandle.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/plugins/router.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/plugins/main.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/apiHandler.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/types/column-type.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/columnType.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/plugins/form.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/plugins/hooks.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/project/framework/vuejs3/index.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/solutions/vuejs3.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/plugins/common/requireUtils.ts","/npm/@dckj-npm/lowcode-code-generator@1.2.48/src/utils/index.ts"],"names":[],"mappings":"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","file":"/npm/@dckj-npm/lowcode-code-generator@1.2.48/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@dckj-npm/lowcode-code-generator@1.2.48/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * 低代码引擎的出码模块，负责将编排产出的 Schema 转换成实际可执行的代码。\n * 注意：为了保持 API 的稳定性，这里所有导出的 API 均要显式命名方式导出\n *     （即用 export { xxx } from 'xx' 的方式，不要直接 export * from 'xxx')\n *      而且所有导出的 API 务必在 tests/public 中编写单元测试\n */\nimport { createProjectBuilder } from './generator/ProjectBuilder';\nimport { createModuleBuilder } from './generator/ModuleBuilder';\nimport { createDiskPublisher } from './publisher/disk';\nimport { createZipPublisher } from './publisher/zip';\nimport createIceJsProjectBuilder, { plugins as icejsPlugins } from './solutions/icejs';\nimport createIceJs3ProjectBuilder, { plugins as icejs3Plugins } from './solutions/icejs3';\nimport createRaxAppProjectBuilder, { plugins as raxPlugins } from './solutions/rax-app';\nimport createDcSolutionProjectBuilder, { plugins as vuejs3Plugins } from './solutions/vuejs3';\n\n// 引入说明\nimport { REACT_CHUNK_NAME } from './plugins/component/react/const';\nimport { COMMON_CHUNK_NAME, CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER, TEMPLATE_DEFINE_CHUNK_NAME, VUE_DEFAULT_LINK_AFTER } from './const/generator';\n\n// 引入通用插件组\nimport esmodule from './plugins/common/esmodule';\nimport requireUtils from './plugins/common/requireUtils';\nimport styleImport from './plugins/common/styleImport';\n\nimport css from './plugins/component/style/css';\nimport constants from './plugins/project/constants';\nimport i18n from './plugins/project/i18n';\nimport utils from './plugins/project/utils';\nimport prettier from './postprocessor/prettier';\n\n// 引入全局常用工具\nimport * as globalUtils from './utils';\n\nimport * as CONSTANTS from './const';\n\n// 引入内置解决方案模块\nimport icejs from './plugins/project/framework/icejs';\nimport icejs3 from './plugins/project/framework/icejs3';\nimport rax from './plugins/project/framework/rax';\nimport vuejs3 from './plugins/project/framework/vuejs3';\n\nexport default {\n  createProjectBuilder,\n  createModuleBuilder,\n  solutions: {\n    icejs: createIceJsProjectBuilder,\n    icejs3: createIceJs3ProjectBuilder,\n    rax: createRaxAppProjectBuilder,\n    vuejs3: createDcSolutionProjectBuilder\n  },\n  solutionParts: {\n    icejs,\n    icejs3,\n    rax,\n    vuejs3\n  },\n  publishers: {\n    disk: createDiskPublisher,\n    zip: createZipPublisher,\n  },\n  plugins: {\n    common: {\n\n      /**\n       * 处理 ES Module\n       * @deprecated please use esModule\n       */\n      esmodule,\n      esModule: esmodule,\n      requireUtils,\n      styleImport,\n    },\n    style: {\n      css,\n    },\n    project: {\n      constants,\n      i18n,\n      utils,\n    },\n    icejs: {\n      ...icejsPlugins,\n    },\n    icejs3: {\n      ...icejs3Plugins,\n    },\n    rax: {\n      ...raxPlugins,\n    },\n    vuejs3: {\n      ...vuejs3Plugins\n    },\n\n    /**\n     * @deprecated please use icejs\n     */\n    react: {\n      ...icejsPlugins,\n    },\n  },\n  postprocessor: {\n    prettier,\n  },\n  utils: globalUtils,\n  chunkNames: {\n    COMMON_CHUNK_NAME,\n    CLASS_DEFINE_CHUNK_NAME,\n    REACT_CHUNK_NAME,\n    TEMPLATE_DEFINE_CHUNK_NAME\n  },\n  defaultLinkAfter: {\n    COMMON_DEFAULT_LINK_AFTER: DEFAULT_LINK_AFTER,\n    VUE_DEFAULT_LINK_AFTER: VUE_DEFAULT_LINK_AFTER\n  },\n  constants: CONSTANTS,\n};\n\n// 一些类型定义\nexport * from './types';\n\n// 一些常量定义\nexport * from './const';\n\n// 一些工具函数\nexport * from './analyzer/componentAnalyzer';\nexport * from './parser/SchemaParser';\nexport * from './generator/ChunkBuilder';\nexport * from './generator/CodeBuilder';\nexport * from './generator/ModuleBuilder';\nexport * from './generator/ProjectBuilder';\n","function toWords(input: string): string[] {\n  if (!input) return [];\n\n  const normalized = String(input)\n    .replace(/[_\\-\\s]+/g, ' ')\n    .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n    .replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, '$1 $2')\n    .trim();\n\n  if (!normalized) return [];\n  return normalized.split(' ').filter(Boolean);\n}\n\nexport function upperCaseFirst(input: string): string {\n  if (!input) return '';\n  return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nexport function camelCase(input: string): string {\n  const words = toWords(input);\n  if (words.length === 0) return '';\n\n  const [first, ...rest] = words;\n  return (\n    first.toLowerCase() +\n    rest.map((w) => upperCaseFirst(w.toLowerCase())).join('')\n  );\n}\n\nexport function pascalCase(input: string): string {\n  const words = toWords(input);\n  if (words.length === 0) return '';\n  return words.map((w) => upperCaseFirst(w.toLowerCase())).join('');\n}\n\nexport function paramCase(input: string): string {\n  const words = toWords(input);\n  if (words.length === 0) return '';\n  return words.map((w) => w.toLowerCase()).join('-');\n}\n\nconst changeCase = {\n  camelCase,\n  pascalCase,\n  paramCase,\n  upperCaseFirst,\n};\n\nexport default changeCase;\n","import {\n  IPublicTypeCompositeArray,\n  IPublicTypeCompositeObject,\n  IPublicTypeJSExpression,\n  IPublicTypeJSFunction,\n  IPublicTypeJSONArray,\n  IPublicTypeJSONObject,\n  IPublicTypeJSSlot,\n  IPublicTypeNodeDataType,\n  IPublicTypeProjectSchema,\n  ResultDir,\n  ResultFile,\n} from '@alilc/lowcode-types';\n\nimport type { ProjectBuilderInitOptions } from '../generator/ProjectBuilder';\nimport { IScopeBindings } from '../utils/ScopeBindings';\nimport { IParseResult } from './intermediate';\n\nexport enum FileType {\n  CSS = 'css',\n  SCSS = 'scss',\n  LESS = 'less',\n  HTML = 'html',\n  JS = 'js',\n  MJS = 'mjs',\n  JSX = 'jsx',\n  TS = 'ts',\n  MTS = 'mts',\n  TSX = 'tsx',\n  JSON = 'json',\n  MD = 'md',\n  VUE = 'vue',\n}\n\nexport enum ChunkType {\n  AST = 'ast',\n  STRING = 'string',\n  JSON = 'json',\n}\n\nexport enum PluginType {\n  COMPONENT = 'component',\n  UTILS = 'utils',\n  I18N = 'i18n',\n}\n\nexport type ChunkContent = string | any;\nexport type CodeGeneratorFunction<T> = (content: T) => string;\n\nexport interface ICodeChunk {\n  type: ChunkType;\n  fileType: string;\n  name: string;\n  subModule?: string;\n  content: ChunkContent;\n  linkAfter: string[];\n  ext?: Record<string, unknown>;\n  // 多文件重复时保留zIndex值更高的文件\n  zIndex?: number;\n}\n\nexport interface IBaseCodeStruct {\n  chunks: ICodeChunk[];\n  depNames: string[];\n}\n\nexport interface ICodeStruct extends IBaseCodeStruct {\n  ir: any;\n  contextData: IContextData;\n}\n\n/** 上下文数据，用来在插件之间共享一些数据 */\nexport interface IContextData extends IProjectBuilderOptions {\n  /**\n   * 其他自定义数据\n   * （三方自定义插件也可以在此放一些数据，建议起个长一点的名称，用自己的插件名做前缀，以防冲突）\n   */\n  [key: string]: any;\n\n  /**\n   * 是否使用了 Ref 的 API (this.$/this.$$)\n   * */\n  useRefApi?: boolean;\n}\n\nexport type BuilderComponentPlugin = (initStruct: ICodeStruct) => Promise<ICodeStruct>;\n\nexport type BuilderComponentPluginFactory<T> = (config?: T) => BuilderComponentPlugin;\n\nexport interface IChunkBuilder {\n  run: (ir: any, initialStructure?: ICodeStruct) => Promise<{ chunks: ICodeChunk[][] }>;\n  getPlugins: () => BuilderComponentPlugin[];\n  addPlugin: (plugin: BuilderComponentPlugin) => void;\n}\n\nexport interface ICodeBuilder {\n  link: (chunkDefinitions: ICodeChunk[]) => string;\n  generateByType: (type: string, content: unknown) => string;\n}\n\nexport interface ICompiledModule {\n  files: ResultFile[];\n}\n\nexport interface IModuleBuilder {\n  generateModule: (input: unknown) => Promise<ICompiledModule>;\n  generateModuleCode: (schema: IPublicTypeProjectSchema | string) => Promise<ResultDir>;\n  linkCodeChunks: (chunks: Record<string, ICodeChunk[]>, fileName: string) => ResultFile[];\n  addPlugin: (plugin: BuilderComponentPlugin) => void;\n}\n\n/**\n * 引擎对外接口\n *\n * @export\n * @interface ICodeGenerator\n */\nexport interface ICodeGenerator {\n  /**\n   * 出码接口，把 Schema 转换成代码文件系统描述\n   *\n   * @param {(IPublicTypeProjectSchema)} schema 传入的 Schema\n   * @returns {ResultDir}\n   * @memberof ICodeGenerator\n   */\n  toCode: (schema: IPublicTypeProjectSchema) => Promise<ResultDir>;\n}\n\nexport interface ISchemaParser {\n  validate: (schema: IPublicTypeProjectSchema) => boolean;\n  parse: (schema: IPublicTypeProjectSchema | string) => IParseResult;\n}\n\nexport interface IProjectTemplate {\n  slots: Record<string, IProjectSlot>;\n  generateTemplate: (data: IParseResult) => ResultDir | Promise<ResultDir>;\n}\n\nexport interface IProjectSlot {\n  path: string[];\n  fileName?: string;\n}\n\nexport interface IProjectPlugins {\n  [slotName: string]: BuilderComponentPlugin[];\n}\n\nexport interface IProjectBuilderOptions {\n  /** 是否处于严格模式 (默认：否) */\n  inStrictMode?: boolean;\n\n  /**\n   * 是否要容忍对 JSExpression 求值时的异常\n   * 默认：true\n   * 注：如果容忍异常，则会在求值时包裹 try-catch 块，\n   *     catch 到异常时默认会抛出一个 CustomEvent 事件里面包含异常信息和求值的表达式\n   */\n  tolerateEvalErrors?: boolean;\n\n  /**\n   * 容忍异常的时候的的错误处理语句块\n   * 默认：无\n   * 您可以设置为一个语句块，比如：\n   *  window.dispatchEvent(new CustomEvent('lowcode-eval-error', { error, expr }))\n   *\n   * 一般可以结合埋点监控模块用来监控求值异常\n   *\n   * 其中：\n   * - error: 异常信息\n   * - expr: 求值的表达式\n   */\n  evalErrorsHandler?: string;\n\n  /**\n   * Hook which is used to customize original options, we can reorder/add/remove plugins/processors\n   * of the existing solution.\n   */\n  customizeBuilderOptions?(originalOptions: ProjectBuilderInitOptions): ProjectBuilderInitOptions;\n}\n\nexport interface IProjectBuilder {\n  generateProject: (schema: IPublicTypeProjectSchema | string | IPublicTypeProjectSchema[], resourceList: ResourceListType[]) => Promise<ResultDir>;\n}\n\n/** 项目级别的前置处理器 */\nexport type ProjectPreProcessor = (\n  schema: IPublicTypeProjectSchema,\n) => Promise<IPublicTypeProjectSchema> | IPublicTypeProjectSchema;\n\nexport interface ProjectPostProcessorOptions {\n  parseResult?: IParseResult;\n  template?: IProjectTemplate;\n}\n\n/** 项目级别的后置处理器 */\nexport type ProjectPostProcessor = (\n  result: ResultDir,\n  schema: IPublicTypeProjectSchema,\n  originalSchema: IPublicTypeProjectSchema | string,\n  options: ProjectPostProcessorOptions,\n) => Promise<ResultDir> | ResultDir;\n\n/** 模块级别的后置处理器的工厂方法 */\nexport type PostProcessorFactory<T> = (config?: T) => PostProcessor;\n\n/** 模块级别的后置处理器 */\nexport type PostProcessor = (content: string, fileType: string, name?: string) => string | Promise<string>;\n\n// TODO: temp interface, need modify\nexport interface IPluginOptions {\n  fileDirDepth: number;\n}\n\nexport type BaseGenerator<I, T, C> = (\n  input: I,\n  scope: IScope,\n  config?: C,\n  next?: BaseGenerator<I, T, C>,\n) => T;\ntype CompositeTypeGenerator<I, T> =\n  | BaseGenerator<I, T, CompositeValueGeneratorOptions>\n  | Array<BaseGenerator<I, T, CompositeValueGeneratorOptions>>;\n\nexport type NodeGenerator<T> = (nodeItem: IPublicTypeNodeDataType, scope: IScope) => T;\n\n// FIXME: 在新的实现中，添加了第一参数 this: CustomHandlerSet 作为上下文。究其本质\n// scopeBindings?: IScopeBindings;\n// 这个组合只用来用来处理 IPublicTypeCompositeValue 类型，不是这个类型的不要放在这里\nexport interface HandlerSet<T> {\n  string?: CompositeTypeGenerator<string, T>;\n  boolean?: CompositeTypeGenerator<boolean, T>;\n  number?: CompositeTypeGenerator<number, T>;\n  expression?: CompositeTypeGenerator<IPublicTypeJSExpression, T>;\n  function?: CompositeTypeGenerator<IPublicTypeJSFunction, T>;\n  slot?: CompositeTypeGenerator<IPublicTypeJSSlot, T>;\n  array?: CompositeTypeGenerator<IPublicTypeJSONArray | IPublicTypeCompositeArray, T>;\n  object?: CompositeTypeGenerator<IPublicTypeJSONObject | IPublicTypeCompositeObject, T>;\n}\n\nexport interface CompositeValueGeneratorOptions {\n  handlers?: HandlerSet<string>;\n  nodeGenerator?: NodeGenerator<string>;\n  tolerateEvalErrors?: boolean;\n}\n\n/**\n * 作用域定义，维护作用域内定义，支持作用域链上溯\n */\nexport interface IScope {\n  // 父级作用域（如果是根作用域则为 null）\n  readonly parent: IScope | null;\n\n  // 作用域内定义的变量/函数等 bindings\n  readonly bindings?: IScopeBindings;\n\n  // TODO: 需要有上下文信息吗？ 描述什么内容\n  createSubScope: (ownIndentifiers: string[]) => IScope;\n}\n\n/**\n * 页面参数\n */\nexport interface ResourceListType {\n  title: string\n  slug: string\n  id: string\n  // 是否是一级页面\n  firstPage: 'true' | 'false'\n}\n","export interface INpmPackage {\n  package: string; // 组件包的名称\n  version: string; // 组件包的版本\n}\n\n/**\n * 外部依赖描述\n *\n * @export\n * @interface IExternalDependency\n */\nexport interface IExternalDependency extends IDependency {\n  package: string; // 组件包的名称\n  version: string; // 组件包的版本\n}\n\nexport enum InternalDependencyType {\n  PAGE = 'pages',\n  BLOCK = 'components',\n  COMPONENT = 'components',\n  UTILS = 'utils',\n}\n\nexport enum DependencyType {\n  External = 'External',\n  Internal = 'Internal',\n}\n\nexport interface IInternalDependency extends IDependency {\n  type: InternalDependencyType;\n  moduleName: string;\n}\n\nexport interface IDependency {\n  destructuring: boolean; // 组件是否是解构方式方式导出\n  exportName: string; // 导出命名\n  subName?: string; // 下标子组件名称\n  main?: string; // 包导出组件入口文件路径 /lib/input\n  dependencyType?: DependencyType; // 依赖类型 内/外\n  componentName?: string; // 导入后名称\n  package?: string; // 组件包\n  devMode: string; // 最外层的page标签\n}","/* eslint-disable @typescript-eslint/no-useless-constructor */\nexport class CodeGeneratorError extends Error {\n  readonly detail?: unknown;\n\n  constructor(message: string, detail?: unknown) {\n    super(message);\n    this.name = this.constructor.name;\n    this.detail = detail;\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nexport class ComponentValidationError extends CodeGeneratorError {}\n\nexport class CompatibilityError extends CodeGeneratorError {}\n\nexport class PublisherError extends CodeGeneratorError {}\n","import { IPublicTypeNodeSchema, IPublicTypeCompositeValue } from '@alilc/lowcode-types';\nimport { HandlerSet, BaseGenerator, NodeGenerator } from './core';\n\nexport enum PIECE_TYPE {\n  BEFORE = 'NodeCodePieceBefore',\n  TAG = 'NodeCodePieceTag',\n  ATTR = 'NodeCodePieceAttr',\n  CHILDREN = 'NodeCodePieceChildren',\n  AFTER = 'NodeCodePieceAfter',\n}\n\nexport interface CodePiece {\n  name?: string;\n  value: string;\n  type: PIECE_TYPE;\n}\n\nexport interface AttrData {\n  attrName: string;\n  attrValue: IPublicTypeCompositeValue;\n}\n// 对 JSX 出码的理解，目前定制点包含【包装】【标签名】【属性】\nexport type AttrPlugin = BaseGenerator<AttrData, CodePiece[], NodeGeneratorConfig>;\nexport type NodePlugin = BaseGenerator<IPublicTypeNodeSchema, CodePiece[], NodeGeneratorConfig>;\n\nexport interface NodeGeneratorConfig {\n  handlers?: HandlerSet<string>;\n  tagMapping?: (input: string) => string;\n  attrPlugins?: AttrPlugin[];\n  nodePlugins?: NodePlugin[];\n  self?: NodeGenerator<string>;\n\n  /**\n   * 是否要容忍对 JSExpression 求值时的异常\n   * 默认：true\n   * 注：如果容忍异常，则会在求值时包裹 try-catch 块 -- 通过 __$$eval / __$$evalArray\n   *     catch 到异常时默认会抛出一个 CustomEvent 事件里面包含异常信息和求值的表达式\n   */\n  tolerateEvalErrors?: boolean;\n}\n","export const NATIVE_ELE_PKG = 'native';\n\nexport const CONTAINER_TYPE = {\n  COMPONENT: 'Component',\n  BLOCK: 'Block',\n  PAGE: 'Page',\n};\n\nexport const SUPPORT_SCHEMA_VERSION_LIST = ['0.0.1', '1.0.0'];\n\n// built-in slot names which have been handled in ProjectBuilder\nexport const BUILTIN_SLOT_NAMES = [\n  'pages',\n  'components',\n  'router',\n  'entry',\n  'appConfig',\n  'buildConfig',\n  'constants',\n  'utils',\n  'i18n',\n  'globalStyle',\n  'htmlEntry',\n  'packageJSON',\n  'demo',\n  'form',\n  'hooks',\n];\n\nexport const isBuiltinSlotName = function (name: string) {\n  return BUILTIN_SLOT_NAMES.includes(name);\n};\n\nexport * from './file';\nexport * from './generator';\n","import { FileType } from '../types/core';\n\nexport const FILE_TYPE_FAMILY = [[FileType.TSX, FileType.TS, FileType.JSX, FileType.JS]];\n","export const COMMON_CHUNK_NAME = {\n  ExternalDepsImport: 'CommonExternalDependencyImport',\n  InternalDepsImport: 'CommonInternalDependencyImport',\n  ImportAliasDefine: 'CommonImportAliasDefine',\n  FileVarDefine: 'CommonFileScopeVarDefine',\n  FileUtilDefine: 'CommonFileScopeMethodDefine',\n  FileMainContent: 'CommonFileMainContent',\n  FileExport: 'CommonFileExport',\n  StyleDepsImport: 'CommonStyleDepsImport',\n  StyleCssContent: 'CommonStyleCssContent',\n  HtmlContent: 'CommonHtmlContent',\n  CustomContent: 'CommonCustomContent',\n};\n\nexport const CLASS_DEFINE_CHUNK_NAME = {\n  Start: 'CommonClassDefineStart',\n  ConstructorStart: 'CommonClassDefineConstructorStart',\n  ConstructorContent: 'CommonClassDefineConstructorContent',\n  ConstructorEnd: 'CommonClassDefineConstructorEnd',\n  StaticVar: 'CommonClassDefineStaticVar',\n  StaticMethod: 'CommonClassDefineStaticMethod',\n  InsVar: 'CommonClassDefineInsVar',\n  InsVarMethod: 'CommonClassDefineInsVarMethod',\n  InsMethod: 'CommonClassDefineInsMethod',\n  InsPrivateMethod: 'CommonClassDefineInsPrivateMethod',\n  End: 'CommonClassDefineEnd',\n};\n\n// vue模板结构\nexport const TEMPLATE_DEFINE_CHUNK_NAME = {\n  TemplateStart: 'CommonTemplateDefineStart', // template开始\n  TemplateDom: 'CommonTemplateDefineDom', // 页面结构\n  TemplateEnd: 'CommonTemplateDefineEnd', // template结束\n  ScriptStart: 'CommonScriptDefineStart', // script开始\n  ExternalDepsImport: 'CommonExternalDependencyImport', // 外部依赖导入\n  InternalDepsImport: 'CommonInternalDependencyImport', // 内部依赖导入\n  ConstVar: 'CommonScriptDefineConstVar', // const变量定义\n  LetVar: 'CommonScriptDefineLetVar', // let变量定义\n  DataSourceMapStart: 'CommonScriptDefineDataSourceMapStart', // dataSourceMap开始\n  DataSourceMapContent: 'CommonScriptDefineDataSourceMapContent', // dataSourceMap内容\n  DataSourceMapEnd: 'CommonScriptDefineDataSourceMapEnd', // dataSourceMap结束\n  OnMountedStart: 'CommonScriptDefineOnMountedStart', // mounted生命周期开始\n  OnMountedContent: 'CommonScriptDefineOnMountedContent', // mounted生命周期内容\n  OnMountedEnd: 'CommonScriptDefineOnMountedEnd', // mounted生命周期结束\n  UnMountedStart: 'CommonScriptDefineUnMountedStart', // unmounted生命周期开始\n  UnMountedContent: 'CommonScriptDefineUnMountedContent', // unmounted生命周期内容\n  UnMountedEnd: 'CommonScriptDefineUnMountedEnd', // unmounted生命周期结束\n  Method: 'CommonScriptDefineMethod', // 方法定义\n  ScriptEnd: 'CommonScriptDefineEnd', // script结束\n  CssStyleStart: 'CommonCssStyleDefineStart', // css样式开始\n  CssStyleImport: 'CommonCssStyleDefineImport', // 样式导入\n  CssStyleEnd: 'CommonCssStyleDefineEnd', // css样式结束\n};\n\nexport const DEFAULT_LINK_AFTER = {\n  [COMMON_CHUNK_NAME.ExternalDepsImport]: [],\n  [COMMON_CHUNK_NAME.InternalDepsImport]: [COMMON_CHUNK_NAME.ExternalDepsImport],\n  [COMMON_CHUNK_NAME.ImportAliasDefine]: [\n    COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport,\n  ],\n  [COMMON_CHUNK_NAME.FileVarDefine]: [\n    COMMON_CHUNK_NAME.ExternalDepsImport,\n    COMMON_CHUNK_NAME.InternalDepsImport,\n    COMMON_CHUNK_NAME.ImportAliasDefine,\n  ],\n  [COMMON_CHUNK_NAME.FileUtilDefine]: [\n    COMMON_CHUNK_NAME.ExternalDepsImport,\n    COMMON_CHUNK_NAME.InternalDepsImport,\n    COMMON_CHUNK_NAME.ImportAliasDefine,\n    COMMON_CHUNK_NAME.FileVarDefine,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.Start]: [\n    COMMON_CHUNK_NAME.ExternalDepsImport,\n    COMMON_CHUNK_NAME.InternalDepsImport,\n    COMMON_CHUNK_NAME.ImportAliasDefine,\n    COMMON_CHUNK_NAME.FileVarDefine,\n    COMMON_CHUNK_NAME.FileUtilDefine,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.ConstructorStart]: [\n    CLASS_DEFINE_CHUNK_NAME.Start,\n    CLASS_DEFINE_CHUNK_NAME.StaticVar,\n    CLASS_DEFINE_CHUNK_NAME.StaticMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsVar,\n    CLASS_DEFINE_CHUNK_NAME.InsVarMethod,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.ConstructorContent]: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart],\n  [CLASS_DEFINE_CHUNK_NAME.ConstructorEnd]: [\n    CLASS_DEFINE_CHUNK_NAME.ConstructorStart,\n    CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.StaticVar]: [CLASS_DEFINE_CHUNK_NAME.Start],\n  [CLASS_DEFINE_CHUNK_NAME.StaticMethod]: [\n    CLASS_DEFINE_CHUNK_NAME.Start, CLASS_DEFINE_CHUNK_NAME.StaticVar,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.InsVar]: [\n    CLASS_DEFINE_CHUNK_NAME.Start,\n    CLASS_DEFINE_CHUNK_NAME.StaticVar,\n    CLASS_DEFINE_CHUNK_NAME.StaticMethod,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.InsVarMethod]: [\n    CLASS_DEFINE_CHUNK_NAME.Start,\n    CLASS_DEFINE_CHUNK_NAME.StaticVar,\n    CLASS_DEFINE_CHUNK_NAME.StaticMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsVar,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.InsMethod]: [\n    CLASS_DEFINE_CHUNK_NAME.Start,\n    CLASS_DEFINE_CHUNK_NAME.StaticVar,\n    CLASS_DEFINE_CHUNK_NAME.StaticMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsVar,\n    CLASS_DEFINE_CHUNK_NAME.InsVarMethod,\n    CLASS_DEFINE_CHUNK_NAME.ConstructorEnd,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod]: [\n    CLASS_DEFINE_CHUNK_NAME.Start,\n    CLASS_DEFINE_CHUNK_NAME.StaticVar,\n    CLASS_DEFINE_CHUNK_NAME.StaticMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsVar,\n    CLASS_DEFINE_CHUNK_NAME.InsVarMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsMethod,\n    CLASS_DEFINE_CHUNK_NAME.ConstructorEnd,\n  ],\n  [CLASS_DEFINE_CHUNK_NAME.End]: [\n    CLASS_DEFINE_CHUNK_NAME.Start,\n    CLASS_DEFINE_CHUNK_NAME.StaticVar,\n    CLASS_DEFINE_CHUNK_NAME.StaticMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsVar,\n    CLASS_DEFINE_CHUNK_NAME.InsVarMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsMethod,\n    CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n    CLASS_DEFINE_CHUNK_NAME.ConstructorEnd,\n  ],\n  [COMMON_CHUNK_NAME.FileMainContent]: [\n    COMMON_CHUNK_NAME.ExternalDepsImport,\n    COMMON_CHUNK_NAME.InternalDepsImport,\n    COMMON_CHUNK_NAME.ImportAliasDefine,\n    COMMON_CHUNK_NAME.FileVarDefine,\n    COMMON_CHUNK_NAME.FileUtilDefine,\n    CLASS_DEFINE_CHUNK_NAME.End,\n  ],\n  [COMMON_CHUNK_NAME.FileExport]: [\n    COMMON_CHUNK_NAME.ExternalDepsImport,\n    COMMON_CHUNK_NAME.InternalDepsImport,\n    COMMON_CHUNK_NAME.ImportAliasDefine,\n    COMMON_CHUNK_NAME.FileVarDefine,\n    COMMON_CHUNK_NAME.FileUtilDefine,\n    CLASS_DEFINE_CHUNK_NAME.End,\n    COMMON_CHUNK_NAME.FileMainContent,\n  ],\n  [COMMON_CHUNK_NAME.StyleDepsImport]: [],\n  [COMMON_CHUNK_NAME.StyleCssContent]: [COMMON_CHUNK_NAME.StyleDepsImport],\n  [COMMON_CHUNK_NAME.HtmlContent]: [],\n};\n\n// VUE代码块插入顺序\nexport const VUE_DEFAULT_LINK_AFTER = {\n  [TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart]: [],\n  [TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom]: [TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart],\n  [TEMPLATE_DEFINE_CHUNK_NAME.TemplateEnd]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart, TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.TemplateEnd,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart,\n    TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.ConstVar]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.LetVar]: [TEMPLATE_DEFINE_CHUNK_NAME.ConstVar],\n\n  [TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapStart]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.LetVar,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapContent]: [TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapStart],\n  [TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapEnd]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapStart, TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapContent,\n  ],\n\n  [TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapEnd,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent]: [TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart],\n  [TEMPLATE_DEFINE_CHUNK_NAME.OnMountedEnd]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart, TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.UnMountedStart]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.OnMountedEnd,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.UnMountedContent]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.UnMountedStart,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.UnMountedStart,\n    TEMPLATE_DEFINE_CHUNK_NAME.UnMountedContent,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.Method]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart, TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd, TEMPLATE_DEFINE_CHUNK_NAME.Method,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.CssStyleStart]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.CssStyleImport]: [\n    TEMPLATE_DEFINE_CHUNK_NAME.CssStyleStart,\n  ],\n  [TEMPLATE_DEFINE_CHUNK_NAME.CssStyleEnd]: [TEMPLATE_DEFINE_CHUNK_NAME.CssStyleStart, TEMPLATE_DEFINE_CHUNK_NAME.CssStyleImport]\n};\n\nexport const COMMON_SUB_MODULE_NAME = 'Index';\n// vue 物料包\nexport const VUE_MODULE_NAME = '@dckj-npm/lowcode-vue-materials';\n","/**\n * 获取错误信息\n */\nexport function getErrorMessage(error: unknown): string | null {\n  if (!error) {\n    return null;\n  }\n\n  if (error instanceof Error) {\n    return error.message;\n  }\n\n  if (typeof error === 'string') {\n    return error;\n  }\n\n  if (typeof error === 'object' && error !== null) {\n    return (\n      getErrorMessage((error as { message: string }).message) ||\n      getErrorMessage((error as { errorMessage: string }).errorMessage) ||\n      getErrorMessage((error as { detail: string }).detail)\n    );\n  }\n\n  return null;\n}\n","import * as _ from 'lodash';\nimport {\n  IPublicTypeJSExpression,\n  IPublicTypeNodeData,\n  IPublicTypeNodeSchema,\n  isJSExpression,\n  isJSSlot,\n  isDOMText,\n  IPublicTypeContainerSchema,\n  IPublicTypeNpmInfo,\n  IPublicTypeCompositeValue,\n  isNodeSchema,\n  isJSFunction,\n} from '@alilc/lowcode-types';\nimport { CodeGeneratorError } from '../types/error';\nimport { isJSExpressionFn } from './common';\n\nexport function isContainerSchema(x: any): x is IPublicTypeContainerSchema {\n  return (\n    typeof x === 'object' &&\n    x &&\n    typeof x.componentName === 'string' &&\n    typeof x.fileName === 'string'\n  );\n}\n\nexport function isNpmInfo(x: any): x is IPublicTypeNpmInfo {\n  return typeof x === 'object' && x && typeof x.package === 'string';\n}\n\nconst noop = () => undefined;\n\nconst handleChildrenDefaultOptions = {\n  rerun: false,\n};\n\nconst DEFAULT_MAX_DEPTH = 100000;\n\n/**\n * 遍历并处理所有的子节点\n * @param children\n * @param handlers\n * @param options\n * @returns\n */\nexport function handleSubNodes<T>(\n  children: IPublicTypeNodeSchema['children'],\n  handlers: {\n    string?: (i: string) => T;\n    expression?: (i: IPublicTypeJSExpression) => T;\n    node?: (i: IPublicTypeNodeSchema) => T;\n  },\n  options?: {\n    rerun?: boolean;\n    maxDepth?: number; // 防止出现死循环无穷递归\n  },\n): T[] {\n  const opt = {\n    ...handleChildrenDefaultOptions,\n    ...(options || {}),\n  };\n  const maxDepth = opt.maxDepth ?? DEFAULT_MAX_DEPTH;\n  if (maxDepth <= 0) {\n    throw new Error('handleSubNodes maxDepth reached');\n  }\n\n  if (Array.isArray(children)) {\n    const list: IPublicTypeNodeData[] = children as IPublicTypeNodeData[];\n    return list\n      .map((child) => handleSubNodes(child, handlers, { ...opt, maxDepth: maxDepth - 1 }))\n      .reduce((p, c) => p.concat(c), []);\n  }\n\n  let result: T | undefined;\n  const childrenRes: T[] = [];\n  if (children === null || children === undefined) {\n    return [];\n  } else if (isDOMText(children)) {\n    const handler = handlers.string || noop;\n    result = handler(children);\n  } else if (isJSExpression(children)) {\n    const handler = handlers.expression || noop;\n    result = handler(children);\n  } else if (isJSSlot(children)) {\n    return handleSubNodes(children.value, handlers, { ...opt, maxDepth: maxDepth - 1 });\n  } else if (isNodeSchema(children)) {\n    const handler = handlers.node || noop;\n    const child = children as IPublicTypeNodeSchema;\n    result = handler(child);\n\n    if (child.children) {\n      const childRes = handleSubNodes(child.children, handlers, opt);\n      childrenRes.push(...childRes);\n    }\n\n    if (child.props) {\n      if (Array.isArray(child.props)) {\n        child.props.forEach(({ value }) => {\n          const childRes = handleCompositeValueInProps(value);\n          childrenRes.push(...childRes);\n        });\n      } else {\n        Object.values(child.props).forEach((value) => {\n          const childRes = handleCompositeValueInProps(value as IPublicTypeCompositeValue);\n          childrenRes.push(...childRes);\n        });\n      }\n    }\n  } else {\n    throw new CodeGeneratorError('handleSubNodes got invalid NodeData', children);\n  }\n\n  if (result !== undefined) {\n    childrenRes.unshift(result);\n  }\n\n  return childrenRes;\n\n  function handleCompositeValueInProps(value: IPublicTypeCompositeValue): T[] {\n    if (isJSSlot(value)) {\n      return handleSubNodes(value.value, handlers, { ...opt, maxDepth: maxDepth - 1 });\n    }\n\n    // CompositeArray\n    if (Array.isArray(value)) {\n      return _.flatMap(value, (v) => handleCompositeValueInProps(v));\n    }\n\n    // IPublicTypeCompositeObject\n    if (\n      !isJSExpression(value) &&\n      !isJSExpressionFn(value) &&\n      !isJSFunction(value) &&\n      typeof value === 'object' &&\n      value !== null\n    ) {\n      return _.flatMap(Object.values(value), (v) => handleCompositeValueInProps(v));\n    }\n\n    return [];\n  }\n}\n\nexport function isValidContainerType(schema: IPublicTypeNodeSchema) {\n  return [\n    'Page',\n    'Component',\n    'Block',\n  ].includes(schema.componentName);\n}\n\nexport const enum ContainerType {\n  Page = 'Page',\n  Component = 'Component',\n  Block = 'Block',\n}","import type { IPublicTypeJSExpression, IPublicTypeJSFunction } from '@alilc/lowcode-types';\nimport changeCase from './changeCaseCompat';\nimport short from 'short-uuid';\nimport { DependencyType, IDependency, IExternalDependency, IInternalDependency } from '../types';\n\n// Doc: https://www.npmjs.com/package/change-case\n\nexport function camel2dash(input: string): string {\n  return changeCase.paramCase(input);\n}\n\n/**\n * 转为驼峰\n */\nexport function camelize(str: string): string {\n  return changeCase.camelCase(str);\n}\n\nexport function generateID(): string {\n  return short.generate();\n}\n\nexport function upperCaseFirst(inputValue: string): string {\n  return changeCase.upperCaseFirst(inputValue);\n}\n\nexport function uniqueArray<T>(arr: T[], by: (i: T) => string) {\n  const map: Record<string, T> = {};\n  arr.forEach((item) => {\n    map[by(item)] = item;\n  });\n  // FIXME: Babel 编译存在问题，暂时替换实现\n  // const uniqueKeys = [...new Set<string>(Object.keys(map))];\n  const uniqueKeys = Array.from(new Set<string>(Object.keys(map)));\n  const uniqueItems = uniqueKeys.map((key) => map[key]);\n  return uniqueItems;\n}\n\nexport function getStaticExprValue<T>(expr: string): T {\n  // TODO: 需要安全性检查\n  // eslint-disable-next-line no-new-func\n  return Function(`\"use strict\";return (${expr})`)();\n}\n\nexport function isJSExpressionFn(data: any): data is IPublicTypeJSFunction {\n  return data?.type === 'JSExpression' && data?.extType === 'function';\n}\n\nexport function isInternalDependency(\n  dependency: IDependency,\n): dependency is IInternalDependency {\n  return dependency.dependencyType === DependencyType.Internal;\n}\n\nexport function isExternalDependency(\n  dependency: IDependency,\n): dependency is IExternalDependency {\n  return dependency.dependencyType === DependencyType.External;\n}","import type { IPublicTypeNodeSchema, IPublicTypeCompositeObject } from '@alilc/lowcode-types';\nimport type { TComponentAnalyzer } from '../types';\n\nimport { handleSubNodes } from '../utils/schema';\n\nexport const componentAnalyzer: TComponentAnalyzer = (container) => {\n  let hasRefAttr = false;\n  const nodeValidator = (n: IPublicTypeNodeSchema) => {\n    if (n.props) {\n      const props = n.props as IPublicTypeCompositeObject;\n      if (props.ref) {\n        hasRefAttr = true;\n      }\n    }\n  };\n\n  nodeValidator(container);\n\n  if (!hasRefAttr && container.children) {\n    // eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n    handleSubNodes<void>(\n      container.children,\n      {\n        node: nodeValidator,\n      },\n      {\n        rerun: true,\n      },\n    );\n  }\n\n  return {\n    isUsingRef: hasRefAttr,\n  };\n};\n","export const isValidIdentifier = (name: string) => {\n  return /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/.test(name);\n};\n\nexport const isValidComponentName = (name: string) => {\n  return /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF.]*$/.test(name);\n};\n\nexport const ensureValidClassName = (name: string) => {\n  if (!isValidIdentifier(name)) {\n    return `$${name.replace(/[^_$a-zA-Z0-9]/g, '')}`;\n  }\n  return name;\n};\n/**\n * 判断是否是vue的内置指令\n * @param name\n */\nexport const isValidVueDirective = (name: string) => {\n  const directives = ['v-model', 'v-html', 'v-for', 'v-if', 'v-else', 'v-if-else', 'v-show'];\n  return directives.includes(name);\n};\n","/**\n * 解析器是对输入的固定格式数据做拆解，使其符合引擎后续步骤预期，完成统一处理逻辑的步骤。\n * 本解析器面向的是标准 schema 协议。\n */\nimport changeCase from '../utils/changeCaseCompat';\nimport {\n  IPublicTypeUtilItem,\n  IPublicTypeNodeDataType,\n  IPublicTypeNodeSchema,\n  IPublicTypeContainerSchema,\n  IPublicTypeProjectSchema,\n  IPublicTypePropsMap,\n  IPublicTypeNodeData,\n  IPublicTypeNpmInfo,\n} from '@alilc/lowcode-types';\nimport {\n  IPageMeta,\n  CodeGeneratorError,\n  CompatibilityError,\n  DependencyType,\n  IContainerInfo,\n  IDependency,\n  IExternalDependency,\n  IInternalDependency,\n  InternalDependencyType,\n  IParseResult,\n  ISchemaParser,\n  INpmPackage,\n  IRouterInfo,\n  ResourceListType,\n} from '../types';\n\nimport { SUPPORT_SCHEMA_VERSION_LIST } from '../const';\n\nimport { getErrorMessage } from '../utils/errors';\nimport { handleSubNodes, isValidContainerType, ContainerType } from '../utils/schema';\nimport { uniqueArray } from '../utils/common';\nimport { componentAnalyzer } from '../analyzer/componentAnalyzer';\nimport { ensureValidClassName } from '../utils/validate';\nimport type { ProjectRemark } from '../types/intermediate';\nimport { isFormPage } from '../utils/dataSource';\n\nconst defaultContainer: IContainerInfo = {\n  containerType: 'Component',\n  componentName: 'Component',\n  moduleName: 'Index',\n  fileName: 'Index',\n  css: '',\n  props: {},\n};\n\nfunction getRootComponentName(typeName: string, maps: Record<string, IExternalDependency>): string {\n  if (maps[typeName]) {\n    const rec = maps[typeName];\n    if (rec.destructuring) {\n      return rec.componentName || typeName;\n    }\n\n    const peerName = Object.keys(maps).find((depName: string) => {\n      const depInfo = maps[depName];\n      return (\n        depName !== typeName &&\n        !depInfo.destructuring &&\n        depInfo.package === rec.package &&\n        depInfo.version === rec.version &&\n        depInfo.main === rec.main &&\n        depInfo.exportName === rec.exportName &&\n        depInfo.subName === rec.subName\n      );\n    });\n\n    return peerName || typeName;\n  }\n  return typeName;\n}\n\nfunction processChildren(schema: IPublicTypeNodeSchema): void {\n  if (schema.props) {\n    if (Array.isArray(schema.props)) {\n      // FIXME: is array type props description\n    } else {\n      const nodeProps = schema.props as IPublicTypePropsMap;\n      if (nodeProps.children) {\n        if (!schema.children) {\n          // eslint-disable-next-line no-param-reassign\n          schema.children = nodeProps.children as IPublicTypeNodeDataType;\n        } else {\n          let _children: IPublicTypeNodeData[] = [];\n\n          if (Array.isArray(schema.children)) {\n            _children = _children.concat(schema.children);\n          } else {\n            _children.push(schema.children);\n          }\n\n          if (Array.isArray(nodeProps.children)) {\n            _children = _children.concat(nodeProps.children as IPublicTypeNodeData[]);\n          } else {\n            _children.push(nodeProps.children as IPublicTypeNodeData);\n          }\n\n          // eslint-disable-next-line no-param-reassign\n          schema.children = _children;\n        }\n        delete nodeProps.children;\n      }\n    }\n  }\n}\n\nfunction getInternalDep(internalDeps: Record<string, IInternalDependency>, depName: string) {\n  const dep = internalDeps[depName];\n  return dep && dep.type !== InternalDependencyType.PAGE ? dep : null;\n}\n\nexport class SchemaParser implements ISchemaParser {\n  validate(schema: IPublicTypeProjectSchema): boolean {\n    if (SUPPORT_SCHEMA_VERSION_LIST.indexOf(schema.version) < 0) {\n      throw new CompatibilityError(`Not support schema with version [${schema.version}]`);\n    }\n\n    return true;\n  }\n\n  parse(schemaSrc: IPublicTypeProjectSchema | string): IParseResult {\n    // TODO: collect utils depends in JSExpression\n    const compDeps: Record<string, IExternalDependency> = {};\n    const internalDeps: Record<string, IInternalDependency> = {};\n    let utilsDeps: IExternalDependency[] = [];\n\n    const schema = this.decodeSchema(schemaSrc);\n\n    // 解析三方组件依赖\n    schema.componentsMap.forEach((info: any) => {\n      if (info.componentName) {\n        compDeps[info.componentName] = {\n          ...info,\n          dependencyType: DependencyType.External,\n          componentName: info.componentName,\n          exportName: info.exportName ?? info.componentName,\n          version: info.version || '*',\n          destructuring: info.destructuring ?? false,\n        };\n      }\n    });\n\n    let containers: IContainerInfo[];\n    // Test if this is a lowcode component without container\n    if (schema.componentsTree.length > 0) {\n      const firstRoot: IPublicTypeContainerSchema = schema\n        .componentsTree[0] as IPublicTypeContainerSchema;\n\n      if (!firstRoot.fileName && !isValidContainerType(firstRoot)) {\n        // 整个 schema 描述一个容器，且无根节点定义\n        const container: IContainerInfo = {\n          ...firstRoot,\n          ...defaultContainer,\n          props: firstRoot.props || defaultContainer.props,\n          css: firstRoot.css || defaultContainer.css,\n          moduleName: (firstRoot as IContainerInfo).moduleName || defaultContainer.moduleName,\n          children: schema.componentsTree as IPublicTypeNodeSchema[],\n        };\n        containers = [container];\n      } else {\n        // 普通带 1 到多个容器的 schema\n        containers = schema.componentsTree.map((n) => {\n          const subRoot = n as IPublicTypeContainerSchema;\n          const container: IContainerInfo = {\n            ...subRoot,\n            componentName: getRootComponentName(subRoot.componentName, compDeps),\n            containerType: subRoot.componentName,\n            moduleName: ensureValidClassName(\n              subRoot.componentName === ContainerType.Component\n                ? subRoot.fileName\n                : changeCase.pascalCase(subRoot.fileName),\n            ),\n          };\n          return container;\n        });\n      }\n    } else {\n      throw new CodeGeneratorError(\"Can't find anything to generate.\");\n    }\n\n    // 分析引用能力的依赖\n    containers = containers.map((con) => ({\n      ...con,\n      analyzeResult: componentAnalyzer(con as IPublicTypeContainerSchema),\n    }));\n\n    // 建立所有容器的内部依赖索引\n    containers.forEach((container) => {\n      let type;\n      switch (container.containerType) {\n        case 'Page':\n          type = InternalDependencyType.PAGE;\n          break;\n        case 'Block':\n          type = InternalDependencyType.BLOCK;\n          break;\n        default:\n          type = InternalDependencyType.COMPONENT;\n          break;\n      }\n\n      const dep: IInternalDependency = {\n        type,\n        moduleName: container.moduleName,\n        destructuring: false,\n        exportName: container.moduleName,\n        dependencyType: DependencyType.Internal,\n      };\n\n      internalDeps[dep.moduleName] = dep;\n    });\n\n    const containersDeps = ([] as IDependency[]).concat(...containers.map((c) => c.deps || []));\n    // TODO: 不应该在出码部分解决？\n    // 处理 children 写在了 props 里的情况\n    containers.forEach((container) => {\n      if (container.children) {\n        // eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n        handleSubNodes<void>(\n          container.children,\n          {\n            node: (i: IPublicTypeNodeSchema) => processChildren(i),\n          },\n          {\n            rerun: true,\n          },\n        );\n      }\n    });\n\n    containers.forEach((container) => {\n      const depNames = this.getComponentNames(container);\n      // eslint-disable-next-line no-param-reassign\n      container.deps = uniqueArray<string>(depNames, (i: string) => i)\n        .map((depName) => {\n          const internal = getInternalDep(internalDeps, depName);\n          if (internal) {\n            return internal;\n          }\n\n          const external = compDeps[depName];\n          if (external) {\n            return external;\n          }\n\n          // If schema references a sub-component like \"Menu.Item\" but componentsMap doesn't\n          // include it, infer it from the root component \"Menu\".\n          if (depName.includes('.')) {\n            const parts = depName.split('.').filter(Boolean);\n            const rootName = parts[0];\n            const subName = parts[parts.length - 1];\n            const rootDep = compDeps[rootName];\n            if (rootDep) {\n              return {\n                ...rootDep,\n                dependencyType: DependencyType.External,\n                componentName: depName,\n                exportName: rootDep.exportName || rootName,\n                destructuring: true,\n                subName,\n              } as IExternalDependency;\n            }\n          }\n\n          return null;\n        })\n        .filter(Boolean) as IDependency[];\n      // container.deps = Object.keys(compDeps).map((depName) => compDeps[depName]);\n    });\n\n    // 分析路由配置\n    const routes: IRouterInfo['routes'] = schemaSrc.routes\n      ? schemaSrc.routes\n      : containers\n          .filter((container) => container.containerType === 'Page')\n          .map((page) => {\n            const { meta } = page;\n            if (meta) {\n              return {\n                path: (meta as IPageMeta).router || `/${page.fileName}`, // 如果无法找到页面路由信息，则用 fileName 做兜底\n                fileName: page.fileName,\n                componentName: page.moduleName,\n                isFormRouter: page.state['pageType'] == 'form',\n              };\n            }\n\n            return {\n              path: `/${page.fileName}`,\n              fileName: page.fileName,\n              componentName: page.moduleName,\n              isFormRouter: page.state['pageType'] == 'form',\n            };\n          });\n\n    const routerDeps = routes\n      .map((r) => internalDeps[r.componentName] || compDeps[r.componentName])\n      .filter((dep) => !!dep);\n\n    // 分析 Utils 依赖\n    let utils: IPublicTypeUtilItem[];\n    if (schema.utils) {\n      utils = schema.utils;\n      utilsDeps = schema.utils\n        .filter(\n          (u): u is { name: string; type: 'npm' | 'tnpm'; content: IPublicTypeNpmInfo } =>\n            u.type !== 'function',\n        )\n        .map(\n          (u): IExternalDependency => ({\n            ...u.content,\n            componentName: u.name,\n            version: u.content.version || '*',\n            destructuring: u.content.destructuring ?? false,\n            exportName: u.content.exportName ?? u.name,\n          }),\n        );\n    } else {\n      utils = [];\n    }\n\n    // 分析项目 npm 依赖\n    let npms: INpmPackage[] = [];\n    containers.forEach((con) => {\n      const p = (con.deps || [])\n        .map((dep) => {\n          return dep.dependencyType === DependencyType.External ? dep : null;\n        })\n        .filter((dep) => dep !== null);\n      const npmInfos: INpmPackage[] = p.filter(Boolean).map((i) => ({\n        package: (i as IExternalDependency).package,\n        version: (i as IExternalDependency).version,\n      }));\n      npms.push(...npmInfos);\n    });\n\n    npms.push(\n      ...utilsDeps.map((utilsDep) => ({\n        package: utilsDep.package,\n        version: utilsDep.version,\n      })),\n    );\n\n    npms = uniqueArray<INpmPackage>(npms, (i) => i.package).filter(Boolean);\n\n    return {\n      containers,\n      globalUtils: {\n        utils,\n        deps: utilsDeps,\n      },\n      globalI18n: schema.i18n,\n      globalRouter: {\n        routes,\n        deps: routerDeps,\n      },\n      project: {\n        css: schema.css,\n        constants: schema.constants,\n        config: schema.config || {},\n        meta: schema.meta || {},\n        i18n: schema.i18n,\n        containersDeps,\n        utilsDeps,\n        packages: npms || [],\n        dataSourcesTypes: this.collectDataSourcesTypes(schema),\n        projectRemark: this.getProjectRemark(containers),\n      },\n    };\n  }\n\n  getProjectRemark(containers: IContainerInfo[]): ProjectRemark {\n    return {\n      isSingleComponent: containers.length === 1 && containers[0].containerType === 'Component',\n    };\n  }\n\n  getComponentNames(children: IPublicTypeNodeDataType): string[] {\n    return handleSubNodes<string>(\n      children,\n      {\n        node: (i: IPublicTypeNodeSchema) => i.componentName,\n      },\n      {\n        rerun: true,\n      },\n    );\n  }\n\n  decodeSchema(schemaSrc: string | IPublicTypeProjectSchema): IPublicTypeProjectSchema {\n    let schema: IPublicTypeProjectSchema;\n    if (typeof schemaSrc === 'string') {\n      try {\n        schema = JSON.parse(schemaSrc);\n      } catch (error) {\n        throw new CodeGeneratorError(\n          `Parse schema failed: ${getErrorMessage(error) || 'unknown reason'}`,\n        );\n      }\n    } else {\n      schema = schemaSrc;\n    }\n    return schema;\n  }\n\n  private collectDataSourcesTypes(schema: IPublicTypeProjectSchema): string[] {\n    const dataSourcesTypes = new Set<string>();\n\n    // 数据源的默认类型为 fetch\n    const defaultDataSourceType = 'fetch';\n\n    // 收集应用级别的数据源\n    schema.dataSource?.list?.forEach((ds) => {\n      dataSourcesTypes.add(ds.type || defaultDataSourceType);\n    });\n\n    // 收集容器级别的数据源（页面/组件/区块）\n    schema.componentsTree.forEach((rootNode) => {\n      rootNode.dataSource?.list?.forEach((ds) => {\n        dataSourcesTypes.add(ds.type || defaultDataSourceType);\n      });\n    });\n\n    return Array.from(dataSourcesTypes.values());\n  }\n}\n\n/**\n * 生成router信息\n * @param originalSchema\n * @param resourceList\n */\nexport function handleRouter(\n  originalSchema: IPublicTypeProjectSchema[],\n  resourceList: ResourceListType[],\n) {\n  if (!resourceList || resourceList.length == 0) {\n    return '';\n  }\n  return resourceList\n    .map((item) => {\n      // 找到页面对应的schema\n      const schema = originalSchema.find((s) => s.componentsTree[0].fileName === item.slug);\n      if (!schema) return '';\n      const page = schema?.componentsTree[0];\n      return {\n        path: `/${page?.fileName}`, // 如果无法找到页面路由信息，则用 fileName 做兜底\n        fileName: page?.fileName,\n        componentName: page?.moduleName || capitalizeFirstLetter(page?.fileName),\n        isFormRouter: page?.state['pageType'] == 'form',\n        firstPage: item.firstPage,\n        title: item.title,\n      };\n    })\n    .filter((item) => item);\n}\n\n/**\n * 首字母大写,并且短横线去掉\n * @param str\n */\nfunction capitalizeFirstLetter(str: string) {\n  if (!str) return '';\n  return str\n    .split('-') // 按照短横线分割字符串\n    .map(\n      (\n        word, // 遍历每个单词\n      ) => word.charAt(0).toUpperCase() + word.slice(1), // 每个单词首字母大写\n    )\n    .join('');\n}\n\nexport default SchemaParser;\n","import { ResultFile, ResultDir } from '@alilc/lowcode-types';\nimport nm from 'nanomatch';\n\nimport { CodeGeneratorError } from '../types/error';\nimport { FlattenFile } from '../types/file';\n\nexport function createResultFile(name: string, ext = 'jsx', content = ''): ResultFile {\n  return {\n    name,\n    ext,\n    content,\n  };\n}\n\nexport function createResultDir(name: string): ResultDir {\n  return {\n    name,\n    dirs: [],\n    files: [],\n  };\n}\n\nexport function addDirectory(target: ResultDir, dir: ResultDir): void {\n  if (target.dirs.findIndex((d) => d.name === dir.name) < 0) {\n    target.dirs.push(dir);\n  } else {\n    throw new CodeGeneratorError(\n      `Adding same directory to one directory: ${dir.name} -> ${target.name}`,\n    );\n  }\n}\n\nexport function addFile(target: ResultDir, file: ResultFile): void {\n  if (target.files.findIndex((f) => f.name === file.name && f.ext === file.ext) < 0) {\n    target.files.push(file);\n  } else {\n    throw new CodeGeneratorError(\n      `Adding same file to one directory: ${file.name} -> ${target.name}`,\n    );\n  }\n}\n\nexport function flattenResult(dir: ResultDir, cwd = ''): FlattenFile[] {\n  if (!dir.files.length && !dir.dirs.length) {\n    return [];\n  }\n\n  return [\n    ...dir.files.map(\n      (file): FlattenFile => ({\n        pathName: joinPath(cwd, `${file.name}${file.ext ? `.${file.ext}` : ''}`),\n        content: file.content,\n      }),\n    ),\n  ].concat(...dir.dirs.map((subDir) => flattenResult(subDir, joinPath(cwd, subDir.name))));\n}\n\nexport type GlobOptions = {\n  /** 是否查找 \".xxx\" 文件, 默认: 否 */\n  dot?: boolean;\n};\n\n/**\n * 查找文件\n * @param result 出码结果\n * @param fileGlobExpr 文件名匹配表达式\n * @param resultDirPath 出码结果的路径（默认是 '.'）\n * @returns 匹配的第一个文件或 null （找不到）\n */\nexport function findFile(\n  result: ResultDir,\n  fileGlobExpr: string,\n  options: GlobOptions = {},\n  resultDirPath = getResultNameOrDefault(result, ''),\n): ResultFile | null {\n  const maxDepth = !/\\/|\\*\\*/.test(fileGlobExpr) ? 1 : undefined; // 如果 glob 表达式里面压根不会匹配子目录，则深度限制为 1\n  const files = scanFiles(result, resultDirPath, maxDepth);\n\n  for (let [filePath, file] of files) {\n    if (nm.isMatch(filePath, fileGlobExpr, options)) {\n      return file;\n    }\n  }\n\n  return null;\n}\n\n/**\n * 使用 glob 语法查找多个文件\n * @param result 出码结果\n * @param fileGlobExpr 文件名匹配表达式\n * @param resultDirPath 出码结果的路径（默认是 '.'）\n * @returns 找到的文件列表的迭代器 [ [文件路径, 文件信息], ... ]\n */\nexport function* globFiles(\n  result: ResultDir,\n  fileGlobExpr: string,\n  options: GlobOptions = {},\n  resultDirPath = getResultNameOrDefault(result, ''),\n): IterableIterator<[string, ResultFile]> {\n  const files = scanFiles(result, resultDirPath);\n\n  for (let [filePath, file] of files) {\n    if (nm.isMatch(filePath, fileGlobExpr, options)) {\n      yield [filePath, file];\n    }\n  }\n}\n\n/**\n * 遍历所有的文件\n */\nexport function* scanFiles(\n  result: ResultDir,\n  resultDirPath = getResultNameOrDefault(result, ''),\n  maxDepth = 10000,\n): IterableIterator<[string, ResultFile]> {\n  for (let file of result.files) {\n    const fileName = getFileNameWithExt(file);\n    yield [joinPath(resultDirPath, fileName), file];\n  }\n\n  for (let subDir of result.dirs) {\n    yield* scanFiles(subDir, joinPath(resultDirPath, subDir.name), maxDepth - 1);\n  }\n}\n\nexport function getFileNameWithExt(file: ResultFile) {\n  return `${file.name}${file.ext ? `.${file.ext}` : ''}`;\n}\n\nfunction getResultNameOrDefault(result: ResultDir, defaultDir = '/') {\n  return result.name && result.name !== '.' ? result.name : defaultDir;\n}\n\nfunction joinPath(...pathParts: string[]): string {\n  return pathParts\n    .filter((x) => x !== '' && x !== '.')\n    .join('/')\n    .replace(/\\\\+/g, '/')\n    .replace(/\\/+/g, '/');\n}\n\nexport function* scanDirs(\n  result: ResultDir,\n  resultDirPath = getResultNameOrDefault(result, ''),\n  maxDepth = 10000,\n): IterableIterator<[string, ResultDir]> {\n  yield [resultDirPath, result];\n\n  for (let subDir of result.dirs) {\n    yield* scanDirs(subDir, joinPath(resultDirPath, subDir.name), maxDepth - 1);\n  }\n}\n\nexport function* globDirs(\n  result: ResultDir,\n  dirGlobExpr: string,\n  options: GlobOptions = {},\n  resultDirPath = getResultNameOrDefault(result, ''),\n): IterableIterator<[string, ResultDir]> {\n  const dirs = scanDirs(result, resultDirPath);\n\n  for (let [dirPath, dir] of dirs) {\n    if (nm.isMatch(dirPath, dirGlobExpr, options)) {\n      yield [dirPath, dir];\n    }\n  }\n}\n\nexport function findDir(\n  result: ResultDir,\n  dirGlobExpr: string,\n  options: GlobOptions = {},\n  resultDirPath = getResultNameOrDefault(result, ''),\n): ResultDir | null {\n  const dirs = scanDirs(result, resultDirPath);\n\n  for (let [dirPath, dir] of dirs) {\n    if (nm.isMatch(dirPath, dirGlobExpr, options)) {\n      return dir;\n    }\n  }\n\n  return null;\n}\n\n/**\n * 从结果中移除一些文件\n * @param result 出码结果目录\n * @param filePathGlobExpr 要移除的文件路径（glob 表达式）\n * @param globOptions glob 参数\n * @returns 移除了多少文件\n */\nexport function removeFilesFromResult(\n  result: ResultDir,\n  filePathGlobExpr: string,\n  globOptions: GlobOptions = {},\n): number {\n  let removedCount = 0;\n  const [dirPath, fileName] = splitPath(filePathGlobExpr);\n\n  const dirs = dirPath ? globDirs(result, dirPath) : [['', result] as const];\n  for (let [, dir] of dirs) {\n    const files = globFiles(dir, fileName, globOptions, '.');\n    for (let [, file] of files) {\n      dir.files.splice(dir.files.indexOf(file), 1);\n      removedCount += 1;\n    }\n  }\n\n  return removedCount;\n}\n\n/**\n * 从结果中移除一些目录\n * @param result 出码结果目录\n * @param dirPathGlobExpr 要移除的目录路径（glob 表达式）\n * @param globOptions glob 参数\n * @returns 移除了多少文件\n */\nexport function removeDirsFromResult(\n  result: ResultDir,\n  dirPathGlobExpr: string,\n  globOptions: GlobOptions = {},\n): number {\n  let removedCount = 0;\n  const [dirPath, fileName] = splitPath(dirPathGlobExpr);\n\n  const dirs = dirPath ? globDirs(result, dirPath) : [['', result] as const];\n  for (let [, dir] of dirs) {\n    const foundDirs = globDirs(dir, fileName, globOptions, '.');\n    for (let [, foundDir] of foundDirs) {\n      dir.dirs.splice(dir.dirs.indexOf(foundDir), 1);\n      removedCount += 1;\n    }\n  }\n\n  return removedCount;\n}\n\n/**\n * 将文件路径拆分为目录路径和文件名\n * @param filePath\n * @returns [fileDirPath, fileName]\n */\nfunction splitPath(filePath: string) {\n  const parts = filePath.split('/');\n  const fileName = parts.pop() || '';\n  return [joinPath(...parts), fileName];\n}\n","import { BuilderComponentPlugin, IChunkBuilder, ICodeChunk, ICodeStruct, FileType } from '../types';\n\nimport { COMMON_SUB_MODULE_NAME } from '../const/generator';\nimport { FILE_TYPE_FAMILY } from '../const/file';\n\ninterface ChunkGroupInfo {\n  chunk: ICodeChunk;\n  familyIdx?: number;\n}\n\nfunction whichFamily(type: FileType): [number, FileType[]] | undefined {\n  const idx = FILE_TYPE_FAMILY.findIndex((family) => family.indexOf(type) >= 0);\n  if (idx < 0) {\n    return undefined;\n  }\n  return [idx, FILE_TYPE_FAMILY[idx]];\n}\n\n/**\n * 代码片段分组\n * @param chunks\n */\nexport const groupChunks = (chunks: ICodeChunk[]): ICodeChunk[][] => {\n  const tmp: Record<string, Record<number, number>> = {};\n  const col = chunks.reduce((chunksSet: Record<string, ChunkGroupInfo[]>, chunk) => {\n    const fileKey = chunk.subModule || COMMON_SUB_MODULE_NAME;\n    if (!chunksSet[fileKey]) {\n      // eslint-disable-next-line no-param-reassign\n      chunksSet[fileKey] = [];\n    }\n    // 获取文件类型\n    const res = whichFamily(chunk.fileType as FileType);\n    const info: ChunkGroupInfo = {\n      chunk,\n    };\n    if (res) {\n      const [familyIdx, family] = res;\n      const rank = family.indexOf(chunk.fileType as FileType);\n      if (tmp[fileKey]) {\n        if (tmp[fileKey][familyIdx] !== undefined) {\n          if (tmp[fileKey][familyIdx] > rank) {\n            tmp[fileKey][familyIdx] = rank;\n          }\n        } else {\n          tmp[fileKey][familyIdx] = rank;\n        }\n      } else {\n        tmp[fileKey] = {};\n        tmp[fileKey][familyIdx] = rank;\n      }\n      info.familyIdx = familyIdx;\n    }\n\n    chunksSet[fileKey].push(info);\n    return chunksSet;\n  }, {});\n\n  const result: ICodeChunk[][] = [];\n  Object.keys(col).forEach((key) => {\n    const byType: Record<string, ICodeChunk[]> = {};\n    col[key].forEach((info) => {\n      let t: string = info.chunk.fileType;\n      if (info.familyIdx !== undefined) {\n        t = FILE_TYPE_FAMILY[info.familyIdx][tmp[key][info.familyIdx]];\n        // eslint-disable-next-line no-param-reassign\n        info.chunk.fileType = t;\n      }\n      if (!byType[t]) {\n        byType[t] = [];\n      }\n      byType[t].push(info.chunk);\n    });\n    result.push(...Object.keys(byType).map((t) => byType[t]));\n  });\n\n  return result;\n};\n\n/**\n * 代码片段构建器\n *\n * @export\n * @class ChunkBuilder\n * @template T\n */\nexport class ChunkBuilder implements IChunkBuilder {\n  private plugins: BuilderComponentPlugin[];\n\n  constructor(plugins: BuilderComponentPlugin[] = []) {\n    this.plugins = plugins;\n  }\n\n  async run(\n    ir: unknown,\n    initialStructure: ICodeStruct = {\n      ir,\n      chunks: [],\n      depNames: [],\n      contextData: {},\n    },\n  ) {\n    const structure = initialStructure;\n\n    // 依次执行plugins获取代码片段chunks\n    const finalStructure: ICodeStruct = await this.plugins.reduce(\n      async (previousPluginOperation: Promise<ICodeStruct>, plugin) => {\n        const modifiedStructure = await previousPluginOperation;\n        return plugin(modifiedStructure);\n      },\n      Promise.resolve(structure),\n    );\n\n    // 代码片段分组\n    const chunks = groupChunks(finalStructure.chunks);\n\n    return {\n      chunks,\n    };\n  }\n\n  getPlugins() {\n    return this.plugins;\n  }\n\n  addPlugin(plugin: BuilderComponentPlugin) {\n    this.plugins.push(plugin);\n  }\n}\n\nexport default ChunkBuilder;\n","import {\n  ChunkContent,\n  ChunkType,\n  CodeGeneratorError,\n  CodeGeneratorFunction,\n  ICodeBuilder,\n  ICodeChunk,\n} from '../types';\n\nexport class CodeBuilder implements ICodeBuilder {\n  private chunkDefinitions: ICodeChunk[] = [];\n\n  private generators: { [key: string]: CodeGeneratorFunction<ChunkContent> } = {\n    [ChunkType.STRING]: (str: string) => str, // no-op for string chunks\n    [ChunkType.JSON]: (json: Record<string, unknown>) => JSON.stringify(json), // stringify json to string\n  };\n\n  constructor(chunkDefinitions: ICodeChunk[] = []) {\n    this.chunkDefinitions = chunkDefinitions;\n  }\n\n  /**\n   * Links all chunks together based on their requirements. Returns an array\n   * of ordered chunk names which need to be compiled and glued together.\n   */\n  link(chunkDefinitions: ICodeChunk[] = []): { zIndex: number; content: string } {\n    let zIndexA = 0;\n    const chunks = chunkDefinitions || this.chunkDefinitions;\n    if (chunks.length <= 0) {\n      return { zIndex: 0, content: ''}\n    }\n\n    const unprocessedChunks = chunks.map((chunk) => {\n      return {\n        name: chunk.name,\n        type: chunk.type,\n        content: chunk.content,\n        linkAfter: this.cleanupInvalidChunks(chunk.linkAfter, chunks),\n        zIndex: chunk.zIndex || 0\n      };\n    });\n\n    const resultingString: string[] = [];\n\n    while (unprocessedChunks.length > 0) {\n      let indexToRemove = 0;\n      for (let index = 0; index < unprocessedChunks.length; index++) {\n        if (unprocessedChunks[index].linkAfter.length <= 0) {\n          indexToRemove = index;\n          break;\n        }\n      }\n\n      if (unprocessedChunks[indexToRemove].linkAfter.length > 0) {\n        throw new CodeGeneratorError(\n          'Operation aborted. Reason: cyclic dependency between chunks.',\n        );\n      }\n\n      const { type, content, name, zIndex } = unprocessedChunks[indexToRemove];\n      const compiledContent = this.generateByType(type, content);\n      if (compiledContent) {\n        resultingString.push(`${compiledContent}\\n`);\n        zIndexA = zIndex > zIndexA ? zIndex : zIndexA;\n      }\n\n      unprocessedChunks.splice(indexToRemove, 1);\n      if (!unprocessedChunks.some((ch) => ch.name === name)) {\n        unprocessedChunks.forEach(\n          // remove the processed chunk from all the linkAfter arrays from the remaining chunks\n          (ch) => {\n            // eslint-disable-next-line no-param-reassign\n            ch.linkAfter = ch.linkAfter.filter((after) => after !== name);\n          },\n        );\n      }\n    }\n\n    return { zIndex: zIndexA, content: resultingString.join('\\n')};\n  }\n\n  generateByType(type: string, content: unknown): string {\n    if (!content) {\n      return '';\n    }\n    if (Array.isArray(content)) {\n      return content.map((contentItem) => this.generateByType(type, contentItem)).join('\\n');\n    }\n\n    if (!this.generators[type]) {\n      throw new Error(\n        `Attempted to generate unknown type ${type}. Please register a generator for this type in builder/index.ts`,\n      );\n    }\n\n    return this.generators[type](content);\n  }\n\n  // remove invalid chunks (which did not end up being created) from the linkAfter fields\n  // one use-case is when you want to remove the import plugin\n  private cleanupInvalidChunks(linkAfter: string[], chunks: ICodeChunk[]) {\n    return linkAfter.filter((chunkName) => chunks.some((chunk) => chunk.name === chunkName));\n  }\n}\n\nexport default CodeBuilder;\n","import { IPublicTypeProjectSchema, ResultFile, ResultDir } from '@alilc/lowcode-types';\n\nimport {\n  BuilderComponentPlugin,\n  CodeGeneratorError,\n  ICodeChunk,\n  ICompiledModule,\n  IContextData,\n  IModuleBuilder,\n  IParseResult,\n  ISchemaParser,\n  PostProcessor,\n} from '../types';\n\nimport { COMMON_SUB_MODULE_NAME } from '../const/generator';\n\nimport { SchemaParser } from '../parser/SchemaParser';\nimport { ChunkBuilder } from './ChunkBuilder';\nimport { CodeBuilder } from './CodeBuilder';\nimport { createResultFile, createResultDir, addFile } from '../utils/resultHelper';\n\nexport function createModuleBuilder(\n  options: {\n    plugins: BuilderComponentPlugin[];\n    postProcessors: PostProcessor[];\n    mainFileName?: string;\n    contextData?: IContextData;\n  } = {\n    plugins: [],\n    postProcessors: [],\n  },\n): IModuleBuilder {\n  const chunkGenerator = new ChunkBuilder(options.plugins);\n  const linker = new CodeBuilder();\n\n  const generateModule = async (input: unknown): Promise<ICompiledModule> => {\n    const moduleMainName = options.mainFileName || COMMON_SUB_MODULE_NAME;\n    if (chunkGenerator.getPlugins().length <= 0) {\n      throw new CodeGeneratorError(\n        'No plugins found. Component generation cannot work without any plugins!',\n      );\n    }\n\n    let files: ResultFile[] = [];\n    // 获取chunks片段\n    const { chunks } = await chunkGenerator.run(input, {\n      ir: input,\n      chunks: [],\n      depNames: [],\n      contextData: options.contextData || {},\n    });\n\n    chunks.forEach((fileChunkList) => {\n      // 按照顺序正确排序，并组装返回代码字符串\n      const { content, zIndex } = linker.link(fileChunkList);\n      const file = createResultFile(\n        fileChunkList[0].subModule || moduleMainName,\n        fileChunkList[0].fileType,\n        content,\n      );\n      file.zIndex = zIndex;\n      files.push(file);\n    });\n\n    if (options.postProcessors.length > 0) {\n      files = files.map((file) => {\n        let { content, ext: type, name } = file;\n        // 调用预处理器\n        options.postProcessors.forEach((processer) => {\n          content = processer(content, type, name);\n        });\n        const resultFile = createResultFile(file.name, type, content);\n        resultFile.zIndex = file.zIndex;\n        return resultFile;\n      });\n    }\n\n    return {\n      files,\n    };\n  };\n\n  const generateModuleCode = async (schema: IPublicTypeProjectSchema | string): Promise<ResultDir> => {\n    // Init\n    const schemaParser: ISchemaParser = new SchemaParser();\n    const parseResult: IParseResult = schemaParser.parse(schema);\n\n    const containerInfo = parseResult.containers[0];\n    const { files } = await generateModule(containerInfo);\n\n    const dir = createResultDir(containerInfo.moduleName);\n    files.forEach((file) => addFile(dir, file));\n\n    return dir;\n  };\n\n  const linkCodeChunks = (chunks: Record<string, ICodeChunk[]>, fileName: string) => {\n    const files: ResultFile[] = [];\n\n    Object.keys(chunks).forEach((fileKey) => {\n      const fileChunkList = chunks[fileKey];\n      const { content, zIndex } = linker.link(fileChunkList);\n      const file = createResultFile(\n        fileChunkList[0].subModule || fileName,\n        fileChunkList[0].fileType,\n        content\n      );\n      file.zIndex = zIndex;\n      files.push(file);\n    });\n\n    return files;\n  };\n\n  return {\n    generateModule,\n    generateModuleCode,\n    linkCodeChunks,\n    addPlugin: chunkGenerator.addPlugin.bind(chunkGenerator),\n  };\n}\n","import { IPublicTypeProjectSchema, ResultDir, ResultFile } from '@alilc/lowcode-types';\n\nimport {\n  IModuleBuilder,\n  IParseResult,\n  IProjectBuilder,\n  IProjectPlugins,\n  IProjectTemplate,\n  ISchemaParser,\n  PostProcessor,\n  ResourceListType,\n} from '../types';\n\nimport { handleRouter, SchemaParser } from '../parser/SchemaParser';\nimport { addDirectory, addFile, createResultDir } from '../utils/resultHelper';\n\nimport { createModuleBuilder } from './ModuleBuilder';\nimport { IContextData, ProjectPostProcessor, ProjectPreProcessor } from '../types/core';\nimport { CodeGeneratorError } from '../types/error';\nimport { isBuiltinSlotName } from '../const';\n\ninterface IModuleInfo {\n  moduleName?: string;\n  path: string[];\n  files: ResultFile[];\n}\n\nexport interface ProjectBuilderInitOptions {\n  /** 项目模板 */\n  template: IProjectTemplate;\n\n  /** 项目插件 */\n  plugins: IProjectPlugins;\n\n  /** 模块后置处理器 */\n  postProcessors: PostProcessor[];\n\n  /** Schema 解析器 */\n  schemaParser?: ISchemaParser;\n\n  /** 项目级别的前置处理器 */\n  projectPreProcessors?: ProjectPreProcessor[];\n\n  /** 项目级别的后置处理器 */\n  projectPostProcessors?: ProjectPostProcessor[];\n\n  /** 是否处于严格模式 */\n  inStrictMode?: boolean;\n\n  /** 一些额外的上下文数据 */\n  extraContextData?: Record<string, unknown>;\n\n  /**\n   * Hook which is used to customize original options, we can reorder/add/remove plugins/processors\n   * of the existing solution.\n   */\n  customizeBuilderOptions?(originalOptions: ProjectBuilderInitOptions): ProjectBuilderInitOptions;\n}\n\nexport class ProjectBuilder implements IProjectBuilder {\n  /** 项目模板 */\n  private template: IProjectTemplate;\n\n  /** 项目插件 */\n  private plugins: IProjectPlugins;\n\n  /** 模块后置处理器 */\n  private postProcessors: PostProcessor[];\n\n  /** Schema 解析器 */\n  private schemaParser: ISchemaParser;\n\n  /** 项目级别的前置处理器 */\n  private projectPreProcessors: ProjectPreProcessor[];\n\n  /** 项目级别的后置处理器 */\n  private projectPostProcessors: ProjectPostProcessor[];\n\n  /** 是否处于严格模式 */\n  readonly inStrictMode: boolean;\n\n  /** 一些额外的上下文数据 */\n  readonly extraContextData: IContextData;\n\n  constructor(builderOptions: ProjectBuilderInitOptions) {\n    let customBuilderOptions = builderOptions;\n    if (typeof builderOptions.customizeBuilderOptions === 'function') {\n      customBuilderOptions = builderOptions.customizeBuilderOptions(builderOptions);\n    }\n    const {\n      template,\n      plugins,\n      postProcessors,\n      schemaParser = new SchemaParser(),\n      projectPreProcessors = [],\n      projectPostProcessors = [],\n      inStrictMode = false,\n      extraContextData = {},\n    } = customBuilderOptions;\n    this.template = template;\n    this.plugins = plugins;\n    this.postProcessors = postProcessors;\n    this.schemaParser = schemaParser;\n    this.projectPreProcessors = projectPreProcessors;\n    this.projectPostProcessors = projectPostProcessors;\n    this.inStrictMode = inStrictMode;\n    this.extraContextData = extraContextData;\n  }\n\n  async generateProjectOne(originalSchema: IPublicTypeProjectSchema | string): Promise<ResultDir> {\n    // Init\n    const { schemaParser } = this;\n\n    let schema: IPublicTypeProjectSchema =\n      typeof originalSchema === 'string' ? JSON.parse(originalSchema) : originalSchema;\n\n    // Parse / Format\n    // Preprocess\n    for (const preProcessor of this.projectPreProcessors) {\n      // eslint-disable-next-line no-await-in-loop\n      schema = await preProcessor(schema);\n    }\n\n    // Validate\n    if (!schemaParser.validate(schema)) {\n      throw new CodeGeneratorError('Schema is invalid');\n    }\n\n    // Collect Deps\n    // Parse JSExpression\n    const parseResult: IParseResult = schemaParser.parse(schema);\n\n    // 获取静态文件\n    const projectRoot = await this.template.generateTemplate(parseResult);\n\n    let buildResult: IModuleInfo[] = [];\n\n    // 获取各个插槽的构造器\n    const builders = this.createModuleBuilders({\n      extraContextData: {\n        projectRemark: parseResult?.project?.projectRemark,\n        template: this.template,\n      },\n    });\n    // Generator Code module\n    // components\n    // pages\n    const containerBuildResult: IModuleInfo[] = await Promise.all<IModuleInfo>(\n      parseResult.containers.map(async (containerInfo) => {\n        // parseResult.containers = componentsTree\n        let builder: IModuleBuilder;\n        let path: string[];\n        let files: ResultFile[];\n        if (containerInfo.containerType === 'Page') {\n          //如果这是表单页面\n          if (containerInfo.state && containerInfo.state.pageType == 'form') {\n            builder = builders.form;\n\n            path = this.template.slots.form.path;\n            // files = [\n            //   {\n            //     content: `<template>\\n  <div>1111</div>\\n</template>\\n\\n<script setup lang=\"ts\"></script>\\n\\n<style lang=\"scss\" scoped></style>`,\n            //     ext: 'vue',\n            //     name: 'Add',\n            //   },\n            //   {\n            //     content: ``,\n            //     ext: 'ts',\n            //     name: 'add-fields',\n            //   },\n            //   {\n            //     content: `<template>\\n  <div>2222</div>\\n</template>\\n\\n<script setup lang=\"ts\"></script>\\n\\n<style lang=\"scss\" scoped></style>`,\n            //     ext: 'vue',\n            //     name: 'Detail',\n            //   },\n            // ];\n            files = (await builder.generateModule(containerInfo)).files;\n          } else {\n            //普通页面\n            builder = builders.pages;\n            // 插槽定义的路径\n            path = this.template.slots.pages.path;\n            // 获取组装后的代码片段\n            files = (await builder.generateModule(containerInfo)).files;\n          }\n        } else {\n          builder = builders.components;\n          path = this.template.slots.components.path;\n          // 获取组装后的代码片段\n          files = (await builder.generateModule(containerInfo)).files;\n        }\n\n        // const { files } = await builder.generateModule(containerInfo);\n\n        return {\n          moduleName: containerInfo.moduleName,\n          path,\n          files,\n        };\n      }),\n    );\n    buildResult = buildResult.concat(containerBuildResult);\n\n    // router生成\n    if (parseResult.globalRouter && builders.router) {\n      const { files } = await builders.router.generateModule(parseResult.globalRouter);\n\n      buildResult.push({\n        path: this.template.slots.router.path,\n        files,\n      });\n    }\n\n    // entry生成\n    if (parseResult.project && builders.entry) {\n      const { files } = await builders.entry.generateModule(parseResult.project);\n\n      buildResult.push({\n        path: this.template.slots.entry.path,\n        files,\n      });\n    }\n\n    // appConfig生成\n    if (builders.appConfig) {\n      const { files } = await builders.appConfig.generateModule(parseResult);\n\n      buildResult.push({\n        path: this.template.slots.appConfig.path,\n        files,\n      });\n    }\n\n    // buildConfig生成\n    if (builders.buildConfig) {\n      const { files } = await builders.buildConfig.generateModule(parseResult);\n\n      buildResult.push({\n        path: this.template.slots.buildConfig.path,\n        files,\n      });\n    }\n\n    // constants?生成\n    if (parseResult.project && builders.constants && this.template.slots.constants) {\n      const { files } = await builders.constants.generateModule(parseResult.project);\n\n      buildResult.push({\n        path: this.template.slots.constants.path,\n        files,\n      });\n    }\n\n    // utils?生成\n    if (parseResult.globalUtils && builders.utils && this.template.slots.utils) {\n      const { files } = await builders.utils.generateModule(parseResult.globalUtils);\n\n      buildResult.push({\n        path: this.template.slots.utils.path,\n        files,\n      });\n    }\n\n    // hooks?生成\n    if (parseResult.globalUtils && builders.hooks && this.template.slots.hooks) {\n      const { files } = await builders.hooks.generateModule(parseResult.globalUtils);\n\n      buildResult.push({\n        path: this.template.slots.hooks.path,\n        files,\n      });\n    }\n\n    // i18n?生成\n    if (builders.i18n && this.template.slots.i18n) {\n      const { files } = await builders.i18n.generateModule(parseResult.project);\n\n      buildResult.push({\n        path: this.template.slots.i18n.path,\n        files,\n      });\n    }\n\n    // globalStyle生成\n    if (parseResult.project && builders.globalStyle) {\n      const { files } = await builders.globalStyle.generateModule(parseResult.project);\n\n      buildResult.push({\n        path: this.template.slots.globalStyle.path,\n        files,\n      });\n    }\n\n    // htmlEntry生成\n    if (parseResult.project && builders.htmlEntry) {\n      const { files } = await builders.htmlEntry.generateModule(parseResult.project);\n\n      buildResult.push({\n        path: this.template.slots.htmlEntry.path,\n        files,\n      });\n    }\n\n    // packageJSON生成\n    if (parseResult.project && builders.packageJSON) {\n      const { files } = await builders.packageJSON.generateModule(parseResult.project);\n\n      buildResult.push({\n        path: this.template.slots.packageJSON.path,\n        files,\n      });\n    }\n\n    // demo生成\n    if (parseResult.project && builders.demo) {\n      const { files } = await builders.demo.generateModule(parseResult.project);\n      buildResult.push({\n        path: this.template.slots.demo.path,\n        files,\n      });\n    }\n\n    // handle extra slots 处理自定义插槽\n    await this.generateExtraSlots(builders, parseResult, buildResult);\n\n    // Post Process\n    const isSingleComponent = parseResult?.project?.projectRemark?.isSingleComponent;\n    // Combine Modules 静态文件和动态文件目录树结构结合\n    buildResult.forEach((moduleInfo) => {\n      let targetDir = getDirFromRoot(projectRoot, moduleInfo.path);\n      // if project only contain single component, skip creation of directory.\n      if (moduleInfo.moduleName && !isSingleComponent) {\n        const dir = createResultDir(moduleInfo.moduleName);\n        addDirectory(targetDir, dir);\n        targetDir = dir;\n      }\n      moduleInfo.files.forEach((file) => addFile(targetDir, file));\n    });\n\n    // post-processors 文件格式化处理\n    let finalResult = projectRoot;\n    for (const projectPostProcessor of this.projectPostProcessors) {\n      // eslint-disable-next-line no-await-in-loop\n      finalResult = await projectPostProcessor(finalResult, schema, originalSchema, {\n        template: this.template,\n        parseResult,\n      });\n    }\n\n    return finalResult;\n  }\n\n  /**\n   * 生成整个项目结构\n   * @param originalSchema\n   * @param resourceList\n   */\n  async generateProject(\n    originalSchema: IPublicTypeProjectSchema | string | IPublicTypeProjectSchema[],\n    resourceList: ResourceListType[],\n  ): Promise<ResultDir> {\n    if (Array.isArray(originalSchema)) {\n      // 传入多个schema时处理路由信息\n      const routes = handleRouter(originalSchema, resourceList);\n      // 传入多个schema时处理\n      const data = await Promise.all(\n        originalSchema.map((schema) => {\n          schema.routes = routes;\n          return this.generateProjectOne(schema);\n        }),\n      );\n      // 文件合并\n      return mergeResultDirs(data);\n    }\n    return await this.generateProjectOne(originalSchema as IPublicTypeProjectSchema);\n  }\n\n  private createModuleBuilders(\n    extraContextData: Record<string, unknown> = {},\n  ): Record<string, IModuleBuilder> {\n    const builders: Record<string, IModuleBuilder> = {};\n\n    Object.keys(this.plugins).forEach((pluginName) => {\n      // 遍历所有插件\n      if (this.plugins[pluginName].length > 0) {\n        const options: { mainFileName?: string } = {};\n        if (this.template.slots[pluginName] && this.template.slots[pluginName].fileName) {\n          // 获取各个插槽主文件名称\n          options.mainFileName = this.template.slots[pluginName].fileName;\n        }\n        // 获取各个插槽的构造器\n        builders[pluginName] = createModuleBuilder({\n          plugins: this.plugins[pluginName],\n          postProcessors: this.postProcessors,\n          contextData: {\n            // template: this.template,\n            inStrictMode: this.inStrictMode,\n            tolerateEvalErrors: true,\n            evalErrorsHandler: '',\n            ...this.extraContextData,\n            ...extraContextData,\n          },\n          ...options,\n        });\n      }\n    });\n\n    return builders;\n  }\n\n  /**\n   * 自定义插槽代码生成\n   * @param builders\n   * @param parseResult\n   * @param buildResult\n   * @private\n   */\n  private async generateExtraSlots(\n    builders: Record<string, IModuleBuilder>,\n    parseResult: IParseResult,\n    buildResult: IModuleInfo[],\n  ) {\n    for (const slotName in this.template.slots) {\n      if (!isBuiltinSlotName(slotName)) {\n        const { files } = await builders[slotName].generateModule(parseResult);\n        buildResult.push({\n          path: this.template.slots[slotName].path,\n          files,\n        });\n      }\n    }\n  }\n}\n\nexport function createProjectBuilder(initOptions: ProjectBuilderInitOptions): IProjectBuilder {\n  return new ProjectBuilder(initOptions);\n}\n\nfunction getDirFromRoot(root: ResultDir, path: string[]): ResultDir {\n  let current: ResultDir = root;\n  path.forEach((p) => {\n    const exist = current.dirs.find((d) => d.name === p);\n    if (exist) {\n      current = exist;\n    } else {\n      const newDir = createResultDir(p);\n      addDirectory(current, newDir);\n      current = newDir;\n    }\n  });\n\n  return current;\n}\n/**\n * 合并 ResultDir 数组\n * @param dirs ResultDir 数组\n * @returns 合并后的单一 ResultDir\n */\nfunction mergeResultDirs(dirs: ResultDir[]): ResultDir {\n  // 合并的结果\n  const result: ResultDir = { name: '.', dirs: [], files: [] };\n\n  const mergeDir = (target: ResultDir, source: ResultDir) => {\n    // 合并文件：用文件名和扩展名作为唯一标识\n    const fileMap: Record<string, ResultFile> = {};\n    [...target.files, ...source.files].forEach((file) => {\n      const key = `${file.name}.${file.ext}`;\n      if (fileMap[key]) {\n        // 如果文件已存在，则保留zIndex大的那个\n        fileMap[key] = file.zIndex > fileMap[key].zIndex ? file : fileMap[key];\n        return;\n      }\n      fileMap[key] = file; // 文件名相同则覆盖\n    });\n    target.files = Object.values(fileMap);\n\n    // 合并子目录：用子目录名作为唯一标识\n    const dirMap: Record<string, ResultDir> = {};\n    target.dirs.forEach((dir) => {\n      dirMap[dir.name] = dir;\n    });\n    source.dirs.forEach((dir) => {\n      if (dirMap[dir.name]) {\n        // 如果子目录存在，递归合并\n        mergeDir(dirMap[dir.name], dir);\n      } else {\n        // 如果子目录不存在，直接添加\n        dirMap[dir.name] = dir;\n      }\n    });\n    target.dirs = Object.values(dirMap);\n  };\n\n  // 遍历每个根目录进行合并\n  dirs.forEach((dir) => {\n    mergeDir(result, dir);\n  });\n\n  return result;\n}\n","import * as defaultFs from 'fs';\n\nimport { ResultDir } from '@alilc/lowcode-types';\nimport { PublisherFactory, IPublisher, IPublisherFactoryParams, PublisherError } from '../../types';\nimport { getErrorMessage } from '../../utils/errors';\nimport { writeFolder, IFileSystem } from './utils';\n\nexport interface IDiskFactoryParams extends IPublisherFactoryParams {\n  outputPath?: string;\n  projectSlug?: string;\n  createProjectFolder?: boolean;\n  fs?: IFileSystem;\n}\n\nexport interface IDiskPublisher extends IPublisher<IDiskFactoryParams, string> {\n  getOutputPath: () => string;\n  setOutputPath: (path: string) => void;\n}\n\nexport const createDiskPublisher: PublisherFactory<IDiskFactoryParams, IDiskPublisher> = (\n  params: IDiskFactoryParams = {},\n): IDiskPublisher => {\n  let { project, outputPath = './' } = params;\n  const { fs = defaultFs } = params;\n\n  const getProject = (): ResultDir => {\n    if (!project) {\n      throw new PublisherError('MissingProject');\n    }\n    return project;\n  };\n  const setProject = (projectToSet: ResultDir): void => {\n    project = projectToSet;\n  };\n\n  const getOutputPath = (): string => {\n    return outputPath;\n  };\n  const setOutputPath = (path: string): void => {\n    outputPath = path;\n  };\n\n  const publish = async (options: IDiskFactoryParams = {}) => {\n    const projectToPublish = options.project || project;\n    if (!projectToPublish) {\n      throw new PublisherError('MissingProject');\n    }\n\n    const projectOutputPath = options.outputPath || outputPath;\n    const overrideProjectSlug = options.projectSlug || params.projectSlug;\n    const createProjectFolder = options.createProjectFolder ?? params.createProjectFolder;\n\n    if (overrideProjectSlug) {\n      projectToPublish.name = overrideProjectSlug;\n    }\n\n    try {\n      await writeFolder(projectToPublish, projectOutputPath, createProjectFolder, fs);\n      return { success: true, payload: projectOutputPath };\n    } catch (error) {\n      throw new PublisherError(getErrorMessage(error) || 'UnknownError');\n    }\n  };\n\n  return {\n    publish,\n    getProject,\n    setProject,\n    getOutputPath,\n    setOutputPath,\n  };\n};\n","import * as systemFs from 'fs';\nimport { join } from 'path';\nimport { ResultDir, ResultFile } from '@alilc/lowcode-types';\n\nexport interface IFileSystem {\n  existsSync: typeof systemFs.existsSync;\n  mkdir: typeof systemFs.mkdir;\n  writeFile: typeof systemFs.writeFile;\n}\n\nexport const writeFolder = async (\n  folder: ResultDir,\n  currentPath: string,\n  createProjectFolder = true,\n  fs: IFileSystem = systemFs,\n): Promise<void> => {\n  const { name, files, dirs } = folder;\n\n  const folderPath = createProjectFolder ? join(currentPath, name) : currentPath;\n\n  if (!fs.existsSync(folderPath)) {\n    await createDirectory(folderPath, fs);\n  }\n\n  const promises = [\n    writeFilesToFolder(folderPath, files, fs),\n    writeSubFoldersToFolder(folderPath, dirs, fs),\n  ];\n\n  await Promise.all(promises);\n};\n\nconst writeFilesToFolder = async (\n  folderPath: string,\n  files: ResultFile[],\n  fs: IFileSystem,\n): Promise<void> => {\n  const promises = files.map((file) => {\n    const fileName = file.ext ? `${file.name}.${file.ext}` : file.name;\n    const filePath = join(folderPath, fileName);\n    return writeContentToFile(filePath, file.content, 'utf8', fs);\n  });\n\n  await Promise.all(promises);\n};\n\nconst writeSubFoldersToFolder = async (\n  folderPath: string,\n  subFolders: ResultDir[],\n  fs: IFileSystem,\n): Promise<void> => {\n  const promises = subFolders.map((subFolder) => {\n    return writeFolder(subFolder, folderPath, true, fs);\n  });\n\n  await Promise.all(promises);\n};\n\nconst createDirectory = (pathToDir: string, fs: IFileSystem): Promise<void> => {\n  return new Promise((resolve, reject) => {\n    fs.mkdir(pathToDir, { recursive: true }, (err) => {\n      err ? reject(err) : resolve();\n    });\n  });\n};\n\nconst writeContentToFile = (\n  filePath: string,\n  fileContent: string,\n  encoding = 'utf8',\n  fs: IFileSystem,\n): Promise<void> => {\n  return new Promise((resolve, reject) => {\n    fs.writeFile(filePath, fileContent, { encoding: encoding as BufferEncoding }, (err) => {\n      err ? reject(err) : resolve();\n    });\n  });\n};\n","import JSZip from 'jszip';\nimport { ResultDir, ResultFile } from '@alilc/lowcode-types';\nimport type { ZipBuffer } from './index';\n\nexport const isNodeProcess = (): boolean => {\n  return (\n    typeof process === 'object' &&\n    typeof process.versions === 'object' &&\n    typeof process.versions.node !== 'undefined'\n  );\n};\n\nexport const writeZipToDisk = (\n  zipFolderPath: string,\n  content: ZipBuffer,\n  zipName: string,\n): void => {\n  if (!isNodeProcess()) {\n    throw new Error('ZipPublisher: writeZipToDisk is only available in NodeJS');\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const fs = require('fs');\n  // eslint-disable-next-line @typescript-eslint/no-var-requires\n  // eslint-disable-next-line @typescript-eslint/no-require-imports\n  const path = require('path');\n\n  if (!fs.existsSync(zipFolderPath)) {\n    fs.mkdirSync(zipFolderPath, { recursive: true });\n  }\n\n  const zipPath = path.join(zipFolderPath, `${zipName}.zip`);\n\n  const writeStream = fs.createWriteStream(zipPath);\n  writeStream.write(content);\n  writeStream.end();\n};\n\nexport const generateProjectZip = async (project: ResultDir): Promise<ZipBuffer> => {\n  let zip = new JSZip();\n  zip = writeFolderToZip(project, zip, true);\n  const zipType = isNodeProcess() ? 'nodebuffer' : 'blob';\n  return zip.generateAsync({ type: zipType });\n};\n\nconst writeFolderToZip = (folder: ResultDir, parentFolder: JSZip, ignoreFolder = false) => {\n  const zipFolder = ignoreFolder ? parentFolder : parentFolder.folder(folder.name);\n  if (zipFolder !== null) {\n    folder.files.forEach((file: ResultFile) => {\n      // const options = file.contentEncoding === 'base64' ? { base64: true } : {};\n      const options = {};\n      const fileName = file.ext ? `${file.name}.${file.ext}` : file.name;\n      zipFolder.file(fileName, file.content, options);\n    });\n\n    folder.dirs.forEach((subFolder: ResultDir) => {\n      writeFolderToZip(subFolder, zipFolder);\n    });\n  }\n\n  return parentFolder;\n};\n","import { ResultDir } from '@alilc/lowcode-types';\nimport { PublisherFactory, IPublisher, IPublisherFactoryParams, PublisherError } from '../../types';\nimport { getErrorMessage } from '../../utils/errors';\nimport { isNodeProcess, writeZipToDisk, generateProjectZip } from './utils';\nimport { saveAs } from 'file-saver';\n\nexport type ZipBuffer = Buffer | Blob;\n\ndeclare type ZipPublisherResponse = string | ZipBuffer;\n\nexport interface ZipFactoryParams extends IPublisherFactoryParams {\n  outputPath?: string;\n  projectSlug?: string;\n}\n\nexport interface ZipPublisher extends IPublisher<ZipFactoryParams, ZipPublisherResponse> {\n  getOutputPath: () => string | undefined;\n  setOutputPath: (path: string) => void;\n}\n\nexport const createZipPublisher: PublisherFactory<ZipFactoryParams, ZipPublisher> = (\n  params: ZipFactoryParams = {},\n): ZipPublisher => {\n  let { project, outputPath } = params;\n\n  const getProject = () => project;\n  const setProject = (projectToSet: ResultDir) => {\n    project = projectToSet;\n  };\n\n  const getOutputPath = () => outputPath;\n  const setOutputPath = (path: string) => {\n    outputPath = path;\n  };\n\n  const publish = async (options: ZipFactoryParams = {}) => {\n    const projectToPublish = options.project || project;\n    if (!projectToPublish) {\n      throw new PublisherError('MissingProject');\n    }\n\n    const zipName = options.projectSlug || params.projectSlug || projectToPublish.name;\n\n    try {\n      const zipContent = await generateProjectZip(projectToPublish);\n\n      if (isNodeProcess()) {\n        // If not output path is provided on the node side, zip is not written to disk\n        const projectOutputPath = options.outputPath || outputPath;\n        if (projectOutputPath) {\n          await writeZipToDisk(projectOutputPath, zipContent, zipName);\n        }\n      } else {\n        // the browser end does not require a path\n        // auto download zip files\n        saveAs(zipContent as Blob, `${zipName}.zip`);\n      }\n\n      return { success: true, payload: zipContent };\n    } catch (error) {\n      throw new PublisherError(getErrorMessage(error) || 'UnknownError');\n    }\n  };\n\n  return {\n    publish,\n    getProject,\n    setProject,\n    getOutputPath,\n    setOutputPath,\n  };\n};\n","import { flatMap, camelCase, get } from 'lodash';\nimport { COMMON_CHUNK_NAME } from '../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  CodeGeneratorError,\n  DependencyType,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IDependency,\n  IExternalDependency,\n  IInternalDependency,\n  IWithDependency,\n} from '../../types';\n\nimport { isValidIdentifier } from '../../utils/validate';\n\n// TODO: main 这个信息到底怎么用，是不是外部包不需要使用？\nconst DEP_MAIN_BLOCKLIST = ['lib', 'lib/index', 'es', 'es/index', 'main'];\nconst DEFAULT_EXPORT_NAME = '__default__';\n\nfunction groupDepsByPack(deps: IDependency[]): Record<string, IDependency[]> {\n  const depMap: Record<string, IDependency[]> = {};\n\n  const addDep = (pkg: string, dep: IDependency) => {\n    if (!depMap[pkg]) {\n      depMap[pkg] = [];\n    }\n    depMap[pkg].push(dep);\n  };\n\n  deps.forEach((dep) => {\n    if (dep.dependencyType === DependencyType.Internal) {\n      addDep(`${(dep as IInternalDependency).moduleName}${dep.main ? `/${dep.main}` : ''}`, dep);\n    } else {\n      let depMain = '';\n      // TODO: 部分类型的 main 暂时认为没用\n      if (dep.main && DEP_MAIN_BLOCKLIST.indexOf(dep.main) < 0) {\n        depMain = dep.main;\n      }\n      if (depMain.substring(0, 1) === '/') {\n        depMain = depMain.substring(1);\n      }\n      addDep(`${(dep as IExternalDependency).package}${depMain ? `/${depMain}` : ''}`, dep);\n    }\n  });\n\n  return depMap;\n}\n\ninterface IDependencyItem {\n  exportName: string;\n  aliasName?: string;\n  isDefault?: boolean;\n  subName?: string;\n  nodeIdentifier?: string; // 与使用处的映射关系，理论上是不可变更的，如需变更需要提供额外信息\n  source: IDependency;\n}\n\ninterface IExportItem {\n  exportName: string;\n  aliasNames: string[];\n  isDefault?: boolean;\n  needOriginExport: boolean;\n}\n\nfunction getDependencyIdentifier(info: IDependencyItem): string {\n  return info.aliasName || info.exportName;\n}\n\nfunction getExportNameOfDep(dep: IDependency): string {\n  if (dep.destructuring) {\n    return (\n      dep.exportName ||\n      dep.componentName ||\n      throwNewError('destructuring dependency must have exportName or componentName')\n    );\n  }\n\n  if (!dep.subName) {\n    return (\n      dep.componentName ||\n      dep.exportName ||\n      throwNewError('dependency item must have componentName or exportName')\n    );\n  }\n\n  return (\n    dep.exportName ||\n    `__$${camelCase(\n      get(dep, 'moduleName') ||\n        get(dep, 'package') ||\n        throwNewError('dep.moduleName or dep.package is undefined'),\n    )}_default`\n  );\n}\n\nfunction throwNewError(msg: string): never {\n  throw new Error(msg);\n}\n\nfunction buildPackageImport(\n  pkg: string,\n  deps: IDependency[],\n  targetFileType: string,\n  useAliasName: boolean,\n): ICodeChunk[] {\n  // 如果压根没有包，则不生成对应的 import 语句（生成了没有任何意义）\n  if (!pkg || pkg === 'undefined' || pkg === 'null') {\n    // TODO: 要不要加个 warning？\n    return [];\n  }\n\n  const chunks: ICodeChunk[] = [];\n\n  const exportItems: Record<string, IExportItem> = {};\n  const defaultExportNames: string[] = [];\n\n  const depsInfo: IDependencyItem[] = deps.map((dep) => {\n    const info: IDependencyItem = {\n      exportName: getExportNameOfDep(dep),\n      isDefault: !dep.destructuring,\n      subName: dep.subName || undefined,\n      nodeIdentifier: dep.componentName || undefined,\n      source: dep,\n    };\n\n    // 下面 5 个逻辑是清理不必要的冗余信息，做到数据结构归一化\n    if (info.isDefault) {\n      if (defaultExportNames.indexOf(info.exportName) < 0) {\n        defaultExportNames.push(info.exportName);\n      }\n    }\n\n    if (!info.subName) {\n      if (info.nodeIdentifier === info.exportName) {\n        info.nodeIdentifier = undefined;\n      }\n\n      if (info.isDefault) {\n        info.aliasName = info.nodeIdentifier || info.exportName;\n        info.exportName = DEFAULT_EXPORT_NAME;\n      }\n\n      if (info.nodeIdentifier) {\n        info.aliasName = info.nodeIdentifier;\n        info.nodeIdentifier = undefined;\n      }\n    } else {\n      if (info.isDefault) {\n        info.aliasName = info.exportName;\n        info.exportName = DEFAULT_EXPORT_NAME;\n      }\n\n      if (info.nodeIdentifier === `${info.exportName}.${info.subName}`) {\n        info.nodeIdentifier = undefined;\n      }\n    }\n\n    return info;\n  });\n\n  // 建立 export 项目的列表\n  depsInfo.forEach((info) => {\n    if (!exportItems[info.exportName]) {\n      exportItems[info.exportName] = {\n        exportName: info.exportName,\n        isDefault: info.isDefault,\n        aliasNames: [],\n        needOriginExport: false,\n      };\n    }\n\n    if (!info.nodeIdentifier && !info.aliasName) {\n      exportItems[info.exportName].needOriginExport = true;\n    }\n  });\n\n  // 建立别名字典\n  depsInfo.forEach((info) => {\n    if (info.aliasName) {\n      const { aliasNames } = exportItems[info.exportName];\n      if (aliasNames.indexOf(info.aliasName) < 0) {\n        aliasNames.push(info.aliasName);\n      }\n    }\n  });\n\n  // fix: 父组件ImportAliasDefine, 与子组件import的父组件冲突情况\n  depsInfo.forEach((info) => {\n    if (info.nodeIdentifier) {\n      const exportItem = exportItems[info.exportName];\n      if (!exportItem.needOriginExport && exportItem.aliasNames.length > 0) {\n        // eslint-disable-next-line no-param-reassign\n        info.aliasName = exportItem.aliasNames[0];\n      }\n    }\n  });\n\n  // 发现 nodeIdentifier 与 exportName 或者 aliasName 冲突的场景\n  const nodeIdentifiers = depsInfo.map((info) => info.nodeIdentifier).filter(Boolean);\n  const conflictInfos = flatMap(Object.keys(exportItems), (exportName) => {\n    const exportItem = exportItems[exportName];\n    const usedNames = [\n      ...exportItem.aliasNames,\n      ...(exportItem.needOriginExport || exportItem.aliasNames.length <= 0 ? [exportName] : []),\n    ];\n    const conflictNames = usedNames.filter((n) => nodeIdentifiers.indexOf(n) >= 0);\n    if (conflictNames.length > 0) {\n      return [\n        ...(conflictNames.indexOf(exportName) >= 0 ? [[exportName, true, exportItem]] : []),\n        ...conflictNames.filter((n) => n !== exportName).map((n) => [n, false, exportItem]),\n      ];\n    }\n    return [];\n  });\n\n  const conflictExports = conflictInfos.filter((c) => c[1]).map((c) => c[0] as string);\n  const conflictAlias = conflictInfos.filter((c) => !c[1]).map((c) => c[0] as string);\n\n  const solutions: Record<string, string> = {};\n\n  depsInfo.forEach((info) => {\n    if (info.aliasName && conflictAlias.indexOf(info.aliasName) >= 0) {\n      // find solution\n      let solution = solutions[info.aliasName];\n      if (!solution) {\n        solution = `${info.aliasName}Alias`;\n        const conflictItem = (conflictInfos.find((c) => c[0] === info.aliasName) ||\n          [])[2] as IExportItem;\n        conflictItem.aliasNames = conflictItem.aliasNames.filter((a) => a !== info.aliasName);\n        conflictItem.aliasNames.push(solution);\n        solutions[info.aliasName] = solution;\n      }\n      // eslint-disable-next-line no-param-reassign\n      info.aliasName = solution;\n    }\n\n    if (conflictExports.indexOf(info.exportName) >= 0) {\n      // find solution\n      let solution = solutions[info.exportName];\n      if (!solution) {\n        solution = `${info.exportName}Export`;\n        const conflictItem = (conflictInfos.find((c) => c[0] === info.exportName) ||\n          [])[2] as IExportItem;\n        conflictItem.aliasNames.push(solution);\n        conflictItem.needOriginExport = false;\n        solutions[info.exportName] = solution;\n      }\n      // eslint-disable-next-line no-param-reassign\n      info.aliasName = solution;\n    }\n  });\n\n  // 判断是否所有依赖都有合法的 Identifier\n  depsInfo.forEach((info) => {\n    const name = info.aliasName || info.exportName;\n    if (!isValidIdentifier(name)) {\n      throw new CodeGeneratorError(`Invalid Identifier [${name}]`);\n    }\n    if (info.nodeIdentifier && !isValidIdentifier(info.nodeIdentifier)) {\n      throw new CodeGeneratorError(`Invalid Identifier [${info.nodeIdentifier}]`);\n    }\n  });\n\n  const aliasDefineStatements: Record<string, string> = {};\n  if (useAliasName) {\n    Object.keys(exportItems).forEach((exportName) => {\n      const aliasList = exportItems[exportName]?.aliasNames || [];\n      if (aliasList.length > 0) {\n        const srcName = exportItems[exportName].needOriginExport ? exportName : aliasList[0];\n        const aliasNameList = exportItems[exportName].needOriginExport\n          ? aliasList\n          : aliasList.slice(1);\n        aliasNameList.forEach((a) => {\n          if (!aliasDefineStatements[a]) {\n            aliasDefineStatements[a] = `const ${a} = ${srcName};`;\n          }\n        });\n      }\n    });\n  }\n\n  function getDefaultExportName(info: IDependencyItem): string {\n    if (info.isDefault) {\n      return defaultExportNames[0];\n    }\n    return info.exportName;\n  }\n\n  depsInfo.forEach((info) => {\n    // 如果是子组件，则导出父组件，并且根据自组件命名规则，判断是否需要定义标识符\n    if (info.nodeIdentifier) {\n      // 前提，存在 nodeIdentifier 一定是有 subName 的，不然前面会优化掉\n      const ownerName = getDependencyIdentifier(info);\n\n      chunks.push({\n        type: ChunkType.STRING,\n        fileType: targetFileType,\n        name: COMMON_CHUNK_NAME.ImportAliasDefine,\n        content: useAliasName ? `const ${info.nodeIdentifier} = ${ownerName}.${info.subName};` : '',\n        linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport],\n        ext: {\n          originalName: `${getDefaultExportName(info)}.${info.subName}`,\n          aliasName: info.nodeIdentifier,\n          dependency: info.source,\n        },\n      });\n    } else if (info.aliasName) {\n      // default 方式的导入会生成单独de import 语句，无需生成赋值语句\n      if (info.isDefault && defaultExportNames.find((n) => n === info.aliasName)) {\n        delete aliasDefineStatements[info.aliasName];\n        return;\n      }\n\n      let contentStatement = '';\n      if (aliasDefineStatements[info.aliasName]) {\n        contentStatement = aliasDefineStatements[info.aliasName];\n        delete aliasDefineStatements[info.aliasName];\n      }\n\n      chunks.push({\n        type: ChunkType.STRING,\n        fileType: targetFileType,\n        name: COMMON_CHUNK_NAME.ImportAliasDefine,\n        content: contentStatement,\n        linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport],\n        ext: {\n          originalName: getDefaultExportName(info),\n          aliasName: info.aliasName,\n          dependency: info.source,\n        },\n      });\n    }\n  });\n\n  // 可能会剩余一些存在二次转换的定义\n  Object.keys(aliasDefineStatements).forEach((a) => {\n    chunks.push({\n      type: ChunkType.STRING,\n      fileType: targetFileType,\n      name: COMMON_CHUNK_NAME.ImportAliasDefine,\n      content: aliasDefineStatements[a],\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport],\n    });\n  });\n\n  const exportItemList = Object.keys(exportItems).map((k) => exportItems[k]);\n  const defaultExport = exportItemList.filter((item) => item.isDefault);\n  const otherExports = exportItemList.filter((item) => !item.isDefault);\n\n  const statementL = ['import'];\n  if (defaultExport.length > 0) {\n    if (useAliasName) {\n      statementL.push(defaultExportNames[0]);\n    } else {\n      statementL.push(defaultExport[0].aliasNames[0]);\n    }\n    if (otherExports.length > 0) {\n      statementL.push(', ');\n    }\n  }\n  if (otherExports.length > 0) {\n    const items = otherExports.map((item) => {\n      return !useAliasName || item.needOriginExport || item.aliasNames.length <= 0\n        ? item.exportName\n        : `${item.exportName} as ${item.aliasNames[0]}`;\n    });\n    statementL.push(`{ ${items.join(', ')} }`);\n  }\n  statementL.push('from');\n\n  const getInternalDependencyModuleId = () => `@/${(deps[0] as IInternalDependency).type}/${pkg}`;\n\n  if (deps[0].dependencyType === DependencyType.Internal) {\n    // TODO: Internal Deps path use project slot setting\n    statementL.push(`'${getInternalDependencyModuleId()}';`);\n    chunks.push({\n      type: ChunkType.STRING,\n      fileType: targetFileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: statementL.join(' '),\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n  } else {\n    statementL.push(`'${pkg}';`);\n    chunks.push({\n      type: ChunkType.STRING,\n      fileType: targetFileType,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: statementL.join(' '),\n      linkAfter: [],\n    });\n  }\n\n  // 处理下一些额外的 default 方式的导入\n  if (defaultExportNames.length > 1) {\n    if (deps[0].dependencyType === DependencyType.Internal) {\n      defaultExportNames.slice(1).forEach((exportName) => {\n        chunks.push({\n          type: ChunkType.STRING,\n          fileType: targetFileType,\n          name: COMMON_CHUNK_NAME.InternalDepsImport,\n          content: `import ${exportName} from '${getInternalDependencyModuleId()}';`,\n          linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n        });\n      });\n    } else {\n      defaultExportNames.slice(1).forEach((exportName) => {\n        chunks.push({\n          type: ChunkType.STRING,\n          fileType: targetFileType,\n          name: COMMON_CHUNK_NAME.ExternalDepsImport,\n          content: `import ${exportName} from '${pkg}';`,\n          linkAfter: [],\n        });\n\n        chunks.push({\n          type: ChunkType.STRING,\n          fileType: targetFileType,\n          name: COMMON_CHUNK_NAME.ImportAliasDefine,\n          content: '',\n          linkAfter: [],\n          ext: {\n            aliasName: exportName,\n            originalName: exportName,\n            dependency: {\n              package: pkg,\n              componentName: exportName,\n            },\n          },\n        });\n      });\n    }\n  }\n\n  return chunks;\n}\n\nexport interface PluginConfig {\n  fileType?: string; // 导出的文件类型\n  useAliasName?: boolean; // 是否使用 componentName 重命名组件 identifier\n  filter?: (deps: IDependency[]) => IDependency[]; // 支持过滤能力\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?: PluginConfig) => {\n  const cfg = {\n    fileType: FileType.JS,\n    useAliasName: true,\n    ...(config || {}),\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IWithDependency;\n\n    if (ir && ir.deps && ir.deps.length > 0) {\n      const deps = cfg.filter ? cfg.filter(ir.deps) : ir.deps;\n      const packs = groupDepsByPack(deps);\n\n      Object.keys(packs).forEach((pkg) => {\n        const chunks = buildPackageImport(pkg, packs[pkg], cfg.fileType, cfg.useAliasName);\n        next.chunks.push(...chunks);\n      });\n    }\n\n    return next;\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n","import changeCase from '../../utils/changeCaseCompat';\nimport {\n  FileType,\n  BuilderComponentPluginFactory,\n  BuilderComponentPlugin,\n  ICodeStruct,\n  IWithDependency,\n  ChunkType,\n} from '../../types';\n\nimport { COMMON_CHUNK_NAME } from '../../const/generator';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IWithDependency;\n    const { chunks } = next;\n\n    if (ir && ir.deps && ir.deps.length > 0) {\n      let lowcodeMaterialsStyleAdded = false;\n      let fusionUIStyleAdded = false;\n      let nextStyleAddedMap: Record<string, boolean> = {};\n      ir.deps.forEach((dep: any) => {\n        if (dep.package === '@alifd/next' && !nextStyleAddedMap[dep.exportName]) {\n          chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.JSX,\n            name: COMMON_CHUNK_NAME.InternalDepsImport,\n            content: `import '@alifd/next/lib/${changeCase.paramCase(dep.exportName)}/style';`,\n            linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n          });\n          nextStyleAddedMap[dep.exportName] = true;\n        } else if (dep.package === '@alilc/lowcode-materials' && !lowcodeMaterialsStyleAdded) {\n          chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.JSX,\n            name: COMMON_CHUNK_NAME.InternalDepsImport,\n            content: 'import \\'@alilc/lowcode-materials/lib/style\\';',\n            linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n          });\n          lowcodeMaterialsStyleAdded = true;\n        } else if (dep.package === '@alifd/fusion-ui' && !fusionUIStyleAdded) {\n          chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.JSX,\n            name: COMMON_CHUNK_NAME.InternalDepsImport,\n            content: 'import \\'@alifd/fusion-ui/lib/style\\';',\n            linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n          });\n          fusionUIStyleAdded = true;\n        }\n      });\n    }\n\n    return next;\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n","export const REACT_CHUNK_NAME = {\n  ClassRenderStart: 'ReactComponentClassRenderStart',\n  ClassRenderPre: 'ReactComponentClassRenderPre',\n  ClassRenderEnd: 'ReactComponentClassRenderEnd',\n  ClassRenderJSX: 'ReactComponentClassRenderJSX',\n  ClassDidMountStart: 'ReactComponentClassDidMountStart',\n  ClassDidMountEnd: 'ReactComponentClassDidMountEnd',\n  ClassDidMountContent: 'ReactComponentClassDidMountContent',\n};\n","import changeCase from '../../../utils/changeCaseCompat';\nimport {\n  COMMON_CHUNK_NAME,\n  CLASS_DEFINE_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\nimport { REACT_CHUNK_NAME } from './const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { ensureValidClassName } from '../../../utils/validate';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    // 将模块名转换成 PascalCase 的格式，并添加特定后缀，防止命名冲突\n    const componentClassName = ensureValidClassName(\n      `${changeCase.pascalCase(ir.moduleName)}$$${ir.containerType}`,\n    );\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.Start,\n      content: `class ${componentClassName} extends React.Component {`,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n      ],\n    });\n\n    if (ir.containerType === 'Component') {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: FileType.JSX,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: `static displayName = '${ir.moduleName}';`,\n        linkAfter: [\n          CLASS_DEFINE_CHUNK_NAME.Start,\n        ],\n      });\n    }\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.End,\n      content: '}',\n      linkAfter: [\n        ...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.End],\n        REACT_CHUNK_NAME.ClassRenderEnd,\n        REACT_CHUNK_NAME.ClassDidMountEnd,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.ConstructorStart,\n      content: 'constructor(props, context) { super(props); ',\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart]],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.ConstructorEnd,\n      content: '}',\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorEnd]],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: REACT_CHUNK_NAME.ClassDidMountStart,\n      content: 'componentDidMount() {',\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.End]],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: REACT_CHUNK_NAME.ClassDidMountEnd,\n      content: '}',\n      linkAfter: [REACT_CHUNK_NAME.ClassDidMountContent, REACT_CHUNK_NAME.ClassDidMountStart],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: REACT_CHUNK_NAME.ClassRenderStart,\n      content: 'render() {',\n      linkAfter: [\n        ...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.End],\n        REACT_CHUNK_NAME.ClassDidMountEnd,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: REACT_CHUNK_NAME.ClassRenderEnd,\n      content: '}',\n      linkAfter: [\n        REACT_CHUNK_NAME.ClassRenderStart,\n        REACT_CHUNK_NAME.ClassRenderPre,\n        REACT_CHUNK_NAME.ClassRenderJSX,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.FileExport,\n      content: `export default ${componentClassName};`,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n        CLASS_DEFINE_CHUNK_NAME.End,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {\n  IPublicTypeCompositeArray,\n  IPublicTypeCompositeValue,\n  IPublicTypeCompositeObject,\n  IPublicTypeJSFunction,\n  IPublicTypeJSExpression,\n  isJSExpression,\n  isJSFunction,\n  isJSSlot,\n  IPublicTypeJSSlot,\n} from '@alilc/lowcode-types';\nimport _ from 'lodash';\n\nimport { IScope, CompositeValueGeneratorOptions, CodeGeneratorError } from '../types';\nimport { generateExpression, generateFunction } from './jsExpression';\nimport { generateJsSlot } from './jsSlot';\nimport { executeFunctionStack } from './aopHelper';\nimport { parseExpressionGetKeywords } from './expressionParser';\nimport { isJSExpressionFn } from './common';\n\ninterface ILegaoVariable {\n  type: 'variable';\n  value: string;\n  variable: string;\n}\n\nfunction isVariable(v: any): v is ILegaoVariable {\n  if (_.isObject(v) && (v as ILegaoVariable).type === 'variable') {\n    return true;\n  }\n  return false;\n}\n\ninterface DataSource {\n  type: 'DataSource';\n  id: string;\n}\n\n/**\n * 判断是否是数据源类型\n */\nfunction isDataSource(v: unknown): v is DataSource {\n  return typeof v === 'object' && v != null && (v as Partial<DataSource>).type === 'DataSource';\n}\n\nfunction generateArray(\n  value: IPublicTypeCompositeArray,\n  scope: IScope,\n  options: CompositeValueGeneratorOptions = {},\n): string {\n  const body = value.map((v) => generateUnknownType(v, scope, options)).join(',');\n  return `[${body}]`;\n}\n\nfunction generateObject(\n  value: IPublicTypeCompositeObject,\n  scope: IScope,\n  options: CompositeValueGeneratorOptions = {},\n): string {\n  if (value.type === 'i18n') {\n    // params 可能会绑定变量，这里需要处理下\n    if (value.params && typeof value.params === 'object') {\n      return `this._i18nText(${generateUnknownType(_.omit(value, 'type'), scope, options)})`;\n    }\n    return `this._i18nText(${JSON.stringify(_.omit(value, 'type'))})`; // TODO: 优化：这里可以考虑提取成个常量...\n  }\n\n  const body = Object.keys(value)\n    .map((key) => {\n      // const propName = JSON.stringify(key);\n      // const v = generateUnknownType(value[key], scope, options);\n      // return `${propName}: ${v}`;\n      const propName = key; // 不再使用JSON.stringify来转义属性名\n      const v = generateUnknownType(value[key], scope, options);\n      return `${propName}: ${v}`;\n    })\n    .join(',');\n\n  return `{${body}}`;\n}\n\nfunction generateString(value: string): string {\n // 有的字符串里面会有特殊字符，比如换行或引号之类的，这里我们借助 JSON 的字符串转义功能来做下转义并加上双引号\n  // return JSON.stringify(value);\n\n  // 使用单引号包围字符串\n  const escapeString = (val: string) => {\n    return JSON.stringify(val).slice(1, -1);\n  };\n  return `'${escapeString(value)}'`;\n}\n\nfunction generateNumber(value: number): string {\n  return String(value);\n}\n\nfunction generateBool(value: boolean): string {\n  return value ? 'true' : 'false';\n}\n\nfunction genFunction(value: IPublicTypeJSFunction): string {\n  const globalVars = parseExpressionGetKeywords(value.value);\n\n  if (globalVars.includes('arguments')) {\n    return generateFunction(value, { isBindExpr: true });\n  }\n\n  return generateFunction(value, { isArrow: true });\n}\n\nfunction genJsSlot(\n  value: IPublicTypeJSSlot,\n  scope: IScope,\n  options: CompositeValueGeneratorOptions = {},\n) {\n  if (options.nodeGenerator) {\n    return generateJsSlot(value, scope, options.nodeGenerator);\n  }\n  return '';\n}\n\nfunction generateUnknownType(\n  value: IPublicTypeCompositeValue,\n  scope: IScope,\n  options: CompositeValueGeneratorOptions = {},\n): string {\n  if (_.isUndefined(value)) {\n    return 'undefined';\n  }\n\n  if (_.isNull(value)) {\n    return 'null';\n  }\n\n  if (_.isArray(value)) {\n    if (options.handlers?.array) {\n      return executeFunctionStack(value, scope, options.handlers.array, generateArray, options);\n    }\n    return generateArray(value, scope, options);\n  }\n\n  // FIXME: 这个是临时方案\n  // 在遇到 type variable 私有类型时，转换为 JSExpression\n  if (isVariable(value)) {\n    const transValue: IPublicTypeJSExpression = {\n      type: 'JSExpression',\n      value: value.variable,\n    };\n\n    if (options.handlers?.expression) {\n      const expression = executeFunctionStack(\n        transValue,\n        scope,\n        options.handlers.expression,\n        generateExpression,\n        options,\n      );\n      return expression || 'undefined';\n    }\n    return generateExpression(transValue, scope);\n  }\n\n  if (isJSExpression(value)) {\n    if (options.handlers?.expression) {\n      return executeFunctionStack(\n        value,\n        scope,\n        options.handlers.expression,\n        generateExpression,\n        options,\n      );\n    }\n    // return generateExpression(value, scope);\n    return generateFunction(value, {\n      isToVue: true,\n      isBelongTemplate: true,\n      isDeleteLastSemicolon: true,\n    });\n  }\n\n  if (isJSFunction(value) || isJSExpressionFn(value)) {\n    if (options.handlers?.function) {\n      return executeFunctionStack(value, scope, options.handlers.function, genFunction, options);\n    }\n    return genFunction(value);\n  }\n\n  if (isJSSlot(value)) {\n    if (options.handlers?.slot) {\n      return executeFunctionStack(value, scope, options.handlers.slot, genJsSlot, options);\n    }\n    return genJsSlot(value, scope, options);\n  }\n\n  if (isDataSource(value)) {\n    return generateUnknownType(\n      {\n        type: 'JSExpression',\n        value: `this.dataSourceMap[${JSON.stringify(value.id)}]`,\n      },\n      scope,\n      options,\n    );\n  }\n\n  if (_.isObject(value)) {\n    if (options.handlers?.object) {\n      return executeFunctionStack(value, scope, options.handlers.object, generateObject, options);\n    }\n    return generateObject(value as IPublicTypeCompositeObject, scope, options);\n  }\n\n  if (_.isString(value)) {\n    if (options.handlers?.string) {\n      return executeFunctionStack(value, scope, options.handlers.string, generateString, options);\n    }\n    return generateString(value);\n  }\n\n  if (_.isNumber(value)) {\n    if (options.handlers?.number) {\n      return executeFunctionStack(value, scope, options.handlers.number, generateNumber, options);\n    }\n    return generateNumber(value);\n  }\n\n  if (_.isBoolean(value)) {\n    if (options.handlers?.boolean) {\n      return executeFunctionStack(value, scope, options.handlers.boolean, generateBool, options);\n    }\n    return generateBool(value);\n  }\n\n  throw new CodeGeneratorError('Meet unknown composite value type');\n}\n\n// 这一层曾经是对产出做最外层包装的，但其实包装逻辑不应该属于这一层\n// 这一层先不去掉，做冗余，方便后续重构\nexport function generateCompositeType(\n  value: IPublicTypeCompositeValue,\n  scope: IScope,\n  options: CompositeValueGeneratorOptions = {},\n): string {\n  const result = generateUnknownType(value, scope, options);\n  return result;\n}\n","import * as parser from '@babel/parser';\nimport type { ParserPlugin } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport {\n  CallExpression,\n  ExpressionStatement,\n  Identifier,\n  MemberExpression,\n  StringLiteral,\n} from '@babel/types';\nimport {\n  IPublicTypeJSExpression,\n  IPublicTypeJSFunction,\n  isJSExpression,\n  isJSFunction,\n} from '@alilc/lowcode-types';\nimport { CodeGeneratorError, IScope } from '../types';\nimport { ParseError, transformExpressionLocalRef } from './expressionParser';\nimport { isJSExpressionFn } from './common';\nimport { lineToUppercase } from './changeCase';\n\nconst DEFAULT_BABEL_PLUGINS: ParserPlugin[] = [\n  'jsx',\n  'optionalChaining',\n  'nullishCoalescingOperator',\n  'objectRestSpread',\n  'dynamicImport',\n];\n\n/**\n * 解析给定的字符串内容为函数表达式。\n * @note 使用babel转化为ast树，再对树进行处理\n * @param content 要解析的字符串内容。\n * @param isToVue 是否转化为vue\n * @param isBelongTemplate 是否是template的表达式\n * @returns 解析成功的函数表达式节点，如果解析失败则返回null。\n * @throws 如果解析过程中发生错误，将抛出ParseError异常。\n */\nfunction parseFunction(\n  content: string,\n  isToVue?: boolean,\n  isBelongTemplate = false,\n): t.FunctionExpression | null {\n  try {\n    const ast = parser.parse(`(${content});`, {\n      plugins: DEFAULT_BABEL_PLUGINS,\n    });\n\n    let resultNode: t.FunctionExpression | null = null;\n    traverse(ast, {\n      FunctionExpression(path) {\n        resultNode = path.node;\n        // todo path.stop() 是停止向下解析\n        // path.stop();\n      },\n      CallExpression(path) {\n        if (isToVue) {\n          // setState转化\n          convertSetState(path, isBelongTemplate);\n        }\n      },\n      MemberExpression(path) {\n        if (isToVue) {\n          // this.state['aaa']转换\n          convertState(path, isBelongTemplate);\n        }\n      },\n    });\n    return resultNode;\n  } catch (e) {\n    throw new ParseError(content, e);\n  }\n}\n\nfunction transformFuncExpr2MethodMember(\n  methodName: string,\n  content: string,\n  isToVue?: boolean,\n  isBelongTemplate?: boolean,\n): string {\n  const funcNode = parseFunction(content, isToVue, isBelongTemplate);\n  if (funcNode) {\n    const targetNode = t.classMethod(\n      'method',\n      (methodName && t.identifier(methodName)) || funcNode.id || t.identifier('notDefineName'),\n      funcNode.params,\n      funcNode.body,\n      undefined,\n      undefined,\n      undefined,\n      funcNode.async || undefined,\n    );\n\n    const { code: resultCode } = generate(targetNode, { sourceMaps: false });\n    return resultCode;\n  }\n\n  throw new Error('Can not find Function Statement');\n}\n\nfunction getArrowFunction(content: string) {\n  const funcNode = parseFunction(content);\n  if (funcNode) {\n    const targetNode = t.arrowFunctionExpression(\n      funcNode.params,\n      funcNode.body,\n      funcNode.async || undefined,\n    );\n\n    const { code: resultCode } = generate(targetNode, { sourceMaps: false });\n    return resultCode;\n  }\n\n  throw new Error('Can not find Function Statement');\n}\n\nfunction getBodyStatements(content: string, isToVue?: boolean, isBelongTemplate?: boolean) {\n  const funcNode = parseFunction(content, isToVue, isBelongTemplate);\n  if (funcNode) {\n    const statements: t.Statement[] = funcNode.body.body;\n\n    const targetNode = t.program(statements, undefined, 'module', undefined);\n\n    const { code: resultCode } = generate(targetNode, { sourceMaps: false });\n    return resultCode;\n  }\n\n  throw new Error('Can not find Function Statement');\n}\n\n/**\n * 是否是广义上的 JSFunction\n * @param value\n * @returns\n */\nexport function isBroadJSFunction(value: unknown): boolean {\n  return isJSExpressionFn(value) || isJSFunction(value);\n}\n\nexport function generateExpression(value: any, scope: IScope): string {\n  if (isJSExpression(value)) {\n    const exprVal = (value as IPublicTypeJSExpression).value.trim();\n    if (!exprVal) {\n      return 'null';\n    }\n\n    const afterProcessWithLocals = getExpressionBody(exprVal, true, true, true);\n    return afterProcessWithLocals;\n  }\n\n  throw new CodeGeneratorError('Not a JSExpression');\n}\n\nfunction getFunctionSource(cfg: IPublicTypeJSFunction): string {\n  return cfg.source || cfg.value || cfg.compiled;\n}\n\n/**\n * 生成函数代码\n *\n * @param value 函数或表达式\n * @param config 配置对象，包含以下属性：\n * - name: 函数名称，可选\n * - isMember: 是否为成员函数，默认为false\n * - isBlock: 是否为块级函数，默认为false\n * - isArrow: 是否为箭头函数，默认为false\n * - isBindExpr: 是否为绑定表达式，默认为false\n * - isToVue 是否转化为vue（state，this转换）\n * - isDeleteLastSemicolon 是否删除生成代码最后的一个分号，默认为false\n * - isBelongTemplate 是否是template的表达式\n * @returns 返回生成的函数代码\n * @throws 当 value 不是 JSFunction 或 JSExpression 时抛出 CodeGeneratorError\n */\nexport function generateFunction(\n  value: any,\n  config: {\n    name?: string;\n    isMember?: boolean;\n    isBlock?: boolean;\n    isArrow?: boolean;\n    isBindExpr?: boolean;\n    isToVue?: boolean;\n    isDeleteLastSemicolon?: boolean;\n    isBelongTemplate?: boolean;\n  } = {\n    name: undefined,\n    isMember: false,\n    isBlock: false,\n    isArrow: false,\n    isBindExpr: false,\n    isToVue: false,\n    isDeleteLastSemicolon: false,\n    isBelongTemplate: false,\n  },\n) {\n  function extractFunctionCalls(str: string) {\n    const regex =\n      /(\\w+)\\.apply\\(\\w+,\\s*Array\\.prototype\\.slice\\.call\\(arguments\\)\\.concat\\(\\[(.*?)\\]\\)/g;\n    const matches = [];\n    let match;\n\n    while ((match = regex.exec(str)) !== null) {\n      const functionName = match[1];\n      let params = match[2]\n          .replace(/\"([a-zA-Z0-9_]+)\":/g, \"'$1':\") // 替换键的双引号为单引号\n          .replace(/:\"([^\"]+)\"/g, \":'$1'\");        // 替换字符串值的双引号为单引号;\n      matches.push(`${functionName}(${params})`);\n    }\n\n    return matches;\n  }\n  // js函数\n  if (isBroadJSFunction(value)) {\n    const functionCfg = value as IPublicTypeJSFunction;\n    const functionSource = getFunctionSource(functionCfg);\n    if (config.isMember) {\n      return transformFuncExpr2MethodMember(\n        config.name || '',\n        functionSource,\n        config.isToVue,\n        config.isBelongTemplate,\n      );\n    }\n    if (config.isBlock) {\n      return getBodyStatements(functionSource, config.isToVue, config.isBelongTemplate);\n    }\n    if (config.isArrow) {\n      return getArrowFunction(functionSource);\n    }\n    if (config.isBindExpr) {\n      return `${extractFunctionCalls(functionSource)}`;\n    }\n    return functionSource;\n  }\n  // js表达式\n  if (isJSExpression(value)) {\n    if (config.isToVue) {\n      // 如果是转换为vue，则去掉this.state,this.xxx\n      return getExpressionBody(\n        value.value,\n        config.isToVue,\n        config.isDeleteLastSemicolon,\n        config.isBelongTemplate,\n      );\n    }\n    return value.value;\n  }\n\n  throw new CodeGeneratorError('Not a JSFunction or JSExpression');\n}\n\n/**\n * 将this.setState({a:1}) 转换为 this.a.value = 1\n * @param path\n * @param isBelongTemplate 是否属于template的表达式\n */\nfunction convertSetState(path: NodePath<CallExpression>, isBelongTemplate?: boolean) {\n  // 拿到节点\n  const node = path.node;\n  // 判断是否是this.setState\n  if (\n    node.callee.type === 'MemberExpression' &&\n    node.callee.object.type === 'ThisExpression' &&\n    node.callee.property.name === 'setState'\n  ) {\n    // 获取setstate里的参数\n    const args = node.arguments[0].properties;\n    // 获取setstate里的回调方法\n    const stateFunction = node.arguments[1];\n    const expressionStatementArray: ExpressionStatement[] = [];\n    // 遍历参数\n    args.forEach((arg: any) => {\n      // key驼峰处理 todo 当key是字符串是进行驼峰处理，key是表达式暂不处理\n      if (arg.key.type == 'Identifier') {\n        arg.key.name = lineToUppercase(arg.key.name);\n      }\n      if (arg.key.type == 'Literal' || arg.key.type == 'StringLiteral') {\n        arg.key.value = lineToUppercase(arg.key.value);\n        // 去除单引号\n        arg.key = t.identifier(arg.key.value);\n      }\n      // 获得赋值表达式\n      let left1 = t.memberExpression(t.thisExpression(), arg.key, true);\n      if (!isBelongTemplate) {\n        // 不是template则要加上.value访问\n        left1 = t.memberExpression(left1, t.identifier('value'));\n      }\n      const assignment = t.assignmentExpression('=', left1, arg.value);\n      // 表达声明再套一层\n      expressionStatementArray.push(t.expressionStatement(assignment));\n    });\n    // 回调参数处理\n    if (stateFunction) {\n      // 将回调方法体移到setState外\n      const functionBody = stateFunction.body?.body;\n      expressionStatementArray.push(...functionBody);\n    }\n    // 获取父节点路径\n    const expressionStatementPath = path.parentPath;\n    // 用等号表达式批量替换父节点路径的this.setState表达式\n    expressionStatementPath.replaceWithMultiple(expressionStatementArray);\n  }\n}\n\n/**\n * todo this.xxx 转为 xxx。this.state['aaa'] 转为 aaa.value\n * @param path 路径\n * @param isBelongTemplate 是否属于template的表达式\n */\nfunction convertState(path: NodePath<MemberExpression>, isBelongTemplate?: boolean) {\n  // todo this.xxx 转为 xxx。this.state['aaa'] 转为 aaa.value\n  const node = path.node;\n  // 判断是不是this.state['aaa'] 格式\n  if (node.object.type === 'ThisExpression' && node.property.name === 'state') {\n    // 获取父路径\n    const parentPath = path.parentPath;\n    // 只有 this.state.xxx / this.state['xxx'] 这种场景才做转换。\n    // 像 Object.values(this.state) 这种仅访问 this.state 本身，会导致 parent 不是 MemberExpression，\n    // 之前这里会崩溃并被包装成 ParseError。\n    if (!parentPath.isMemberExpression()) {\n      return;\n    }\n\n    // 获取父节点\n    const parentNode = parentPath.node as MemberExpression;\n\n    // 确保 parent 的 object 就是当前这个 this.state\n    if (parentNode.object !== node) {\n      return;\n    }\n\n    // 获取变量名 ['aaa'],并进行驼峰转换\n    const name = lineToUppercase(\n      (parentNode.property as StringLiteral).value || (parentNode.property as Identifier).name,\n    );\n    if (isBelongTemplate) {\n      // template则this.state['aaa']转换为aaa\n      parentPath.replaceWith(t.identifier(name));\n    } else {\n      // 替换父节点为 aaa.value\n      parentPath.replaceWith(t.memberExpression(t.identifier(name), t.identifier('value')));\n    }\n  } else if (node.object.type === 'ThisExpression') {\n    // 如果仅是this.xxx 格式，则替换为xxx\n    path.replaceWith(node.property);\n  }\n}\n\n/**\n * 获取this.state.xxx里的xxx\n * @param path\n */\nfunction getStateName(path: NodePath<MemberExpression>) {\n  const node = path.node;\n  // 判断是不是this.state['aaa']或者 格式\n  if (!(node.object.type === 'ThisExpression') || !(node.property.name === 'state')) {\n    return '';\n  }\n  // 获取父路径\n  const parentPath = path.parentPath;\n  if (!parentPath.isMemberExpression()) {\n    return '';\n  }\n  // 获取父节点\n  const parentNode = parentPath.node as MemberExpression;\n  if (parentNode.object !== node) {\n    return '';\n  }\n  // 获取变量名 ['aaa'],并进行驼峰转换\n  return lineToUppercase(\n    (parentNode.property as StringLiteral).value || (parentNode.property as Identifier).name,\n  );\n}\n// function convertState(path: NodePath<CallExpression>) {\n//   // Grab the node\n//   const node = path.node;\n//\n//   // Check if it's a this.setState call\n//   if (\n//     node.callee.type === 'MemberExpression' &&\n//     node.callee.object.type === 'ThisExpression' &&\n//     node.callee.property.name === 'setState'\n//   ) {\n//     // Get the arguments passed to setState (e.g., { field: value })\n//     const args = node.arguments[0].properties;\n//     const expressionStatementArray: ExpressionStatement[] = [];\n//\n//     // Loop through each argument in the setState\n//     args.forEach((arg: any) => {\n//       if (arg.key.type === 'Identifier') {\n//         // For static keys like 'a': 1\n//         const assignment = t.assignmentExpression(\n//           '=',\n//           t.memberExpression(t.thisExpression(), arg.key),\n//           arg.value,\n//         );\n//         expressionStatementArray.push(t.expressionStatement(assignment));\n//       } else if (arg.key.type === 'Literal') {\n//         // For keys like 'a': 1\n//         const assignment = t.assignmentExpression(\n//           '=',\n//           t.memberExpression(t.thisExpression(), arg.key),\n//           arg.value,\n//         );\n//         expressionStatementArray.push(t.expressionStatement(assignment));\n//       } else if (arg.key.type === 'MemberExpression') {\n//         // Handle dynamic keys (e.g., [field]: clickValue)\n//         const dynamicKey = arg.key; // this will be [field] part\n//         const computedKey = t.memberExpression(t.thisExpression(), dynamicKey.object);\n//         const assignment = t.assignmentExpression(\n//           '=',\n//           t.memberExpression(computedKey, dynamicKey.property),\n//           arg.value,\n//         );\n//         expressionStatementArray.push(t.expressionStatement(assignment));\n//       }\n//     });\n//\n//     // If there's a callback function, recursively handle the nested setState inside it\n//     if (node.arguments[1] && node.arguments[1].type === 'ArrowFunctionExpression') {\n//       const callback = node.arguments[1];\n//       if (callback.body.body) {\n//         callback.body.body.forEach((nestedNode: any) => {\n//           if (\n//             nestedNode.type === 'ExpressionStatement' &&\n//             nestedNode.expression.callee.property.name === 'setState'\n//           ) {\n//             // Recursively handle nested setState calls\n//             convertState({\n//               node: nestedNode.expression,\n//               parentPath: path.parentPath,\n//             });\n//           }\n//         });\n//       }\n//     }\n//\n//     // Replace the original setState call with the transformed code\n//     const expressionStatementPath = path.parentPath;\n//     expressionStatementPath.replaceWithMultiple(expressionStatementArray);\n//   }\n// }\n\n/**\n * 解析给定的字符串内容为js表达式。\n * @note 使用babel转化为ast树，再对树进行处理\n * @param content 要解析的字符串内容。\n * @param isToVue\n * @param isBelongTemplate 是否是template的表达式\n * @returns 解析成功的表达式节点，如果解析失败则返回null。\n * @throws 如果解析过程中发生错误，将抛出ParseError异常。\n */\nexport function parseExpression(\n  content: string,\n  isToVue?: boolean,\n  isBelongTemplate?: boolean,\n): t.FunctionExpression | null {\n  try {\n    const ast = parser.parse(`(${content})`, {\n      plugins: DEFAULT_BABEL_PLUGINS,\n    });\n\n    let resultNode: t.FunctionExpression | null = ast;\n    traverse(ast, {\n      MemberExpression(path) {\n        if (isToVue) {\n          convertState(path, isBelongTemplate);\n        }\n      },\n    });\n    return resultNode;\n  } catch (e) {\n    throw new ParseError(content, e);\n  }\n}\n\n/**\n * 解析js表达式获取this.state.xxx 的xxx\n * @param content\n */\nexport function parseExpressionGetState(content: string): Set<string> {\n  try {\n    const ast = parser.parse(`(${content})`, {\n      plugins: DEFAULT_BABEL_PLUGINS,\n    });\n\n    const refSet: Set<string> = new Set();\n    traverse(ast, {\n      MemberExpression(path) {\n        refSet.add(getStateName(path));\n      },\n    });\n    return refSet;\n  } catch (e) {\n    throw new ParseError(content, e);\n  }\n}\n\n/**\n * 获取js表达式文字\n * @param content\n * @param isToVue 是否是转换为vue\n * @param isDeleteLastSemicolon 是否删除最后一个分号\n * @param isBelongTemplate 是否是template的内容\n */\nfunction getExpressionBody(\n  content: string,\n  isToVue?: boolean,\n  isDeleteLastSemicolon?: boolean,\n  isBelongTemplate?: boolean,\n) {\n  const funcNode = parseExpression(content, isToVue, isBelongTemplate);\n  if (funcNode) {\n    const { code: resultCode } = generate(funcNode, { sourceMaps: false });\n    if (resultCode) {\n      // 删除最后一个分号\n      if (isDeleteLastSemicolon && resultCode.endsWith(';')) {\n        return resultCode.slice(0, -1);\n      }\n    }\n    return resultCode;\n  }\n\n  throw new Error('Can not find Function Statement');\n}\n","import * as parser from '@babel/parser';\nimport type { ParserPlugin } from '@babel/parser';\nimport generate from '@babel/generator';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { isIdentifier, Node } from '@babel/types';\n\nimport { OrderedSet } from './OrderedSet';\nimport { IScope } from '../types';\n\nexport class ParseError extends Error {\n  readonly expr: string | t.Expression;\n\n  readonly detail: unknown;\n\n  constructor(expr: string | t.Expression, detail: unknown) {\n    super(`Failed to parse expression \"${typeof expr === 'string' ? expr : generate(expr)}\"`);\n    this.expr = expr;\n    this.detail = detail;\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n}\n\nconst DEFAULT_BABEL_PLUGINS: ParserPlugin[] = [\n  'jsx',\n  // schema / 出码过程中经常出现的现代语法\n  'optionalChaining',\n  'nullishCoalescingOperator',\n  // 常见增强语法（开启后对旧语法兼容）\n  'objectRestSpread',\n  'dynamicImport',\n];\n\nconst MAYBE_EXPRESSIONS: {\n  [k in Node['type']]?: {\n    // fields: Array<keyof (Node & { type: k })>\n    fields: string[] | ((node: Node) => string[]);\n  };\n} = {\n  ArrayExpression: { fields: ['elements'] },\n  AssignmentExpression: { fields: ['left', 'right'] },\n  BinaryExpression: { fields: ['left', 'right'] },\n  CallExpression: { fields: ['arguments', 'callee'] },\n  ConditionalExpression: { fields: ['test', 'consequent', 'alternate'] },\n  DoWhileStatement: { fields: ['test'] },\n  ExpressionStatement: { fields: ['expression'] },\n  ForInStatement: { fields: ['right'] },\n  ForStatement: { fields: ['init', 'test', 'update'] },\n  IfStatement: { fields: ['test'] },\n  LogicalExpression: { fields: ['left', 'right'] },\n  MemberExpression: {\n    fields: (node) => {\n      return node.type === 'MemberExpression' && node.computed\n        ? ['object', 'property']\n        : ['object'];\n    },\n  },\n  NewExpression: { fields: ['callee', 'arguments'] },\n  ObjectMethod: {\n    fields: (node) => {\n      return node.type === 'ObjectMethod' && node.computed ? ['key'] : [];\n    },\n  },\n  ObjectProperty: {\n    fields: (node) => {\n      return node.type === 'ObjectProperty' && node.computed ? ['key', 'value'] : ['value'];\n    },\n  },\n  ReturnStatement: { fields: ['argument'] },\n  SequenceExpression: { fields: ['expressions'] },\n  ParenthesizedExpression: { fields: ['expression'] },\n  SwitchCase: { fields: ['test'] },\n  SwitchStatement: { fields: ['discriminant'] },\n  ThrowStatement: { fields: ['argument'] },\n  UnaryExpression: { fields: ['argument'] },\n  UpdateExpression: { fields: ['argument'] },\n  VariableDeclarator: { fields: ['init'] },\n  WhileStatement: { fields: ['test'] },\n  WithStatement: { fields: ['object'] },\n  AssignmentPattern: { fields: ['right'] },\n  ArrowFunctionExpression: { fields: ['body'] },\n  ClassExpression: { fields: ['superClass'] },\n  ClassDeclaration: { fields: ['superClass'] },\n  ExportDefaultDeclaration: { fields: ['declaration'] },\n  ForOfStatement: { fields: ['right'] },\n  ClassMethod: {\n    fields: (node) => {\n      return node.type === 'ClassMethod' && node.computed ? ['key'] : [];\n    },\n  },\n  SpreadElement: { fields: ['argument'] },\n  TaggedTemplateExpression: { fields: ['tag'] },\n  TemplateLiteral: { fields: ['expressions'] },\n  YieldExpression: { fields: ['argument'] },\n  AwaitExpression: { fields: ['argument'] },\n  OptionalMemberExpression: {\n    fields: (node) => {\n      return node.type === 'OptionalMemberExpression' && node.computed\n        ? ['object', 'property']\n        : ['object'];\n    },\n  },\n  OptionalCallExpression: { fields: ['callee', 'arguments'] },\n  JSXSpreadAttribute: { fields: ['argument'] },\n  BindExpression: { fields: ['object', 'callee'] },\n  ClassProperty: {\n    fields: (node) => {\n      return node.type === 'ClassProperty' && node.computed ? ['key', 'value'] : ['value'];\n    },\n  },\n  PipelineTopicExpression: { fields: ['expression'] },\n  PipelineBareFunction: { fields: ['callee'] },\n  ClassPrivateProperty: { fields: ['value'] },\n  Decorator: { fields: ['expression'] },\n  TupleExpression: { fields: ['elements'] },\n  TSDeclareMethod: {\n    fields: (node) => {\n      return node.type === 'TSDeclareMethod' && node.computed ? ['key'] : [];\n    },\n  },\n  TSPropertySignature: {\n    fields: (node) => {\n      return node.type === 'TSPropertySignature' && node.computed\n        ? ['key', 'initializer']\n        : ['initializer'];\n    },\n  },\n\n  TSMethodSignature: {\n    fields: (node) => {\n      return node.type === 'TSMethodSignature' && node.computed ? ['key'] : [];\n    },\n  },\n  TSAsExpression: { fields: ['expression'] },\n  TSTypeAssertion: { fields: ['expression'] },\n  TSEnumDeclaration: { fields: ['initializer'] },\n  TSEnumMember: { fields: ['initializer'] },\n  TSNonNullExpression: { fields: ['expression'] },\n  TSExportAssignment: { fields: ['expression'] },\n};\n\nexport interface ParseExpressionGetGlobalVariablesOptions {\n  filter?: (varName: string) => boolean;\n}\n\nconst CROSS_THIS_SCOPE_TYPE_NODE: {\n  [k in Node['type']]?: boolean;\n} = {\n  ArrowFunctionExpression: false, // 箭头函数不跨越 this 的 scope\n  FunctionExpression: true,\n  FunctionDeclaration: true,\n  // FunctionTypeAnnotation: false, // 这是 TS 定义\n  // FunctionTypeParam: false, // 这是 TS 定义\n  ClassDeclaration: true,\n  ClassExpression: true,\n  ClassBody: true,\n  ClassImplements: true,\n  ClassMethod: true,\n  ClassPrivateMethod: true,\n  ClassProperty: true,\n  ClassPrivateProperty: true,\n  DeclareClass: true,\n};\n\nconst JS_KEYWORDS = ['arguments', 'this', 'super'];\n\nexport function parseExpressionGetKeywords(expr: string | null | undefined): string[] {\n  if (!expr) {\n    return [];\n  }\n\n  try {\n    const keywordVars = new OrderedSet<string>();\n\n    let ast: t.File;\n    try {\n      ast = parser.parse(`!(${expr});`, {\n        plugins: DEFAULT_BABEL_PLUGINS,\n      });\n    } catch (e) {\n      // 某些 schema 会把函数声明/复杂片段塞进“表达式”字段里。\n      // 对分析（关键字/全局变量）来说，我们只需要可 parse 的 AST。\n      ast = parser.parse(`!((${expr}));`, {\n        plugins: DEFAULT_BABEL_PLUGINS,\n      });\n    }\n\n    const addIdentifierIfNeeded = (x: Node | null | undefined) => {\n      if (typeof x === 'object' && isIdentifier(x) && JS_KEYWORDS.includes(x.name)) {\n        keywordVars.add(x.name);\n      }\n    };\n\n    traverse(ast, {\n      enter(path) {\n        const { node } = path;\n        const expressionFields = MAYBE_EXPRESSIONS[node.type]?.fields;\n        if (expressionFields) {\n          (typeof expressionFields === 'function'\n            ? expressionFields(node)\n            : expressionFields\n          ).forEach((fieldName) => {\n            const fieldValue = node[fieldName as keyof typeof node];\n            if (typeof fieldValue === 'object') {\n              if (Array.isArray(fieldValue)) {\n                fieldValue.forEach((item: any) => {\n                  addIdentifierIfNeeded(item);\n                });\n              } else {\n                addIdentifierIfNeeded(fieldValue as any);\n              }\n            }\n          });\n        }\n      },\n    });\n\n    return keywordVars.toArray().filter(Boolean);\n  } catch (e) {\n    throw new ParseError(expr, e);\n  }\n}\n\nexport function parseExpressionGetGlobalVariables(\n  expr: string | null | undefined,\n  { filter = () => true }: ParseExpressionGetGlobalVariablesOptions = {},\n): string[] {\n  if (!expr) {\n    return [];\n  }\n\n  try {\n    const undeclaredVars = new OrderedSet<string>();\n\n    let ast: t.File;\n    try {\n      ast = parser.parse(`!(${expr});`, {\n        plugins: DEFAULT_BABEL_PLUGINS,\n      });\n    } catch (e) {\n      ast = parser.parse(`!((${expr}));`, {\n        plugins: DEFAULT_BABEL_PLUGINS,\n      });\n    }\n\n    const addUndeclaredIdentifierIfNeeded = (\n      x: Node | null | undefined,\n      path: NodePath<Node>,\n    ) => {\n      if (typeof x === 'object' && isIdentifier(x) && !path.scope.hasBinding(x.name)) {\n        undeclaredVars.add(x.name);\n      }\n    };\n\n    traverse(ast, {\n      enter(path) {\n        const { node } = path;\n        const expressionFields = MAYBE_EXPRESSIONS[node.type]?.fields;\n        if (expressionFields) {\n          (typeof expressionFields === 'function'\n            ? expressionFields(node)\n            : expressionFields\n          ).forEach((fieldName) => {\n            const fieldValue = node[fieldName as keyof typeof node];\n            if (typeof fieldValue === 'object') {\n              if (Array.isArray(fieldValue)) {\n                fieldValue.forEach((item: any) => {\n                  addUndeclaredIdentifierIfNeeded(item, path);\n                });\n              } else {\n                addUndeclaredIdentifierIfNeeded(fieldValue as any, path);\n              }\n            }\n          });\n        }\n      },\n    });\n\n    return undeclaredVars.toArray().filter(filter);\n  } catch (e) {\n    throw new ParseError(expr, e);\n  }\n}\n\nexport function parseExpressionConvertThis2Context(\n  expr: string | t.Expression,\n  contextName = '__$$context',\n  localVariables: string[] = [],\n): string {\n  if (!expr) {\n    return '';\n  }\n\n  try {\n    const exprAst =\n      typeof expr === 'string'\n        ? parseExpression(expr)\n        : expr;\n    const exprWrapAst = t.expressionStatement(exprAst);\n    const fileAst = t.file(t.program([exprWrapAst]));\n\n    const localVariablesSet = new Set(localVariables);\n\n    let thisScopeLevel = CROSS_THIS_SCOPE_TYPE_NODE[exprAst.type] ? -1 : 0;\n    traverse(fileAst, {\n      enter(path) {\n        if (CROSS_THIS_SCOPE_TYPE_NODE[path.node.type]) {\n          thisScopeLevel++;\n        }\n      },\n      exit(path) {\n        if (CROSS_THIS_SCOPE_TYPE_NODE[path.node.type]) {\n          thisScopeLevel--;\n        }\n      },\n      MemberExpression(path) {\n        if (!path.isMemberExpression()) {\n          return;\n        }\n\n        const obj = path.get('object');\n        if (!obj.isThisExpression()) {\n          return;\n        }\n\n        // Special-case: if this.state is used as a whole (e.g. Object.values(this.state)\n        // or passed as a function argument), we should replace the entire `this.state`\n        // node with the context identifier so the runtime sees the context object.\n        // Otherwise replacing only `this` will produce `__$$context.state`, which is\n        // incorrect when the code expects the whole state object.\n        const propNode = path.node.property as any;\n        const isStateMember = !path.node.computed && propNode && propNode.type === 'Identifier' && propNode.name === 'state';\n        if (isStateMember) {\n          const parent = path.parentPath;\n          if (parent.isCallExpression() || parent.isBinaryExpression() || parent.isLogicalExpression() || parent.isConditionalExpression()) {\n            if (thisScopeLevel <= 0) {\n              path.replaceWith(t.identifier(contextName));\n            }\n            return;\n          }\n        }\n\n        // 处理局部变量\n        if (!path.node.computed) {\n          const prop = path.get('property');\n          if (prop.isIdentifier() && localVariablesSet.has(prop.node.name)) {\n            path.replaceWith(t.identifier(prop.node.name));\n            return;\n          }\n        }\n\n        // 替换 this (只在顶层替换)\n        if (thisScopeLevel <= 0) {\n          obj.replaceWith(t.identifier(contextName));\n        }\n      },\n      ThisExpression(path) {\n        if (!path.isThisExpression()) {\n          return;\n        }\n\n        // MemberExpression 中的 this.xxx 已经处理过了\n        if (path.parent.type === 'MemberExpression') {\n          return;\n        }\n\n        if (thisScopeLevel <= 0) {\n          path.replaceWith(t.identifier(contextName));\n        }\n      },\n    });\n\n    const { code } = generate(exprWrapAst.expression, { sourceMaps: false });\n    return code;\n  } catch (e) {\n    throw new ParseError(expr, e);\n  }\n}\n\nexport function parseExpression(expr: string) {\n  try {\n    return parser.parseExpression(expr, { plugins: DEFAULT_BABEL_PLUGINS });\n  } catch (e) {\n    // Some schema fields may provide a function string like `function foo() {}`.\n    // That's not valid for `parseExpression` unless wrapped as an expression.\n    try {\n      return parser.parseExpression(`(${expr})`, { plugins: DEFAULT_BABEL_PLUGINS });\n    } catch {\n      throw new ParseError(expr, e);\n    }\n  }\n}\n\nexport function transformExpressionLocalRef(expr: string, scope: IScope) {\n  if (!expr) {\n    return expr;\n  }\n\n  if (!scope) {\n    throw new Error('transform expression without scope');\n  }\n\n  try {\n    const exprAst =\n      typeof expr === 'string'\n        ? parseExpression(expr)\n        : expr;\n    const exprWrapAst = t.expressionStatement(exprAst);\n    const fileAst = t.file(t.program([exprWrapAst]));\n\n    traverse(fileAst, {\n      MemberExpression(path) {\n        if (!path.isMemberExpression()) {\n          return;\n        }\n\n        const obj = path.get('object');\n        if (!obj.isThisExpression()) {\n          return;\n        }\n\n        // 查看是否存在引用 local 值\n        const prop = path.get('property');\n        let memberName = '';\n        if (!path.node.computed && prop.isIdentifier()) {\n          memberName = prop.node.name;\n        } else if (path.node.computed && prop.isStringLiteral()) {\n          memberName = prop.node.value;\n        }\n        if (memberName && scope.bindings && scope.bindings.hasBinding(memberName)) {\n          path.replaceWith(t.identifier(memberName));\n        }\n      },\n    });\n\n    const { code } = generate(exprWrapAst.expression, { sourceMaps: false });\n    return code;\n  } catch (e) {\n    throw new ParseError(expr, e);\n    // throw e;\n  }\n}\n","export class OrderedSet<T> {\n  private _set = new Set<T>();\n  private _arr: T[] = [];\n\n  constructor(items?: T[]) {\n    if (items) {\n      this._set = new Set(items);\n      this._arr = items.slice(0);\n    }\n  }\n\n  add(item: T) {\n    if (!this._set.has(item)) {\n      this._set.add(item);\n      this._arr.push(item);\n    }\n  }\n\n  delete(item: T) {\n    if (this._set.has(item)) {\n      this._set.delete(item);\n      this._arr.splice(this._arr.indexOf(item), 1);\n    }\n  }\n\n  has(item: T) {\n    return this._set.has(item);\n  }\n\n  toArray() {\n    return this._arr.slice(0);\n  }\n}\n","\n/**\n * 首字母改为大写，其他字母小写\n * @param {string} str\n */\nexport function toFirstUpperCase(str: string): string {\n  let name = str.toLowerCase();\n  return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/**\n * @description 下划线字符串转驼峰\n * @param str\n */\nexport function lineToUppercase(str: string) {\n  if (!str) {\n    return ''\n  }\n  function upper(all: string,letter: string){\n    return letter.toUpperCase();\n  }\n\n  return str.replace(/_(\\w)/g,upper);\n}\n","import { IPublicTypeJSSlot, isJSSlot, IPublicTypeNodeData } from '@alilc/lowcode-types';\nimport { CodeGeneratorError, NodeGenerator, IScope } from '../types';\nimport { unwrapJsExprQuoteInJsx } from './jsxHelpers';\n\nfunction generateSingleLineComment(commentText: string): string {\n  return `/* ${commentText.split('\\n').join(' ').replace(/\\*\\//g, '*-/')}*/`;\n}\n\nexport function generateJsSlot(slot: any, scope: IScope, generator: NodeGenerator<string>): string {\n  if (isJSSlot(slot)) {\n    const { title, params, value } = slot as IPublicTypeJSSlot;\n\n    // slot 也是分有参数和无参数的\n    // - 有参数的 slot 就是类似一个 render 函数，需要创建子作用域\n    // - 无参数的 slot 就是类似一个 JSX 节点，不需要创建子作用域\n    const slotScope = params ? scope.createSubScope(params || []) : scope;\n    const contentExpr = !value\n      ? 'null'\n      : generateNodeDataOrArrayForJsSlot(value, generator, slotScope);\n    if (params) {\n      return [\n        title && generateSingleLineComment(title),\n        '(',\n        (params || []).join(', '),\n        ') => ((__$$context) => (',\n        contentExpr,\n        '))(',\n        `  __$$createChildContext(__$$context, { ${(params || []).join(', ')} }`,\n        '))',\n      ]\n        .filter(Boolean)\n        .join('');\n    }\n\n    return contentExpr || '[]';\n  }\n\n  throw new CodeGeneratorError('Not a JSSlot');\n}\n\nfunction generateNodeDataOrArrayForJsSlot(\n  value: IPublicTypeNodeData | IPublicTypeNodeData[],\n  generator: NodeGenerator<string>,\n  scope: IScope,\n) {\n  if (Array.isArray(value)) {\n    if (value.length === 0) {\n      return '[]';\n    }\n\n    if (value.length === 1) {\n      return unwrapJsExprQuoteInJsx(generator(value, scope)) || 'null';\n    }\n\n    return `[\\n${\n      value\n        .map((v) => {\n          if (typeof v === 'string') {\n            return JSON.stringify(v);\n          }\n\n          return unwrapJsExprQuoteInJsx(generator(v, scope)) || 'null';\n        })\n        .join(',\\n') || 'null'\n    }\\n]`;\n  }\n\n  return unwrapJsExprQuoteInJsx(generator(value, scope)) || 'null';\n}\n","/**\n * 去掉 JS 表达式的 \"{...}\" 的封装, 如:\n *  {<xxx />} => <xxx />\n */\nexport function unwrapJsExprQuoteInJsx(jsxExpr: string): string {\n  if (jsxExpr.length >= 2 && jsxExpr[0] === '{' && jsxExpr[jsxExpr.length - 1] === '}') {\n    return jsxExpr.slice(1, jsxExpr.length - 1);\n  }\n\n  return jsxExpr;\n}\n","import { BaseGenerator, IScope } from '../types/core';\n\nexport function executeFunctionStack<I, T, C>(\n  input: I,\n  scope: IScope,\n  funcs: BaseGenerator<I, T, C> | Array<BaseGenerator<I, T, C>>,\n  baseFunc: BaseGenerator<I, T, C>,\n  config?: C,\n): T {\n  const funcList: Array<BaseGenerator<I, T, C>> = [];\n  if (Array.isArray(funcs)) {\n    funcList.push(...funcs);\n  } else {\n    funcList.push(funcs);\n  }\n\n  let next: BaseGenerator<I, T, C> = baseFunc;\n  while (funcList.length > 0) {\n    const func = funcList.pop();\n    if (func) {\n      const warppedFunc = ((nextFunc) => (i: I, s: IScope, cfg?: C) => func(i, s, cfg, nextFunc))(next);\n      next = warppedFunc;\n    }\n  }\n\n  return next(input, scope, config);\n}\n","import { IScope } from '../types/core';\nimport { IScopeBindings, ScopeBindings } from './ScopeBindings';\n\nexport class Scope implements IScope {\n  /**\n   * 创建根部 Scope，根据需要被上溯的作用域链决定是否开启新的\n   */\n  static createRootScope(): IScope {\n    return new Scope();\n  }\n\n  bindings?: IScopeBindings;\n\n  constructor(public readonly parent: IScope | null = null) {\n    this.bindings = undefined;\n  }\n\n  createSubScope(ownIdentifiers: string[]): IScope {\n    const originalScopeBindings = this.bindings;\n    const newScopeBindings = new ScopeBindings(originalScopeBindings);\n    ownIdentifiers.forEach((identifier) => {\n      newScopeBindings.addBinding(identifier);\n    });\n    const newScope = new Scope(this);\n    newScope.bindings = newScopeBindings;\n    return newScope;\n  }\n}\n","import { OrderedSet } from './OrderedSet';\n\nexport interface IScopeBindings {\n  readonly parent: IScopeBindings | null;\n\n  hasBinding: (varName: string) => boolean;\n  hasOwnBinding: (varName: string) => boolean;\n\n  addBinding: (varName: string) => void;\n  removeBinding: (varName: string) => void;\n\n  getAllBindings: () => string[];\n  getAllOwnedBindings: () => string[];\n}\n\nexport class ScopeBindings implements IScopeBindings {\n  readonly parent: IScopeBindings | null;\n\n  private _bindings = new OrderedSet<string>();\n\n  constructor(p: IScopeBindings | null = null) {\n    this.parent = p;\n  }\n\n  hasBinding(varName: string): boolean {\n    return this._bindings.has(varName) || !!this.parent?.hasBinding(varName);\n  }\n\n  hasOwnBinding(varName: string): boolean {\n    return this._bindings.has(varName);\n  }\n\n  addBinding(varName: string): void {\n    this._bindings.add(varName);\n  }\n\n  removeBinding(varName: string): void {\n    this._bindings.delete(varName);\n  }\n\n  getAllBindings(): string[] {\n    const allBindings = new OrderedSet(this._bindings.toArray());\n\n    for (let { parent } = this; parent; parent = parent?.parent) {\n      parent.getAllOwnedBindings().forEach((varName) => {\n        allBindings.add(varName);\n      });\n    }\n\n    return allBindings.toArray();\n  }\n\n  getAllOwnedBindings(): string[] {\n    return this._bindings.toArray();\n  }\n}\n","import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator';\n\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { Scope } from '../../../utils/Scope';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\n\nexport interface PluginConfig {\n  fileType?: string;\n  implementType: 'inConstructor' | 'insMember' | 'hooks';\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig & { fileType: string } = {\n    fileType: FileType.JSX,\n    implementType: 'inConstructor',\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const scope = Scope.createRootScope();\n\n    const state = ir.state || {};\n    const fields = Object.keys(state).map<string>((stateName) => {\n      const value = generateCompositeType(state[stateName], scope);\n      return `${stateName}: ${value},`;\n    });\n\n    if (cfg.implementType === 'inConstructor') {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n        content: `this.state = { ${fields.join('')} };`,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],\n      });\n    } else if (cfg.implementType === 'insMember') {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: `state = { ${fields.join('')} };`,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],\n      });\n    }\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { CLASS_DEFINE_CHUNK_NAME } from '../../../const/generator';\n\nimport { Scope } from '../../../utils/Scope';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { DEFAULT_LINK_AFTER } from '../../../const';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const scope = Scope.createRootScope();\n\n    const { inStrictMode } = next.contextData;\n    if (!inStrictMode) {\n      // 非严格模式下，上下文就是自己\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: `\n          _context = this;\n        `,\n        linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n      });\n    } else {\n      // 严格模式下的上下文只保留协议中规定的那些\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: `\n          _context = this._createContext();\n        `,\n        linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n        content: `\n          _createContext() {\n            const self = this;\n            const context = {\n              get state() { return self.state; },\n              setState(newState, callback) { self.setState(newState, callback); },\n              get dataSourceMap() { return self._dataSourceEngine.dataSourceMap || {}; },\n              async reloadDataSource() { await self._dataSourceEngine.reloadDataSource(); },\n              get utils() { return self.utils; },\n              get page() { return context; },\n              get component() { return context; },\n              get props() { return self.props; },\n              get constants() { return self.constants; },\n              get $() { return self.$ },\n              get $$() { return self.$$ },\n              ...this._methods,\n            };\n  \n            return context;\n          }\n        `,\n        linkAfter: DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod],\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { IContextData } from '../types';\n\nfunction relativePath(from: string[], to: string[]): string[] {\n  const length = Math.min(from.length, to.length);\n  let samePartsLength = length;\n  for (let i = 0; i < length; i++) {\n    if (from[i] !== to[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n  if (samePartsLength === 0) {\n    return to;\n  }\n  let outputParts = [];\n  for (let i = samePartsLength; i < from.length; i++) {\n    outputParts.push('..');\n  }\n  outputParts = [...outputParts, ...to.slice(samePartsLength)];\n  if (outputParts[0] !== '..') {\n    outputParts.unshift('.');\n  }\n  return outputParts;\n}\n\nexport function getSlotRelativePath(options: {\n  contextData: IContextData;\n  from: string;\n  to: string;\n}) {\n  const { contextData, from, to } = options;\n  const isSingleComponent = contextData?.extraContextData?.projectRemark?.isSingleComponent;\n  const template = contextData?.extraContextData?.template;\n  let toPath = template.slots[to].path;\n  toPath = [...toPath, template.slots[to].fileName!];\n  let fromPath = template.slots[from].path;\n  if (!isSingleComponent && ['components', 'pages'].indexOf(from) !== -1) {\n    fromPath = [...fromPath, 'pageName'];\n  }\n  return relativePath(fromPath, toPath).join('/');\n}","import {\n  CLASS_DEFINE_CHUNK_NAME,\n  COMMON_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { getSlotRelativePath } from '../../../utils/pathHelper';\n\nexport interface PluginConfig {\n  fileType?: string;\n\n  /** prefer using class property to define utils */\n  preferClassProperty?: boolean;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig & { fileType: string } = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    next.contextData.useRefApi = true;\n    const useRef = !!ir.analyzeResult?.isUsingRef;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: `\n        import utils${useRef ? ', { RefsManager }' : ''} from '${getSlotRelativePath({ contextData: next.contextData, from: 'components', to: 'utils' })}';\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    if (cfg.preferClassProperty) {\n      // mode: class property\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: 'utils = utils;',\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],\n      });\n    } else {\n      // mode: assign in constructor\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n        content: 'this.utils = utils;',\n        linkAfter: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart],\n      });\n    }\n\n    if (useRef) {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n        content: 'this._refsManager = new RefsManager();',\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        content: `\n          $ = (refName) => {\n            return this._refsManager.get(refName);\n          }\n        `,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        content: `\n          $$ = (refName) => {\n            return this._refsManager.getAll(refName);\n          }\n        `,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n      });\n    } else {\n      // useRef 为 false 的时候是指没有组件在 props 中配置 ref 属性，但这个时候其实也可能有代码访问 this.$/$$ 所以还是加上个空的代码\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        content: ' $ = () => null; ',\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        content: ' $$ = () => [];        ',\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","/* eslint-disable @typescript-eslint/indent */\n\nimport {\n  IPublicTypeCompositeValue,\n  IPublicTypeJSExpression,\n  InterpretDataSourceConfig,\n  isJSExpression,\n  isJSFunction,\n} from '@alilc/lowcode-types';\nimport changeCase from '../../../utils/changeCaseCompat';\n\nimport {\n  CLASS_DEFINE_CHUNK_NAME,\n  COMMON_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\nimport { Scope } from '../../../utils/Scope';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IScope,\n} from '../../../types';\n\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { parseExpressionConvertThis2Context } from '../../../utils/expressionParser';\nimport { isValidContainerType } from '../../../utils/schema';\nimport { REACT_CHUNK_NAME } from './const';\nimport { isJSExpressionFn } from '../../../utils/common';\n\nexport interface PluginConfig {\n  fileType?: string;\n\n  /**\n   * 数据源配置\n   */\n  datasourceConfig?: {\n\n    /** 数据源引擎的版本 */\n    engineVersion?: string;\n\n    /** 数据源引擎的包名 */\n    enginePackage?: string;\n\n    /** 数据源 handlers 的版本 */\n    handlersVersion?: {\n      [key: string]: string;\n    };\n\n    /** 数据源 handlers 的包名 */\n    handlersPackages?: {\n      [key: string]: string;\n    };\n  };\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg = {\n    ...config,\n    fileType: config?.fileType || FileType.JSX,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const scope = Scope.createRootScope();\n    const dataSourceConfig = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n    const dataSourceItems: InterpretDataSourceConfig[] =\n      (dataSourceConfig && dataSourceConfig.list) || [];\n    const dataSourceEngineOptions = { runtimeConfig: true };\n    if (dataSourceItems.length > 0) {\n      const requestHandlersMap: Record<string, IPublicTypeJSExpression> = {};\n\n      dataSourceItems.forEach((ds) => {\n        const dsType = ds.type || 'fetch';\n        if (!(dsType in requestHandlersMap) && dsType !== 'custom') {\n          const handlerFactoryName = `__$$create${changeCase.pascal(dsType)}RequestHandler`;\n\n          requestHandlersMap[dsType] = {\n            type: 'JSExpression',\n            value:\n              handlerFactoryName + (dsType === 'urlParams' ? '(window.location.search)' : '()'),\n          };\n\n          const handlerFactoryExportName = `create${changeCase.pascal(dsType)}Handler`;\n          const handlerPkgName =\n            cfg.datasourceConfig?.handlersPackages?.[dsType] ||\n            `@alilc/lowcode-datasource-${changeCase.kebab(dsType)}-handler`;\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.JSX,\n            name: COMMON_CHUNK_NAME.ExternalDepsImport,\n            content: `\n              import { ${handlerFactoryExportName} as ${handlerFactoryName} } from '${handlerPkgName}';\n            `,\n            linkAfter: [],\n          });\n        }\n      });\n\n      Object.assign(dataSourceEngineOptions, { requestHandlersMap });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: FileType.JSX,\n        name: COMMON_CHUNK_NAME.ExternalDepsImport,\n        content: `\n          import { create as __$$createDataSourceEngine } from '@alilc/lowcode-datasource-engine/runtime';\n        `,\n        linkAfter: [],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: `\n          _dataSourceConfig = this._defineDataSourceConfig();\n          _dataSourceEngine = __$$createDataSourceEngine(\n            this._dataSourceConfig,\n            this,\n            ${generateCompositeType(dataSourceEngineOptions, scope)}\n          );\n\n          get dataSourceMap() {\n            return this._dataSourceEngine.dataSourceMap || {};\n          }\n\n          reloadDataSource = async () => {\n            await this._dataSourceEngine.reloadDataSource();\n          }\n\n          `,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],\n      });\n\n      next.chunks.unshift({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: REACT_CHUNK_NAME.ClassDidMountContent,\n        content: `\n          this._dataSourceEngine.reloadDataSource();\n        `,\n        linkAfter: [REACT_CHUNK_NAME.ClassDidMountStart],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        content: `\n  _defineDataSourceConfig() {\n    const _this = this;\n    return (${generateCompositeType(\n      {\n        ...dataSourceConfig,\n        list: [\n          ...dataSourceItems.map((item) => ({\n            ...item,\n            isInit: wrapAsFunction(item.isInit, scope),\n            options: wrapAsFunction(item.options, scope),\n          })),\n        ],\n      },\n      scope,\n      {\n        handlers: {\n          function: (jsFunc) => parseExpressionConvertThis2Context(jsFunc.value, '_this'),\n          expression: (jsExpr) => parseExpressionConvertThis2Context(jsExpr.value, '_this'),\n        },\n      },\n    )});\n  }\n        `,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n\nfunction wrapAsFunction(value: IPublicTypeCompositeValue, scope: IScope): IPublicTypeCompositeValue {\n  if (isJSExpression(value) || isJSFunction(value) || isJSExpressionFn(value)) {\n    return {\n      type: 'JSExpression',\n      value: `function(){ return ((${value.value}))}.bind(this)`,\n    };\n  }\n\n  return {\n    type: 'JSExpression',\n    value: `function(){return((${generateCompositeType(value, scope)}))}.bind(this)`,\n  };\n}\n","import {\n  CLASS_DEFINE_CHUNK_NAME,\n  COMMON_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: \"import __$$constants from '../../constants';\",\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n      content: `\n        get constants() {\n          return __$$constants || {};\n        }\n        `,\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {\n  CLASS_DEFINE_CHUNK_NAME,\n  COMMON_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\nimport { getSlotRelativePath } from '../../../utils/pathHelper';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: `\n        import * as __$$i18n from '${getSlotRelativePath({ contextData: next.contextData, from: 'components', to: 'i18n' })}';\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n      content: `\n        __$$i18n._inject2(this);\n      `,\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator';\nimport { REACT_CHUNK_NAME } from './const';\n\nimport { generateFunction } from '../../../utils/jsExpression';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { isJSFunction, isJSExpression } from '@alilc/lowcode-types';\nimport { isJSExpressionFn } from '../../../utils/common';\n\nexport interface PluginConfig {\n  fileType?: string;\n  exportNameMapping?: Record<string, string>;\n  normalizeNameMapping?: Record<string, string>;\n  exclude?: string[];\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg = {\n    fileType: FileType.JSX,\n    exportNameMapping: {},\n    normalizeNameMapping: {},\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    if (ir.lifeCycles) {\n      const { lifeCycles } = ir;\n      const chunks = Object.keys(lifeCycles).map<ICodeChunk | null>((lifeCycleName) => {\n        // 过滤掉非法数据（有些场景下会误传入空字符串或 null)\n        if (\n          !isJSFunction(lifeCycles[lifeCycleName]) &&\n          !isJSExpressionFn(lifeCycles[lifeCycleName]) &&\n          !isJSExpression(lifeCycles[lifeCycleName])\n        ) {\n          return null;\n        }\n\n        let normalizeName;\n        // constructor会取到对象的构造函数\n        if (lifeCycleName === 'constructor') {\n          normalizeName = lifeCycleName;\n        } else {\n          normalizeName = cfg.normalizeNameMapping[lifeCycleName] || lifeCycleName;\n        }\n\n        if (cfg?.exclude?.includes(normalizeName)) {\n          return null;\n        }\n\n        const exportName = cfg.exportNameMapping[lifeCycleName] || lifeCycleName;\n        if (normalizeName === 'constructor') {\n          return {\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n            content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }),\n            linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart]],\n          };\n        }\n\n        if (normalizeName === 'componentDidMount') {\n          return {\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: REACT_CHUNK_NAME.ClassDidMountContent,\n            content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }),\n            linkAfter: [REACT_CHUNK_NAME.ClassDidMountStart],\n          };\n        }\n\n        if (normalizeName === 'render') {\n          return {\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: REACT_CHUNK_NAME.ClassRenderPre,\n            content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }),\n            linkAfter: [REACT_CHUNK_NAME.ClassRenderStart],\n          };\n        }\n\n        return {\n          type: ChunkType.STRING,\n          fileType: cfg.fileType,\n          name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n          content: generateFunction(lifeCycles[lifeCycleName], {\n            name: exportName,\n            isMember: true,\n          }),\n          linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n        };\n      }).filter((i) => !!i);\n\n      next.chunks.push(...chunks.filter((x): x is ICodeChunk => x !== null));\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator';\n\nimport { generateFunction } from '../../../utils/jsExpression';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { isValidIdentifier } from '../../../utils/validate';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const { inStrictMode } = next.contextData;\n\n    if (!ir.methods) {\n      return next;\n    }\n\n    // 将这些 methods 都定义到 class 上\n    const { methods } = ir;\n    const chunks = Object.keys(methods).map<ICodeChunk>((methodName) => ({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsMethod,\n      content: generateFunction(methods[methodName], { name: methodName, isMember: true }),\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsMethod]],\n    }));\n    next.chunks.push(...chunks);\n\n    // 严格模式下需要将这些方法都挂到上下文中\n    if (inStrictMode) {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n        content: Object.keys(ir.methods)\n          .map((methodName) =>\n            isValidIdentifier(methodName) ? `.${methodName}` : `[${JSON.stringify(methodName)}]`,\n          )\n          .map((method) => `this._context${method} = this${method};`)\n          .join('\\n'),\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import _ from 'lodash';\nimport { pipe } from 'fp-ts/function';\nimport { IPublicTypeNodeSchema, isNodeSchema, IPublicTypeNodeDataType, IPublicTypeCompositeValue } from '@alilc/lowcode-types';\n\nimport {\n  IScope,\n  CodeGeneratorError,\n  PIECE_TYPE,\n  CodePiece,\n  NodeGenerator,\n  NodeGeneratorConfig,\n  NodePlugin,\n  AttrData,\n} from '../types';\n\nimport { generateCompositeType } from './compositeType';\nimport { getStaticExprValue } from './common';\nimport { executeFunctionStack } from './aopHelper';\nimport { encodeJsxStringNode } from './encodeJsxAttrString';\nimport { unwrapJsExprQuoteInJsx } from './jsxHelpers';\nimport { transformThis2Context } from '../core/jsx/handlers/transformThis2Context';\nimport { isValidIdentifier } from './validate';\n\nfunction mergeNodeGeneratorConfig(\n  cfg1: NodeGeneratorConfig,\n  cfg2: NodeGeneratorConfig = {},\n): NodeGeneratorConfig {\n  const resCfg: NodeGeneratorConfig = {};\n  if (cfg1.handlers || cfg2.handlers) {\n    resCfg.handlers = {\n      ...(cfg1.handlers || {}),\n      ...(cfg2.handlers || {}),\n    };\n  }\n\n  if (cfg1.tagMapping || cfg2.tagMapping) {\n    resCfg.tagMapping = cfg2.tagMapping || cfg1.tagMapping;\n  }\n\n  if (cfg1.attrPlugins || cfg2.attrPlugins) {\n    resCfg.attrPlugins = [];\n    resCfg.attrPlugins.push(...(cfg2.attrPlugins || []));\n    resCfg.attrPlugins.push(...(cfg1.attrPlugins || []));\n  }\n\n  if (cfg1.nodePlugins || cfg2.nodePlugins) {\n    resCfg.nodePlugins = [];\n    resCfg.nodePlugins.push(...(cfg2.nodePlugins || []));\n    resCfg.nodePlugins.push(...(cfg1.nodePlugins || []));\n  }\n\n  return resCfg;\n}\n\nexport function isPureString(v: string) {\n  // FIXME: 目前的方式不够严谨\n  return (v[0] === \"'\" && v[v.length - 1] === \"'\") || (v[0] === '\"' && v[v.length - 1] === '\"');\n}\n\nfunction generateAttrValue(\n  attrData: { attrName: string; attrValue: IPublicTypeCompositeValue },\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const valueStr = generateCompositeType(attrData.attrValue, scope, {\n    handlers: config?.handlers,\n    nodeGenerator: config?.self,\n  });\n  return [\n    {\n      type: PIECE_TYPE.ATTR,\n      name: attrData.attrName,\n      value: valueStr,\n    },\n  ];\n}\n\nfunction generateAttr(\n  attrName: string,\n  attrValue: IPublicTypeCompositeValue,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  let pieces: CodePiece[];\n  if (config?.attrPlugins) {\n    pieces = executeFunctionStack<AttrData, CodePiece[], NodeGeneratorConfig>(\n      { attrName, attrValue },\n      scope,\n      config.attrPlugins,\n      generateAttrValue,\n      config,\n    );\n  } else {\n    pieces = generateAttrValue({ attrName, attrValue }, scope, config);\n  }\n\n  pieces = pieces.map((p) => {\n    // FIXME: 在经过 generateCompositeType 处理过之后，其实已经无法通过传入值的类型判断传出值是否为纯字面值字符串了（可能包裹了加工函数之类的）\n    //        因此这个处理最好的方式是对传出值做语法分析，判断以哪种模版产出 Attr 值\n    let newValue: string;\n    if (p.value && isPureString(p.value)) {\n      // 似乎多次一举，目前的诉求是处理多种引号类型字符串的 case，正确处理转义\n      const content = getStaticExprValue<string>(p.value);\n      newValue = JSON.stringify(encodeJsxStringNode(content));\n    } else {\n      newValue = `{${p.value}}`;\n    }\n\n    return {\n      value: `${p.name}=${newValue}`,\n      type: PIECE_TYPE.ATTR,\n    };\n  });\n\n  return pieces;\n}\n\nfunction generateAttrs(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const { props } = nodeItem;\n\n  let pieces: CodePiece[] = [];\n\n  if (props) {\n    if (!Array.isArray(props)) {\n      Object.keys(props).forEach((propName: string) => {\n        if (isValidIdentifier(propName)) {\n          pieces = pieces.concat(generateAttr(propName, props[propName] as IPublicTypeCompositeValue, scope, config));\n        }\n      });\n    } else {\n      props.forEach((prop) => {\n        if (prop.name && isValidIdentifier(prop.name) && !prop.spread) {\n          pieces = pieces.concat(generateAttr(prop.name, prop.value, scope, config));\n        }\n\n        // TODO: 处理 spread 场景（<Xxx {...(something)}/>)\n        // 这种在 schema 里面怎么描述\n      });\n    }\n  }\n\n  return pieces;\n}\n\nfunction generateBasicNode(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const pieces: CodePiece[] = [];\n  const tagName = (config?.tagMapping || _.identity)(nodeItem.componentName);\n\n  pieces.push({\n    value: tagName || '', // FIXME: type detection error\n    type: PIECE_TYPE.TAG,\n  });\n\n  return pieces;\n}\n\nfunction generateSimpleNode(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const basicParts = generateBasicNode(nodeItem, scope, config) || [];\n  const attrParts = generateAttrs(nodeItem, scope, config) || [];\n  const childrenParts: CodePiece[] = [];\n  if (nodeItem.children && config?.self) {\n    const childrenStr = config.self(nodeItem.children, scope);\n\n    childrenParts.push({\n      type: PIECE_TYPE.CHILDREN,\n      value: childrenStr,\n    });\n  }\n\n  return [...basicParts, ...attrParts, ...childrenParts];\n}\n\nfunction linkPieces(pieces: CodePiece[]): string {\n  const tagsPieces = pieces.filter((p) => p.type === PIECE_TYPE.TAG);\n  if (tagsPieces.length !== 1) {\n    throw new CodeGeneratorError('Only one tag definition required', tagsPieces);\n  }\n  const tagName = tagsPieces[0].value;\n\n  const beforeParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.BEFORE)\n    .map((p) => p.value)\n    .join('');\n\n  const afterParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.AFTER)\n    .map((p) => p.value)\n    .join('');\n\n  const childrenParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.CHILDREN)\n    .map((p) => p.value)\n    .join('');\n\n  let attrsParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.ATTR)\n    .map((p) => p.value)\n    .join(' ');\n\n  attrsParts = attrsParts ? ` ${attrsParts}` : '';\n\n  if (childrenParts) {\n    return `${beforeParts}<${tagName}${attrsParts}>${childrenParts}</${tagName}>${afterParts}`;\n  }\n\n  return `${beforeParts}<${tagName}${attrsParts} />${afterParts}`;\n}\n\nfunction generateNodeSchema(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): string {\n  const pieces: CodePiece[] = [];\n  if (config?.nodePlugins) {\n    const res = executeFunctionStack<IPublicTypeNodeSchema, CodePiece[], NodeGeneratorConfig>(\n      nodeItem,\n      scope,\n      config.nodePlugins,\n      generateSimpleNode,\n      config,\n    );\n    pieces.push(...res);\n  } else {\n    pieces.push(...generateSimpleNode(nodeItem, scope, config));\n  }\n\n  return linkPieces(pieces);\n}\n\n// TODO: 生成文档\n// 为包裹的代码片段生成子上下文，集成父级上下文，并传入子级上下文新增内容。（如果存在多级上下文怎么处理？）\n// 创建新的上下文，并从作用域中取对应同名变量塞到作用域里面？\n// export function createSubContext() {}\n\n/**\n * JSX 生成逻辑插件。在 React 代码模式下生成 loop 相关的逻辑代码\n * @type NodePlugin Extended\n *\n * @export\n * @param {IPublicTypeNodeSchema} nodeItem 当前 UI 节点\n * @returns {CodePiece[]} 实现功能的相关代码片段\n */\nexport function generateReactLoopCtrl(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n  next?: NodePlugin,\n): CodePiece[] {\n  if (nodeItem.loop) {\n    const tolerateEvalErrors = config?.tolerateEvalErrors ?? true;\n\n    const loopItemName = nodeItem.loopArgs?.[0] || 'item';\n    const loopIndexName = nodeItem.loopArgs?.[1] || 'index';\n\n    // 新建作用域\n    const subScope = scope.createSubScope([loopItemName, loopIndexName]);\n    const pieces: CodePiece[] = next ? next(nodeItem, subScope, config) : [];\n\n    // 生成循环变量表达式\n    const loopDataExpr = pipe(\n      nodeItem.loop,\n      // 将 JSExpression 转换为 JS 表达式代码:\n      (expr) => generateCompositeType(expr, scope, {\n          handlers: config?.handlers,\n          tolerateEvalErrors: false, // 这个内部不需要包 try catch, 下面会统一加的\n        }),\n      // 将 this.xxx 转换为 __$$context.xxx:\n      (expr) => transformThis2Context(expr, scope, { ignoreRootScope: true }),\n      // 如果要容忍错误，则包一层 try catch (基于助手函数 __$$evalArray)\n      (expr) => (tolerateEvalErrors ? `__$$evalArray(() => (${expr}))` : expr),\n    );\n\n    pieces.unshift({\n      value: `(${loopDataExpr}).map((${loopItemName}, ${loopIndexName}) => ((__$$context) => (`,\n      type: PIECE_TYPE.BEFORE,\n    });\n\n    pieces.push({\n      value: `))(__$$createChildContext(__$$context, { ${loopItemName}, ${loopIndexName} })))`,\n      type: PIECE_TYPE.AFTER,\n    });\n\n    return pieces;\n  }\n\n  return next ? next(nodeItem, scope, config) : [];\n}\n\n/**\n * JSX 生成逻辑插件。在 React 代码模式下生成 condition 相关的逻辑代码\n * @type NodePlugin\n *\n * @export\n * @param {IPublicTypeNodeSchema} nodeItem 当前 UI 节点\n * @returns {CodePiece[]} 实现功能的相关代码片段\n */\nexport function generateConditionReactCtrl(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n  next?: NodePlugin,\n): CodePiece[] {\n  const pieces: CodePiece[] = next ? next(nodeItem, scope, config) : [];\n\n  if (nodeItem.condition != null && nodeItem.condition !== true) {\n    const value = generateCompositeType(nodeItem.condition, scope, {\n      handlers: config?.handlers,\n    });\n\n    pieces.unshift({\n      value: `!!(${value}) && (`,\n      type: PIECE_TYPE.BEFORE,\n    });\n\n    pieces.push({\n      value: ')',\n      type: PIECE_TYPE.AFTER,\n    });\n  }\n\n  return pieces;\n}\n\n/**\n * JSX 生成逻辑插件。在 React 代码模式下，如果 Node 生成结果是一个表达式，则对其进行 { Expression } 包装\n * @type NodePlugin\n *\n * @export\n * @param {IPublicTypeNodeSchema} nodeItem 当前 UI 节点\n * @returns {CodePiece[]} 实现功能的相关代码片段\n */\nexport function generateReactExprInJS(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n  next?: NodePlugin,\n): CodePiece[] {\n  const pieces: CodePiece[] = next ? next(nodeItem, scope, config) : [];\n\n  if ((nodeItem.condition != null && nodeItem.condition !== true) || nodeItem.loop != null) {\n    pieces.unshift({\n      value: '{',\n      type: PIECE_TYPE.BEFORE,\n    });\n\n    pieces.push({\n      value: '}',\n      type: PIECE_TYPE.AFTER,\n    });\n  }\n\n  return pieces;\n}\n\nconst handleChildren = (v: string[]) => v.join('');\n\nexport function createNodeGenerator(cfg: NodeGeneratorConfig = {}): NodeGenerator<string> {\n  const generateNode = (nodeItem: IPublicTypeNodeDataType, scope: IScope): string => {\n    if (_.isArray(nodeItem)) {\n      const resList = nodeItem.map((n) => generateNode(n, scope));\n      return handleChildren(resList);\n    }\n\n    if (isNodeSchema(nodeItem)) {\n      return generateNodeSchema(nodeItem, scope, {\n        ...cfg,\n        self: generateNode,\n      });\n    }\n\n    const valueStr = generateCompositeType(nodeItem, scope, {\n      handlers: cfg.handlers,\n      nodeGenerator: generateNode,\n    });\n\n    if (isPureString(valueStr)) {\n      return encodeJsxStringNode(getStaticExprValue<string>(valueStr));\n    }\n\n    return `{${valueStr}}`;\n  };\n\n  return (nodeItem: IPublicTypeNodeDataType, scope: IScope) => unwrapJsExprQuoteInJsx(generateNode(nodeItem, scope));\n}\n\nconst defaultReactGeneratorConfig: NodeGeneratorConfig = {\n  nodePlugins: [generateReactExprInJS, generateReactLoopCtrl, generateConditionReactCtrl],\n};\n\nexport function createReactNodeGenerator(cfg?: NodeGeneratorConfig): NodeGenerator<string> {\n  const newCfg = mergeNodeGeneratorConfig(defaultReactGeneratorConfig, cfg);\n\n  return createNodeGenerator(newCfg);\n}\n","import _ from 'lodash';\n// import { encode } from 'html-entities';\n\nconst SPECIAL_CHARS = '\\n\\r\\'\"<>&';\nconst SPECIAL_CHARS_REG = new RegExp(\n  `[${SPECIAL_CHARS.split('')\n    .map((c) => `\\\\x${_.padStart(c.charCodeAt(0).toString(16), 2, '0')}`)\n    .join('')}]`,\n  'g',\n);\n\nexport function encodeJsxStringNode(str: string): string {\n  return str.replace(SPECIAL_CHARS_REG, (c) => `&#${c.charCodeAt(0)};`);\n}\n\n// export function encodeJsxStringNode(str: string): string {\n//   return encode(str);\n// }\n","import { Expression } from '@babel/types';\nimport generate from '@babel/generator';\nimport { IScope } from '../../../types';\nimport { parseExpressionConvertThis2Context } from '../../../utils/expressionParser';\n\n/**\n * 将所有的 this.xxx 替换为 __$$context.xxx\n * @param expr\n */\nexport function transformThis2Context(\n  expr: string | Expression,\n  scope: IScope,\n  { ignoreRootScope = false } = {},\n): string {\n  if (ignoreRootScope && scope.parent == null) {\n    return typeof expr === 'string' ? expr : generate(expr).code;\n  }\n\n  // 下面这种字符串替换的方式虽然简单直接，但是对于复杂场景会误匹配，故后期改成了解析 AST 然后修改 AST 最后再重新生成代码的方式\n  // return expr\n  //   .replace(/\\bthis\\.item\\./g, () => 'item.')\n  //   .replace(/\\bthis\\.index\\./g, () => 'index.')\n  //   .replace(/\\bthis\\./g, () => '__$$context.');\n  return parseExpressionConvertThis2Context(\n    expr,\n    '__$$context',\n    scope.bindings?.getAllBindings() || [],\n  );\n}\n","/**\n * 判断是否是原子类型的表达式\n */\nexport function isLiteralAtomicExpr(expr: string): boolean {\n  return (\n    expr === 'null' ||\n    expr === 'undefined' ||\n    expr === 'true' ||\n    expr === 'false' ||\n    /^-?\\d+(\\.\\d+)?$/.test(expr)\n  );\n}\n","import { Expression } from '@babel/types';\n\n/** 判断是非是一些简单直接的字面值 */\nexport function isSimpleStraightLiteral(expr: Expression): boolean {\n  switch (expr.type) {\n    case 'BigIntLiteral':\n    case 'BooleanLiteral':\n    case 'DecimalLiteral':\n    case 'NullLiteral':\n    case 'NumericLiteral':\n    case 'RegExpLiteral':\n    case 'StringLiteral':\n      return true;\n    default:\n      return false;\n  }\n}\n","import { IScope } from '../../../types';\nimport { parseExpression } from '../../../utils/expressionParser';\nimport { isLiteralAtomicExpr } from '../util/isLiteralAtomicExpr';\nimport { isSimpleStraightLiteral } from '../util/isSimpleStraightLiteral';\nimport { transformThis2Context } from './transformThis2Context';\n\nexport function transformJsExpr(\n  expr: string,\n  scope: IScope,\n  { dontWrapEval = false, dontTransformThis2ContextAtRootScope = false } = {},\n) {\n  if (!expr) {\n    return 'undefined';\n  }\n\n  if (isLiteralAtomicExpr(expr)) {\n    return expr;\n  }\n\n  const exprAst = parseExpression(expr);\n\n  // 对于下面这些比较安全的字面值，可以直接返回对应的表达式，而非包一层\n  if (isSimpleStraightLiteral(exprAst)) {\n    return expr;\n  }\n\n  if (dontWrapEval) {\n    return transformThis2Context(exprAst, scope, {\n      ignoreRootScope: dontTransformThis2ContextAtRootScope,\n    });\n  }\n\n  switch (exprAst.type) {\n    // 对于直接写个函数的，则不用再包下，因为这样不会抛出异常的\n    case 'ArrowFunctionExpression':\n    case 'FunctionExpression':\n      return transformThis2Context(exprAst, scope, {\n        ignoreRootScope: dontTransformThis2ContextAtRootScope,\n      });\n\n    default:\n      break;\n  }\n\n  // 其他的都需要包一层\n  return `__$$eval(() => (${transformThis2Context(exprAst, scope, {\n    ignoreRootScope: dontTransformThis2ContextAtRootScope,\n  })}))`;\n}\n","import {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  HandlerSet,\n  ICodeStruct,\n  IContainerInfo,\n  IScope,\n  NodeGeneratorConfig,\n  PIECE_TYPE,\n} from '../../../types';\n\nimport { REACT_CHUNK_NAME } from './const';\nimport { COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport { createReactNodeGenerator } from '../../../utils/nodeToJSX';\nimport { Scope } from '../../../utils/Scope';\nimport { IPublicTypeJSExpression } from '@alilc/lowcode-types';\nimport { generateExpression } from '../../../utils/jsExpression';\nimport { transformJsExpr } from '../../../core/jsx/handlers/transformJsExpression';\nimport { transformThis2Context } from '../../../core/jsx/handlers/transformThis2Context';\nimport { generateCompositeType } from '../../../utils/compositeType';\n\nexport interface PluginConfig {\n  fileType?: string;\n  nodeTypeMapping?: Record<string, string>;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg = {\n    fileType: FileType.JSX,\n    // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n    nodeTypeMapping: {} as Record<string, string>,\n    ...config,\n  };\n\n  const { nodeTypeMapping } = cfg;\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const { tolerateEvalErrors = true, evalErrorsHandler = '' } = next.contextData;\n\n    // 这里会将内部的一些子上下文的访问(this.xxx)转换为 __$$context.xxx 的形式\n    // 与 Rax 所不同的是，这里不会将最顶层的 this 转换掉\n    const customHandlers: HandlerSet<string> = {\n      expression(input: IPublicTypeJSExpression, scope: IScope, config) {\n        return transformJsExpr(generateExpression(input, scope), scope, {\n          dontWrapEval: !(config?.tolerateEvalErrors ?? tolerateEvalErrors),\n          dontTransformThis2ContextAtRootScope: true,\n        });\n      },\n      function(input, scope: IScope) {\n        return transformThis2Context(\n          generateCompositeType(\n            {\n              type: 'JSFunction',\n              value: input.value || 'function () {}',\n            },\n            Scope.createRootScope(),\n          ),\n          scope,\n          { ignoreRootScope: true },\n        );\n      },\n    };\n\n    const generatorPlugins: NodeGeneratorConfig = {\n      handlers: customHandlers,\n      tagMapping: (v) => nodeTypeMapping[v] || v,\n      tolerateEvalErrors,\n    };\n\n    if (next.contextData.useRefApi) {\n      generatorPlugins.attrPlugins = [\n        (attrData, scope, pluginCfg, nextFunc) => {\n          if (attrData.attrName === 'ref') {\n            return [\n              {\n                name: attrData.attrName,\n                value: `this._refsManager.linkRef('${attrData.attrValue}')`,\n                type: PIECE_TYPE.ATTR,\n              },\n            ];\n          }\n\n          return nextFunc ? nextFunc(attrData, scope, pluginCfg) : [];\n        },\n      ];\n    }\n\n    const generator = createReactNodeGenerator(generatorPlugins);\n\n    const ir = next.ir as IContainerInfo;\n    const scope: IScope = Scope.createRootScope();\n    const jsxContent = generator(ir, scope);\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: REACT_CHUNK_NAME.ClassRenderJSX,\n      content: `\n        const __$$context = this._context || this;\n        const { state } = __$$context;\n        return ${jsxContent};\n      `,\n      linkAfter: [REACT_CHUNK_NAME.ClassRenderStart, REACT_CHUNK_NAME.ClassRenderPre],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.CustomContent,\n      content: [\n        tolerateEvalErrors &&\n          `\n          function __$$eval(expr) {\n            try {\n              return expr();\n            } catch (error) {\n              ${evalErrorsHandler}\n            }\n          }\n\n          function __$$evalArray(expr) {\n            const res = __$$eval(expr);\n            return Array.isArray(res) ? res : [];\n          }\n      `,\n        `\n        function __$$createChildContext(oldContext, ext) {\n          const childContext = {\n            ...oldContext,\n            ...ext,\n          };\n          childContext.__proto__ = oldContext;\n          return childContext;\n        }\n      `,\n      ]\n        .filter(Boolean)\n        .join('\\n'),\n      linkAfter: [COMMON_CHUNK_NAME.FileExport],\n    });\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: `\n// 注意: 出码引擎注入的临时变量默认都以 \"__$$\" 开头，禁止在搭建的代码中直接访问。\n// 例外：react 框架的导出名和各种组件名除外。\nimport React from \\'react\\';`,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\n\nexport interface PluginConfig {\n  fileType: string;\n  moduleFileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.CSS,\n    moduleFileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: ir.css,\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.moduleFileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: `import './index.${cfg.fileType}';`,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../const/generator';\nimport { generateCompositeType } from '../../utils/compositeType';\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../types';\nimport { Scope } from '../../utils/Scope';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n    const scope = Scope.createRootScope();\n    const constantStr = generateCompositeType(ir.constants || {}, scope);\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileVarDefine,\n      content: `\n        const __$$constants = (${constantStr});\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileExport,\n      content: `\n        export default __$$constants;\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n        COMMON_CHUNK_NAME.FileMainContent,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n    const i18nStr = ir.i18n ? JSON.stringify(ir.i18n, null, 2) : '{}';\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: `\n        const i18nConfig = ${i18nStr};\n\n        let locale = typeof navigator === 'object' && typeof navigator.language === 'string' ? navigator.language : 'zh-CN';\n\n        const getLocale = () => locale;\n\n        const setLocale = (target) => {\n          locale = target;\n        };\n\n        const isEmptyVariables = variables => (\n          Array.isArray(variables) && variables.length === 0\n          || typeof variables === 'object' && (!variables || Object.keys(variables).length === 0)\n        );\n\n        // 按低代码规范里面的要求进行变量替换\n        const format = (msg, variables) => (\n          typeof msg === 'string'\n            ? msg.replace(/\\\\\\$?\\\\{(\\\\w+)\\\\}/g, (match, key) => variables?.[key] ?? '')\n            : msg\n        );\n\n        const i18nFormat = ({ id, defaultMessage, fallback }, variables) => {\n          const msg = i18nConfig[locale]?.[id] ??  i18nConfig[locale.replace('-', '_')]?.[id] ??  defaultMessage;\n          if (msg == null) {\n            console.warn('[i18n]: unknown message id: %o (locale=%o)', id, locale);\n            return fallback === undefined ? \\`\\${id}\\` : fallback;\n          }\n\n          return format(msg, variables);\n        }\n\n        const i18n = (id, params) => {\n          return i18nFormat({ id }, params);\n        };\n\n        // 将国际化的一些方法注入到目标对象&上下文中\n        const _inject2 = (target) => {\n          target.i18n = i18n;\n          target.getLocale = getLocale;\n          target.setLocale = (locale) => {\n            setLocale(locale);\n            target.forceUpdate();\n          };\n          target._i18nText = (t) => {\n            // 优先取直接传过来的语料\n            const localMsg = t[locale] ?? t[String(locale).replace('-', '_')]\n            if (localMsg != null) {\n              return format(localMsg, t.params);\n            }\n\n            // 其次用项目级别的\n            const projectMsg = i18nFormat({ id: t.key, fallback: null }, t.params);\n            if (projectMsg != null) {\n              return projectMsg;\n            }\n\n            // 兜底用 use 指定的或默认语言的\n            return format(t[t.use || \"zh-CN\"] ?? t.en_US, t.params);\n          }\n\n          // 注入到上下文中去\n          if (target._context && target._context !== target) {\n            Object.assign(target._context, {\n              i18n,\n              getLocale, setLocale: target.setLocale\n            });\n          }\n        }\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileExport,\n      content: `\n        export {\n          getLocale,\n          setLocale,\n          i18n,\n          i18nFormat,\n          _inject2,\n        };\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n        COMMON_CHUNK_NAME.FileMainContent,\n      ],\n    });\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IUtilInfo,\n} from '../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<string> = (baseFramework?: string) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const framework = baseFramework || 'react';\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IUtilInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: `\n        import { createRef } from '${framework}';\n      `,\n      linkAfter: [],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileUtilDefine,\n      content: `\n        export class RefsManager {\n          constructor() {\n            this.refInsStore = {};\n          }\n\n          clearNullRefs() {\n            Object.keys(this.refInsStore).forEach((refName) => {\n              const filteredInsList = this.refInsStore[refName].filter(insRef => !!insRef.current);\n              if (filteredInsList.length > 0) {\n                this.refInsStore[refName] = filteredInsList;\n              } else {\n                delete this.refInsStore[refName];\n              }\n            });\n          }\n\n          get(refName) {\n            this.clearNullRefs();\n            if (this.refInsStore[refName] && this.refInsStore[refName].length > 0) {\n              return this.refInsStore[refName][0].current;\n            }\n\n            return null;\n          }\n\n          getAll(refName) {\n            this.clearNullRefs();\n            if (this.refInsStore[refName] && this.refInsStore[refName].length > 0) {\n              return this.refInsStore[refName].map(i => i.current);\n            }\n\n            return [];\n          }\n\n          linkRef(refName) {\n            const refIns = createRef();\n            this.refInsStore[refName] = this.refInsStore[refName] || [];\n            this.refInsStore[refName].push(refIns);\n            return refIns;\n          }\n        }\n      `,\n      linkAfter: [...DEFAULT_LINK_AFTER[COMMON_CHUNK_NAME.FileUtilDefine]],\n    });\n\n    if (ir.utils) {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: FileType.JS,\n        name: COMMON_CHUNK_NAME.FileExport,\n        content: `\n          export default {\n        `,\n        linkAfter: [\n          COMMON_CHUNK_NAME.ExternalDepsImport,\n          COMMON_CHUNK_NAME.InternalDepsImport,\n          COMMON_CHUNK_NAME.ImportAliasDefine,\n          COMMON_CHUNK_NAME.FileVarDefine,\n          COMMON_CHUNK_NAME.FileUtilDefine,\n          COMMON_CHUNK_NAME.FileMainContent,\n        ],\n      });\n\n      ir.utils.forEach((util) => {\n        if (util.type === 'function') {\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.JS,\n            name: COMMON_CHUNK_NAME.FileVarDefine,\n            content: `\n              const ${util.name} = ${util.content.value};\n            `,\n            linkAfter: [\n              COMMON_CHUNK_NAME.ExternalDepsImport,\n              COMMON_CHUNK_NAME.InternalDepsImport,\n              COMMON_CHUNK_NAME.ImportAliasDefine,\n            ],\n          });\n        }\n\n        next.chunks.push({\n          type: ChunkType.STRING,\n          fileType: FileType.JS,\n          name: COMMON_CHUNK_NAME.FileExport,\n          content: `${util.name},`,\n          linkAfter: [\n            COMMON_CHUNK_NAME.ExternalDepsImport,\n            COMMON_CHUNK_NAME.InternalDepsImport,\n            COMMON_CHUNK_NAME.ImportAliasDefine,\n            COMMON_CHUNK_NAME.FileVarDefine,\n            COMMON_CHUNK_NAME.FileUtilDefine,\n            COMMON_CHUNK_NAME.FileMainContent,\n          ],\n        });\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: FileType.JS,\n        name: COMMON_CHUNK_NAME.FileExport,\n        content: `\n          };\n        `,\n        linkAfter: [\n          COMMON_CHUNK_NAME.ExternalDepsImport,\n          COMMON_CHUNK_NAME.InternalDepsImport,\n          COMMON_CHUNK_NAME.ImportAliasDefine,\n          COMMON_CHUNK_NAME.FileVarDefine,\n          COMMON_CHUNK_NAME.FileUtilDefine,\n          COMMON_CHUNK_NAME.FileMainContent,\n        ],\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { ResultDir, ResultFile } from '@alilc/lowcode-types';\nimport { createResultDir, addDirectory, addFile } from './resultHelper';\n\ntype FuncFileGenerator = () => [string[], ResultFile];\n\n/**\n * 将文件位置及文件插入到目录的树形结构\n * @param root\n * @param path\n * @param file\n */\nexport function insertFile(root: ResultDir, path: string[], file: ResultFile) {\n  let current: ResultDir = root;\n  path.forEach((pathNode) => {\n    const dir = current.dirs.find((d) => d.name === pathNode);\n    if (dir) {\n      current = dir;\n    } else {\n      const newDir = createResultDir(pathNode);\n      addDirectory(current, newDir);\n      current = newDir;\n    }\n  });\n\n  addFile(current, file);\n}\n\nexport function runFileGenerator(root: ResultDir, fun: FuncFileGenerator) {\n  try {\n    const result = fun();\n    const [path, file] = result;\n    insertFile(root, path, file);\n  } catch (error) {\n    throw new Error(`Error: ${typeof fun}`);\n  }\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'abc',\n      ext: 'json',\n      content: `\n{\n  \"type\": \"ice-app\",\n  \"builder\": \"@ali/builder-ice-app\"\n}\n    `,\n    },\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'build',\n      ext: 'json',\n      content: `\n{\n  \"entry\": \"src/app.js\",\n  \"plugins\": [\n    [\n      \"build-plugin-fusion\",\n      {\n        \"themePackage\": \"@alifd/theme-design-pro\"\n      }\n    ],\n    [\n      \"build-plugin-moment-locales\",\n      {\n        \"locales\": [\n          \"zh-cn\"\n        ]\n      }\n    ]\n  ]\n}\n      `,\n    },\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.editorconfig',\n    '',\n    `\n# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.eslintignore',\n    '',\n    `\n# 忽略目录\nbuild/\ntests/\ndemo/\n.ice/\n\n# node 覆盖率文件\ncoverage/\n\n# 忽略文件\n**/*-min.js\n**/*.min.js\n\npackage-lock.json\nyarn.lock\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.eslintrc',\n    'js',\n    `\nconst { eslint } = require('@ice/spec');\n\nmodule.exports = eslint;\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.gitignore',\n    '',\n    `\n# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\nnode_modules/\n\n# production\nbuild/\ndist/\ntmp/\nlib/\n\n# misc\n.idea/\n.happypack\n.DS_Store\n*.swp\n*.dia~\n.ice\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nindex.module.scss.d.ts\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'jsconfig',\n    'json',\n    `\n{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"jsx\": \"react\",\n    \"paths\": {\n      \"@/*\": [\"./src/*\"],\n      \"ice\": [\".ice/index.ts\"],\n      \"ice/*\": [\".ice/pages/*\"]\n    }\n  }\n}\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.prettierignore',\n    '',\n    `\nbuild/\ntests/\ndemo/\n.ice/\ncoverage/\n**/*-min.js\n**/*.min.js\npackage-lock.json\nyarn.lock\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.prettierrc',\n    'js',\n    `\nconst { prettier } = require('@ice/spec');\n\nmodule.exports = prettier;\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'README',\n    'md',\n    `\n## Scaffold Lite\n\n> 轻量级模板，使用 JavaScript，仅包含基础的 Layout。\n\n## 使用\n\n\\`\\`\\`bash\n# 安装依赖\n$ npm install\n\n# 启动服务\n$ npm start  # visit http://localhost:3333\n\\`\\`\\`\n\n[More docs](https://ice.work/docs/guide/about).\n\n## 目录\n\n\\`\\`\\`md\n├── build/                         # 构建产物\n├── mock/                          # 本地模拟数据\n│   ├── index.[j,t]s\n├── public/\n│   ├── index.html                 # 应用入口 HTML\n│   └── favicon.png                # Favicon\n├── src/                           # 源码路径\n│   ├── components/                # 自定义业务组件\n│   │   └── Guide/\n│   │       ├── index.[j,t]sx\n│   │       ├── index.module.scss\n│   ├── layouts/                   # 布局组件\n│   │   └── BasicLayout/\n│   │       ├── index.[j,t]sx\n│   │       └── index.module.scss\n│   ├── pages/                     # 页面\n│   │   └── Home/                  # home 页面，约定路由转成小写\n│   │       ├── components/        # 页面级自定义业务组件\n│   │       ├── models.[j,t]sx     # 页面级数据状态\n│   │       ├── index.[j,t]sx      # 页面入口\n│   │       └── index.module.scss  # 页面样式文件\n│   ├── configs/                   # [可选] 配置文件\n│   │   └── menu.[j,t]s            # [可选] 菜单配置\n│   ├── models/                    # [可选] 应用级数据状态\n│   │   └── user.[j,t]s\n│   ├── utils/                     # [可选] 工具库\n│   ├── global.scss                # 全局样式\n│   ├── routes.[j,t]s              # 路由配置\n│   └── app.[j,t]s[x]              # 应用入口脚本\n├── build.json                     # 工程配置\n├── README.md\n├── package.json\n├── .editorconfig\n├── .eslintignore\n├── .eslintrc.[j,t]s\n├── .gitignore\n├── .stylelintignore\n├── .stylelintrc.[j,t]s\n├── .gitignore\n└── [j,t]sconfig.json\n\\`\\`\\`\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React from 'react';\nimport styles from './index.module.scss';\n\nexport default function Footer() {\n  return (\n    <p className={styles.footer}>\n      <span className={styles.logo}>Alibaba Fusion</span>\n      <br />\n      <span className={styles.copyright}>© 2019-现在 Alibaba Fusion & ICE</span>\n    </p>\n  );\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Footer'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'module.scss',\n    `\n.footer {\n  line-height: 20px;\n  text-align: center;\n}\n\n.logo {\n  font-weight: bold;\n  font-size: 16px;\n}\n\n.copyright {\n  font-size: 12px;\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Footer'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React from 'react';\nimport { Link } from 'ice';\nimport styles from './index.module.scss';\n\nexport default function Logo({ image, text, url }) {\n  return (\n    <div className=\"logo\">\n      <Link to={url || '/'} className={styles.logo}>\n        {image && <img src={image} alt=\"logo\" />}\n        <span>{text}</span>\n      </Link>\n    </div>\n  );\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Logo'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'module.scss',\n    `\n.logo{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: $color-text1-1;\n  font-weight: bold;\n  font-size: 14px;\n  line-height: 22px;\n\n  &:visited, &:link {\n    color: $color-text1-1;\n  }\n\n  img {\n    height: 24px;\n    margin-right: 10px;\n  }\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Logo'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link, withRouter } from 'ice';\nimport { Nav } from '@alifd/next';\nimport { asideMenuConfig } from '../../menuConfig';\n\nconst { SubNav } = Nav;\nconst NavItem = Nav.Item;\n\nfunction getNavMenuItems(menusData) {\n  if (!menusData) {\n    return [];\n  }\n\n  return menusData\n    .filter(item => item.name && !item.hideInMenu)\n    .map((item, index) => getSubMenuOrItem(item, index));\n}\n\nfunction getSubMenuOrItem(item, index) {\n  if (item.children && item.children.some(child => child.name)) {\n    const childrenItems = getNavMenuItems(item.children);\n\n    if (childrenItems && childrenItems.length > 0) {\n      const subNav = (\n        <SubNav key={index} icon={item.icon} label={item.name}>\n          {childrenItems}\n        </SubNav>\n      );\n      return subNav;\n    }\n\n    return null;\n  }\n\n  const navItem = (\n    <NavItem key={item.path} icon={item.icon}>\n      <Link to={item.path}>{item.name}</Link>\n    </NavItem>\n  );\n  return navItem;\n}\n\nconst Navigation = (props, context) => {\n  const { location } = props;\n  const { pathname } = location;\n  const { isCollapse } = context;\n  return (\n    <Nav\n      type=\"primary\"\n      selectedKeys={[pathname]}\n      defaultSelectedKeys={[pathname]}\n      embeddable\n      openMode=\"single\"\n      iconOnly={isCollapse}\n      hasArrow={false}\n      mode={isCollapse ? 'popup' : 'inline'}\n    >\n      {getNavMenuItems(asideMenuConfig)}\n    </Nav>\n  );\n};\n\nNavigation.contextTypes = {\n  isCollapse: PropTypes.bool,\n};\nconst PageNav = withRouter(Navigation);\nexport default PageNav;\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'PageNav'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React, { useState } from 'react';\nimport { Shell, ConfigProvider } from '@alifd/next';\nimport PageNav from './components/PageNav';\nimport Logo from './components/Logo';\nimport Footer from './components/Footer';\n\n(function() {\n  const throttle = function(type, name, obj = window) {\n    let running = false;\n\n    const func = () => {\n      if (running) {\n        return;\n      }\n\n      running = true;\n      requestAnimationFrame(() => {\n        obj.dispatchEvent(new CustomEvent(name));\n        running = false;\n      });\n    };\n\n    obj.addEventListener(type, func);\n  };\n\n  throttle('resize', 'optimizedResize');\n})();\n\nexport default function BasicLayout({ children }) {\n  const getDevice = width => {\n    const isPhone =\n      typeof navigator !== 'undefined' && navigator && navigator.userAgent.match(/phone/gi);\n\n    if (width < 680 || isPhone) {\n      return 'phone';\n    }\n    if (width < 1280 && width > 680) {\n      return 'tablet';\n    }\n    return 'desktop';\n  };\n\n  const [device, setDevice] = useState(getDevice(NaN));\n  window.addEventListener('optimizedResize', e => {\n    setDevice(getDevice(e && e.target && e.target.innerWidth));\n  });\n  return (\n    <ConfigProvider device={device}>\n      <Shell\n        type=\"dark\"\n        style={{\n          minHeight: '100vh',\n        }}\n      >\n        <Shell.Branding>\n          <Logo\n            image=\"https://img.alicdn.com/tfs/TB1.ZBecq67gK0jSZFHXXa9jVXa-904-826.png\"\n            text=\"Logo\"\n          />\n        </Shell.Branding>\n        <Shell.Navigation\n          direction=\"hoz\"\n          style={{\n            marginRight: 10,\n          }}\n        ></Shell.Navigation>\n        <Shell.Action></Shell.Action>\n        <Shell.Navigation>\n          <PageNav />\n        </Shell.Navigation>\n\n        <Shell.Content>{children}</Shell.Content>\n        <Shell.Footer>\n          <Footer />\n        </Shell.Footer>\n      </Shell>\n    </ConfigProvider>\n  );\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'menuConfig',\n    'js',\n    `\nconst headerMenuConfig = [];\nconst asideMenuConfig = [\n  {\n    name: 'Dashboard',\n    path: '/',\n    icon: 'smile',\n  },\n];\nexport { headerMenuConfig, asideMenuConfig };\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.stylelintignore',\n    '',\n    `\n# 忽略目录\nbuild/\ntests/\ndemo/\n\n# node 覆盖率文件\ncoverage/\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.stylelintrc',\n    'js',\n    `\nconst { stylelint } = require('@ice/spec');\n\nmodule.exports = stylelint;\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'tsconfig',\n    'json',\n    `\n{\n  \"compileOnSave\": false,\n  \"buildOnSave\": false,\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"outDir\": \"build\",\n    \"module\": \"esnext\",\n    \"target\": \"es6\",\n    \"jsx\": \"react\",\n    \"moduleResolution\": \"node\",\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\"es6\", \"dom\"],\n    \"sourceMap\": true,\n    \"allowJs\": true,\n    \"rootDir\": \"./\",\n    \"forceConsistentCasingInFileNames\": true,\n    \"noImplicitReturns\": true,\n    \"noImplicitThis\": true,\n    \"noImplicitAny\": false,\n    \"importHelpers\": true,\n    \"strictNullChecks\": true,\n    \"suppressImplicitAnyIndexErrors\": true,\n    \"noUnusedLocals\": true,\n    \"skipLibCheck\": true,\n    \"paths\": {\n      \"@/*\": [\"./src/*\"],\n      \"ice\": [\".ice/index.ts\"],\n      \"ice/*\": [\".ice/pages/*\"]\n    }\n  },\n  \"include\": [\"src/*\", \".ice\"],\n  \"exclude\": [\"node_modules\", \"build\", \"public\"]\n}\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultDir } from '@alilc/lowcode-types';\n\nimport { createResultDir } from '../../../../../utils/resultHelper';\nimport { runFileGenerator } from '../../../../../utils/templateHelper';\n\nimport file12 from './files/abc.json';\nimport file11 from './files/build.json';\nimport file10 from './files/editorconfig';\nimport file9 from './files/eslintignore';\nimport file8 from './files/eslintrc.js';\nimport file7 from './files/gitignore';\nimport file6 from './files/jsconfig.json';\nimport file5 from './files/prettierignore';\nimport file4 from './files/prettierrc.js';\nimport file13 from './files/README.md';\nimport file16 from './files/src/layouts/BasicLayout/components/Footer/index.jsx';\nimport file17 from './files/src/layouts/BasicLayout/components/Footer/index.style';\nimport file18 from './files/src/layouts/BasicLayout/components/Logo/index.jsx';\nimport file19 from './files/src/layouts/BasicLayout/components/Logo/index.style';\nimport file20 from './files/src/layouts/BasicLayout/components/PageNav/index.jsx';\nimport file14 from './files/src/layouts/BasicLayout/index.jsx';\nimport file15 from './files/src/layouts/BasicLayout/menuConfig.js';\nimport file3 from './files/stylelintignore';\nimport file2 from './files/stylelintrc.js';\nimport file1 from './files/tsconfig.json';\n\nexport function generateStaticFiles(root = createResultDir('.')): ResultDir {\n  runFileGenerator(root, file1);\n  runFileGenerator(root, file2);\n  runFileGenerator(root, file3);\n  runFileGenerator(root, file4);\n  runFileGenerator(root, file5);\n  runFileGenerator(root, file6);\n  runFileGenerator(root, file7);\n  runFileGenerator(root, file8);\n  runFileGenerator(root, file9);\n  runFileGenerator(root, file10);\n  runFileGenerator(root, file11);\n  runFileGenerator(root, file12);\n  runFileGenerator(root, file13);\n  runFileGenerator(root, file14);\n  runFileGenerator(root, file15);\n  runFileGenerator(root, file16);\n  runFileGenerator(root, file17);\n  runFileGenerator(root, file18);\n  runFileGenerator(root, file19);\n  runFileGenerator(root, file20);\n\n  return root;\n}\n","import { ResultDir } from '@alilc/lowcode-types';\nimport { IProjectTemplate } from '../../../../../types';\nimport { generateStaticFiles } from './static-files';\n\nconst icejsTemplate: IProjectTemplate = {\n  slots: {\n    components: {\n      path: ['src', 'components'],\n    },\n    pages: {\n      path: ['src', 'pages'],\n    },\n    router: {\n      path: ['src'],\n      fileName: 'routes',\n    },\n    entry: {\n      path: ['src'],\n      fileName: 'app',\n    },\n    constants: {\n      path: ['src'],\n      fileName: 'constants',\n    },\n    utils: {\n      path: ['src'],\n      fileName: 'utils',\n    },\n    i18n: {\n      path: ['src'],\n      fileName: 'i18n',\n    },\n    globalStyle: {\n      path: ['src'],\n      fileName: 'global',\n    },\n    htmlEntry: {\n      path: ['public'],\n      fileName: 'index',\n    },\n    packageJSON: {\n      path: [],\n      fileName: 'package',\n    },\n  },\n\n  generateTemplate(): ResultDir {\n    return generateStaticFiles();\n  },\n};\n\nexport default icejsTemplate;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: `\n        import { createApp } from 'ice';\n      `,\n      linkAfter: [],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: `\n        const appConfig = {\n          app: {\n            rootId: 'app',\n          },\n          router: {\n            type: 'hash',\n          },\n        };\n        createApp(appConfig);\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.HTML,\n      name: COMMON_CHUNK_NAME.HtmlContent,\n      content: `\n        <!DOCTYPE html>\n        <html>\n          <head>\n            <meta charset=\"utf-8\" />\n            <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge,chrome=1\" />\n            <meta name=\"viewport\" content=\"width=device-width\" />\n            <title>${ir?.meta?.name || 'Ice App'}</title>\n          </head>\n          <body>\n            <div id=\"app\"></div>\n          </body>\n        </html>\n      `,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.SCSS,\n      name: COMMON_CHUNK_NAME.StyleDepsImport,\n      content: `\n        // 引入默认全局样式\n        @import '@alifd/next/reset.scss';\n      `,\n      linkAfter: [],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.SCSS,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: `\n        body {\n          -webkit-font-smoothing: antialiased;\n        }\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.SCSS,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: ir.css || '',\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import changeCase from './changeCaseCompat';\nimport type {\n  DataSourceCustomExtra,\n  ExtraInterpretDataSource,\n  IProjectInfo,\n  IPublicTypeFormContainerSchema,\n} from '../types/intermediate';\n\nexport interface DataSourceDependenciesConfig {\n  /** 数据源引擎的版本 */\n  engineVersion?: string;\n\n  /** 数据源引擎的包名 */\n  enginePackage?: string;\n\n  /** 数据源 handlers 的版本 */\n  handlersVersion?: {\n    [key: string]: string;\n  };\n\n  /** 数据源 handlers 的包名 */\n  handlersPackages?: {\n    [key: string]: string;\n  };\n}\n\nexport function buildDataSourceDependencies(\n  ir: IProjectInfo,\n  cfg: DataSourceDependenciesConfig = {},\n): Record<string, string> {\n  return {\n    // 数据源引擎的依赖包\n    [cfg.enginePackage || '@alilc/lowcode-datasource-engine']: cfg.engineVersion || '^1.0.0',\n\n    // 各种数据源的 handlers 的依赖包\n    ...(ir.dataSourcesTypes || []).reduce(\n      (acc, dsType) => ({\n        ...acc,\n        [getDataSourceHandlerPackageName(dsType)]: cfg.handlersVersion?.[dsType] || '^1.0.0',\n      }),\n      {},\n    ),\n  };\n\n  function getDataSourceHandlerPackageName(dsType: string) {\n    return (\n      cfg.handlersPackages?.[dsType] ||\n      `@alilc/lowcode-datasource-${changeCase.kebab(dsType)}-handler`\n    );\n  }\n}\n\nexport function isFormPage(obj: Record<string, DataSourceCustomExtra>) {\n  // 遍历对象，检查每一项的 id 是否不为空\n  for (let key in obj) {\n    if (obj[key].dataSourceType && obj[key].dataSourceType == 'formPage') {\n      return true;\n    }\n  }\n  return false;\n}\n","import { PackageJSON } from '@alilc/lowcode-types';\n\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\nimport { buildDataSourceDependencies } from '../../../../../utils/dataSource';\n\ninterface IIceJsPackageJSON extends PackageJSON {\n  ideMode: {\n    name: string;\n  };\n  iceworks: {\n    type: string;\n    adapter: string;\n  };\n  originTemplate: string;\n}\n\nexport type IceJsPackageJsonPluginConfig = {\n  /**\n   * 数据源配置\n   */\n  datasourceConfig?: {\n    /** 数据源引擎的版本 */\n    engineVersion?: string;\n    /** 数据源引擎的包名 */\n    enginePackage?: string;\n    /** 数据源 handlers 的版本 */\n    handlersVersion?: {\n      [key: string]: string;\n    };\n    /** 数据源 handlers 的包名 */\n    handlersPackages?: {\n      [key: string]: string;\n    };\n  };\n  /** 包名 */\n  packageName?: string;\n  /** 版本 */\n  packageVersion?: string;\n};\n\nconst pluginFactory: BuilderComponentPluginFactory<IceJsPackageJsonPluginConfig> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    const packageJson: IIceJsPackageJSON = {\n      name: cfg?.packageName || 'icejs-demo-app',\n      version: cfg?.packageVersion || '0.1.5',\n      description: '轻量级模板，使用 JavaScript，仅包含基础的 Layout。',\n      dependencies: {\n        moment: '^2.24.0',\n        react: '^16.4.1',\n        'react-dom': '^16.4.1',\n        'react-router': '^5.2.1',\n        '@alifd/theme-design-pro': '^0.x',\n        'intl-messageformat': '^9.3.6',\n        '@ice/store': '^1.4.3',\n        '@loadable/component': '^5.15.2',\n\n        // 数据源相关的依赖:\n        ...buildDataSourceDependencies(ir, cfg?.datasourceConfig),\n      },\n      devDependencies: {\n        '@ice/spec': '^1.0.0',\n        'build-plugin-fusion': '^0.1.0',\n        'build-plugin-moment-locales': '^0.1.0',\n        eslint: '^6.0.1',\n        'ice.js': '^1.0.0',\n        stylelint: '^13.2.0',\n      },\n      scripts: {\n        start: 'icejs start',\n        build: 'icejs build',\n        lint: 'npm run eslint && npm run stylelint',\n        eslint: 'eslint --cache --ext .js,.jsx ./',\n        stylelint: 'stylelint ./**/*.scss',\n      },\n      ideMode: {\n        name: 'ice-react',\n      },\n      iceworks: {\n        type: 'react',\n        adapter: 'adapter-react-v3',\n      },\n      engines: {\n        node: '>=8.0.0',\n      },\n      repository: {\n        type: 'git',\n        url: 'http://gitlab.xxx.com/msd/leak-scan/tree/master',\n      },\n      private: true,\n      originTemplate: '@alifd/scaffold-lite-js',\n    };\n\n    ir.packages.forEach((packageInfo) => {\n      packageJson.dependencies[packageInfo.package] = packageInfo.version;\n    });\n\n    next.chunks.push({\n      type: ChunkType.JSON,\n      fileType: FileType.JSON,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: packageJson,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IRouterInfo,\n} from '../../../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IRouterInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: `\n        import BasicLayout from '@/layouts/BasicLayout';\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileVarDefine,\n      content: `\n        const routerConfig = [\n          {\n            path: '/',\n            component: BasicLayout,\n            children: [\n              ${ir.routes\n    .map(\n      (route) => `\n                    {\n                      path: '${route.path}',\n                      component: ${route.componentName},\n                    }\n                  `,\n    )\n    .join(',')}\n            ],\n          },\n        ];\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileExport,\n      content: `\n        export default routerConfig;\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileMainContent,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import template from './template';\nimport entry from './plugins/entry';\nimport entryHtml from './plugins/entryHtml';\nimport globalStyle from './plugins/globalStyle';\nimport packageJSON from './plugins/packageJSON';\nimport router from './plugins/router';\n\nexport default {\n  template,\n  plugins: {\n    entry,\n    entryHtml,\n    globalStyle,\n    packageJSON,\n    router,\n  },\n};\n","import prettier from 'prettier';\nimport parserBabel from 'prettier/parser-babel';\nimport parserPostCss from 'prettier/parser-postcss';\nimport parserHtml from 'prettier/parser-html';\n\nimport { PostProcessor, PostProcessorFactory } from '../../types';\n\nconst PARSERS = ['css', 'scss', 'less', 'json', 'html', 'vue'];\n\nexport interface ProcessorConfig {\n  customFileTypeParser: Record<string, string>;\n  plugins?: prettier.Plugin[];\n}\n\nconst factory: PostProcessorFactory<ProcessorConfig> = (config?: ProcessorConfig) => {\n  const cfg: ProcessorConfig = {\n    customFileTypeParser: {},\n    ...config,\n  };\n\n  const basePlugins = [parserBabel, parserPostCss, parserHtml].filter(Boolean);\n\n  const codePrettier: PostProcessor = (content: string, fileType: string) => {\n    let parser: prettier.BuiltInParserName | any;\n    if (fileType === 'js' || fileType === 'jsx' || fileType === 'ts' || fileType === 'tsx') {\n      parser = 'babel-ts';\n    } else if (fileType === 'json') {\n      parser = 'json-stringify';\n    } else if (PARSERS.indexOf(fileType) >= 0) {\n      parser = fileType;\n    } else if (cfg.customFileTypeParser[fileType]) {\n      parser = cfg.customFileTypeParser[fileType];\n    } else {\n      return content;\n    }\n\n    const plugins = [...basePlugins, ...(cfg.plugins || [])].filter(Boolean);\n\n    return prettier.format(content, {\n      parser,\n      plugins,\n      singleQuote: true,\n      jsxSingleQuote: false,\n    });\n  };\n\n  return codePrettier;\n};\n\nexport default factory;\n","import { IProjectBuilder, IProjectBuilderOptions } from '../types';\n\nimport { createProjectBuilder } from '../generator/ProjectBuilder';\n\nimport esmodule from '../plugins/common/esmodule';\nimport styleImport from '../plugins/common/styleImport';\nimport containerClass from '../plugins/component/react/containerClass';\nimport containerInitState from '../plugins/component/react/containerInitState';\nimport containerInjectContext from '../plugins/component/react/containerInjectContext';\nimport containerInjectUtils from '../plugins/component/react/containerInjectUtils';\nimport containerInjectDataSourceEngine from '../plugins/component/react/containerInjectDataSourceEngine';\nimport containerInjectConstants from '../plugins/component/react/containerInjectConstants';\nimport containerInjectI18n from '../plugins/component/react/containerInjectI18n';\nimport containerLifeCycle from '../plugins/component/react/containerLifeCycle';\nimport containerMethod from '../plugins/component/react/containerMethod';\nimport jsx from '../plugins/component/react/jsx';\nimport reactCommonDeps from '../plugins/component/react/reactCommonDeps';\nimport css from '../plugins/component/style/css';\nimport constants from '../plugins/project/constants';\nimport i18n from '../plugins/project/i18n';\nimport utils from '../plugins/project/utils';\n\nimport icejs from '../plugins/project/framework/icejs';\n\nimport { prettier } from '../postprocessor';\n\nexport type IceJsProjectBuilderOptions = IProjectBuilderOptions;\n\nexport default function createIceJsProjectBuilder(\n  options?: IceJsProjectBuilderOptions,\n): IProjectBuilder {\n  return createProjectBuilder({\n    inStrictMode: options?.inStrictMode,\n    extraContextData: { ...options },\n    template: icejs.template,\n    plugins: {\n      components: [\n        reactCommonDeps(),\n        esmodule({\n          fileType: 'jsx',\n        }),\n        styleImport(),\n        containerClass(),\n        containerInjectContext(),\n        containerInjectUtils(),\n        containerInjectDataSourceEngine(),\n        containerInjectI18n(),\n        containerInjectConstants(),\n        containerInitState(),\n        containerLifeCycle(),\n        containerMethod(),\n        jsx({\n          nodeTypeMapping: {\n            Div: 'div',\n            Component: 'div',\n            Page: 'div',\n            Block: 'div',\n          },\n        }),\n        css(),\n      ],\n      pages: [\n        reactCommonDeps(),\n        esmodule({\n          fileType: 'jsx',\n        }),\n        styleImport(),\n        containerClass(),\n        containerInjectContext(),\n        containerInjectUtils(),\n        containerInjectDataSourceEngine(),\n        containerInjectI18n(),\n        containerInjectConstants(),\n        containerInitState(),\n        containerLifeCycle(),\n        containerMethod(),\n        jsx({\n          nodeTypeMapping: {\n            Div: 'div',\n            Component: 'div',\n            Page: 'div',\n            Block: 'div',\n            // Box: 'div',\n          },\n        }),\n        css(),\n      ],\n      router: [esmodule(), icejs.plugins.router()],\n      entry: [icejs.plugins.entry()],\n      constants: [constants()],\n      utils: [esmodule(), utils('react')],\n      i18n: [i18n()],\n      globalStyle: [icejs.plugins.globalStyle()],\n      htmlEntry: [icejs.plugins.entryHtml()],\n      packageJSON: [icejs.plugins.packageJSON()],\n    },\n    postProcessors: [prettier()],\n    customizeBuilderOptions: options?.customizeBuilderOptions,\n  });\n}\n\nexport const plugins = {\n  containerClass,\n  containerInjectContext,\n  containerInjectUtils,\n  containerInjectDataSourceEngine,\n  containerInjectI18n,\n  containerInjectConstants,\n  containerInitState,\n  containerLifeCycle,\n  containerMethod,\n  jsx,\n  commonDeps: reactCommonDeps,\n\n  /** @deprecated Please use commonDeps */\n  reactCommonDeps,\n};\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.gitignore',\n    '',\n    `\n# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\nnode_modules/\n\n# production\nbuild/\ndist/\ntmp/\nlib/\n\n# misc\n.idea/\n.happypack\n.DS_Store\n*.swp\n*.dia~\n.ice\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nindex.module.scss.d.ts\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'README',\n    'md',\n    'This project is generated by lowcode-code-generator & lowcode-solution-icejs3.',\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.browserslistrc',\n    '',\n    `defaults\nios_saf 9\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'typings.d',\n    'ts',\n    `/// <reference types=\"@ice/app/types\" />\n\nexport {};\ndeclare global {\n  interface Window {\n    g_config: Record<string, any>;\n  }\n}\n    `,\n  );\n\n  return [['src'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\n/* eslint-disable max-len */\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'document',\n    'tsx',\n    `import React from 'react';\nimport { Meta, Title, Links, Main, Scripts } from 'ice';\n\nexport default function Document() {\n  return (\n    <html>\n      <head>\n        <meta charSet=\"utf-8\" />\n        <meta name=\"description\" content=\"ice.js 3 lite scaffold\" />\n        <link rel=\"icon\" href=\"/favicon.ico\" />\n        <link rel=\"stylesheet\" href=\"//alifd.alicdn.com/npm/@alifd/next/1.21.16/next.min.css\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\" />\n        <Meta />\n        <Title />\n        <Links />\n      </head>\n      <body>\n        <Main />\n        <script crossOrigin=\"anonymous\" src=\"//g.alicdn.com/code/lib/react/18.2.0/umd/react.development.js\" />\n        <script crossOrigin=\"anonymous\" src=\"//g.alicdn.com/code/lib/react-dom/18.2.0/umd/react-dom.development.js\" />\n        <script crossOrigin=\"anonymous\" src=\"//g.alicdn.com/code/lib/??react-router/6.9.0/react-router.production.min.js,react-router-dom/6.9.0/react-router-dom.production.min.js\" />\n        <script crossOrigin=\"anonymous\" src=\"//g.alicdn.com/code/lib/alifd__next/1.26.22/next.min.js\" />\n        <script crossOrigin=\"anonymous\" src=\"//g.alicdn.com/code/lib/prop-types/15.7.2/prop-types.js\" />\n        <script crossOrigin=\"anonymous\" src=\"//g.alicdn.com/platform/c/??lodash/4.6.1/lodash.min.js,immutable/3.7.6/dist/immutable.min.js\" />\n        <Scripts />\n      </body>\n    </html>\n  );\n}`,\n  );\n\n  return [['src'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React from 'react';\nimport styles from './index.module.scss';\n\nexport default function Footer() {\n  return (\n    <p className={styles.footer}>\n      <span className={styles.logo}>Alibaba Fusion</span>\n      <br />\n      <span className={styles.copyright}>© 2019-现在 Alibaba Fusion & ICE</span>\n    </p>\n  );\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Footer'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'module.scss',\n    `\n.footer {\n  line-height: 20px;\n  text-align: center;\n}\n\n.logo {\n  font-weight: bold;\n  font-size: 16px;\n}\n\n.copyright {\n  font-size: 12px;\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Footer'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React from 'react';\nimport { Link } from 'ice';\nimport styles from './index.module.scss';\n\nexport default function Logo({ image, text, url }) {\n  return (\n    <div className=\"logo\">\n      <Link to={url || '/'} className={styles.logo}>\n        {image && <img src={image} alt=\"logo\" />}\n        <span>{text}</span>\n      </Link>\n    </div>\n  );\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Logo'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'module.scss',\n    `\n.logo{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: #FF7300;\n  font-weight: bold;\n  font-size: 14px;\n  line-height: 22px;\n\n  &:visited, &:link {\n    color: #FF7300;\n  }\n\n  img {\n    height: 24px;\n    margin-right: 10px;\n  }\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'Logo'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link, useLocation } from 'ice';\nimport { Nav } from '@alifd/next';\nimport { asideMenuConfig } from '../../menuConfig';\n\nconst { SubNav } = Nav;\nconst NavItem = Nav.Item;\n\nfunction getNavMenuItems(menusData) {\n  if (!menusData) {\n    return [];\n  }\n\n  return menusData\n    .filter(item => item.name && !item.hideInMenu)\n    .map((item, index) => getSubMenuOrItem(item, index));\n}\n\nfunction getSubMenuOrItem(item, index) {\n  if (item.children && item.children.some(child => child.name)) {\n    const childrenItems = getNavMenuItems(item.children);\n\n    if (childrenItems && childrenItems.length > 0) {\n      const subNav = (\n        <SubNav key={index} icon={item.icon} label={item.name}>\n          {childrenItems}\n        </SubNav>\n      );\n      return subNav;\n    }\n\n    return null;\n  }\n\n  const navItem = (\n    <NavItem key={item.path} icon={item.icon}>\n      <Link to={item.path}>{item.name}</Link>\n    </NavItem>\n  );\n  return navItem;\n}\n\nconst Navigation = (props, context) => {\n  const location = useLocation();\n  const { pathname } = location;\n  const { isCollapse } = context;\n  return (\n    <Nav\n      type=\"primary\"\n      selectedKeys={[pathname]}\n      defaultSelectedKeys={[pathname]}\n      embeddable\n      openMode=\"single\"\n      iconOnly={isCollapse}\n      hasArrow={false}\n      mode={isCollapse ? 'popup' : 'inline'}\n    >\n      {getNavMenuItems(asideMenuConfig)}\n    </Nav>\n  );\n};\n\nNavigation.contextTypes = {\n  isCollapse: PropTypes.bool,\n};\nexport default Navigation;\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout', 'components', 'PageNav'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'index',\n    'jsx',\n    `\nimport React, { useState } from 'react';\nimport { Shell, ConfigProvider } from '@alifd/next';\nimport PageNav from './components/PageNav';\nimport Logo from './components/Logo';\nimport Footer from './components/Footer';\n\n(function() {\n  const throttle = function(type, name, obj = window) {\n    let running = false;\n\n    const func = () => {\n      if (running) {\n        return;\n      }\n\n      running = true;\n      requestAnimationFrame(() => {\n        obj.dispatchEvent(new CustomEvent(name));\n        running = false;\n      });\n    };\n\n    obj.addEventListener(type, func);\n  };\n\n  throttle('resize', 'optimizedResize');\n})();\n\nexport default function BasicLayout({ children }) {\n  const getDevice = width => {\n    const isPhone =\n      typeof navigator !== 'undefined' && navigator && navigator.userAgent.match(/phone/gi);\n\n    if (width < 680 || isPhone) {\n      return 'phone';\n    }\n    if (width < 1280 && width > 680) {\n      return 'tablet';\n    }\n    return 'desktop';\n  };\n\n  const [device, setDevice] = useState(getDevice(NaN));\n  window.addEventListener('optimizedResize', e => {\n    setDevice(getDevice(e && e.target && e.target.innerWidth));\n  });\n  return (\n    <ConfigProvider device={device}>\n      <Shell\n        type=\"dark\"\n        style={{\n          minHeight: '100vh',\n        }}\n      >\n        <Shell.Branding>\n          <Logo\n            image=\"https://img.alicdn.com/tfs/TB1.ZBecq67gK0jSZFHXXa9jVXa-904-826.png\"\n            text=\"Logo\"\n          />\n        </Shell.Branding>\n        <Shell.Navigation\n          direction=\"hoz\"\n          style={{\n            marginRight: 10,\n          }}\n        ></Shell.Navigation>\n        <Shell.Action></Shell.Action>\n        <Shell.Navigation>\n          <PageNav />\n        </Shell.Navigation>\n\n        <Shell.Content>{children}</Shell.Content>\n        <Shell.Footer>\n          <Footer />\n        </Shell.Footer>\n      </Shell>\n    </ConfigProvider>\n  );\n}\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'menuConfig',\n    'js',\n    `\nconst headerMenuConfig = [];\nconst asideMenuConfig = [\n  {\n    name: 'Dashboard',\n    path: '/',\n    icon: 'smile',\n  },\n];\nexport { headerMenuConfig, asideMenuConfig };\n    `,\n  );\n\n  return [['src', 'layouts', 'BasicLayout'], file];\n}\n","import { ResultDir } from '@alilc/lowcode-types';\nimport { createResultDir } from '../../../../../utils/resultHelper';\nimport { runFileGenerator } from '../../../../../utils/templateHelper';\n\nimport file1 from './files/gitignore';\nimport file2 from './files/README.md';\nimport file3 from './files/browserslistrc';\nimport file4 from './files/typings';\nimport file5 from './files/document';\nimport file6 from './files/src/layouts/BasicLayout/components/Footer/index.jsx';\nimport file7 from './files/src/layouts/BasicLayout/components/Footer/index.style';\nimport file8 from './files/src/layouts/BasicLayout/components/Logo/index.jsx';\nimport file9 from './files/src/layouts/BasicLayout/components/Logo/index.style';\nimport file10 from './files/src/layouts/BasicLayout/components/PageNav/index.jsx';\nimport file11 from './files/src/layouts/BasicLayout/index.jsx';\nimport file12 from './files/src/layouts/BasicLayout/menuConfig.js';\n\nexport function generateStaticFiles(root = createResultDir('.')): ResultDir {\n  runFileGenerator(root, file1);\n  runFileGenerator(root, file2);\n  runFileGenerator(root, file3);\n  runFileGenerator(root, file4);\n  runFileGenerator(root, file5);\n  runFileGenerator(root, file6);\n  runFileGenerator(root, file7);\n  runFileGenerator(root, file8);\n  runFileGenerator(root, file9);\n  runFileGenerator(root, file10);\n  runFileGenerator(root, file11);\n  runFileGenerator(root, file12);\n\n  return root;\n}\n","import { IProjectTemplate } from '../../../../../types';\nimport { generateStaticFiles } from './static-files';\n\nconst icejs3Template: IProjectTemplate = {\n  slots: {\n    components: {\n      path: ['src', 'components'],\n      fileName: 'index',\n    },\n    pages: {\n      path: ['src', 'pages'],\n      fileName: 'index',\n    },\n    entry: {\n      path: ['src'],\n      fileName: 'app',\n    },\n    constants: {\n      path: ['src'],\n      fileName: 'constants',\n    },\n    utils: {\n      path: ['src'],\n      fileName: 'utils',\n    },\n    i18n: {\n      path: ['src'],\n      fileName: 'i18n',\n    },\n    globalStyle: {\n      path: ['src'],\n      fileName: 'global',\n    },\n    packageJSON: {\n      path: [],\n      fileName: 'package',\n    },\n    appConfig: {\n      path: ['src'],\n      fileName: 'app',\n    },\n    buildConfig: {\n      path: [],\n      fileName: 'ice.config',\n    },\n    layout: {\n      path: ['src', 'pages'],\n      fileName: 'layout',\n    },\n  },\n\n  generateTemplate() {\n    return generateStaticFiles();\n  },\n};\n\nexport default icejs3Template;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.SCSS,\n      name: COMMON_CHUNK_NAME.StyleDepsImport,\n      content: `\n        // 引入默认全局样式\n        @import '@alifd/next/reset.scss';\n      `,\n      linkAfter: [],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.SCSS,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: `\n        body {\n          -webkit-font-smoothing: antialiased;\n        }\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.SCSS,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: ir.css || '',\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { PackageJSON } from '@alilc/lowcode-types';\n\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\nimport { buildDataSourceDependencies } from '../../../../../utils/dataSource';\n\ninterface IIceJs3PackageJSON extends PackageJSON {\n  originTemplate: string;\n}\n\nexport type IceJs3PackageJsonPluginConfig = {\n\n  /**\n   * 数据源配置\n   */\n  datasourceConfig?: {\n\n    /** 数据源引擎的版本 */\n    engineVersion?: string;\n\n    /** 数据源引擎的包名 */\n    enginePackage?: string;\n\n    /** 数据源 handlers 的版本 */\n    handlersVersion?: {\n      [key: string]: string;\n    };\n\n    /** 数据源 handlers 的包名 */\n    handlersPackages?: {\n      [key: string]: string;\n    };\n  };\n\n  /** 包名 */\n  packageName?: string;\n\n  /** 版本 */\n  packageVersion?: string;\n};\n\nconst pluginFactory: BuilderComponentPluginFactory<IceJs3PackageJsonPluginConfig> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    const packageJson: IIceJs3PackageJSON = {\n      name: cfg?.packageName || 'icejs3-demo-app',\n      version: cfg?.packageVersion || '0.1.5',\n      description: 'icejs 3 轻量级模板，使用 JavaScript，仅包含基础的 Layout。',\n      dependencies: {\n        moment: '^2.24.0',\n        react: '^18.2.0',\n        'react-dom': '^18.2.0',\n        'react-router': '^6.9.0',\n        'react-router-dom': '^6.9.0',\n        'intl-messageformat': '^9.3.6',\n        '@alifd/next': '1.26.15',\n        '@ice/runtime': '~1.1.0',\n        // 数据源相关的依赖:\n        ...buildDataSourceDependencies(ir, cfg?.datasourceConfig),\n      },\n      devDependencies: {\n        '@ice/app': '~3.1.0',\n        '@types/react': '^18.0.0',\n        '@types/react-dom': '^18.0.0',\n        '@types/node': '^18.11.17',\n        '@ice/plugin-fusion': '^1.0.1',\n        '@ice/plugin-moment-locales': '^1.0.0',\n        eslint: '^6.0.1',\n        stylelint: '^13.2.0',\n      },\n      scripts: {\n        start: 'ice start',\n        build: 'ice build',\n        lint: 'npm run eslint && npm run stylelint',\n        eslint: 'eslint --cache --ext .js,.jsx ./',\n        stylelint: 'stylelint ./**/*.scss',\n      },\n      engines: {\n        node: '>=14.0.0',\n      },\n      repository: {\n        type: 'git',\n        url: 'http://gitlab.xxx.com/msd/leak-scan/tree/master',\n      },\n      private: true,\n      originTemplate: '@alifd/scaffold-lite-js',\n    };\n\n    ir.packages.forEach((packageInfo) => {\n      packageJson.dependencies[packageInfo.package] = packageInfo.version;\n    });\n\n    next.chunks.push({\n      type: ChunkType.JSON,\n      fileType: FileType.JSON,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: packageJson,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../../../types';\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: `\n      import { Outlet } from 'ice';\n      import BasicLayout from '@/layouts/BasicLayout';\n\n      export default function Layout() {\n        return (\n          <BasicLayout>\n            <Outlet />\n          </BasicLayout>\n        );;\n      }\n      `,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../../../types';\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nexport interface AppConfigPluginConfig {\n\n}\n\nfunction getContent() {\n  return `import { defineAppConfig } from 'ice';\n\n// App config, see https://v3.ice.work/docs/guide/basic/app\nexport default defineAppConfig(() => ({\n  // Set your configs here.\n  app: {\n    rootId: 'App',\n  },\n  router: {\n    type: 'browser',\n    basename: '/',\n  },\n}));`;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<AppConfigPluginConfig> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: getContent(),\n      linkAfter: [],\n    });\n\n    return next;\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n","import prettier from 'prettier';\nimport parserBabel from 'prettier/parser-babel';\n\nexport function format(content: string, options = {}) {\n  return prettier.format(content, {\n    parser: 'babel',\n    plugins: [parserBabel],\n    singleQuote: true,\n    jsxSingleQuote: false,\n    ...options,\n  });\n}\n","/**\n * 获取主题信息\n * @param theme theme 形如 @alife/theme-97 或者 @alife/theme-97@^1.0.0\n */\n\nexport interface ThemeInfo {\n  name: string;\n  version?: string;\n}\n\nexport function getThemeInfo(theme: string): ThemeInfo {\n  const sepIdx = theme.indexOf('@', 1);\n  if (sepIdx === -1) {\n    return { name: theme };\n  }\n  return {\n    name: theme.slice(0, sepIdx),\n    version: theme.slice(sepIdx + 1),\n  };\n}","import {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../../../types';\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\nimport { format } from '../../../../../utils/format';\nimport { getThemeInfo } from '../../../../../utils/theme';\n\nexport interface BuildConfigPluginConfig {\n\n  /** 包名 */\n  themePackage?: string;\n}\n\nfunction getContent(cfg?: BuildConfigPluginConfig, routesContent?: string) {\n  return `\nimport { join } from 'path';\nimport { defineConfig } from '@ice/app';\nimport _ from 'lodash';\nimport fusion from '@ice/plugin-fusion';\nimport locales from '@ice/plugin-moment-locales';\nimport type { Plugin } from '@ice/app/esm/types';\n\ninterface PluginOptions {\n  id: string;\n}\n\nconst plugin: Plugin<PluginOptions> = (options) => ({\n  // name 可选，插件名称\n  name: 'plugin-name',\n  // setup 必选，用于定制工程构建配置\n  setup: ({ onGetConfig, modifyUserConfig }) => {\n    modifyUserConfig('codeSplitting', 'page');\n\n    onGetConfig((config) => {\n      config.entry = {\n        web: join(process.cwd(), '.ice/entry.client.tsx'),\n      };\n\n      config.cssFilename = '[name].css';\n\n      config.configureWebpack = config.configureWebpack || [];\n      config.configureWebpack?.push((webpackConfig) => {\n        if (webpackConfig.output) {\n          webpackConfig.output.filename = '[name].js';\n          webpackConfig.output.chunkFilename = '[name].js';\n        }\n        return webpackConfig;\n      });\n\n      config.swcOptions = _.merge(config.swcOptions, {\n        compilationConfig: {\n          jsc: {\n            transform: {\n              react: {\n                runtime: 'classic',\n              },\n            },\n          },\n        }\n      });\n\n      // 解决 webpack publicPath 问题\n      config.transforms = config.transforms || [];\n      config.transforms.push((source: string, id: string) => {\n        if (id.includes('.ice/entry.client.tsx')) {\n          let code = \\`\n          if (!__webpack_public_path__?.startsWith('http') && document.currentScript) {\n            // @ts-ignore\n            __webpack_public_path__ = document.currentScript.src.replace(/^(.*\\\\\\\\/)[^/]+$/, '$1');\n            window.__ICE_ASSETS_MANIFEST__ = window.__ICE_ASSETS_MANIFEST__ || {};\n            window.__ICE_ASSETS_MANIFEST__.publicPath = __webpack_public_path__;\n          }\n          \\`;\n          code += source;\n          return { code };\n        }\n      });\n    });\n  },\n});\n\n// The project config, see https://v3.ice.work/docs/guide/basic/config\nconst minify = process.env.NODE_ENV === 'production' ? 'swc' : false;\nexport default defineConfig(() => ({\n  ssr: false,\n  ssg: false,\n  minify,\n  ${routesContent}\n  externals: {\n    react: 'React',\n    'react-dom': 'ReactDOM',\n    'react-dom/client': 'ReactDOM',\n    '@alifd/next': 'Next',\n    lodash: 'var window._',\n    '@alilc/lowcode-engine': 'var window.AliLowCodeEngine',\n  },\n  plugins: [\n    fusion(${cfg?.themePackage ? `{\n      importStyle: 'sass',\n      themePackage: '${getThemeInfo(cfg.themePackage).name}',\n    }` : `{\n      importStyle: 'sass',\n    }`}),\n    locales(),\n    plugin(),\n  ]\n}));\n  `;\n}\n\nfunction getRoutesContent(navData: any, needShell = true) {\n  const routes = [\n    'routes: {',\n    '  defineRoutes: route => {',\n  ];\n  function _getRoutes(nav: any, _routes: string[] = []) {\n    const { slug, children } = nav;\n    if (children && children.length > 0) {\n      children.forEach((_nav: any) => _getRoutes(_nav, _routes));\n    } else if (slug) {\n      _routes.push(`route('/${slug}', '${slug}/index.jsx');`);\n    }\n  }\n  if (needShell) {\n    routes.push(\"    route('/', 'layout.jsx', () => {\");\n  }\n  navData?.forEach((nav: any) => {\n    _getRoutes(nav, routes);\n  });\n  if (needShell) {\n    routes.push('    });');\n  }\n  routes.push('  }'); // end of defineRoutes\n  routes.push('  },'); // end of routes\n  return routes.join('\\n');\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<BuildConfigPluginConfig> = (cfg?) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const { navConfig } = next.contextData;\n    const routesContent = navConfig?.data ? getRoutesContent(navConfig.data, true) : '';\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.MTS,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: format(getContent(cfg, routesContent)),\n      linkAfter: [],\n    });\n\n    return next;\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n","import template from './template';\nimport globalStyle from './plugins/globalStyle';\nimport packageJSON from './plugins/packageJSON';\nimport layout from './plugins/layout';\nimport appConfig from './plugins/appConfig';\nimport buildConfig from './plugins/buildConfig';\n\nexport default {\n  template,\n  plugins: {\n    appConfig,\n    buildConfig,\n    globalStyle,\n    packageJSON,\n    layout,\n  },\n};\n","import { IProjectBuilder, IProjectBuilderOptions } from '../types';\n\nimport { createProjectBuilder } from '../generator/ProjectBuilder';\n\nimport esmodule from '../plugins/common/esmodule';\nimport styleImport from '../plugins/common/styleImport';\nimport containerClass from '../plugins/component/react/containerClass';\nimport containerInitState from '../plugins/component/react/containerInitState';\nimport containerInjectContext from '../plugins/component/react/containerInjectContext';\nimport containerInjectUtils from '../plugins/component/react/containerInjectUtils';\nimport containerInjectDataSourceEngine from '../plugins/component/react/containerInjectDataSourceEngine';\nimport containerInjectConstants from '../plugins/component/react/containerInjectConstants';\nimport containerInjectI18n from '../plugins/component/react/containerInjectI18n';\nimport containerLifeCycle from '../plugins/component/react/containerLifeCycle';\nimport containerMethod from '../plugins/component/react/containerMethod';\nimport jsx from '../plugins/component/react/jsx';\nimport reactCommonDeps from '../plugins/component/react/reactCommonDeps';\nimport css from '../plugins/component/style/css';\nimport constants from '../plugins/project/constants';\nimport i18n from '../plugins/project/i18n';\nimport utils from '../plugins/project/utils';\n\nimport icejs3 from '../plugins/project/framework/icejs3';\n\nimport { prettier } from '../postprocessor';\n\nexport type IceJs3ProjectBuilderOptions = IProjectBuilderOptions;\n\nexport default function createIceJsProjectBuilder(\n  options?: IceJs3ProjectBuilderOptions,\n): IProjectBuilder {\n  return createProjectBuilder({\n    inStrictMode: options?.inStrictMode,\n    extraContextData: { ...options },\n    template: icejs3.template,\n    plugins: {\n      components: [\n        reactCommonDeps(),\n        esmodule({\n          fileType: 'jsx',\n        }),\n        styleImport(),\n        containerClass(),\n        containerInjectContext(),\n        containerInjectUtils(),\n        containerInjectDataSourceEngine(),\n        containerInjectI18n(),\n        containerInjectConstants(),\n        containerInitState(),\n        containerLifeCycle(),\n        containerMethod(),\n        jsx({\n          nodeTypeMapping: {\n            Div: 'div',\n            Component: 'div',\n            Page: 'div',\n            Block: 'div',\n          },\n        }),\n        css(),\n      ],\n      pages: [\n        reactCommonDeps(),\n        esmodule({\n          fileType: 'jsx',\n        }),\n        styleImport(),\n        containerClass(),\n        containerInjectContext(),\n        containerInjectUtils(),\n        containerInjectDataSourceEngine(),\n        containerInjectI18n(),\n        containerInjectConstants(),\n        containerInitState(),\n        containerLifeCycle(),\n        containerMethod(),\n        jsx({\n          nodeTypeMapping: {\n            Div: 'div',\n            Component: 'div',\n            Page: 'div',\n            Block: 'div',\n            Box: 'div',\n          },\n        }),\n        css(),\n      ],\n      constants: [constants()],\n      utils: [esmodule(), utils('react')],\n      i18n: [i18n()],\n      globalStyle: [icejs3.plugins.globalStyle()],\n      packageJSON: [icejs3.plugins.packageJSON()],\n      buildConfig: [icejs3.plugins.buildConfig()],\n      appConfig: [icejs3.plugins.appConfig()],\n      layout: [icejs3.plugins.layout()],\n    },\n    postProcessors: [prettier()],\n    customizeBuilderOptions: options?.customizeBuilderOptions,\n  });\n}\n\nexport const plugins = {\n  containerClass,\n  containerInitState,\n  containerInjectContext,\n  containerInjectUtils,\n  containerInjectI18n,\n  containerInjectDataSourceEngine,\n  containerLifeCycle,\n  containerMethod,\n  jsx,\n  commonDeps: reactCommonDeps,\n};\n","export const RAX_CHUNK_NAME = {\n  ClassDidMountBegin: 'RaxComponentClassDidMountBegin',\n  ClassDidMountContent: 'RaxComponentClassDidMountContent',\n  ClassDidMountEnd: 'RaxComponentClassDidMountEnd',\n  ClassWillUnmountBegin: 'RaxComponentClassWillUnmountBegin',\n  ClassWillUnmountContent: 'RaxComponentClassWillUnmountContent',\n  ClassWillUnmountEnd: 'RaxComponentClassWillUnmountEnd',\n  ClassRenderBegin: 'RaxComponentClassRenderBegin',\n  ClassRenderPre: 'RaxComponentClassRenderPre',\n  ClassRenderJSX: 'RaxComponentClassRenderJSX',\n  ClassRenderEnd: 'RaxComponentClassRenderEnd',\n  MethodsBegin: 'RaxComponentMethodsBegin',\n  MethodsContent: 'RaxComponentMethodsContent',\n  MethodsEnd: 'RaxComponentMethodsEnd',\n  LifeCyclesBegin: 'RaxComponentLifeCyclesBegin',\n  LifeCyclesContent: 'RaxComponentLifeCyclesContent',\n  LifeCyclesEnd: 'RaxComponentLifeCyclesEnd',\n};\n","import changeCase from '../../../utils/changeCaseCompat';\nimport {\n  COMMON_CHUNK_NAME,\n  CLASS_DEFINE_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\nimport { RAX_CHUNK_NAME } from './const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { ensureValidClassName } from '../../../utils/validate';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    // 将模块名转换成 PascalCase 的格式，并添加特定后缀，防止命名冲突\n    const componentClassName = ensureValidClassName(\n      `${changeCase.pascalCase(ir.moduleName)}$$Page`,\n    );\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.Start,\n      content: `class ${componentClassName} extends Component {`,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.End,\n      content: '}',\n      linkAfter: [\n        CLASS_DEFINE_CHUNK_NAME.Start,\n        CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n        RAX_CHUNK_NAME.ClassRenderEnd,\n        RAX_CHUNK_NAME.MethodsEnd,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.ConstructorStart,\n      content: 'constructor(props, context) { super(props); ',\n      linkAfter: DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: CLASS_DEFINE_CHUNK_NAME.ConstructorEnd,\n      content: '} /* end of constructor */',\n      linkAfter: DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorEnd],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: RAX_CHUNK_NAME.ClassDidMountBegin,\n      content: 'componentDidMount() {',\n      linkAfter: [\n        CLASS_DEFINE_CHUNK_NAME.Start,\n        CLASS_DEFINE_CHUNK_NAME.InsVar,\n        CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        CLASS_DEFINE_CHUNK_NAME.ConstructorEnd,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: RAX_CHUNK_NAME.ClassDidMountEnd,\n      content: '} /* end of componentDidMount */',\n      linkAfter: [RAX_CHUNK_NAME.ClassDidMountBegin, RAX_CHUNK_NAME.ClassDidMountContent],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: RAX_CHUNK_NAME.ClassWillUnmountBegin,\n      content: 'componentWillUnmount() {',\n      linkAfter: [\n        CLASS_DEFINE_CHUNK_NAME.Start,\n        CLASS_DEFINE_CHUNK_NAME.InsVar,\n        CLASS_DEFINE_CHUNK_NAME.InsMethod,\n        RAX_CHUNK_NAME.ClassDidMountEnd,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: RAX_CHUNK_NAME.ClassWillUnmountEnd,\n      content: '} /* end of componentWillUnmount */',\n      linkAfter: [RAX_CHUNK_NAME.ClassWillUnmountBegin, RAX_CHUNK_NAME.ClassWillUnmountContent],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: RAX_CHUNK_NAME.ClassRenderBegin,\n      content: 'render() {',\n      linkAfter: [RAX_CHUNK_NAME.ClassDidMountEnd, RAX_CHUNK_NAME.ClassWillUnmountEnd],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: RAX_CHUNK_NAME.ClassRenderEnd,\n      content: '} /* end of render */',\n      linkAfter: [\n        RAX_CHUNK_NAME.ClassRenderBegin,\n        RAX_CHUNK_NAME.ClassRenderPre,\n        RAX_CHUNK_NAME.ClassRenderJSX,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.FileExport,\n      content: `export default ${componentClassName};`,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n        CLASS_DEFINE_CHUNK_NAME.End,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import _ from 'lodash';\nimport { isJSExpression, isJSFunction } from '@alilc/lowcode-types';\n\nimport { CLASS_DEFINE_CHUNK_NAME } from '../../../const/generator';\nimport { RAX_CHUNK_NAME } from './const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  FileType,\n  ChunkType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { debug } from '../../../utils/debug';\nimport { isJSExpressionFn } from '../../../utils/common';\n\nexport interface PluginConfig {\n  fileType: string;\n  exportNameMapping: Record<string, string>;\n  normalizeNameMapping: Record<string, string>;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    exportNameMapping: {},\n    normalizeNameMapping: {\n      didMount: 'componentDidMount',\n      willUnmount: 'componentWillUnmount',\n    },\n    ...config,\n  };\n\n  const exportNameMapping = new Map(Object.entries(cfg.exportNameMapping));\n  const normalizeNameMapping = new Map(Object.entries(cfg.normalizeNameMapping));\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    // Rax 先只支持 didMount 和 willUnmount 吧\n\n    const ir = next.ir as IContainerInfo;\n    const { lifeCycles } = ir;\n\n    if (lifeCycles && !_.isEmpty(lifeCycles)) {\n      Object.entries(lifeCycles).forEach(([lifeCycleName, lifeCycleMethodExpr]) => {\n        // 过滤掉非法数据（有些场景下会误传入空字符串或 null)\n        if (\n          !isJSFunction(lifeCycles[lifeCycleName]) &&\n          !isJSExpressionFn(lifeCycles[lifeCycleName]) &&\n          !isJSExpression(lifeCycles[lifeCycleName])\n        ) {\n          return;\n        }\n\n        const normalizeName = normalizeNameMapping.get(lifeCycleName) || lifeCycleName;\n        const exportName = exportNameMapping.get(lifeCycleName) || lifeCycleName;\n\n        next.chunks.push({\n          type: ChunkType.STRING,\n          fileType: cfg.fileType,\n          name: RAX_CHUNK_NAME.LifeCyclesContent,\n          content: `${exportName}: (${lifeCycleMethodExpr.value}),`,\n          linkAfter: [RAX_CHUNK_NAME.LifeCyclesBegin],\n        });\n\n        if (normalizeName === 'constructor') {\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n            content: `this._lifeCycles.${exportName}();`,\n            linkAfter: [CLASS_DEFINE_CHUNK_NAME.ConstructorStart],\n          });\n        } else if (normalizeName === 'componentDidMount') {\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: RAX_CHUNK_NAME.ClassDidMountContent,\n            content: `this._lifeCycles.${exportName}();`,\n            linkAfter: [RAX_CHUNK_NAME.ClassDidMountBegin],\n          });\n        } else if (normalizeName === 'componentWillUnmount') {\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: RAX_CHUNK_NAME.ClassWillUnmountContent,\n            content: `this._lifeCycles.${exportName}();`,\n            linkAfter: [RAX_CHUNK_NAME.ClassWillUnmountBegin],\n          });\n        } else {\n          debug(`[CodeGen]: unknown life cycle: ${lifeCycleName}`);\n        }\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: '_lifeCycles = this._defineLifeCycles();',\n        linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: RAX_CHUNK_NAME.LifeCyclesBegin,\n        content: `\n          _defineLifeCycles() {\n            const __$$lifeCycles = ({\n        `,\n        linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd, CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod],\n      });\n\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: RAX_CHUNK_NAME.LifeCyclesEnd,\n        content: `\n            });\n\n            // 为所有的方法绑定上下文\n            Object.entries(__$$lifeCycles).forEach(([lifeCycleName, lifeCycleMethod]) => {\n              if (typeof lifeCycleMethod === 'function') {\n                __$$lifeCycles[lifeCycleName] = (...args) => {\n                  return lifeCycleMethod.apply(this._context, args);\n                }\n              }\n            });\n\n            return __$$lifeCycles;\n          }\n        `,\n        linkAfter: [RAX_CHUNK_NAME.LifeCyclesBegin, RAX_CHUNK_NAME.LifeCyclesContent],\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import createDebug from 'debug';\n\nexport const debug = createDebug('code-generator');\n","import { CLASS_DEFINE_CHUNK_NAME } from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\n\nimport { RAX_CHUNK_NAME } from './const';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n      content: `\n         _methods = this._defineMethods();\n      `,\n      linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: RAX_CHUNK_NAME.MethodsBegin,\n      content: `\n        _defineMethods() {\n          return ({\n      `,\n      linkAfter: [\n        RAX_CHUNK_NAME.ClassRenderEnd,\n        CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n        RAX_CHUNK_NAME.LifeCyclesEnd,\n      ],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: RAX_CHUNK_NAME.MethodsEnd,\n      content: `\n          });\n        }\n      `,\n      linkAfter: [RAX_CHUNK_NAME.MethodsBegin, RAX_CHUNK_NAME.MethodsContent],\n    });\n\n    if (ir.methods && Object.keys(ir.methods).length > 0) {\n      Object.entries(ir.methods).forEach(([methodName, methodDefine]) => {\n        next.chunks.push({\n          type: ChunkType.STRING,\n          fileType: cfg.fileType,\n          name: RAX_CHUNK_NAME.MethodsContent,\n          content: `${methodName}: (${methodDefine.value}),`,\n          linkAfter: [RAX_CHUNK_NAME.MethodsBegin],\n        });\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { CLASS_DEFINE_CHUNK_NAME, DEFAULT_LINK_AFTER } from '../../../const/generator';\n\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { Scope } from '../../../utils/Scope';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\n\nexport interface PluginConfig {\n  fileType: string;\n  implementType: 'inConstructor' | 'insMember' | 'hooks';\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    implementType: 'insMember',\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const scope = Scope.createRootScope();\n\n    const state = ir.state || {};\n    const fields = Object.keys(state).map<string>((stateName) => {\n      // TODO: 这里用什么 handlers?\n      const value = generateCompositeType(state[stateName], scope);\n      return `${JSON.stringify(stateName)}: ${value}`;\n    });\n\n    if (cfg.implementType === 'inConstructor') {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n        content: `this.state = { ${fields.join(',')} };`,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],\n      });\n    } else if (cfg.implementType === 'insMember') {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n        content: `state = { ${fields.join(',')} };`,\n        linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.InsVar]],\n      });\n    }\n    // TODO: hooks state??\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","/* eslint-disable @typescript-eslint/indent */\nimport { CLASS_DEFINE_CHUNK_NAME, COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { RAX_CHUNK_NAME } from './const';\nimport { DEFAULT_LINK_AFTER } from '../../../const';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const useRef = !!ir.analyzeResult?.isUsingRef;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: \"import __$$constants from '../../constants';\",\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    // TODO: i18n 是可选的，如果没有 i18n 这个文件怎么办？该怎么判断？\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: \"import * as __$$i18n from '../../i18n';\",\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n      content: `\n        __$$i18n._inject2(this);\n      `,\n      linkAfter: [...DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorContent]],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n      content: `\n        _context = this._createContext();\n      `,\n      linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n    });\n\n    // TODO: 按照目前的实现方案，代码的插拔能力太弱了，需要有一些变化。\n    //   Step 1: 增加前置的分析器\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n      content: `\n        _createContext() {\n          const self = this;\n          const context = {\n            get state() {\n              return self.state;\n            },\n            setState(newState, callback) {\n              self.setState(newState, callback);\n            },\n            get dataSourceMap() {\n              return self._dataSourceEngine.dataSourceMap || {};\n            },\n            async reloadDataSource() {\n              await self._dataSourceEngine.reloadDataSource();\n            },\n            get utils() {\n              return self._utils;\n            },\n            get page() {\n              return context;\n            },\n            get component() {\n              return context;\n            },\n            get props() {\n              return self.props;\n            },\n            get constants() {\n              return __$$constants;\n            },\n            i18n: __$$i18n.i18n,\n            i18nFormat: __$$i18n.i18nFormat,\n            getLocale: __$$i18n.getLocale,\n            setLocale(locale) {\n              __$$i18n.setLocale(locale);\n              self.forceUpdate();\n            },${\n              useRef\n                ? `\n                  $(refName) {\n                    return self._refsManager.get(refName);\n                  },\n                  $$(refName) {\n                    return self._refsManager.getAll(refName);\n                  },\n                  get _refsManager() {\n                    if (!self._refsManager) {\n                      self._refsManager = new RefsManager();\n                    }\n                    return self._refsManager;\n                  },\n                `\n                : ''\n            }\n            ...this._methods,\n          };\n\n          return context;\n        }\n      `,\n      linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","/* eslint-disable @typescript-eslint/indent */\n\nimport {\n  IPublicTypeCompositeValue,\n  IPublicTypeJSExpression,\n  InterpretDataSourceConfig,\n  isJSExpression,\n  isJSFunction,\n} from '@alilc/lowcode-types';\nimport changeCase from '../../../utils/changeCaseCompat';\n\nimport { CLASS_DEFINE_CHUNK_NAME, COMMON_CHUNK_NAME } from '../../../const/generator';\nimport { Scope } from '../../../utils/Scope';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IScope,\n} from '../../../types';\n\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { parseExpressionConvertThis2Context } from '../../../utils/expressionParser';\nimport { isContainerSchema } from '../../../utils/schema';\nimport { RaxFrameworkOptions } from '../../project/framework/rax/types/RaxFrameworkOptions';\nimport { RAX_CHUNK_NAME } from './const';\n\nexport interface PluginConfig extends RaxFrameworkOptions {\n  fileType?: string;\n\n  /**\n   * 数据源的 handlers 的映射配置\n   * @deprecated 请使用 datasourceConfig.handlersPackages 来配置\n   */\n  dataSourceHandlersPackageMap?: Record<string, string>;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n    dataSourceHandlersPackageMap:\n      config?.dataSourceHandlersPackageMap || config?.datasourceConfig?.handlersPackages,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const scope = Scope.createRootScope();\n    const dataSourceConfig = isContainerSchema(pre.ir) ? pre.ir.dataSource : null;\n    const dataSourceItems: InterpretDataSourceConfig[] =\n      (dataSourceConfig && dataSourceConfig.list) || [];\n    const dataSourceEngineOptions = { runtimeConfig: true };\n    if (dataSourceItems.length > 0) {\n      const requestHandlersMap: Record<string, IPublicTypeJSExpression> = {};\n\n      dataSourceItems.forEach((ds) => {\n        const dsType = ds.type || 'fetch';\n        if (!(dsType in requestHandlersMap) && dsType !== 'custom') {\n          const handlerFactoryName = `__$$create${changeCase.pascal(dsType)}RequestHandler`;\n\n          requestHandlersMap[dsType] = {\n            type: 'JSExpression',\n            value: `${handlerFactoryName}(${\n              dsType === 'urlParams' ? '__$$getSearchParams()' : ''\n            })`,\n          };\n\n          const handlerFactoryExportName = `create${changeCase.pascal(dsType)}Handler`;\n          const handlerPkgName =\n            cfg.dataSourceHandlersPackageMap?.[dsType] ||\n            `@alilc/lowcode-datasource-${changeCase.kebab(dsType)}-handler`;\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.JSX,\n            name: COMMON_CHUNK_NAME.ExternalDepsImport,\n            content: `\n              import { ${handlerFactoryExportName} as ${handlerFactoryName} } from '${handlerPkgName}';\n            `,\n            linkAfter: [],\n          });\n        }\n      });\n\n      Object.assign(dataSourceEngineOptions, { requestHandlersMap });\n    }\n\n    const datasourceEnginePackageName =\n      cfg.datasourceConfig?.enginePackage || '@alilc/lowcode-datasource-engine';\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: `\n        import { create as __$$createDataSourceEngine } from '${datasourceEnginePackageName}/runtime';\n      `,\n      linkAfter: [],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType!,\n      name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n      content: `\n        _dataSourceConfig = this._defineDataSourceConfig();\n        _dataSourceEngine = __$$createDataSourceEngine(\n          this._dataSourceConfig,\n          this._context,\n          ${generateCompositeType(dataSourceEngineOptions, scope)}\n        );`,\n      linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType!,\n      name: RAX_CHUNK_NAME.ClassDidMountContent,\n      content: `\n        this._dataSourceEngine.reloadDataSource();\n      `,\n      linkAfter: [RAX_CHUNK_NAME.ClassDidMountBegin],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType!,\n      name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n      content: `\n_defineDataSourceConfig() {\n  const __$$context = this._context;\n  return (${generateCompositeType(\n    {\n      ...dataSourceConfig,\n      list: [\n        ...dataSourceItems.map((item) => ({\n          // 数据源引擎默认的 errorHandler 是空的，而且并不会触发组件重新渲染……\n          // 这会导致页面状态不能正常展示，故这里处理下:\n          errorHandler: {\n            type: 'JSFunction',\n            value: `function (err){\n              setTimeout(() => {\n                this.setState({ __refresh: Date.now() + Math.random() });\n              }, 0);\n              throw err;\n            }`,\n          },\n          ...item,\n          isInit:\n            typeof item.isInit === 'boolean' || typeof item.isInit === 'undefined'\n              ? item.isInit ?? true\n              : wrapAsFunction(item.isInit, scope),\n          options: wrapAsFunction(item.options, scope),\n        })),\n      ],\n    },\n    scope,\n    {\n      handlers: {\n        function: (jsFunc) => parseExpressionConvertThis2Context(jsFunc.value, '__$$context'),\n        expression: (jsExpr) => parseExpressionConvertThis2Context(jsExpr.value, '__$$context'),\n      },\n    },\n  )});\n}\n      `,\n      linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n\nfunction wrapAsFunction(value: IPublicTypeCompositeValue, scope: IScope): IPublicTypeCompositeValue {\n  if (isJSExpression(value) || isJSFunction(value)) {\n    return {\n      type: 'JSExpression',\n      value: `function(){ return ((${value.value}))}`,\n    };\n  }\n\n  return {\n    type: 'JSExpression',\n    value: `function(){return((${generateCompositeType(value, scope)}))}`,\n  };\n}\n","import { CLASS_DEFINE_CHUNK_NAME, COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { RAX_CHUNK_NAME } from './const';\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const useRef = !!ir.analyzeResult?.isUsingRef;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      // TODO: 下面这个路径有没有更好的方式来获取？而非写死\n      content: `\n        import __$$projectUtils${useRef ? ', { RefsManager }' : ''} from '../../utils';\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsVar,\n      content: '_utils = this._defineUtils();',\n      linkAfter: [CLASS_DEFINE_CHUNK_NAME.Start],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: CLASS_DEFINE_CHUNK_NAME.InsPrivateMethod,\n\n      content: `\n        _defineUtils() {\n          return {\n            ...__$$projectUtils,\n          };\n        }`,\n      linkAfter: [RAX_CHUNK_NAME.ClassRenderEnd],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {\n  IPublicTypeNodeSchema,\n  IPublicTypeJSExpression,\n  IPublicTypeNpmInfo,\n  IPublicTypeCompositeValue,\n  isJSExpression,\n} from '@alilc/lowcode-types';\n\nimport _ from 'lodash';\nimport changeCase from '../../../utils/changeCaseCompat';\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  CodePiece,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IContainerInfo,\n  PIECE_TYPE,\n  HandlerSet,\n  IScope,\n  NodeGeneratorConfig,\n  NodePlugin,\n  AttrPlugin,\n} from '../../../types';\n\nimport { RAX_CHUNK_NAME } from './const';\nimport { COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport { generateExpression } from '../../../utils/jsExpression';\nimport {\n  createNodeGenerator,\n  generateConditionReactCtrl,\n  generateReactExprInJS,\n} from '../../../utils/nodeToJSX';\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { Scope } from '../../../utils/Scope';\nimport { parseExpressionGetGlobalVariables } from '../../../utils/expressionParser';\nimport { transformThis2Context } from '../../../core/jsx/handlers/transformThis2Context';\nimport { transformJsExpr } from '../../../core/jsx/handlers/transformJsExpression';\n\nexport interface PluginConfig {\n  fileType: string;\n\n  /** 是否要忽略小程序 */\n  ignoreMiniApp?: boolean;\n}\n\n// TODO: componentName 若并非大写字符打头，甚至并非是一个有效的 JS 标识符怎么办？？\n// FIXME: 我想了下，这块应该放到解析阶段就去做掉，对所有 componentName 做 identifier validate，然后对不合法的做统一替换。\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.JSX,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const rootScope = Scope.createRootScope();\n    const { tolerateEvalErrors = true, evalErrorsHandler = '' } = next.contextData;\n\n    // Rax 构建到小程序的时候，不能给组件起起别名，得直接引用，故这里将所有的别名替换掉\n    // 先收集下所有的 alias 的映射\n    const componentsNameAliasMap = new Map<string, string>();\n    next.chunks.forEach((chunk) => {\n      if (isImportAliasDefineChunk(chunk)) {\n        componentsNameAliasMap.set(chunk.ext.aliasName, chunk.ext.originalName);\n      }\n    });\n\n    // 注意：这里其实隐含了一个假设：schema 中的 componentName 应该是一个有效的 JS 标识符，而且是大写字母打头的\n    // FIXME: 为了快速修复临时加的逻辑，需要用 pre-process 的方式替代处理。\n    const mapComponentNameToAliasOrKeepIt = (componentName: string) => componentsNameAliasMap.get(componentName) || componentName;\n\n    // 然后过滤掉所有的别名 chunks\n    next.chunks = next.chunks.filter((chunk) => !isImportAliasDefineChunk(chunk));\n\n    // 如果直接按目前的 React 的方式之间出码 JSX 的话，会有 3 个问题：\n    // 1. 小程序出码的时候，循环变量没法拿到\n    // 2. 小程序出码的时候，很容易出现 Uncaught TypeError: Cannot read property 'avatar' of undefined 这样的异常(如下图的 50 行) -- 因为若直接出码，Rax 构建到小程序的时候会立即计算所有在视图中用到的变量\n    // 3. 通过 this.xxx 能拿到的东西太多了，而且自定义的 methods 可能会无意间破坏 Rax 框架或小程序框架在页面 this 上的东东\n    const customHandlers: HandlerSet<string> = {\n      expression(input: IPublicTypeJSExpression, scope: IScope) {\n        return transformJsExpr(generateExpression(input, scope), scope, {\n          dontWrapEval: !tolerateEvalErrors,\n        });\n      },\n      function(input, scope: IScope) {\n        return transformThis2Context(input.value || 'null', scope);\n      },\n    };\n\n    // 创建代码生成器\n    const commonNodeGenerator = createNodeGenerator({\n      handlers: customHandlers,\n      tagMapping: mapComponentNameToAliasOrKeepIt,\n      nodePlugins: [generateReactExprInJS, generateConditionReactCtrl, generateRaxLoopCtrl],\n      attrPlugins: [generateNodeAttrForRax.bind({ cfg })],\n    });\n\n    // 生成 JSX 代码\n    const jsxContent = commonNodeGenerator(ir, rootScope);\n\n    if (!cfg.ignoreMiniApp) {\n      next.chunks.push({\n        type: ChunkType.STRING,\n        fileType: cfg.fileType,\n        name: COMMON_CHUNK_NAME.ExternalDepsImport,\n        content: \"import { isMiniApp as __$$isMiniApp } from 'universal-env';\",\n        linkAfter: [],\n      });\n    }\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: RAX_CHUNK_NAME.ClassRenderPre,\n      // TODO: setState, dataSourceMap, reloadDataSource, utils, i18n, i18nFormat, getLocale, setLocale 这些在 Rax 的编译模式下不能在视图中直接访问，需要转化成 this.xxx\n      content: `\n        const __$$context = this._context;\n        const { state, setState, dataSourceMap, reloadDataSource, utils, constants, i18n, i18nFormat, getLocale, setLocale } = __$$context;\n      `,\n      linkAfter: [RAX_CHUNK_NAME.ClassRenderBegin],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: RAX_CHUNK_NAME.ClassRenderJSX,\n      content: `return ${jsxContent};`,\n      linkAfter: [RAX_CHUNK_NAME.ClassRenderBegin, RAX_CHUNK_NAME.ClassRenderPre],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.CustomContent,\n      content: [\n        tolerateEvalErrors &&\n          `\n        function __$$eval(expr) {\n          try {\n            return expr();\n          } catch (error) {\n            ${evalErrorsHandler}\n          }\n        }\n\n        function __$$evalArray(expr) {\n          const res = __$$eval(expr);\n          return Array.isArray(res) ? res : [];\n        }\n        `,\n        `\n        function __$$createChildContext(oldContext, ext) {\n          return Object.assign({}, oldContext, ext);\n        }\n      `,\n      ]\n        .filter(Boolean)\n        .join('\\n'),\n      linkAfter: [COMMON_CHUNK_NAME.FileExport],\n    });\n\n    return next;\n\n    function generateRaxLoopCtrl(\n      nodeItem: IPublicTypeNodeSchema,\n      scope: IScope,\n      config?: NodeGeneratorConfig,\n      next?: NodePlugin,\n    ): CodePiece[] {\n      if (nodeItem.loop) {\n        const loopItemName = nodeItem.loopArgs?.[0] || 'item';\n        const loopIndexName = nodeItem.loopArgs?.[1] || 'index';\n        const subScope = scope.createSubScope([loopItemName, loopIndexName]);\n        const pieces: CodePiece[] = next ? next(nodeItem, subScope, config) : [];\n\n        const loopDataExpr = tolerateEvalErrors\n          ? `__$$evalArray(() => (${transformThis2Context(\n              generateCompositeType(nodeItem.loop, scope, { handlers: config?.handlers }),\n              scope,\n            )}))`\n          : `(${transformThis2Context(\n              generateCompositeType(nodeItem.loop, scope, { handlers: config?.handlers }),\n              scope,\n            )})`;\n\n        pieces.unshift({\n          value: `${loopDataExpr}.map((${loopItemName}, ${loopIndexName}) => ((__$$context) => (`,\n          type: PIECE_TYPE.BEFORE,\n        });\n\n        pieces.push({\n          value: `))(__$$createChildContext(__$$context, { ${loopItemName}, ${loopIndexName} })))`,\n          type: PIECE_TYPE.AFTER,\n        });\n\n        return pieces;\n      }\n\n      return next ? next(nodeItem, scope, config) : [];\n    }\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n\nfunction isImportAliasDefineChunk(chunk: ICodeChunk): chunk is ICodeChunk & {\n  ext: {\n    aliasName: string;\n    originalName: string;\n    dependency: IPublicTypeNpmInfo;\n  };\n} {\n  return (\n    chunk.name === COMMON_CHUNK_NAME.ImportAliasDefine &&\n    !!chunk.ext &&\n    typeof chunk.ext.aliasName === 'string' &&\n    typeof chunk.ext.originalName === 'string' &&\n    !!(chunk.ext.dependency as IPublicTypeNpmInfo | null)?.componentName\n  );\n}\n\nfunction generateNodeAttrForRax(\n  this: { cfg: PluginConfig },\n  attrData: { attrName: string; attrValue: IPublicTypeCompositeValue },\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n  next?: AttrPlugin,\n): CodePiece[] {\n  if (!this.cfg.ignoreMiniApp && /^on/.test(attrData.attrName)) {\n    // else: onXxx 的都是事件处理函数需要特殊处理下\n    return generateEventHandlerAttrForRax(attrData.attrName, attrData.attrValue, scope, config);\n  }\n\n  if (attrData.attrName === 'ref') {\n    return [\n      {\n        name: attrData.attrName,\n        value: `__$$context._refsManager.linkRef('${attrData.attrValue}')`,\n        type: PIECE_TYPE.ATTR,\n      },\n    ];\n  }\n\n  return next ? next(attrData, scope, config) : [];\n}\n\nfunction generateEventHandlerAttrForRax(\n  attrName: string,\n  attrValue: IPublicTypeCompositeValue,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  // -- 事件处理函数中 JSExpression 转成 JSFunction 来处理，避免当 JSExpression 处理的时候多包一层 eval 而导致 Rax 转码成小程序的时候出问题\n  const valueExpr = generateCompositeType(\n    isJSExpression(attrValue) ? { type: 'JSFunction', value: attrValue.value } : attrValue,\n    scope,\n    {\n      handlers: config?.handlers,\n    },\n  );\n\n  // 查询当前作用域下的变量\n  const currentScopeVariables = scope.bindings?.getAllBindings() || [];\n  if (currentScopeVariables.length <= 0) {\n    return [\n      {\n        type: PIECE_TYPE.ATTR,\n        name: attrName,\n        value: valueExpr,\n      },\n    ];\n  }\n\n  // 提取出所有的未定义的全局变量\n  const undeclaredVariablesInValueExpr = parseExpressionGetGlobalVariables(valueExpr);\n  const referencedLocalVariables = _.intersection(\n    undeclaredVariablesInValueExpr,\n    currentScopeVariables,\n  );\n  if (referencedLocalVariables.length <= 0) {\n    return [\n      {\n        type: PIECE_TYPE.ATTR,\n        name: attrName,\n        value: valueExpr,\n      },\n    ];\n  }\n\n  const wrappedAttrValueExpr = [\n    '(...__$$args) => {',\n    '  if (__$$isMiniApp) {',\n    '    const __$$event = __$$args[0];',\n    ...referencedLocalVariables.map(\n      (localVar) => `const ${localVar} = __$$event.target.dataset.${localVar};`,\n    ),\n    `    return (${valueExpr}).apply(this, __$$args);`,\n    '  } else {',\n    `    return (${valueExpr}).apply(this, __$$args);`,\n    '  }',\n    '}',\n  ].join('\\n');\n\n  return [\n    ...referencedLocalVariables.map((localVar) => ({\n      type: PIECE_TYPE.ATTR,\n      name: `data-${changeCase.snake(localVar)}`,\n      value: localVar,\n    })),\n    {\n      type: PIECE_TYPE.ATTR,\n      name: attrName,\n      value: wrappedAttrValueExpr,\n    },\n  ];\n}\n","import { COMMON_CHUNK_NAME } from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: `\n        // 注意: 出码引擎注入的临时变量默认都以 \"__$$\" 开头，禁止在搭建的代码中直接访问。\n        // 例外：rax 框架的导出名和各种组件名除外。\n        import { createElement, Component } from 'rax';\n        import { getSearchParams as __$$getSearchParams } from 'rax-app';\n      `,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.eslintignore.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.eslintignore',\n      ext: '',\n      content: 'node_modules/\\nlib/\\ndist/\\nbuild/\\ncoverage/\\ndemo/\\nes/\\n.rax/\\n',\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.eslintrc.js.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.eslintrc',\n      ext: 'js',\n      content:\n        \"const { getESLintConfig } = require('@iceworks/spec');\\n\\n// https://www.npmjs.com/package/@iceworks/spec\\nmodule.exports = {\\n  ...getESLintConfig('rax'),\\n  rules: {\\n    'max-len': ['error', { code: 200 }],\\n    'function-paren-newline': 'off',\\n    '@typescript-eslint/indent': 'off',\\n    'prettier/prettier': 'off',\\n    'no-empty': 'off',\\n    'no-unused-vars': 'off',\\n    '@iceworks/best-practices/recommend-functional-component': 'off',\\n  },\\n};\\n\",\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.gitignore.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.gitignore',\n      ext: '',\n      content:\n        '# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\\n\\n*~\\n*.swp\\n*.log\\n\\n.DS_Store\\n.idea/\\n.temp/\\n\\nbuild/\\ndist/\\nlib/\\ncoverage/\\nnode_modules/\\n.rax/\\n\\ntemplate.yml',\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.prettierignore.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.prettierignore',\n      ext: '',\n      content: 'node_modules/\\nlib/\\ndist/\\nbuild/\\ncoverage/\\ndemo/\\nes/\\n.rax/\\n',\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.prettierrc.js.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.prettierrc',\n      ext: 'js',\n      content:\n        \"const { getPrettierConfig } = require('@iceworks/spec');\\n\\nmodule.exports = getPrettierConfig('rax');\\n\",\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.stylelintignore.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.stylelintignore',\n      ext: '',\n      content: 'node_modules/\\nlib/\\ndist/\\nbuild/\\ncoverage/\\ndemo/\\nes/\\n.rax/\\n',\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/.stylelintrc.js.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: '.stylelintrc',\n      ext: 'js',\n      content:\n        \"const { getStylelintConfig } = require('@iceworks/spec');\\n\\nmodule.exports = getStylelintConfig('rax');\\n\",\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/jsconfig.json.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: 'jsconfig',\n      ext: 'json',\n      content:\n        '{\\n  \"compilerOptions\": {\\n    \"baseUrl\": \".\",\\n    \"jsx\": \"react\",\\n    \"paths\": {\\n      \"@/*\": [\"./src/*\"],\\n      \"rax-app\": [\".rax/index.ts\"]\\n    }\\n  }\\n}\\n',\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/README.md.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: 'README',\n      ext: 'md',\n      content:\n        '# rax-materials-basic-app\\n\\n## Getting Started\\n\\n### `npm run start`\\n\\nRuns the app in development mode.\\n\\nOpen [http://localhost:3333](http://localhost:3333) to view it in the browser.\\n\\nThe page will reload if you make edits.\\n\\n### `npm run build`\\n\\nBuilds the app for production to the `build` folder.\\n',\n    },\n  ];\n}\n","/* eslint-disable max-len */\n/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\n/* -- instead, you should modify \"static-files/rax/tsconfig.json.template\" and run \"npm run template\" */\nimport { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    ['.'],\n    {\n      name: 'tsconfig',\n      ext: 'json',\n      content:\n        '{\\n  \"compileOnSave\": false,\\n  \"buildOnSave\": false,\\n  \"compilerOptions\": {\\n    \"baseUrl\": \".\",\\n    \"outDir\": \"build\",\\n    \"module\": \"esnext\",\\n    \"target\": \"es6\",\\n    \"jsx\": \"preserve\",\\n    \"jsxFactory\": \"createElement\",\\n    \"moduleResolution\": \"node\",\\n    \"allowSyntheticDefaultImports\": true,\\n    \"lib\": [\"es6\", \"dom\"],\\n    \"sourceMap\": true,\\n    \"allowJs\": true,\\n    \"rootDir\": \"./\",\\n    \"forceConsistentCasingInFileNames\": true,\\n    \"noImplicitReturns\": true,\\n    \"noImplicitThis\": true,\\n    \"noImplicitAny\": false,\\n    \"importHelpers\": true,\\n    \"strictNullChecks\": true,\\n    \"suppressImplicitAnyIndexErrors\": true,\\n    \"noUnusedLocals\": true,\\n    \"skipLibCheck\": true,\\n    \"paths\": {\\n      \"@/*\": [\"./src/*\"],\\n      \"rax-app\": [\".rax/index.ts\"]\\n    }\\n  },\\n  \"include\": [\"src\", \".rax\"],\\n  \"exclude\": [\"node_modules\", \"build\", \"public\"]\\n}',\n    },\n  ];\n}\n","/* Note: this file is generated by \"npm run template\", please dont modify this file directly */\nimport { ResultDir } from '@alilc/lowcode-types';\n\nimport { createResultDir } from '../../../../../utils/resultHelper';\nimport { runFileGenerator } from '../../../../../utils/templateHelper';\nimport file0 from './files/.eslintignore';\nimport file1 from './files/.eslintrc.js';\nimport file2 from './files/.gitignore';\nimport file3 from './files/.prettierignore';\nimport file4 from './files/.prettierrc.js';\nimport file5 from './files/.stylelintignore';\nimport file6 from './files/.stylelintrc.js';\nimport file7 from './files/jsconfig.json';\nimport file8 from './files/README.md';\nimport file9 from './files/tsconfig.json';\n\nexport function generateStaticFiles(root = createResultDir('.')): ResultDir {\n  runFileGenerator(root, file0);\n  runFileGenerator(root, file1);\n  runFileGenerator(root, file2);\n  runFileGenerator(root, file3);\n  runFileGenerator(root, file4);\n  runFileGenerator(root, file5);\n  runFileGenerator(root, file6);\n  runFileGenerator(root, file7);\n  runFileGenerator(root, file8);\n  runFileGenerator(root, file9);\n  return root;\n}\n","import { ResultDir } from '@alilc/lowcode-types';\nimport { IProjectTemplate } from '../../../../../types';\nimport { generateStaticFiles } from './static-files';\n\nconst raxAppTemplate: IProjectTemplate = {\n  slots: {\n    components: {\n      path: ['src', 'components'],\n    },\n    pages: {\n      path: ['src', 'pages'],\n    },\n    router: {\n      path: ['src'],\n      fileName: 'router',\n    },\n    entry: {\n      path: ['src'],\n      fileName: 'app',\n    },\n    appConfig: {\n      path: ['src'],\n      fileName: 'app',\n    },\n    buildConfig: {\n      path: [],\n      fileName: 'build',\n    },\n    constants: {\n      path: ['src'],\n      fileName: 'constants',\n    },\n    utils: {\n      path: ['src'],\n      fileName: 'utils',\n    },\n    i18n: {\n      path: ['src'],\n      fileName: 'i18n',\n    },\n    globalStyle: {\n      path: ['src'],\n      fileName: 'global',\n    },\n    htmlEntry: {\n      path: ['src', 'document'],\n      fileName: 'index',\n    },\n    packageJSON: {\n      path: [],\n      fileName: 'package',\n    },\n  },\n\n  async generateTemplate(): Promise<ResultDir> {\n    return generateStaticFiles();\n  },\n};\n\nexport default raxAppTemplate;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../../../types';\nimport { RaxFrameworkOptions } from '../types/RaxFrameworkOptions';\n\nconst pluginFactory: BuilderComponentPluginFactory<RaxFrameworkOptions> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.ExternalDepsImport,\n      content: `\nimport { runApp } from 'rax-app';\n\nimport './global.${cfg?.globalStylesFileType || 'css'}';\n`,\n      linkAfter: [],\n    });\n\n    // 应用配置\n    const appConfig = cfg?.appConfig || {};\n    Object.assign(appConfig, {\n      // 路由配置\n      router: {\n        mode: 'hash',\n        ...appConfig.router,\n      },\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JS,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: `\nrunApp(${JSON.stringify(appConfig, null, 2)});\n`,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.ImportAliasDefine,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileUtilDefine,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import changeCase from '../../../../../utils/changeCaseCompat';\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IParseResult,\n} from '../../../../../types';\nimport { ensureValidClassName } from '../../../../../utils/validate';\nimport { RaxFrameworkOptions } from '../types/RaxFrameworkOptions';\n\nconst pluginFactory: BuilderComponentPluginFactory<RaxFrameworkOptions> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IParseResult;\n\n    const routes = ir.globalRouter?.routes?.map((route) => ({\n      path: route.path,\n      source: `pages/${ensureValidClassName(changeCase.pascalCase(route.fileName))}/index`,\n    })) || [{ path: '/', source: 'pages/Home/index' }];\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSON,\n      name: COMMON_CHUNK_NAME.CustomContent,\n      content: `\n{\n  \"routes\": ${JSON.stringify(routes, null, 2)},\n  \"window\": {\n    \"title\": ${JSON.stringify(\n      cfg?.title || ir.project?.meta?.title || ir.project?.meta?.name || '',\n    )}\n  }\n}\n      `,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IParseResult,\n} from '../../../../../types';\nimport type { RaxFrameworkOptions } from '../types/RaxFrameworkOptions';\n\nconst pluginFactory: BuilderComponentPluginFactory<RaxFrameworkOptions> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IParseResult;\n\n    const miniAppBuildType =\n      cfg?.buildConfig?.miniAppBuildType || ir.project?.config?.miniAppBuildType;\n    const targets = cfg?.targets || ['web'];\n\n    const buildCfg = {\n      inlineStyle: false,\n      plugins: [],\n      targets,\n      miniapp: miniAppBuildType\n        ? {\n            buildType: miniAppBuildType,\n            ...cfg?.buildConfig?.miniapp,\n          }\n        : cfg?.buildConfig?.miniapp,\n      ...cfg?.buildConfig,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSON,\n      name: COMMON_CHUNK_NAME.CustomContent,\n      content: `${JSON.stringify(buildCfg, null, 2)}\\n`,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\nimport { RaxFrameworkOptions } from '../types/RaxFrameworkOptions';\n\n/**\n * 这种方式已经不推荐使用了\n */\nconst pluginFactory: BuilderComponentPluginFactory<RaxFrameworkOptions> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.CustomContent,\n      content: `\nimport { createElement } from 'rax';\nimport { Root, Style, Script } from 'rax-document';\n\nfunction Document() {\n  return (\n    <html>\n      <head>\n        <meta charset=\"utf-8\" />\n        <meta\n          name=\"viewport\"\n          content=\"width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cover\"\n        />\n        <title>${cfg?.title || ir?.meta?.name || 'Rax App'}</title>\n        <Style />\n      </head>\n      <body>\n        {/* root container */}\n        <Root />\n        <Script />\n      </body>\n    </html>\n  );\n}\n\nexport default Document;\n`,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\n\nexport interface GlobalStylePluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<GlobalStylePluginConfig> = (\n  config?: Partial<GlobalStylePluginConfig>,\n) => {\n  const cfg: GlobalStylePluginConfig = {\n    fileType: FileType.SCSS,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.StyleDepsImport,\n      content: '',\n      linkAfter: [],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: `\nbody {\n  -webkit-font-smoothing: antialiased;\n}\n`,\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: COMMON_CHUNK_NAME.StyleCssContent,\n      content: ir.css || '',\n      linkAfter: [COMMON_CHUNK_NAME.StyleDepsImport],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import semver from 'semver';\n\nexport function calcCompatibleVersion(v1: string | undefined | null, v2: string | undefined | null): string {\n  if (!v1 && !v2) {\n    return '*';\n  }\n\n  if (!v1 || v1 === '*') {\n    return v2 || '*';\n  }\n\n  if (!v2 || v2 === '*') {\n    return v1;\n  }\n\n  if (v1 === v2) {\n    return v1;\n  }\n\n  if (!semver.intersects(v1, v2, { loose: true })) {\n    throw new Error(`no compatible versions for \"${v1}\" and \"${v2}\"`);\n  }\n\n  if (semver.subset(v1, v2, { loose: true })) {\n    return v1;\n  }\n\n  return v2;\n}\n","import { IPublicTypeNpmInfo, PackageJSON } from '@alilc/lowcode-types';\nimport { COMMON_CHUNK_NAME } from '../../../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\nimport { isNpmInfo } from '../../../../../utils/schema';\nimport { getErrorMessage } from '../../../../../utils/errors';\nimport { calcCompatibleVersion } from '../../../../../utils/version';\nimport { RaxFrameworkOptions } from '../types/RaxFrameworkOptions';\nimport { buildDataSourceDependencies } from '../../../../../utils/dataSource';\n\nconst pluginFactory: BuilderComponentPluginFactory<RaxFrameworkOptions> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    const npmDeps = getNpmDependencies(ir);\n\n    const packageJson: PackageJSON = {\n      name: cfg?.packageName || 'rax-demo-app',\n      private: true,\n      version: cfg?.packageVersion || '1.0.0',\n      scripts: {\n        start: 'rax-app start',\n        build: 'rax-app build',\n        eslint: 'eslint --ext .js,.jsx ./',\n        stylelint: 'stylelint \"**/*.{css,scss,less}\"',\n        prettier: 'prettier **/* --write',\n        lint: 'npm run eslint && npm run stylelint',\n      },\n      dependencies: {\n        // 数据源相关的依赖:\n        ...buildDataSourceDependencies(ir, cfg?.datasourceConfig),\n\n        // 环境判断\n        'universal-env': '^3.2.0',\n\n        // 国际化相关依赖:\n        'intl-messageformat': '^9.3.6',\n\n        // 基础库\n        rax: '^1.1.0',\n        'rax-document': '^0.1.6',\n\n        // 其他组件库\n        ...npmDeps.reduce<Record<string, string>>(\n          (acc, npm) => ({\n            ...acc,\n            [npm.package]: npm.version || '*',\n          }),\n          {},\n        ),\n      },\n      devDependencies: {\n        '@iceworks/spec': '^1.0.0',\n        'rax-app': '^3.0.0',\n        eslint: '^6.8.0',\n        prettier: '^2.1.2',\n        stylelint: '^13.7.2',\n      },\n    };\n\n    next.chunks.push({\n      type: ChunkType.JSON,\n      fileType: FileType.JSON,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: packageJson,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n\nfunction getNpmDependencies(project: IProjectInfo): IPublicTypeNpmInfo[] {\n  const npmDeps: IPublicTypeNpmInfo[] = [];\n  const npmNameToPkgMap = new Map<string, IPublicTypeNpmInfo>();\n\n  const allDeps = project.packages;\n\n  allDeps.forEach((dep) => {\n    if (!isNpmInfo(dep)) {\n      return;\n    }\n\n    const existing = npmNameToPkgMap.get(dep.package);\n    if (!existing) {\n      npmNameToPkgMap.set(dep.package, dep);\n      npmDeps.push(dep);\n      return;\n    }\n\n    if (existing.version !== dep.version) {\n      try {\n        npmNameToPkgMap.set(dep.package, {\n          ...existing,\n          version: calcCompatibleVersion(existing.version, dep.version),\n        });\n      } catch (e) {\n        throw new Error(\n          `Cannot find compatible version for ${dep.package}. Detail: ${getErrorMessage(e)}`,\n        );\n      }\n    }\n  });\n\n  return npmDeps;\n}\n","import template from './template';\nimport entry from './plugins/entry';\nimport appConfig from './plugins/appConfig';\nimport buildConfig from './plugins/buildConfig';\nimport entryDocument from './plugins/entryDocument';\nimport globalStyle from './plugins/globalStyle';\nimport packageJSON from './plugins/packageJSON';\n\nexport default {\n  template,\n  plugins: {\n    appConfig,\n    buildConfig,\n    entry,\n    entryDocument,\n    globalStyle,\n    packageJSON,\n  },\n};\n","import { IProjectBuilder, IProjectBuilderOptions } from '../types';\n\nimport { createProjectBuilder } from '../generator/ProjectBuilder';\n\nimport esModule from '../plugins/common/esmodule';\nimport containerClass from '../plugins/component/rax/containerClass';\nimport containerLifeCycles from '../plugins/component/rax/containerLifeCycle';\nimport containerMethods from '../plugins/component/rax/containerMethods';\nimport containerInitState from '../plugins/component/rax/containerInitState';\nimport containerInjectContext from '../plugins/component/rax/containerInjectContext';\nimport containerInjectDataSourceEngine from '../plugins/component/rax/containerInjectDataSourceEngine';\nimport containerInjectUtils from '../plugins/component/rax/containerInjectUtils';\nimport jsx from '../plugins/component/rax/jsx';\nimport commonDeps from '../plugins/component/rax/commonDeps';\nimport css from '../plugins/component/style/css';\nimport constants from '../plugins/project/constants';\nimport i18n from '../plugins/project/i18n';\nimport utils from '../plugins/project/utils';\n\nimport raxApp from '../plugins/project/framework/rax';\n\nimport { prettier } from '../postprocessor';\nimport { RaxFrameworkOptions } from '../plugins/project/framework/rax/types/RaxFrameworkOptions';\n\nexport interface RaxProjectBuilderOptions extends IProjectBuilderOptions, RaxFrameworkOptions {}\n\nexport default function createRaxProjectBuilder(\n  options?: RaxProjectBuilderOptions,\n): IProjectBuilder {\n  return createProjectBuilder({\n    inStrictMode: options?.inStrictMode,\n    extraContextData: { ...options },\n    template: raxApp.template,\n    plugins: {\n      components: [\n        commonDeps(),\n        esModule({ fileType: 'jsx', useAliasName: false }),\n        containerClass(),\n        containerInitState(),\n        containerMethods(),\n        containerInjectContext(),\n        containerInjectDataSourceEngine(options),\n        containerInjectUtils(),\n        containerLifeCycles(),\n        jsx(),\n        css(),\n      ],\n      pages: [\n        commonDeps(),\n        esModule({ fileType: 'jsx' }),\n        containerClass(),\n        containerInitState(),\n        containerMethods(),\n        containerInjectContext(),\n        containerInjectDataSourceEngine(options),\n        containerInjectUtils(),\n        containerLifeCycles(),\n        jsx(),\n        css(),\n      ],\n      appConfig: [raxApp.plugins.appConfig(options)],\n      buildConfig: [raxApp.plugins.buildConfig(options)],\n      entry: [raxApp.plugins.entry(options)],\n      constants: [constants()],\n      utils: [esModule(), utils('rax')],\n      i18n: [i18n()],\n      globalStyle: [\n        raxApp.plugins.globalStyle({ fileType: options?.globalStylesFileType || 'css' }),\n      ],\n      htmlEntry: [raxApp.plugins.entryDocument(options)],\n      packageJSON: [raxApp.plugins.packageJSON(options)],\n    },\n    postProcessors: [prettier()],\n    customizeBuilderOptions: options?.customizeBuilderOptions,\n  });\n}\n\nexport const plugins = {\n  containerClass,\n  containerLifeCycles,\n  containerMethods,\n  containerInitState,\n  containerInjectContext,\n  containerInjectDataSourceEngine,\n  containerInjectUtils,\n  jsx,\n  commonDeps,\n  raxApp,\n};\n","// 生成 Vue 3 组件\n// import changeCase from 'change-case';\nimport {\n  TEMPLATE_DEFINE_CHUNK_NAME,\n  VUE_DEFAULT_LINK_AFTER,\n} from '../../../const/generator';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\n// import { ensureValidClassName } from '../../../utils/validate';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    // const ir = next.ir as IContainerInfo;\n\n    // 将模块名转换成 PascalCase 的格式，并添加特定后缀，防止命名冲突\n    // const componentName = ensureValidClassName(\n    //   `${changeCase.pascalCase(ir.moduleName)}$$${ir.containerType}`,\n    // );\n\n    // template 开始\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart,\n      content: '<template>',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart]\n      ],\n    });\n\n    // 页面结构\n    // next.chunks.push({\n    //   type: ChunkType.STRING,\n    //   fileType: FileType.VUE,\n    //   name: TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom,\n    //   content: `<div>${componentName} Component</div>`, // 示例结构\n    //   linkAfter: [\n    //     ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom]\n    //   ],\n    // });\n\n    // template 结束\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.TemplateEnd,\n      content: '</template>',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.TemplateEnd]\n      ],\n    });\n\n    // script 开始\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart,\n      content: '<script setup lang=\"ts\">',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart]\n      ],\n    });\n\n    // 引入外部依赖(写在vueCommonDeps.ts文件)\n    // next.chunks.push({\n    //   type: ChunkType.STRING,\n    //   fileType: FileType.VUE,\n    //   name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n    //   content: \"import { ref, onMounted } from 'vue';\",\n    //   linkAfter: [\n    //     ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart]\n    //   ],\n    // });\n\n    // 数据定义\n    // next.chunks.push({\n    //   type: ChunkType.STRING,\n    //   fileType: FileType.VUE,\n    //   name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n    //   content: '',\n    //   linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport],\n    // });\n\n    // mounted 生命周期开始\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart,\n      content: 'onMounted(async () => {',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart]\n      ],\n    });\n\n    // mounted 生命周期内容\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent,\n      content: '',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent]\n      ],\n    });\n\n    // mounted 生命周期结束\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedEnd,\n      content: '});',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.OnMountedEnd]\n      ],\n    });\n\n    // onUnMounted 生命周期开始\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.UnMountedStart,\n      content: 'onUnmounted(() => {',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.UnMountedStart]\n      ],\n    });\n\n    // // onUnMounted 生命周期内容\n    // next.chunks.push({\n    //   type: ChunkType.STRING,\n    //   fileType: FileType.VUE,\n    //   name: TEMPLATE_DEFINE_CHUNK_NAME.UnMountedContent,\n    //   content: '',\n    //   linkAfter: [\n    //     ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.UnMountedContent]\n    //   ],\n    // });\n\n    // onUnMounted 生命周期结束\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd,\n      content: '});',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd]\n      ],\n    });\n\n    // script 结束\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd,\n      content: '</script>',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd]\n      ],\n    });\n\n    // CSS 样式开始\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.CssStyleStart,\n      content: '<style scoped lang=\"scss\">',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.CssStyleStart]\n      ],\n    });\n\n    // 示例 CSS 样式\n    // next.chunks.push({\n    //   type: ChunkType.STRING,\n    //   fileType: FileType.VUE,\n    //   name: TEMPLATE_DEFINE_CHUNK_NAME.CssStyleImport,\n    //   content: '', // 示例样式\n    //   linkAfter: [\n    //     ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.CssStyleImport]\n    //   ],\n    // });\n\n    // CSS 样式结束\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.CssStyleEnd,\n      content: '</style>',\n      linkAfter: [\n        ...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.CssStyleEnd]\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import _ from 'lodash';\nimport {\n  IScope,\n  CodePiece,\n  NodeGenerator,\n  NodeGeneratorConfig,\n  NodePlugin,\n  PIECE_TYPE,\n  CodeGeneratorError,\n  AttrData,\n} from '../types';\nimport { generateCompositeType } from './compositeType';\nimport {\n  IPublicTypeNodeSchema,\n  isNodeSchema,\n  IPublicTypeNodeDataType,\n  IPublicTypeCompositeValue,\n  isJSSlot,\n  IPublicTypeJSSlot,\n} from '@alilc/lowcode-types';\nimport { isValidIdentifier, isValidVueDirective } from './validate';\nimport { executeFunctionStack } from './aopHelper';\nimport { encodeJsxStringNode } from './encodeJsxAttrString';\nimport { getStaticExprValue } from './common';\nimport { array } from 'fp-ts';\nimport { lineToUppercase } from './changeCase';\n\nconst FILE_PREFIX_CONFIG: Record<string, string> = {\n  uploadPrefix: '/upload/',\n  tempPrefix: '/temp/',\n  backupPrefix: '/backup/',\n};\n\nconst API_BASE_LOOKUP_EXPR =\n  \"(typeof $lowcodeApiBaseUrl !== 'undefined' && $lowcodeApiBaseUrl) || '/api'\";\n\nfunction replaceStaticFilePrefix(input: string): string {\n  if (!input) {\n    return input;\n  }\n\n  return Object.values(FILE_PREFIX_CONFIG).reduce((acc, prefix) => {\n    const staticPath = `/source/api${prefix}`;\n    const pattern = new RegExp(`(['\"])${_.escapeRegExp(staticPath)}\\\\1`, 'g');\n    return acc.replace(\n      pattern,\n      (_match, quote: string) => `((${API_BASE_LOOKUP_EXPR}) + ${quote}${prefix}${quote})`,\n    );\n  }, input);\n}\n\nfunction normalizeVueTagName(tagName?: string | null): string {\n  if (!tagName) {\n    return '';\n  }\n\n  // Explicitly handle common sub-components to ensure consistency\n  if (tagName === 'SplitButton.Item') return 'SplitButton-Item';\n  if (tagName === 'Menu.Item') return 'Menu-Item';\n  if (tagName === 'Breadcrumb.Item') return 'Breadcrumb-Item';\n  if (tagName === 'Form.Item') return 'Form-Item';\n\n  // Vue SFC templates cannot contain React style sub-component names like SplitButton.Item\n  return tagName.replace(/\\.+/g, '-');\n}\n\n// 合并两个 NodeGeneratorConfig 对象\n// 它会合并处理程序、标签映射、属性插件和节点插件，并返回一个新的配置对象\n// 如果 cfg1 和 cfg2 都有 handlers、tagMapping、attrPlugins 或 nodePlugins，则将它们合并到一起\nfunction mergeNodeGeneratorConfig(\n  cfg1: NodeGeneratorConfig,\n  cfg2: NodeGeneratorConfig = {},\n): NodeGeneratorConfig {\n  const resCfg: NodeGeneratorConfig = {};\n  if (cfg1.handlers || cfg2.handlers) {\n    resCfg.handlers = {\n      ...(cfg1.handlers || {}),\n      ...(cfg2.handlers || {}),\n    };\n  }\n\n  if (cfg1.tagMapping || cfg2.tagMapping) {\n    resCfg.tagMapping = cfg2.tagMapping || cfg1.tagMapping;\n  }\n\n  if (cfg1.attrPlugins || cfg2.attrPlugins) {\n    resCfg.attrPlugins = [];\n    resCfg.attrPlugins.push(...(cfg2.attrPlugins || []));\n    resCfg.attrPlugins.push(...(cfg1.attrPlugins || []));\n  }\n\n  if (cfg1.nodePlugins || cfg2.nodePlugins) {\n    resCfg.nodePlugins = [];\n    resCfg.nodePlugins.push(...(cfg2.nodePlugins || []));\n    resCfg.nodePlugins.push(...(cfg1.nodePlugins || []));\n  }\n\n  return resCfg;\n}\n\n// 检查字符串 v 是否是一个纯字符串\nexport function isPureString(v: string) {\n  // FIXME: 目前的方式不够严谨\n  return (v[0] === \"'\" && v[v.length - 1] === \"'\") || (v[0] === '\"' && v[v.length - 1] === '\"');\n}\n\n// 生成属性值。\n// 传入的 attrData 包含属性名和属性值，scope 用于存储上下文信息，config 包含了节点生成器的配置信息。\n// 该函数返回一个 CodePiece 数组，其中包含属性名和处理后的属性值。\nfunction generateAttrValue(\n  attrData: { attrName: string; attrValue: IPublicTypeCompositeValue },\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const valueStr = generateCompositeType(attrData.attrValue, scope, {\n    handlers: config?.handlers,\n    nodeGenerator: config?.self,\n  });\n  return [\n    {\n      type: PIECE_TYPE.ATTR,\n      name: attrData.attrName,\n      value: valueStr,\n    },\n  ];\n}\n\n// 生成 Vue 的属性\nfunction generateAttr(\n  attrName: string,\n  attrValue: IPublicTypeCompositeValue,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  let pieces: CodePiece[] = [];\n  // pieces = generateAttrValue({ attrName, attrValue }, scope, config);\n\n  if (config?.attrPlugins) {\n    pieces = executeFunctionStack<AttrData, CodePiece[], NodeGeneratorConfig>(\n      { attrName, attrValue },\n      scope,\n      config.attrPlugins,\n      generateAttrValue,\n      config,\n    );\n  } else {\n    pieces = generateAttrValue({ attrName, attrValue }, scope, config);\n  }\n\n  pieces = pieces\n    .map((p) => {\n      if (p.name === '__events') {\n        return null;\n      }\n\n      let newValue: string = '';\n      let pName: string = '';\n\n      //处理点击事件\n      if (p.name === 'onClick' || p.name === 'onMouseUp') {\n        pName = `@${p.name}`;\n        newValue = `\"${p.value}\"`;\n      } else if (p.name === 'dataList' || p.name === 'itemArray') {\n        //处理数据源绑定\n        let data;\n        try {\n          data = JSON.parse(p.value);\n        } catch (error) {\n          newValue = `\"${p.value\n            .replace(/[\\n\\r]+/g, '')\n            .replace(/^state\\['(.*?)'\\]\\?\\./, '$1?.')}\"`;\n          pName = `:${p.name}`;\n        }\n        if (data !== undefined) {\n          newValue = `\"${JSON.stringify(data)\n            .replace(/\"(\\w+)\":/g, '$1:')\n            .replace(/:\"([^\"]*)\"/g, \":'$1'\")}\"`;\n          pName = `:${p.name}`;\n        }\n      } else if (p.name === 'itemList') {\n        const trimmed = p.value.replace(/[\\n\\r]+/g, ' ').trim();\n        const jsonReady = trimmed\n          .replace(/([{,]\\s*)([a-zA-Z0-9_]+)\\s*:/g, '$1\"$2\":')\n          .replace(/'([^']*)'/g, (_, v: string) => `\"${v.replace(/\"/g, '\\\\\"')}\"`);\n\n        let data;\n        try {\n          data = JSON.parse(jsonReady);\n        } catch (error) {\n          data = undefined;\n        }\n\n        if (data !== undefined) {\n          const formatted = JSON.stringify(data)\n            .replace(/\"(\\w+)\"\\s*:/g, '$1: ')\n            .replace(/\\\\\"/g, '\"')\n            .replace(/'/g, \"\\\\'\");\n          newValue = `'${formatted}'`;\n        } else {\n          const fallback = trimmed\n            .replace(/'([^']*)'/g, (_, v: string) => `\"${v.replace(/\"/g, '\\\\\"')}\"`)\n            .replace(/\\\\\"/g, '\"')\n            .replace(/'/g, \"\\\\'\");\n          newValue = `'${fallback}'`;\n        }\n        pName = `:${p.name}`;\n      } else if (p.value && isPureString(p.value)) {\n        //处理字符串\n        const content = getStaticExprValue<string>(p.value);\n        newValue = JSON.stringify(encodeJsxStringNode(content));\n        pName = `${p.name}`;\n      } else {\n        newValue = `\"${p.value}\"`;\n        pName = `:${p.name}`;\n      }\n\n      const finalValue = lineToUppercase(replaceStaticFilePrefix(newValue));\n      return {\n        value: `${pName}=${finalValue}`,\n        type: PIECE_TYPE.ATTR,\n      };\n    })\n    .filter((p) => p !== null) as CodePiece[];\n\n  return pieces;\n}\n\n// 生成节点的所有属性部分，返回代码片段数组\nfunction generateAttrs(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const { props } = nodeItem;\n\n  let pieces: CodePiece[] = [];\n\n  if (props) {\n    if (!Array.isArray(props)) {\n      Object.keys(props).forEach((propName: string) => {\n        if (isValidIdentifier(propName) || isValidVueDirective(propName)) {\n          pieces = pieces.concat(\n            generateAttr(propName, props[propName] as IPublicTypeCompositeValue, scope, config),\n          );\n        }\n      });\n    } else {\n      props.forEach((prop) => {\n        if (prop.name && isValidIdentifier(prop.name) && !prop.spread) {\n          pieces = pieces.concat(generateAttr(prop.name, prop.value, scope, config));\n        }\n\n        // TODO: 处理 spread 场景（<Xxx {...(something)}/>)\n        // 这种在 schema 里面怎么描述\n      });\n    }\n  }\n\n  return pieces;\n}\n\nfunction buildVueSlotTemplate(\n  slotName: string,\n  slot: IPublicTypeJSSlot,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): string {\n  const params = (slot.params || []).filter(Boolean);\n  const slotScope = params.length > 0 ? scope.createSubScope(params) : scope;\n\n  const slotChildren = slot.value && config?.self ? config.self(slot.value as any, slotScope) : '';\n  const slotArgs = params.length > 0 ? `=\"{ ${params.join(', ')} }\"` : '';\n\n  return `<template #${slotName}${slotArgs}>${slotChildren}</template>`;\n}\n\nfunction splitAttrsAndSlots(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): { attrPieces: CodePiece[]; slotTemplates: string } {\n  const { props } = nodeItem;\n\n  let attrPieces: CodePiece[] = [];\n  const slotTemplates: string[] = [];\n\n  if (props) {\n    if (!Array.isArray(props)) {\n      Object.keys(props).forEach((propName: string) => {\n        if (!(isValidIdentifier(propName) || isValidVueDirective(propName))) {\n          return;\n        }\n\n        const propValue = props[propName] as IPublicTypeCompositeValue;\n        if (isJSSlot(propValue)) {\n          slotTemplates.push(buildVueSlotTemplate(propName, propValue, scope, config));\n          return;\n        }\n\n        attrPieces = attrPieces.concat(generateAttr(propName, propValue, scope, config));\n      });\n    } else {\n      props.forEach((prop) => {\n        if (!prop.name || !isValidIdentifier(prop.name) || prop.spread) {\n          return;\n        }\n\n        if (isJSSlot(prop.value)) {\n          slotTemplates.push(buildVueSlotTemplate(prop.name, prop.value, scope, config));\n          return;\n        }\n\n        attrPieces = attrPieces.concat(generateAttr(prop.name, prop.value, scope, config));\n      });\n    }\n  }\n\n  return {\n    attrPieces,\n    slotTemplates: slotTemplates.join(''),\n  };\n}\n\n// 生成 v-if 逻辑\nfunction generateConditionVueCtrl(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n  next?: NodePlugin,\n): CodePiece[] {\n  const pieces: CodePiece[] = next ? next(nodeItem, scope, config) : [];\n\n  if (nodeItem.condition != null && nodeItem.condition !== true) {\n    let value = generateCompositeType(nodeItem.condition, scope, {\n      handlers: config?.handlers,\n    });\n\n    value = value.replace(/[{}]/g, '');\n\n    pieces.unshift({\n      value: `v-if=\"${value}\"`,\n      type: PIECE_TYPE.ATTR,\n    });\n  }\n\n  return pieces;\n}\n\n// 生成 v-for 逻辑\nfunction generateVueLoopCtrl(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n  next?: NodePlugin,\n): CodePiece[] {\n  if (nodeItem.loop) {\n    const loopItemName = nodeItem.loopArgs?.[0] || 'item';\n    const loopIndexName = nodeItem.loopArgs?.[1] || 'index';\n\n    let loopDataExpr = generateCompositeType(nodeItem.loop, scope, {\n      handlers: config?.handlers,\n    });\n\n    // 将 v-for 表达式中的双引号替换为单引号\n    loopDataExpr = loopDataExpr.replace(/\"/g, \"'\");\n\n    const pieces: CodePiece[] = next ? next(nodeItem, scope, config) : [];\n    pieces.unshift({\n      value: `v-for=\"(${loopItemName}, ${loopIndexName}) in ${loopDataExpr}\"`,\n      type: PIECE_TYPE.ATTR,\n    });\n\n    return pieces;\n  }\n\n  return next ? next(nodeItem, scope, config) : [];\n}\n\n// generateBasicNode 用于生成节点的基本结构。它会生成包含标签名称的 CodePiece 并返回该数组。\nfunction generateBasicNode(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const pieces: CodePiece[] = [];\n  let tagName = (config?.tagMapping || _.identity)(nodeItem.componentName);\n\n  // Div标签转成div标签\n  tagName = tagName === 'Div' ? 'div' : tagName;\n  tagName = normalizeVueTagName(tagName);\n  pieces.push({\n    value: tagName || '', // FIXME: type detection error\n    type: PIECE_TYPE.TAG,\n  });\n\n  return pieces;\n}\n\n// generateSimpleNode 生成简单的节点结构，包括基本部分（标签）、属性部分和子节点部分。\n// 子节点通过调用 config.self 来递归生成。\nfunction generateSimpleNode(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): CodePiece[] {\n  const basicParts = generateBasicNode(nodeItem, scope, config) || [];\n  const { attrPieces: attrParts, slotTemplates } = splitAttrsAndSlots(nodeItem, scope, config);\n  const childrenParts: CodePiece[] = [];\n  if ((nodeItem.children || slotTemplates) && config?.self) {\n    const childrenStr = nodeItem.children ? config.self(nodeItem.children, scope) : '';\n\n    childrenParts.push({\n      type: PIECE_TYPE.CHILDREN,\n      value: `${childrenStr}${slotTemplates}`,\n    });\n  }\n\n  return [...basicParts, ...attrParts, ...childrenParts];\n}\n\n// 将生成的代码片段连接成一个完整的 template 节点。\n// 它检查代码片段是否包含单个标签名称，并将属性、子节点、before 和 after 片段整合成一个 JSX 字符串。\n\nfunction linkPieces(pieces: CodePiece[]): string {\n  const tagsPieces = pieces.filter((p) => p.type === PIECE_TYPE.TAG);\n  if (tagsPieces.length !== 1) {\n    throw new CodeGeneratorError('Only one tag definition required', tagsPieces);\n  }\n  const tagName = tagsPieces[0].value;\n\n  const beforeParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.BEFORE)\n    .map((p) => p.value)\n    .join('');\n\n  const afterParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.AFTER)\n    .map((p) => p.value)\n    .join('');\n\n  const childrenParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.CHILDREN)\n    .map((p) => p.value)\n    .join('');\n\n  let attrsParts = pieces\n    .filter((p) => p.type === PIECE_TYPE.ATTR)\n    .map((p) => p.value)\n    .join(' ');\n\n  attrsParts = attrsParts ? ` ${attrsParts}` : '';\n\n  if (childrenParts) {\n    return `${beforeParts}<${tagName}${attrsParts}>${childrenParts}</${tagName}>${afterParts}`;\n  }\n\n  return `${beforeParts}<${tagName}${attrsParts} />${afterParts}`;\n}\n\n// generateNodeSchema 是该模块的核心部分，用于将节点生成 template 代码。\n// 它可以应用 nodePlugins 来生成额外的代码片段，并调用 generateSimpleNode 生成节点的基本结构。\nfunction generateNodeSchema(\n  nodeItem: IPublicTypeNodeSchema,\n  scope: IScope,\n  config?: NodeGeneratorConfig,\n): string {\n  const pieces: CodePiece[] = [];\n  if (config?.nodePlugins) {\n    const res = executeFunctionStack<IPublicTypeNodeSchema, CodePiece[], NodeGeneratorConfig>(\n      nodeItem,\n      scope,\n      config.nodePlugins,\n      generateSimpleNode,\n      config,\n    );\n    pieces.push(...res);\n  } else {\n    pieces.push(...generateSimpleNode(nodeItem, scope, config));\n  }\n\n  return linkPieces(pieces);\n}\n\nconst handleChildren = (v: string[]) => v.join('');\n\n// createNodeGenerator 是生成器的主函数，它会根据传入的配置 cfg 生成节点代码。\n// 如果 nodeItem 是数组，生成器会递归生成每个节点的代码，并将它们合并成一个完整的字符串。\nexport function createNodeGenerator(cfg: NodeGeneratorConfig = {}): NodeGenerator<string> {\n  const generateNode = (nodeItem: IPublicTypeNodeDataType, scope: IScope): string => {\n    const ignoreNode = ['Navigation'];\n    if (_.isArray(nodeItem)) {\n      const resList = nodeItem.map((n) => generateNode(n, scope));\n      return handleChildren(resList);\n    }\n\n    if (isNodeSchema(nodeItem)) {\n      //忽略指定节点生成\n      // 获取标签名\n      const tagName = (cfg?.tagMapping || _.identity)(nodeItem.componentName) as string;\n\n      if (ignoreNode.includes(tagName)) {\n        return '';\n      }\n      return generateNodeSchema(nodeItem, scope, {\n        ...cfg,\n        self: generateNode,\n      });\n    }\n\n    const valueStr = generateCompositeType(nodeItem, scope, {\n      handlers: cfg.handlers,\n      nodeGenerator: generateNode,\n    });\n\n    if (isPureString(valueStr)) {\n      // Vue 模板中的插值表达式使用 {{ }}\n      // return `{{${encodeJsxStringNode(getStaticExprValue<string>(valueStr))}}}`;\n      return `${encodeJsxStringNode(getStaticExprValue<string>(valueStr))}`;\n    }\n\n    // 处理 Vue 模板中的动态绑定，用 v-bind 或 : 来代替 JSX 中的 {}\n    return `{{${valueStr}}}`;\n  };\n\n  // Vue 不需要 JSX 的 {} 包裹，因此不需要 unwrapJsExprQuoteInJsx\n  return (nodeItem: IPublicTypeNodeDataType, scope: IScope) => generateNode(nodeItem, scope);\n}\n\n// Vue 代码生成器的核心函数\nexport function createVueNodeGenerator(cfg?: NodeGeneratorConfig): NodeGenerator<string> {\n  const newCfg = mergeNodeGeneratorConfig(\n    {\n      nodePlugins: [generateVueLoopCtrl, generateConditionVueCtrl],\n    },\n    cfg,\n  );\n\n  return createNodeGenerator(newCfg);\n}\n\n/**\n * 查找指定节点\n * @param node\n * @param name\n */\nfunction findNodeSchema(node: IPublicTypeNodeDataType, name: string): IPublicTypeNodeSchema | null {\n  // 检查当前节点是否是我们要找的\n  if (isNodeSchema(node) && node.componentName === name) {\n    return node;\n  }\n\n  // 递归检查子节点\n  if (isNodeSchema(node) && node.children) {\n    if (Array.isArray(node.children)) {\n      // 遍历子节点数组\n      for (const child of node.children) {\n        const found = findNodeSchema(child, name);\n        if (found) {\n          return found; // 找到后立即返回\n        }\n      }\n    } else {\n      // 处理单个子节点\n      return findNodeSchema(node.children, name);\n    }\n  }\n\n  return null; // 未找到时返回 null\n}\n\n/**\n * 生成指定节点\n * @param name 指定节点名称\n * @param nodeItem schema文件\n * @param scope\n * @param cfg 配置\n * @param props 要额外添加给组件的属性\n */\nexport function generateByName(\n  cfg: NodeGeneratorConfig = {},\n  name: string,\n  nodeItem: IPublicTypeNodeDataType,\n  scope: IScope,\n  props: Record<string, any>,\n): { code: string; node: IPublicTypeNodeSchema } {\n  const targetNode = findNodeSchema(nodeItem, name);\n  if (!targetNode) {\n    return { code: '', node: {} as IPublicTypeNodeSchema };\n  }\n  targetNode.props = { ...targetNode.props, ...props };\n  // 生成代码\n  return {\n    code: generateNodeSchema(targetNode as IPublicTypeNodeSchema, scope, {\n      ...cfg,\n    }),\n    node: targetNode,\n  };\n}\n","/**\n * 判断是否是原子类型的表达式\n */\nexport function isLiteralAtomicExpr(expr: string): boolean {\n  return (\n    expr === 'null' ||\n    expr === 'undefined' ||\n    expr === 'true' ||\n    expr === 'false' ||\n    /^-?\\d+(\\.\\d+)?$/.test(expr)\n  );\n}\n","import { Expression } from '@babel/types';\n\n/** 判断是非是一些简单直接的字面值 */\nexport function isSimpleStraightLiteral(expr: Expression): boolean {\n  switch (expr.type) {\n    case 'BigIntLiteral':\n    case 'BooleanLiteral':\n    case 'DecimalLiteral':\n    case 'NullLiteral':\n    case 'NumericLiteral':\n    case 'RegExpLiteral':\n    case 'StringLiteral':\n      return true;\n    default:\n      return false;\n  }\n}\n","import { Expression } from '@babel/types';\nimport generate from '@babel/generator';\nimport { IScope } from '../../../types';\nimport { parseExpressionConvertThis2Context } from '../../../utils/expressionParser';\n\n/**\n * 将所有的 this.xxx 替换为 __$$context.xxx\n * @param expr\n */\nexport function transformThis2Context(\n  expr: string | Expression,\n  scope: IScope,\n  { ignoreRootScope = false } = {},\n): string {\n  if (ignoreRootScope && scope.parent == null) {\n    return typeof expr === 'string' ? expr : generate(expr).code;\n  }\n\n  // 下面这种字符串替换的方式虽然简单直接，但是对于复杂场景会误匹配，故后期改成了解析 AST 然后修改 AST 最后再重新生成代码的方式\n  // return expr\n  //   .replace(/\\bthis\\.item\\./g, () => 'item.')\n  //   .replace(/\\bthis\\.index\\./g, () => 'index.')\n  //   .replace(/\\bthis\\./g, () => '__$$context.');\n  return parseExpressionConvertThis2Context(\n    expr,\n    '__$$context',\n    scope.bindings?.getAllBindings() || [],\n  );\n}\n","import { IScope } from '../../../types';\nimport { parseExpression } from '../../../utils/expressionParser';\nimport { isLiteralAtomicExpr } from '../util/isLiteralAtomicExpr';\nimport { isSimpleStraightLiteral } from '../util/isSimpleStraightLiteral';\nimport { transformThis2Context } from './transformThis2Context';\n\nexport function transformJsExpr(\n  expr: string,\n  scope: IScope,\n  { dontWrapEval = false, dontTransformThis2ContextAtRootScope = false } = {},\n) {\n  if (!expr) {\n    return 'undefined';\n  }\n\n  if (isLiteralAtomicExpr(expr)) {\n    return expr;\n  }\n\n  const exprAst = parseExpression(expr);\n\n  // 对于下面这些比较安全的字面值，可以直接返回对应的表达式，而非包一层\n  if (isSimpleStraightLiteral(exprAst)) {\n    return expr;\n  }\n\n  // 移除 `this` 关键字\n  const transformedExpr = transformThis2Context(exprAst, scope, {\n    ignoreRootScope: dontTransformThis2ContextAtRootScope,\n  });\n\n  if (dontWrapEval) {\n    return transformedExpr;\n    // return transformThis2Context(exprAst, scope, {\n    //   ignoreRootScope: dontTransformThis2ContextAtRootScope,\n    // });\n  }\n\n  switch (exprAst.type) {\n    // 对于直接写个函数的，则不用再包下，因为这样不会抛出异常的\n    case 'ArrowFunctionExpression':\n    case 'FunctionExpression':\n      return transformThis2Context(exprAst, scope, {\n        ignoreRootScope: dontTransformThis2ContextAtRootScope,\n      });\n\n    default:\n      break;\n  }\n\n  // 其他的都需要包一层\n  // return `__$$eval(() => (${transformThis2Context(exprAst, scope, {\n  //   ignoreRootScope: dontTransformThis2ContextAtRootScope,\n  // })}))`;\n  // return `{{${transformThis2Context(exprAst, scope, {\n  //   ignoreRootScope: dontTransformThis2ContextAtRootScope,\n  // })}}}`;\n  return `${transformedExpr}`;\n}\n","import type { IPublicTypeCompositeValue, IPublicTypeNodeDataType, IPublicTypeNodeSchema } from '@alilc/lowcode-types';\nimport _ from 'lodash';\nimport { isNodeSchema } from '@alilc/lowcode-types';\n\nexport interface VueItemsFromChildrenRule {\n  /**\n   * Where to write extracted items, e.g. \"items\" / \"options\".\n   */\n  itemsProp: string;\n\n  /**\n   * Which child componentNames should be treated as an item node.\n   * Example: [\"Menu.Item\", \"MenuItem\", \"Menu-Item\"].\n   */\n  itemComponentNames: string[];\n\n  /**\n   * Candidate props to use as item key.\n   * Defaults to [\"key\", \"primaryKey\", \"id\"].\n   */\n  keyPropCandidates?: string[];\n\n  /**\n   * Candidate props to use as item label.\n   * If none found, fall back to string children.\n   */\n  labelPropCandidates?: string[];\n\n  /**\n   * Whether to keep non-item children after extraction.\n   * - keep: keep all non-item children\n   * - drop: remove all children (items are moved to props)\n   */\n  preserveNonItemChildren?: 'keep' | 'drop';\n}\n\nexport interface VueCodegenMeta {\n  /**\n   * Optional tagName to use in Vue template.\n   * If omitted, the schema componentName will be used.\n   */\n  tagName?: string;\n\n  /**\n   * Structural rule: extract items from children.\n   * This is designed for Menu/Dropdown/SplitButton-like components.\n   */\n  itemsFromChildren?: VueItemsFromChildrenRule;\n}\n\nexport type VueCodegenMetaMap = Record<string, VueCodegenMeta>;\n\nfunction asArray(children: IPublicTypeNodeDataType | undefined): IPublicTypeNodeDataType[] {\n  if (children == null) return [];\n  return Array.isArray(children) ? children : [children];\n}\n\nfunction getPropValue(props: any, key: string): IPublicTypeCompositeValue | undefined {\n  if (!props || typeof props !== 'object' || Array.isArray(props)) return undefined;\n  return props[key] as IPublicTypeCompositeValue;\n}\n\nfunction isStringNodeData(v: IPublicTypeNodeDataType): v is string {\n  return typeof v === 'string';\n}\n\nfunction tryPickFirstDefined(props: any, keys: string[]): IPublicTypeCompositeValue | undefined {\n  for (const key of keys) {\n    const value = getPropValue(props, key);\n    if (value !== undefined) return value;\n  }\n  return undefined;\n}\n\nfunction buildItemObjectFromNode(\n  node: IPublicTypeNodeSchema,\n  rule: VueItemsFromChildrenRule,\n): Record<string, IPublicTypeCompositeValue> {\n  const props = node.props;\n\n  const keyCandidates = rule.keyPropCandidates ?? ['key', 'primaryKey', 'id'];\n  const labelCandidates = rule.labelPropCandidates ?? ['label', 'title', 'text', 'children'];\n\n  const keyValue = tryPickFirstDefined(props, keyCandidates) ?? node.id;\n  let labelValue = tryPickFirstDefined(props, labelCandidates);\n\n  if (labelValue === undefined) {\n    const childList = asArray(node.children);\n    const firstString = childList.find(isStringNodeData);\n    if (firstString != null) {\n      labelValue = firstString;\n    }\n  }\n\n  // Keep other props as-is, but drop special/internal fields.\n  const baseProps: Record<string, any> =\n    props && typeof props === 'object' && !Array.isArray(props) ? _.omit(props, ['__events']) : {};\n\n  const item: Record<string, any> = {\n    ...baseProps,\n    key: keyValue,\n  };\n\n  if (labelValue !== undefined) {\n    item.label = labelValue;\n  }\n\n  // Ensure composite-value compatible output\n  return item as Record<string, IPublicTypeCompositeValue>;\n}\n\nfunction preprocessNode(node: IPublicTypeNodeSchema, metaMap: VueCodegenMetaMap): void {\n  const meta = metaMap[node.componentName];\n  const rule = meta?.itemsFromChildren;\n  if (rule) {\n    const childList = asArray(node.children);\n    const itemNames = new Set(rule.itemComponentNames);\n\n    const itemNodes: IPublicTypeNodeSchema[] = [];\n    const nonItemChildren: IPublicTypeNodeDataType[] = [];\n\n    for (const child of childList) {\n      if (isNodeSchema(child) && itemNames.has(child.componentName)) {\n        itemNodes.push(child);\n      } else {\n        nonItemChildren.push(child);\n      }\n    }\n\n    if (itemNodes.length > 0) {\n      const items = itemNodes.map((n) => buildItemObjectFromNode(n, rule));\n      node.props = {\n        ...(node.props && typeof node.props === 'object' && !Array.isArray(node.props)\n          ? (node.props as any)\n          : {}),\n        [rule.itemsProp]: items,\n      };\n\n      const preserve = rule.preserveNonItemChildren ?? 'keep';\n      if (preserve === 'drop') {\n        delete (node as any).children;\n      } else {\n        node.children = nonItemChildren.length === 0 ? undefined : nonItemChildren;\n      }\n    }\n  }\n\n  // recurse\n  const children = asArray(node.children);\n  for (const child of children) {\n    if (isNodeSchema(child)) {\n      preprocessNode(child, metaMap);\n    }\n  }\n}\n\n/**\n * Apply structural preprocess on a container/root node before Vue template generation.\n */\nexport function preprocessVueStructuralNodes(\n  root: IPublicTypeNodeDataType,\n  metaMap: VueCodegenMetaMap,\n): void {\n  if (!metaMap || Object.keys(metaMap).length === 0) return;\n\n  if (Array.isArray(root)) {\n    root.forEach((n) => preprocessVueStructuralNodes(n, metaMap));\n    return;\n  }\n\n  if (isNodeSchema(root)) {\n    preprocessNode(root, metaMap);\n  }\n}\n","// 从组件树生成template\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  HandlerSet,\n  ICodeStruct,\n  IContainerInfo,\n  IScope,\n  NodeGeneratorConfig,\n} from '../../../types';\n\nimport { TEMPLATE_DEFINE_CHUNK_NAME } from '../../../const';\n\nimport { createVueNodeGenerator } from '../../../utils/nodeToTemplate';\nimport { Scope } from '../../../utils/Scope';\nimport { IPublicTypeJSExpression } from '@alilc/lowcode-types';\nimport { generateExpression } from '../../../utils/jsExpression';\nimport { transformJsExpr } from '../../../core/vue/handlers/transformJsExpression';\nimport { transformThis2Context } from '../../../core/vue/handlers/transformThis2Context';\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { preprocessVueStructuralNodes, type VueCodegenMetaMap } from './structuralPreprocess';\n\n// 插件的配置接口，用于自定义插件的行为，如文件类型和节点类型映射\nexport interface PluginConfig {\n  fileType?: string;\n  nodeTypeMapping?: Record<string, string>;\n  /**\n   * Optional, material-driven metadata for Vue codegen.\n   * Use this to handle structural components (Menu/SplitButton/etc) without hardcoding cases.\n   */\n  codegenMeta?: VueCodegenMetaMap;\n}\n\n// 核心的插件工厂函数，它生成并返回一个用于处理template生成的插件\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg = {\n    fileType: FileType.VUE,\n    // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n    nodeTypeMapping: {} as Record<string, string>,\n    ...config,\n  };\n\n  const { nodeTypeMapping } = cfg;\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const { tolerateEvalErrors = true } = next.contextData;\n\n    // 这里会将内部的一些子上下文的访问(this.xxx)转换为 __$$context.xxx 的形式\n    // 与 Rax 所不同的是，这里不会将最顶层的 this 转换掉\n    const customHandlers: HandlerSet<string> = {\n      expression(input: IPublicTypeJSExpression, scope: IScope, config2) {\n        return transformJsExpr(generateExpression(input, scope), scope, {\n          dontWrapEval: !(config2?.tolerateEvalErrors ?? tolerateEvalErrors),\n          dontTransformThis2ContextAtRootScope: true,\n        });\n      },\n      function(input, scope: IScope) {\n        return transformThis2Context(\n          generateCompositeType(\n            {\n              type: 'JSFunction',\n              value: input.value || 'function () {}',\n            },\n            Scope.createRootScope(),\n          ),\n          scope,\n          { ignoreRootScope: true },\n        );\n      },\n    };\n\n    //  定义了如何处理属性（如 ref）、标签映射和错误容忍机制\n    const generatorPlugins: NodeGeneratorConfig = {\n      // handlers: customHandlers,\n      tagMapping: (v) => nodeTypeMapping[v] || v,\n      tolerateEvalErrors,\n    };\n\n    const generator = createVueNodeGenerator(generatorPlugins);\n\n    // createReactNodeGenerator 函数创建一个 Vue 节点生成器，并通过传入的 ir（中间表示）和 scope（作用域）生成最终的 JSX 内容\n    const ir = next.ir as IContainerInfo;\n\n    if (cfg.codegenMeta) {\n      preprocessVueStructuralNodes(ir as any, cfg.codegenMeta);\n    }\n\n    const scope: IScope = Scope.createRootScope();\n    const templateContent = generator(ir, scope); // 生成 Vue 模板内容\n    // Vue 模板生成结果被保存到 next.chunks 中\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom,\n      // content: '',\n      content: `\n          ${templateContent}\n      `,\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","// VUE框架的公共依赖\nimport { TEMPLATE_DEFINE_CHUNK_NAME } from '../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n      content: `\nimport { onMounted, onUnmounted, ref, reactive } from 'vue';\nimport { useRouter } from 'vue-router';`,\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { JSONObject } from '@alilc/lowcode-datasource-types/src/value-type';\nimport _ from 'lodash';\nimport { generateFunction, parseExpressionGetState } from './jsExpression';\nimport { lineToUppercase } from './changeCase';\nimport { InterpretDataSourceConfig, JSONValue, InterpretDataSource } from '@alilc/lowcode-types';\nimport { DataSourceCustomExtra, ExtraInterpretDataSource } from '../types';\n\n// api缓存前缀\nexport const PREFIX_API_CACHE = 'page_cache_';\n// 分页参数pageNum前缀\nexport const PREFIX_PAGE_NUM = '_nowPage';\n// 分页参数isLastPage前缀\nexport const PREFIX_IS_LAST_PAGE = '_isLastPage';\n// 分页参数isLastPage前缀\nexport const PREFIX_API_PARAM_NAME = 'Params';\n// script 内api引用后缀\nexport const SUFFIX_API_SCRIPT = 'Request';\n// 数据源集合变量名\nexport const SUFFIX_DATA_SOURCE_MAP = 'dataSourceMap';\n// api请求方法名后缀\nexport const SUFFIX_API_METHOD = 'Method';\n// 全局请求参数名字\nexport const GLOBE_API_PARAM = 'globeParam';\n// 请求类型枚举\nenum REQUEST_TYPE {\n  PAGE = 'page',\n  SYSTEM_DICTIONARY = 'systemDictionary',\n}\nexport type TypeDataSourceType =\n  | 'dynamicForm'\n  | 'dataDictionary'\n  | 'dynamicFormCache'\n  | 'dynamicFormDetail'\n  | 'dataLoginUserInfo';\n\n// 请求类型匹配\nconst requestEndUrl: Record<\n  TypeDataSourceType,\n  (url: string, formName?: string, isJsExp?: boolean) => string\n> = {\n  dynamicForm: (url: string, formName?: string, isJsExp?: boolean) => {\n    if (isJsExp) {\n      return `/${formName}/page`;\n    } else {\n      return `'/${formName}/page'`;\n    }\n  },\n  dataDictionary: (url: string, formName?: string, isJsExp?: boolean) => {\n    // TODO: 实现数据字典的URL处理\n    return url;\n  },\n  dynamicFormCache: (url: string, formName?: string, isJsExp?: boolean) => {\n    // TODO: 实现动态表单缓存的URL处理\n    return url;\n  },\n  dynamicFormDetail: (url: string, formName?: string, isJsExp?: boolean) => {\n    // TODO: 实现动态表单详情的URL处理\n    return url;\n  },\n  dataLoginUserInfo: (url: string, formName?: string, isJsExp?: boolean) => {\n    // TODO: 实现登录用户信息的URL处理\n    return url;\n  },\n};\n// 需要忽略的请求头\nconst ignoreHeader = [\n  {\n    key: 'authToken',\n    ignore: (value: any) => {\n      return true;\n    },\n  },\n  {\n    key: 'siteCode',\n    ignore: (value: any) => {\n      return true;\n    },\n  },\n  {\n    key: 'dcAuthType',\n    ignore: (value: any) => {\n      return true;\n    },\n  },\n  {\n    key: 'Content-Type',\n    ignore: (value: any) => {\n      return ['application/json'].includes(value);\n    },\n  },\n];\n\n/**\n * 请求头处理\n * @param headers 请求头\n */\nexport function requestHeaderHandler(headers: JSONObject): string {\n  if (!headers) {\n    return '';\n  }\n  let endHeaders = '';\n  for (let i = 0; i < Object.keys(headers).length; i++) {\n    const key = Object.keys(headers)[i];\n    // 忽略指定key\n    if (shouldIgnoreKey(key, headers[key])) {\n      break;\n    }\n    if (headers[key]) {\n      let tempHeaders = `defaultConfig.header.data['${key}'] = '${headers[key]}'`;\n      if (isJsExpression(headers[key])) {\n        // js表达式处理\n        tempHeaders = `defaultConfig.header.data['${key}'] = ${generateFunction(headers[key], {\n          isToVue: true,\n        })}`;\n      }\n      endHeaders += `${tempHeaders};`;\n    }\n  }\n  if (endHeaders) {\n    endHeaders =\n      '// 请求头处理\\n' + 'const defaultConfig = getDefaultConfig<boolean>()\\n' + endHeaders;\n  }\n  return endHeaders;\n}\n\n/**\n * 请求体处理\n * @param params 请求体\n */\nexport function requestParamsHandler(params: JSONObject) {\n  if (!params || Object.keys(params).length === 0) {\n    return '';\n  }\n  // 将请求体处理成key： value的字符串\n  let paramsData = params\n    ? Object.keys(params)\n        .map((key) => {\n          if (isJsExpression(params[key])) {\n            // todo 忽略js表达式，放在script那边处理\n            return '';\n          }\n          return `${key}: ${params[key]}`;\n        })\n        .filter((item) => item)\n        .join(',')\n    : '';\n  return `\n    // 请求参数处理\n    data = {\n   ${paramsData ? paramsData + ',' : ''}\n   ...data\n   }`;\n}\n\n/**\n * 请求结果处理\n */\nexport function requestAfterDataHandler(\n  dataSourceItems: InterpretDataSourceConfig,\n  extra: Record<string, DataSourceCustomExtra>,\n) {\n  const strArray = [];\n  if (dataSourceItems.dataHandler) {\n    const resultDataName = lineToUppercase(dataSourceItems.id + 'Data');\n    // 获取请求结果\n    const resultData = `const ${resultDataName} = await ${getApiName(dataSourceItems.id)}.${\n      dataSourceItems.id\n    }(${getApiParamName(dataSourceItems.id)});`;\n    const handleData = `const handleData = ${getApiHandleFunctionName(\n      dataSourceItems.id,\n    )}({ data: ${resultDataName}})`;\n    strArray.push(resultData, handleData);\n    let endData;\n    if (!dataSourceItems.dataHandler.value.includes('requestAfter')) {\n      // 调用处理函数进行处理 todo requestAfter方法内含有数据源赋值，故不进行赋值\n      endData = `${lineToUppercase(getApiId(dataSourceItems.id, extra))}.value = handleData`;\n      strArray.push(endData);\n    }\n  } else {\n    // 处理函数处理\n    const handleData = `const handleData = await ${getApiName(dataSourceItems.id)}.${\n      dataSourceItems.id\n    }(${getApiParamName(dataSourceItems.id)});`;\n    const data = `${lineToUppercase(getApiId(dataSourceItems.id, extra))}.value = handleData`;\n    strArray.push(handleData, data);\n  }\n  return strArray;\n}\n\n/**\n * 是否是js表达式\n * @param value\n */\nexport function isJsExpression(value: any): value is { type: 'JSExpression'; value: string } {\n  return typeof value === 'object' && value !== null && 'type' in value && value.type === 'JSExpression';\n}\n\n/**\n *  是否忽略该key\n * @param key\n * @param value\n */\nfunction shouldIgnoreKey(key: string, value: JSONValue) {\n  for (let i = 0; i < ignoreHeader.length; i++) {\n    const headerItem = ignoreHeader[i];\n    if (headerItem.key == key) {\n      // 调用忽略函数\n      return headerItem.ignore(value);\n    }\n  }\n\n  // 判断 key 是否以 'authToken-' 开头，并后面跟着数字（动态部分）\n  const dynamicKeyPattern = /^authToken-\\d+$/;\n  if (dynamicKeyPattern.test(key)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * 将线上地址转为出码后的请求地址\n * @param dataSourceConfig\n * @param extra 额外参数\n */\nexport function handleUrl(dataSourceConfig: InterpretDataSourceConfig, extra: any) {\n  // if (!dataSourceConfig.bindPanelData) {\n  //     return dataSourceConfig.options?.uri\n  // }\n  let url;\n  if (isJsExpression(dataSourceConfig.options?.uri)) {\n    // 对url是js表达式进行处理\n    url = generateFunction(dataSourceConfig.options?.uri, {\n      isToVue: true,\n      isDeleteLastSemicolon: true,\n    });\n  } else {\n    url = dataSourceConfig.options?.uri as string;\n  }\n  const id = dataSourceConfig.id as string;\n  const config = extra && extra[id];\n  if (!config) {\n    return `'${dataSourceConfig.options?.uri}'`;\n  }\n  const type = config.dataSourceType as TypeDataSourceType;\n  const formName = lineToUppercase(config.code as string);\n\n  return requestEndUrl[type](url, formName, isJsExpression(dataSourceConfig.options?.uri));\n}\n\n/**\n * 处理分页请求参数\n * 将分页参数转换为ref（pageNum和isLastPage）\n */\nexport function handlePageParamToRef(data: ExtraInterpretDataSource): string[] {\n  if (!data.extra) {\n    return [];\n  }\n  const extra = data.extra;\n  const variableArray: string[] = [];\n  Object.keys(extra).forEach((key) => {\n    const extraItem = extra[key];\n    if (extraItem.pageHelperInfo) {\n      // 对应\n      const pageIsLastPage = `const ${lineToUppercase(key + PREFIX_IS_LAST_PAGE)} = ref(false)`;\n      const pageNowPage = `const ${lineToUppercase(key + PREFIX_PAGE_NUM)} = ref(${\n        extraItem.pageHelperInfo.page.value ?? 1\n      })`;\n      variableArray.push(pageNowPage, pageIsLastPage);\n    }\n  });\n  return variableArray;\n}\n\n/**\n * 将请求参数itemList里面的this.state.xxx 都包裹进reactive里面\n * @param data\n */\nexport function handleParamToRef(data: ExtraInterpretDataSource) {\n  const dataSourceItems: InterpretDataSourceConfig[] = (data && data.list) || [];\n  const paramSet: Set<string> = new Set();\n  const nameArray: string[] = [];\n  dataSourceItems.forEach((item) => {\n    // 获取请求参数\n    const params = item.options?.params as JSONObject;\n    if (params) {\n      Object.values(params).forEach((paramItem) => {\n        if (isJsExpression(paramItem)) {\n          // 将参数值保存进set，进行去重\n          const nameSet = parseExpressionGetState(paramItem?.value as string);\n          nameSet.forEach((name) => paramSet.add(name));\n        }\n      });\n    }\n  });\n  // paramSet.forEach(item => {\n  //     if (item) {\n  //         // 组装ref\n  //         nameArray.push(`const ${item} = ref()`)\n  //     }\n  // })\n  const paramArray = [...paramSet];\n  const paramStr = paramArray.filter((item) => item).map((item) => `${item}: ''`);\n  const param = `const ${GLOBE_API_PARAM} = reactive({${paramStr.join(',')}})`;\n  nameArray.push(param);\n  return nameArray;\n}\n\n/**\n * 将API转换为ref变量\n * @param data\n */\nexport function handleApiToRef(data: ExtraInterpretDataSource): string[] {\n  const dataSourceItems: InterpretDataSourceConfig[] = (data && data.list) || [];\n  const variableArray: string[] = [];\n  const extra = data.extra;\n  dataSourceItems.forEach((item) => {\n    let id = getApiId(item.id, extra);\n    const data = `const ${lineToUppercase(id)} = ref()`;\n    variableArray.push(data);\n  });\n  return variableArray;\n}\n\n/**\n * 获取数据源的id\n * @param id\n * @param extra\n */\nexport function getApiId(id: string, extra: Record<string, DataSourceCustomExtra>) {\n  // 开启缓存则加入缓存前缀\n  return extra && extra[id]?.isOpenCache ? PREFIX_API_CACHE + id : id;\n}\n\n/**\n * 获取请求参数名字\n * @param id\n */\nexport function getApiParamName(id: string) {\n  return lineToUppercase(id) + PREFIX_API_PARAM_NAME;\n}\n\n/**\n * 获取请求后置处理方法名\n * @param id\n */\nexport function getApiHandleFunctionName(id: string) {\n  return lineToUppercase('requestAfter' + id);\n}\n/**\n * 获取script 里引入的api名称\n */\nexport function getApiName(apiId: string) {\n  return apiId + SUFFIX_API_SCRIPT;\n}\n\n/**\n * 获取api请求方法名\n * @param id\n */\nexport function getApiRequestMethodName(id: string) {\n  return lineToUppercase(id) + 'Method';\n}\n","import {\n  InterpretDataSourceConfig\n} from '@alilc/lowcode-types';\n\nimport {\n  TEMPLATE_DEFINE_CHUNK_NAME,\n  DEFAULT_LINK_AFTER\n} from '../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct\n} from '../../../types';\n\nimport { isValidContainerType } from '../../../utils/schema';\nimport {getApiName} from \"../../../utils/requestHandle\";\n\nexport interface PluginConfig {\n  fileType?: string;\n\n  /**\n     * 数据源配置\n     */\n  datasourceConfig?: {\n\n    /** 数据源引擎的版本 */\n    engineVersion?: string;\n\n    /** 数据源引擎的包名 */\n    enginePackage?: string;\n\n    /** 数据源 handlers 的版本 */\n    handlersVersion?: {\n      [key: string]: string;\n    };\n\n    /** 数据源 handlers 的包名 */\n    handlersPackages?: {\n      [key: string]: string;\n    };\n  };\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const dataSourceConfig = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n    const dataSourceItems: InterpretDataSourceConfig[] =\n            (dataSourceConfig && dataSourceConfig.list) || [];\n    if (dataSourceItems.length > 0) {\n      dataSourceItems.forEach((ds) => {\n        const dsType = ds.type || 'fetch';\n        // 处理非自定义数据源\n        if (dsType !== 'custom') {\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport,\n            content: `import  ${getApiName(ds.id)} from '@/api/${ds.id}';`,\n            linkAfter: [...DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport]],\n          });\n        }\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { flatMap, camelCase, get } from 'lodash';\nimport {DEFAULT_LINK_AFTER, TEMPLATE_DEFINE_CHUNK_NAME, VUE_MODULE_NAME} from '../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  CodeGeneratorError,\n  DependencyType,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IDependency,\n  IExternalDependency,\n  IInternalDependency,\n  IWithDependency,\n} from '../../../types';\n\nimport { isValidIdentifier } from '../../../utils/validate';\n\n// TODO: main 这个信息到底怎么用，是不是外部包不需要使用？\nconst DEP_MAIN_BLOCKLIST = ['lib', 'lib/index', 'es', 'es/index', 'main'];\nconst DEFAULT_EXPORT_NAME = '__default__';\n\nfunction upperFirst(input: string): string {\n  if (!input) {\n    return input;\n  }\n  return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nfunction toVueSubComponentIdentifier(\n  componentName: string | undefined,\n  ownerExportName: string,\n  subName: string,\n): string {\n  // If schema already provides a valid identifier (e.g. RangePicker), keep it.\n  if (componentName && isValidIdentifier(componentName) && !componentName.includes('.')) {\n    return componentName;\n  }\n\n  // Otherwise, derive a valid identifier consistent with Vue kebab-case tags.\n  // Examples: Button.Group -> ButtonGroup, Menu.Item -> MenuItem\n  const base = componentName || `${ownerExportName}.${subName}`;\n  return upperFirst(camelCase(base.replace(/\\.+/g, ' ')));\n}\n\n/**\n * 将不同包的依赖分组\n * @param deps\n */\nfunction groupDepsByPack(deps: IDependency[]): Record<string, IDependency[]> {\n  const depMap: Record<string, IDependency[]> = {};\n\n  const addDep = (pkg: string, dep: IDependency) => {\n    if (!depMap[pkg]) {\n      depMap[pkg] = [];\n    }\n    depMap[pkg].push(dep);\n  };\n\n  deps.forEach((dep) => {\n    if (dep.dependencyType === DependencyType.Internal) {\n      addDep(`${(dep as IInternalDependency).moduleName}${dep.main ? `/${dep.main}` : ''}`, dep);\n    } else {\n      let depMain = '';\n      // TODO: 部分类型的 main 暂时认为没用\n      if (dep.main && DEP_MAIN_BLOCKLIST.indexOf(dep.main) < 0) {\n        depMain = dep.main;\n      }\n      if (depMain.substring(0, 1) === '/') {\n        depMain = depMain.substring(1);\n      }\n      addDep(`${(dep as IExternalDependency).package}${depMain ? `/${depMain}` : ''}`, dep);\n    }\n  });\n\n  return depMap;\n}\n\ninterface IDependencyItem {\n  exportName: string;\n  aliasName?: string;\n  isDefault?: boolean;\n  subName?: string;\n  nodeIdentifier?: string; // 与使用处的映射关系，理论上是不可变更的，如需变更需要提供额外信息\n  source: IDependency;\n}\n\ninterface IExportItem {\n  exportName: string;\n  aliasNames: string[];\n  isDefault?: boolean;\n  needOriginExport: boolean;\n}\n\nfunction getDependencyIdentifier(info: IDependencyItem): string {\n  return info.aliasName || info.exportName;\n}\n\n/**\n * 获取依赖的导出名称\n * @param dep\n */\nfunction getExportNameOfDep(dep: IDependency): string {\n  if (dep.destructuring) {\n    return (\n      dep.exportName ||\n      dep.componentName ||\n      throwNewError('destructuring dependency must have exportName or componentName')\n    );\n  }\n\n  if (!dep.subName) {\n    return (\n      dep.componentName ||\n      dep.exportName ||\n      throwNewError('dependency item must have componentName or exportName')\n    );\n  }\n\n  return (\n    dep.exportName ||\n    `__$${camelCase(\n      get(dep, 'moduleName') ||\n      get(dep, 'package') ||\n      throwNewError('dep.moduleName or dep.package is undefined'),\n    )}_default`\n  );\n}\n\nfunction throwNewError(msg: string): never {\n  throw new Error(msg);\n}\n\nfunction buildPackageImport(\n  pkg: string,\n  deps: IDependency[],\n  targetFileType: string,\n  useAliasName: boolean,\n): ICodeChunk[] {\n  // 如果压根没有包，则不生成对应的 import 语句（生成了没有任何意义）\n  if (!pkg || pkg === 'undefined' || pkg === 'null') {\n    // TODO: 要不要加个 warning？\n    return [];\n  }\n\n  const chunks: ICodeChunk[] = [];\n\n  const exportItems: Record<string, IExportItem> = {};\n  const defaultExportNames: string[] = [];\n\n  const depsInfo: IDependencyItem[] = deps.map((dep) => {\n    const ownerExportName = getExportNameOfDep(dep);\n    const info: IDependencyItem = {\n      exportName: ownerExportName,\n      isDefault: !dep.destructuring,\n      subName: dep.subName || undefined,\n      nodeIdentifier: dep.componentName || undefined,\n      source: dep,\n    };\n\n    // 下面 5 个逻辑是清理不必要的冗余信息，做到数据结构归一化\n    if (info.isDefault) {\n      if (defaultExportNames.indexOf(info.exportName) < 0) {\n        defaultExportNames.push(info.exportName);\n      }\n    }\n\n    if (!info.subName) {\n      if (info.nodeIdentifier === info.exportName) {\n        info.nodeIdentifier = undefined;\n      }\n\n      if (info.isDefault) {\n        info.aliasName = info.nodeIdentifier || info.exportName;\n        info.exportName = DEFAULT_EXPORT_NAME;\n      }\n\n      if (info.nodeIdentifier) {\n        info.aliasName = info.nodeIdentifier;\n        info.nodeIdentifier = undefined;\n      }\n    } else {\n      if (info.isDefault) {\n        info.aliasName = info.exportName;\n        info.exportName = DEFAULT_EXPORT_NAME;\n      }\n\n      // Vue template cannot reference sub-components via dot notation.\n      // Always ensure we have a valid identifier for the normalized tag name.\n      info.nodeIdentifier = toVueSubComponentIdentifier(dep.componentName, ownerExportName, info.subName);\n    }\n\n    return info;\n  });\n\n  // 建立 export 项目的列表\n  depsInfo.forEach((info) => {\n    if (!exportItems[info.exportName]) {\n      exportItems[info.exportName] = {\n        exportName: info.exportName,\n        isDefault: info.isDefault,\n        aliasNames: [],\n        needOriginExport: false,\n      };\n    }\n\n    if (!info.nodeIdentifier && !info.aliasName) {\n      exportItems[info.exportName].needOriginExport = true;\n    }\n  });\n\n  // 建立别名字典\n  depsInfo.forEach((info) => {\n    if (info.aliasName) {\n      const { aliasNames } = exportItems[info.exportName];\n      if (aliasNames.indexOf(info.aliasName) < 0) {\n        aliasNames.push(info.aliasName);\n      }\n    }\n  });\n\n  // fix: 父组件ImportAliasDefine, 与子组件import的父组件冲突情况\n  depsInfo.forEach((info) => {\n    if (info.nodeIdentifier) {\n      const exportItem = exportItems[info.exportName];\n      if (!exportItem.needOriginExport && exportItem.aliasNames.length > 0) {\n        // eslint-disable-next-line no-param-reassign\n        info.aliasName = exportItem.aliasNames[0];\n      }\n    }\n  });\n\n  // 发现 nodeIdentifier 与 exportName 或者 aliasName 冲突的场景\n  const nodeIdentifiers = depsInfo.map((info) => info.nodeIdentifier).filter(Boolean);\n  const conflictInfos = flatMap(Object.keys(exportItems), (exportName) => {\n    const exportItem = exportItems[exportName];\n    const usedNames = [\n      ...exportItem.aliasNames,\n      ...(exportItem.needOriginExport || exportItem.aliasNames.length <= 0 ? [exportName] : []),\n    ];\n    const conflictNames = usedNames.filter((n) => nodeIdentifiers.indexOf(n) >= 0);\n    if (conflictNames.length > 0) {\n      return [\n        ...(conflictNames.indexOf(exportName) >= 0 ? [[exportName, true, exportItem]] : []),\n        ...conflictNames.filter((n) => n !== exportName).map((n) => [n, false, exportItem]),\n      ];\n    }\n    return [];\n  });\n\n  const conflictExports = conflictInfos.filter((c) => c[1]).map((c) => c[0] as string);\n  const conflictAlias = conflictInfos.filter((c) => !c[1]).map((c) => c[0] as string);\n\n  const solutions: Record<string, string> = {};\n\n  depsInfo.forEach((info) => {\n    if (info.aliasName && conflictAlias.indexOf(info.aliasName) >= 0) {\n      // find solution\n      let solution = solutions[info.aliasName];\n      if (!solution) {\n        solution = `${info.aliasName}Alias`;\n        const conflictItem = (conflictInfos.find((c) => c[0] === info.aliasName) ||\n          [])[2] as IExportItem;\n        conflictItem.aliasNames = conflictItem.aliasNames.filter((a) => a !== info.aliasName);\n        conflictItem.aliasNames.push(solution);\n        solutions[info.aliasName] = solution;\n      }\n      // eslint-disable-next-line no-param-reassign\n      info.aliasName = solution;\n    }\n\n    if (conflictExports.indexOf(info.exportName) >= 0) {\n      // find solution\n      let solution = solutions[info.exportName];\n      if (!solution) {\n        solution = `${info.exportName}Export`;\n        const conflictItem = (conflictInfos.find((c) => c[0] === info.exportName) ||\n          [])[2] as IExportItem;\n        conflictItem.aliasNames.push(solution);\n        conflictItem.needOriginExport = false;\n        solutions[info.exportName] = solution;\n      }\n      // eslint-disable-next-line no-param-reassign\n      info.aliasName = solution;\n    }\n  });\n\n  // 判断是否所有依赖都有合法的 Identifier\n  depsInfo.forEach((info) => {\n    const name = info.aliasName || info.exportName;\n    if (!isValidIdentifier(name)) {\n      throw new CodeGeneratorError(`Invalid Identifier [${name}]`);\n    }\n    if (info.nodeIdentifier && !isValidIdentifier(info.nodeIdentifier)) {\n      throw new CodeGeneratorError(`Invalid Identifier [${info.nodeIdentifier}]`);\n    }\n  });\n\n  const aliasDefineStatements: Record<string, string> = {};\n  if (useAliasName) {\n    Object.keys(exportItems).forEach((exportName) => {\n      const aliasList = exportItems[exportName]?.aliasNames || [];\n      if (aliasList.length > 0) {\n        const srcName = exportItems[exportName].needOriginExport ? exportName : aliasList[0];\n        const aliasNameList = exportItems[exportName].needOriginExport\n          ? aliasList\n          : aliasList.slice(1);\n        aliasNameList.forEach((a) => {\n          if (!aliasDefineStatements[a]) {\n            aliasDefineStatements[a] = `const ${a} = ${srcName};`;\n          }\n        });\n      }\n    });\n  }\n\n  function getDefaultExportName(info: IDependencyItem): string {\n    if (info.isDefault) {\n      return defaultExportNames[0];\n    }\n    return info.exportName;\n  }\n\n  depsInfo.forEach((info) => {\n    // 如果是子组件，则导出父组件，并且根据自组件命名规则，判断是否需要定义标识符\n    if (info.nodeIdentifier) {\n      // 前提，存在 nodeIdentifier 一定是有 subName 的，不然前面会优化掉\n      const ownerName = getDependencyIdentifier(info);\n\n      chunks.push({\n        type: ChunkType.STRING,\n        fileType: targetFileType,\n        // Put sub-component alias defines into script body (after imports), not before <template>.\n        name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n        content: useAliasName ? `const ${info.nodeIdentifier} = ${ownerName}.${info.subName};` : '',\n        linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport],\n        ext: {\n          originalName: `${getDefaultExportName(info)}.${info.subName}`,\n          aliasName: info.nodeIdentifier,\n          dependency: info.source,\n        },\n      });\n    } else if (info.aliasName) {\n      // default 方式的导入会生成单独de import 语句，无需生成赋值语句\n      if (info.isDefault && defaultExportNames.find((n) => n === info.aliasName)) {\n        delete aliasDefineStatements[info.aliasName];\n        return;\n      }\n\n      let contentStatement = '';\n      if (aliasDefineStatements[info.aliasName]) {\n        contentStatement = aliasDefineStatements[info.aliasName];\n        delete aliasDefineStatements[info.aliasName];\n      }\n\n      chunks.push({\n        type: ChunkType.STRING,\n        fileType: targetFileType,\n        name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n        content: contentStatement,\n        linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport],\n        ext: {\n          originalName: getDefaultExportName(info),\n          aliasName: info.aliasName,\n          dependency: info.source,\n        },\n      });\n    }\n  });\n\n  // 可能会剩余一些存在二次转换的定义\n  Object.keys(aliasDefineStatements).forEach((a) => {\n    chunks.push({\n      type: ChunkType.STRING,\n      fileType: targetFileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n      content: aliasDefineStatements[a],\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport],\n    });\n  });\n\n  const exportItemList = Object.keys(exportItems).map((k) => exportItems[k]);\n  const defaultExport = exportItemList.filter((item) => item.isDefault);\n  const otherExports = exportItemList.filter((item) => !item.isDefault);\n\n  const statementL = ['import'];\n  if (defaultExport.length > 0) {\n    if (useAliasName) {\n      statementL.push(defaultExportNames[0]);\n    } else {\n      statementL.push(defaultExport[0].aliasNames[0]);\n    }\n    if (otherExports.length > 0) {\n      statementL.push(', ');\n    }\n  }\n  if (otherExports.length > 0) {\n    const items = otherExports.map((item) => {\n      return !useAliasName || item.needOriginExport || item.aliasNames.length <= 0\n        ? item.exportName\n        : `${item.exportName} as ${item.aliasNames[0]}`;\n    });\n    statementL.push(`{ ${items.join(', ')} }`);\n  }\n  statementL.push('from');\n\n  const getInternalDependencyModuleId = () => `@/${(deps[0] as IInternalDependency).type}/${pkg}`;\n\n  if (deps[0].dependencyType === DependencyType.Internal) {\n    // TODO: Internal Deps path use project slot setting\n    statementL.push(`'${getInternalDependencyModuleId()}';`);\n    chunks.push({\n      type: ChunkType.STRING,\n      fileType: targetFileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport,\n      content: statementL.join(' '),\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport],\n    });\n  } else {\n    statementL.push(`'${pkg}';`);\n    chunks.push({\n      type: ChunkType.STRING,\n      fileType: targetFileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n      content: statementL.join(' '),\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart],\n    });\n  }\n\n  // 处理下一些额外的 default 方式的导入\n  if (defaultExportNames.length > 1) {\n    if (deps[0].dependencyType === DependencyType.Internal) {\n      defaultExportNames.slice(1).forEach((exportName) => {\n        chunks.push({\n          type: ChunkType.STRING,\n          fileType: targetFileType,\n          name: TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport,\n          content: `import ${exportName} from '${getInternalDependencyModuleId()}';`,\n          linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport],\n        });\n      });\n    } else {\n      defaultExportNames.slice(1).forEach((exportName) => {\n        chunks.push({\n          type: ChunkType.STRING,\n          fileType: targetFileType,\n          name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n          content: `import ${exportName} from '${pkg}';`,\n          linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart],\n        });\n\n        chunks.push({\n          type: ChunkType.STRING,\n          fileType: targetFileType,\n          name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n          content: '',\n          linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart],\n          ext: {\n            aliasName: exportName,\n            originalName: exportName,\n            dependency: {\n              package: pkg,\n              componentName: exportName,\n            },\n          },\n        });\n      });\n    }\n  }\n\n  return chunks;\n}\n\nexport interface PluginConfig {\n  fileType?: string; // 导出的文件类型\n  useAliasName?: boolean; // 是否使用 componentName 重命名组件 identifier\n  filter?: (deps: IDependency[]) => IDependency[]; // 支持过滤能力\n}\n\n/**\n *  将依赖地址转换为vue组件地址\n * @param deps\n */\nfunction depConvertToVue(deps: IDependency[]) {\n  return deps.map((dep) => {\n    // 忽略最外层的page\n    if (!dep.devMode || dep.devMode !== 'lowCode') {\n      dep.package = VUE_MODULE_NAME\n      dep.main = ''\n    }\n    return dep\n  })\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?: PluginConfig) => {\n  const cfg = {\n    fileType: FileType.JS,\n    useAliasName: true,\n    ...(config || {}),\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IWithDependency;\n\n    if (ir && ir.deps && ir.deps.length > 0) {\n      let deps = cfg.filter ? cfg.filter(ir.deps) : ir.deps;\n      // 转换为vue依赖\n      deps = depConvertToVue(deps);\n      const packs = groupDepsByPack(deps);\n\n      Object.keys(packs).forEach((pkg) => {\n        const chunks = buildPackageImport(pkg, packs[pkg], cfg.fileType, cfg.useAliasName);\n        next.chunks.push(...chunks);\n      });\n    }\n\n    return next;\n  };\n\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { TEMPLATE_DEFINE_CHUNK_NAME, VUE_DEFAULT_LINK_AFTER } from '../../../const';\n\nimport { generateCompositeType } from '../../../utils/compositeType';\nimport { Scope } from '../../../utils/Scope';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { isValidContainerType } from '../../../utils/schema';\nimport {\n  handleApiToRef,\n  handlePageParamToRef,\n  handleParamToRef\n} from \"../../../utils/requestHandle\";\n\nexport interface PluginConfig {\n  fileType?: string;\n  implementType: 'inConstructor' | 'insMember' | 'hooks';\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig & { fileType: string } = {\n    fileType: FileType.VUE,\n    implementType: 'inConstructor',\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n    const scope = Scope.createRootScope();\n\n    const state = ir.state || {};\n    // react的state转vue的ref\n    const fields = Object.keys(state).map<string>((stateName) => {\n      const value = generateCompositeType(state[stateName], scope);\n      return `const ${stateName} = ref(${value})`;\n    });\n    // 将api的结果转为ref变量\n    const dataSourceConfig = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n    const apiRefArray = handleApiToRef(dataSourceConfig)\n    // 添加分页组件的额外分页参数（将pageNum和isLastPage转为vue的ref）\n    const pageParams = handlePageParamToRef(dataSourceConfig)\n    // 将api的请求参数itemList里的this.state.xxx转化为ref变量\n    const data = handleParamToRef(dataSourceConfig)\n    // itemList转ref\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n      content: `${data.join('\\n')}`,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ConstVar]],\n    });\n    // 用ref变量保存api请求结果\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n      content: `${apiRefArray.join('\\n')}`,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ConstVar]],\n    });\n    // state转换为ref\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n      content: `${fields.join('\\n')}`,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ConstVar]],\n    });\n    // 分页参数转换为ref\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n      content: `${pageParams.join('\\n')}`,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ConstVar]],\n    });\n    // 路由\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n      content: `const router = useRouter()`,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ConstVar]],\n    });\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { TEMPLATE_DEFINE_CHUNK_NAME, VUE_DEFAULT_LINK_AFTER } from '../../../const';\n\nimport { generateFunction } from '../../../utils/jsExpression';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType, ExtraInterpretDataSource,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport { isJSFunction, isJSExpression, InterpretDataSourceConfig } from '@alilc/lowcode-types';\nimport { isJSExpressionFn } from '../../../utils/common';\nimport { isValidContainerType } from '../../../utils/schema';\nimport {\n    getApiRequestMethodName,\n    isJsExpression,\n    requestAfterDataHandler, SUFFIX_DATA_SOURCE_MAP\n} from '../../../utils/requestHandle';\n\nexport interface PluginConfig {\n  fileType?: string;\n  exportNameMapping?: Record<string, string>;\n  normalizeNameMapping?: Record<string, string>;\n  exclude?: string[];\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg = {\n    fileType: FileType.VUE,\n    exportNameMapping: {},\n    normalizeNameMapping: {},\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    if (ir.lifeCycles) {\n      const { lifeCycles } = ir;\n      const chunks = Object.keys(lifeCycles)\n        .map<ICodeChunk | null>((lifeCycleName) => {\n          // 过滤掉非法数据（有些场景下会误传入空字符串或 null)\n          if (\n            !isJSFunction(lifeCycles[lifeCycleName]) &&\n            !isJSExpressionFn(lifeCycles[lifeCycleName]) &&\n            !isJSExpression(lifeCycles[lifeCycleName])\n          ) {\n            return null;\n          }\n\n          let normalizeName;\n          // constructor会取到对象的构造函数\n          if (lifeCycleName === 'constructor') {\n            normalizeName = lifeCycleName;\n          } else {\n            normalizeName = cfg.normalizeNameMapping[lifeCycleName] || lifeCycleName;\n          }\n\n          if (cfg?.exclude?.includes(normalizeName)) {\n            return null;\n          }\n\n          const exportName = cfg.exportNameMapping[lifeCycleName] || lifeCycleName;\n          if (normalizeName === 'constructor') {\n            // todo 构造函数暂时不处理\n            // return {\n            //   type: ChunkType.STRING,\n            //   fileType: cfg.fileType,\n            //   name: CLASS_DEFINE_CHUNK_NAME.ConstructorContent,\n            //   content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }),\n            //   linkAfter: [...VUE_DEFAULT_LINK_AFTER[CLASS_DEFINE_CHUNK_NAME.ConstructorStart]],\n            // };\n          }\n          // react的componentDidMount对应vue的mounted\n          if (normalizeName === 'componentDidMount') {\n            // TODO(grammar 2024.10.29) 涉及到react专有语法后续遇到再处理（已处理this.xxx，this.setState()）\n            return {\n              type: ChunkType.STRING,\n              fileType: cfg.fileType,\n              name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent,\n              content: generateFunction(lifeCycles[lifeCycleName], {\n                isBlock: true,\n                isToVue: true,\n              }),\n              linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent]],\n            };\n          }\n\n          if (normalizeName === 'componentWillUnmount') {\n            // TODO(grammar 2024.10.29) 涉及到react专有语法后续遇到再处理（已处理this.xxx，this.setState()）\n            return {\n              type: ChunkType.STRING,\n              fileType: cfg.fileType,\n              name: TEMPLATE_DEFINE_CHUNK_NAME.UnMountedContent,\n              content: generateFunction(lifeCycles[lifeCycleName], {\n                isBlock: true,\n                isToVue: true,\n              }),\n              linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.UnMountedContent]],\n            };\n          }\n\n          if (normalizeName === 'render') {\n            // todo 暂时不处理 render\n            // return {\n            //   type: ChunkType.STRING,\n            //   fileType: cfg.fileType,\n            //   name: TEMPLATE_DEFINE_CHUNK_NAME.ClassRenderPre,\n            //   content: generateFunction(lifeCycles[lifeCycleName], { isBlock: true }),\n            //   linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ClassRenderStart],\n            // };\n          }\n\n          return {\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.Method,\n            content: generateFunction(lifeCycles[lifeCycleName], {\n              name: exportName,\n              isMember: true,\n              isToVue: true,\n            }),\n            linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.Method]],\n          };\n        })\n        .filter((i) => !!i);\n\n      next.chunks.push(...chunks.filter((x): x is ICodeChunk => x !== null));\n    }\n\n    // 调用数据源方法\n      const dataSourceConfig: ExtraInterpretDataSource = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n      const dataSourceItems: InterpretDataSourceConfig[] =\n          (dataSourceConfig && dataSourceConfig.list) || [];\n      dataSourceItems.forEach(item => {\n          next.chunks.push({\n              type: ChunkType.STRING,\n              fileType: cfg.fileType,\n              name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent,\n              content: `  ${SUFFIX_DATA_SOURCE_MAP}.${getApiRequestMethodName(item.id)}();`,\n              linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent]],\n          })\n      })\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","/* eslint-disable @typescript-eslint/indent */\n\nimport { InterpretDataSourceConfig } from '@alilc/lowcode-types';\n\nimport { COMMON_CHUNK_NAME } from '../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n} from '../../../types';\n\nimport { isValidContainerType } from '../../../utils/schema';\nimport { lineToUppercase, toFirstUpperCase } from '../../../utils/changeCase';\nimport {\n  handleUrl,\n  requestHeaderHandler,\n  requestParamsHandler,\n} from '../../../utils/requestHandle';\nimport { JSONObject } from '@alilc/lowcode-datasource-types/src/value-type';\n\nexport interface PluginConfig {\n  fileType?: string;\n\n  /**\n   * 数据源配置\n   */\n  datasourceConfig?: {\n    /** 数据源引擎的版本 */\n    engineVersion?: string;\n\n    /** 数据源引擎的包名 */\n    enginePackage?: string;\n\n    /** 数据源 handlers 的版本 */\n    handlersVersion?: {\n      [key: string]: string;\n    };\n\n    /** 数据源 handlers 的包名 */\n    handlersPackages?: {\n      [key: string]: string;\n    };\n  };\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = () => {\n  // const cfg = {\n  //   ...config,\n  //   fileType: config?.fileType || FileType.JSX,\n  // };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const dataSourceConfig = isValidContainerType(pre.ir.containers[0])\n      ? pre.ir.containers[0].dataSource\n      : null;\n    const dataSourceItems: InterpretDataSourceConfig[] =\n      (dataSourceConfig && dataSourceConfig.list) || [];\n    const extra = (dataSourceConfig && dataSourceConfig.extra) || {}\n    if (dataSourceItems.length > 0) {\n      dataSourceItems.forEach((ds) => {\n        const dsType = ds.type || 'fetch';\n        // 请求类型\n        const method = toFirstUpperCase((ds.options?.method as string) ?? 'Post');\n        // 处理请求url\n        const url = handleUrl(ds, extra);\n        // 处理非自定义数据源和表单组件\n        // todo 表达式从if拆开，不然不好判空\n        const formData = dataSourceConfig.extra ? dataSourceConfig.extra[ds.id]?.columnToAttribute?.formData : ''\n        if (\n          dsType !== 'custom' &&\n            !formData\n        ) {\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.TS,\n            subModule: ds.id,\n            name: COMMON_CHUNK_NAME.ExternalDepsImport,\n            content: `\n              import { ${method}RequestModel, QueryType } from '@dc/vue-h5-base/src/http/request-model'\n              import { getDefaultConfig } from '@dc/vue-h5-base/src/http/config/custom-config'\n              import { PageModel } from '@dc/vue-h5-base/src/http/result-model'\n              import utils from '@/utils/utils'\n            `,\n            linkAfter: [],\n          });\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.TS,\n            subModule: ds.id,\n            name: COMMON_CHUNK_NAME.FileMainContent,\n            content: `\nexport default {\n  /**\n   * 分页查询\n   * @param data\n   */\n  ${ds.id}: (data?: QueryType) => {\n  ${requestHeaderHandler(ds.options?.headers as JSONObject)}\n  ${requestParamsHandler(ds.options?.params as JSONObject)}\n  return new ${method}RequestModel<PageModel<any>>(${url}, data).request()\n   },\n}\n            `,\n            linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n          });\n        } else {\n          console.log(dataSourceConfig.extra[ds.id]['columnToAttribute']['formData']);\n          const formId = url?.toString().split('/').pop();\n          const formName = lineToUppercase(dataSourceConfig.extra[ds.id]['code']);\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.TS,\n            subModule: ds.id,\n            name: COMMON_CHUNK_NAME.ExternalDepsImport,\n            content: `\n              import { GetRequestModel, PostRequestModel, PutRequestModel, QueryType } from '@dc/vue-h5-base/src/http/request-model'\n              import { getDefaultConfig } from '@dc/vue-h5-base/src/http/config/custom-config'\n              import { PageModel } from '@dc/vue-h5-base/src/http/result-model'\n            `,\n            linkAfter: [],\n          });\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.TS,\n            subModule: ds.id,\n            name: COMMON_CHUNK_NAME.FileMainContent,\n            content: `\nexport default {\n  /**\n   * 获取表单详情\n   * @param data\n   */\n  ${ds.id}: (data?: QueryType) => {\n  ${requestHeaderHandler(ds.options?.headers as JSONObject)}\n  ${requestParamsHandler(ds.options?.params as JSONObject)}\n  return new ${method}RequestModel<PageModel<any>>(${url}, data).request()\n   },\n  /**\n\t * 分页查询信息\n\t * @param query\n\t */\n  page: (query?: QueryType) => new PostRequestModel<PageModel<any>>('/${formName}/page', query).request(),\n    /**\n   * 新增\n   * @param data\n   */\n  add: (data: Partial<Record<string, string | number | Array<{}>>>) => {\n    return new PostRequestModel<any>('/${formName}/', data as unknown as QueryType).request()\n  },\n    /**\n   * 更新\n   * @param data\n   */\n  update: (data: Partial<Record<string, string | number | Array<{}>>>) => {\n    return new PutRequestModel<any>('/${formName}/', data as unknown as QueryType).request()\n  },\n  /**\n\t * 根据id获取详细信息\n\t * @param id\n\t */\n  getById: (id: string) => {\n    return new GetRequestModel<any>(\\`/${formName}/\\${id}\\`, {}).request()\n  },\n}\n            `,\n            linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n          });\n        }\n      });\n    }\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {\n    GLOBE_API_PARAM,\n    SUFFIX_API_METHOD,\n    SUFFIX_API_SCRIPT,\n    SUFFIX_DATA_SOURCE_MAP\n} from \"../../../../utils/requestHandle\";\nexport default {\n    updateVariable: `\n    /**\n     * 数据源的点击交互事件（请不要随意改动该方法）\n     * @param clickValue 事件传递的原参数\n     * @param extra 额外的参数（数据源相关的参数）\n     */\n    function updateVariable(clickValue: unknown, extra?: any) {\n    const { field, dataSourceId } = extra || {}\n    // 如果没有field，则不进行操作\n    if (!field) {\n        console.log('没有field，不进行操作')\n        return\n    }\n    (${GLOBE_API_PARAM} as any)[String(field)] = clickValue\n\n    const dsId = String(dataSourceId ?? '')\n    const maybeMethod = (${SUFFIX_DATA_SOURCE_MAP} as any)[dsId + '${SUFFIX_API_METHOD}']\n    if (typeof maybeMethod === 'function') {\n        maybeMethod().then((data: any) => {\n            // 分页状态挂载到全局参数上，避免 <script setup> 下 this 为 undefined\n            (${GLOBE_API_PARAM} as any)[dsId + 'IsLastPage'] = data?.data?.isLastPage\n            (${GLOBE_API_PARAM} as any)[dsId + 'NowPage'] = data?.data?.pageNum\n        })\n    }\n}`,\n    goPage: `\n    /**\n     * 页面跳转事件（请不要随意改动该方法）\n     * @param params 默认传入的参数\n     * @param extra 额外的参数\n     */\n    function goPage(params?: unknown, extra?: unknown) {\n    const extraObj = (extra && typeof extra === 'object') ? (extra as any) : {}\n    const pageId = (typeof extraObj?.['pathId'] === 'string' ? extraObj['pathId'] : '') || (typeof params === 'string' ? params : '') || ''\n    if (!pageId) {\n        // 如果没有路径的情况下，不进行跳转\n        return\n    }\n    // 进行页面跳转\n    router.push(pageId);\n}`,\n    pageHelperInfo:  `\n    /**\n     * 分页助手信息\n     * @param params\n     * @param extra\n     */\n    function pageHelperInfo(params?: unknown, extra?: unknown) {\n    const paramsObj = (params && typeof params === 'object') ? (params as any) : {}\n    const extraObj = (extra && typeof extra === 'object') ? (extra as any) : {}\n    const {\n        pageField = 'pageNum',\n        pageValue = 1,\n        rowsField = 'pageSize',\n        rowsValue = 10,\n        dataSourceId,\n    } = { ...(paramsObj || {}), ...(extraObj || {}) }\n\n    const pageFromParams = typeof paramsObj?.page === 'number' ? paramsObj.page : undefined\n    const rowsFromParams = typeof paramsObj?.rows === 'number' ? paramsObj.rows : undefined\n    return new Promise((resolve) => {\n        const dsId = String(dataSourceId ?? '')\n        const maybeMethod = (${SUFFIX_DATA_SOURCE_MAP} as any)[dsId + '${SUFFIX_API_METHOD}']\n        if (typeof maybeMethod !== 'function') {\n            resolve({\n                page: pageFromParams ?? pageValue,\n                rows: rowsFromParams ?? rowsValue,\n                total: 0,\n                isLastPage: true,\n            })\n            return\n        }\n\n        maybeMethod({\n            [pageField]: pageFromParams ?? pageValue,\n            [rowsField]: rowsFromParams ?? rowsValue,\n        }).then((data: any) => {\n            const dataObj = data?.data || {}\n            // 分页状态挂载到全局参数上，避免 <script setup> 下 this 为 undefined\n            (${GLOBE_API_PARAM} as any)[dsId + 'IsLastPage'] = dataObj?.isLastPage\n            (${GLOBE_API_PARAM} as any)[dsId + 'NowPage'] = dataObj?.pageNum\n            resolve({\n                page: dataObj?.[pageField],\n                rows: dataObj?.[rowsField],\n                total: dataObj?.total,\n                isLastPage: dataObj?.isLastPage,\n            })\n        })\n    })\n}`\n}","import { VUE_DEFAULT_LINK_AFTER, TEMPLATE_DEFINE_CHUNK_NAME } from '../../../const';\n\nimport { generateFunction } from '../../../utils/jsExpression';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType, ExtraInterpretDataSource,\n  FileType,\n  ICodeChunk,\n  ICodeStruct,\n  IContainerInfo,\n} from '../../../types';\nimport {isValidContainerType} from \"../../../utils/schema\";\nimport {InterpretDataSourceConfig} from \"@alilc/lowcode-types\";\nimport {\n  getApiHandleFunctionName,\n  getApiParamName, getApiRequestMethodName,\n  isJsExpression,\n  requestAfterDataHandler,\n} from \"../../../utils/requestHandle\";\nimport convertFunction from './convert/convert-function'\nimport convertVariable from './convert/convert-variable'\n\nexport interface PluginConfig {\n  fileType: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg: PluginConfig = {\n    fileType: FileType.VUE,\n    ...config,\n  };\n\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IContainerInfo;\n\n    if (!ir.methods) {\n      return next;\n    }\n\n    // 将这些 methods 都定义到 class 上\n    const { methods } = ir;\n    const chunks = Object.keys(methods).map<ICodeChunk>((methodName) => {\n      // 特殊处理的函数\n      const convertMethod = convertFunction[methodName as keyof typeof convertFunction]\n      if (convertMethod) {\n        return {\n          type: ChunkType.STRING,\n          fileType: cfg.fileType,\n          name: TEMPLATE_DEFINE_CHUNK_NAME.Method,\n          content: `${convertMethod}`,\n          linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.Method]],\n        }\n      }\n      // 正常处理的函数，generateFunction处理\n      return {\n      type: ChunkType.STRING,\n      fileType: cfg.fileType,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.Method,\n      content: `function ${generateFunction(methods[methodName], { name: methodName, isMember: true, isToVue: true })}`,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.Method]],\n    }});\n    // 数据源相关方法\n    const dataSourceConfig: ExtraInterpretDataSource = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n    const dataSourceItems: InterpretDataSourceConfig[] =\n        (dataSourceConfig && dataSourceConfig.list) || [];\n    dataSourceItems.forEach((item) => {\n      if (item.dataHandler && item.dataHandler.type == 'JSFunction') {\n        // 处理请求处理后置函数\n        const functionName = getApiHandleFunctionName(item.id)\n        const handleFunction = generateFunction(item.dataHandler, { name: functionName, isMember: true, isToVue: true })\n        next.chunks.push({\n          type: ChunkType.STRING,\n          fileType: cfg.fileType,\n          name: TEMPLATE_DEFINE_CHUNK_NAME.Method,\n          content: `function ${handleFunction}`,\n          linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.Method]],\n        })\n      }\n    });\n    next.chunks.push(...chunks);\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import {ItemList} from \"../../../../types/datasource-extra-base\";\nimport {lineToUppercase} from \"../../../../utils/changeCase\";\nimport {GLOBE_API_PARAM} from \"../../../../utils/requestHandle\";\n\nexport default {\n    /**\n     * 处理请求参数里的itemList\n     * @param value\n     */\n    itemList: (value: string) => {\n        if (!value) return []\n        // 替换里面的单引号为双引号\n        // value = value.replace(/'/g, '\"')\n        const valueJSON: ItemList[] = parseCustomObjectArray(value)\n        const strArray: { key: string; value: string }[] = []\n        const ascArray: string[] = []\n        const descArray: string[] = []\n        valueJSON.forEach(item => {\n            if (item.columnValue) {\n                const valueName = `${GLOBE_API_PARAM}.${item.columnValue.split('.')[0]}`\n                strArray.push({ key: lineToUppercase(item.columnName), value: valueName })\n            } else if (item.orderBy) {\n                if (item.orderBy == 'desc') {\n                    descArray.push(lineToUppercase(item.columnName))\n                }else if (item.orderBy == 'asc') {\n                    ascArray.push(lineToUppercase(item.columnName))\n                }\n            }\n        })\n        // 降序排序字段\n        descArray.length && strArray.push({\n            key: 'orderByDesc',\n            value: `'${descArray[0]}'`\n        })\n        // 升序排序字段\n        ascArray.length && strArray.push({\n            key: 'orderByAsc',\n            value: `'${ascArray[0]}'`\n        })\n        return strArray\n    }\n}\nfunction parseCustomObjectArray(str: string) {\n    if (str == '[]') {\n        return []\n    }\n    const result: Record<string, any>[] = [];\n\n    // 匹配每个对象\n    const objectRegex = /{([^}]+)}/g;\n    let match;\n    while ((match = objectRegex.exec(str)) !== null) {\n        const objString = match[1].trim(); // 获取对象内容\n        const obj: Record<string, any> = {};\n\n        // 匹配键值对\n        const keyValueRegex = /(\\w+)\\s*:\\s*([^,]+)(,|$)/g;\n        let keyValueMatch;\n        while ((keyValueMatch = keyValueRegex.exec(objString)) !== null) {\n            const key = keyValueMatch[1].trim();\n            let value = keyValueMatch[2].trim();\n\n            // 如果是字符串值，去掉首尾的单引号\n            if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n                value = value.slice(1, -1);\n            }\n\n            // 如果是类似 productType.value 的变量，当作字符串处理\n            if (/^\\w+\\.\\w+$/.test(value)) {\n                value = value; // 保持原样\n            }\n\n            obj[key] = value; // 添加到对象中\n        }\n\n        result.push(obj);\n    }\n\n    return result;\n}","import { TEMPLATE_DEFINE_CHUNK_NAME, VUE_DEFAULT_LINK_AFTER } from '../../../const';\n\nimport {\n    BuilderComponentPlugin,\n    BuilderComponentPluginFactory,\n    ChunkType, ExtraInterpretDataSource,\n    FileType,\n    ICodeStruct,\n} from '../../../types';\nimport { isValidContainerType } from '../../../utils/schema';\nimport { InterpretDataSourceConfig } from '@alilc/lowcode-types';\nimport {\n    getApiParamName, getApiRequestMethodName,\n    handleParamToRef, isJsExpression,\n    requestAfterDataHandler, SUFFIX_DATA_SOURCE_MAP\n} from \"../../../utils/requestHandle\";\nimport {generateFunction} from \"../../../utils/jsExpression\";\nimport convertVariable from \"./convert/convert-variable\";\n\nexport interface PluginConfig {\n    fileType?: string;\n    implementType: 'inConstructor' | 'insMember' | 'hooks';\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n    const cfg: PluginConfig & { fileType: string } = {\n        fileType: FileType.VUE,\n        implementType: 'inConstructor',\n        ...config,\n    };\n\n    const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n        const next: ICodeStruct = {\n            ...pre,\n        };\n\n        // 将api的结果转为ref变量\n        const dataSourceConfig = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n        const dataSourceItems: InterpretDataSourceConfig[] =\n            (dataSourceConfig && dataSourceConfig.list) || [];\n        // 将所有api请求方法包裹在dataSourceMap变量内\n// 将数据请求单独封装为方法，方便分页时重新出发方法\n        // 调用api的并将结果赋值给ref变量\n        dataSourceItems.forEach((item) => {\n            let paramsStr = '';\n            let paramsObject = `const ${item.id}Params = {};`;\n            const paramName = getApiParamName(item.id);\n            const strArray: { key: string; value: string }[] = [];\n            // 请求结果处理\n            const dataResults = requestAfterDataHandler(item, dataSourceConfig.extra)\n            // 当请求参数为js表达式时处理\n            //当参数不为空的时候\n            if (item.options && item.options.params) {\n                const params = item.options.params;\n                const keys = Object.keys(params);\n                for (let i = 0; i < keys.length; i++) {\n                    const key = keys[i]\n                    if (isJsExpression(params[key])) {\n                        // 如果是表达式，则转为字符串\n                        let handleValue = generateFunction(params[key], {\n                            isToVue: true,\n                            isDeleteLastSemicolon: true,\n                        })\n                        // 对itemList进行单独处理,将itemList里面的参数改为\n                        if (convertVariable[key as keyof typeof convertVariable]) {\n                            strArray.push(...convertVariable[key as keyof typeof convertVariable](handleValue))\n                        } else {\n                            strArray.push({\n                                key: key,\n                                value: handleValue,\n                            });\n                        }\n                    }\n                }\n                paramsStr = `${strArray.filter(item => item).map((item) => `${item.key}: ${item.value}`).join(',')}`;\n                paramsObject = `const ${paramName} = { ${paramsStr ? paramsStr + ',' : ''}...params}`;\n            } else if (item.options && !item.options.params) {\n                //当参数为空时，赋值一个空对象\n                paramsObject = `const ${paramName} = {...params}`;\n            }\n            // 请求参数\n            next.chunks.push({\n                type: ChunkType.STRING,\n                fileType: cfg.fileType,\n                name: TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapContent,\n                content: `\n  ${getApiRequestMethodName(item.id)}: async (params?: any) =>  {\n  ${paramsObject}\n  ${dataResults.join('\\n')}\n  return handleData\n},\n        `,\n                linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapContent]],\n            });\n\n        });\n        // datasourceMap开始\n        next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapStart,\n            content: `const ${SUFFIX_DATA_SOURCE_MAP} = {`,\n            linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapStart]],\n        });\n        // datasourceMap结束\n        next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: cfg.fileType,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapEnd,\n            content: `}`,\n            linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.DataSourceMapEnd]],\n        });\n        return next;\n    };\n    return plugin;\n};\n\nexport default pluginFactory;\n","/**\n * @description: 生成二级路由\n */\nimport { COMMON_CHUNK_NAME } from '../../../const';\n\nimport {\n    BuilderComponentPlugin,\n    BuilderComponentPluginFactory,\n    ChunkType,\n    FileType,\n    ICodeStruct,\n    IRouterInfo,\n} from '../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n    const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n        const next: ICodeStruct = {\n            ...pre,\n        };\n\n        const ir = next.ir;\n        ir.globalRouter?.routes?.filter(item => item.firstPage == 'false').forEach(route => {\n            next.chunks.push({\n                type: ChunkType.STRING,\n                fileType: FileType.TS,\n                name: COMMON_CHUNK_NAME.ExternalDepsImport,\n                subModule: route.fileName,\n                content: `export default [`,\n                linkAfter: [],\n            });\n            next.chunks.push({\n                type: ChunkType.STRING,\n                fileType: FileType.TS,\n                name: COMMON_CHUNK_NAME.FileMainContent,\n                subModule: route.fileName,\n                content: `{\n                      path: '${route.path}',\n                      name: '${route.title}',\n                      component: () => import(\"@/views/${route.componentName}/${\n                    route.isFormRouter ? 'Manage.vue' : 'Index.vue'\n                }\"),\n                    }`,\n                linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n            });\n            next.chunks.push({\n                type: ChunkType.STRING,\n                fileType: FileType.TS,\n                name: COMMON_CHUNK_NAME.FileExport,\n                subModule: route.fileName,\n                content: `]`,\n                linkAfter: [COMMON_CHUNK_NAME.FileMainContent],\n            });\n        })\n\n        return next;\n    };\n    return plugin;\n};\n\nexport default pluginFactory;\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.env',\n    '',\n    `\n# .env\nVITE_APP_API_LOGIN=/login\nVITE_APP_API_LOGIN_OUT=/loginOut\nVITE_APP_API_BASE_URL=/api\n\nVITE_APP_API_FILE_REVIEW=http://tz.future.dct99.com:8090/\n#VITE_APP_COPYRIGHT=Copyright@2022 版权所有：xxxx\n\n# oss\n#VITE_APP_OSS_URL=https://tz-community.oss-cn-hangzhou.aliyuncs.com\n#VITE_APP_API_OSS=/oss/logFile/upload\n#VITE_APP_OSS_SUFFIX=!tz_sy\n\n# message\n#VITE_APP_API_MESSAGE=/WxXcx/sendLoginCode\n#VITE_APP_API_CODE_LOGIN=/WxXcx/loginOrSignByMobile\n#VITE_APP_API_CODE_LOGIN_PARAMS_MOBILE=mobile\n#VITE_APP_API_CODE_LOGIN_PARAMS_CODE=smsCode\n\n# mask\nVITE_APP_DEFAULT_MASK='false'\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.eslintignore',\n    '',\n    `\nnode_modules\n.vscode\n.idea\ndist\n/public\n.eslintrc.js\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    '.eslintrc',\n    'yml',\n    `\nenv:\n  browser: true\n  es2021: true\n  node: true\n  'vue/setup-compiler-macros': true\nextends:\n  - eslint:recommended\n  - plugin:vue/essential\n  - prettier\n  - plugin:prettier/recommended\n  - plugin:@typescript-eslint/recommended\nparserOptions:\n  ecmaVersion: 2020\n  parser: '@typescript-eslint/parser'\n  sourceType: module\nparser: 'vue-eslint-parser'\nplugins:\n  - vue\n  - '@typescript-eslint'\nrules:\n  # 缩进 tab\n  indent:\n    - error\n    - tab\n    - SwitchCase: 1\n  # 字符单引号\n  quotes:\n    - error\n    - single\n  # 尾部分号\n  semi:\n    - error\n    - never\n  # 支持单个template中多个一级标签\n  vue/no-multiple-template-root: off\n  # 处理v-model后方参数问题\n  vue/no-v-model-argument: off\n  # 组件名称检查\n  vue/multi-word-component-names: 0\n    `,\n  );\n\n  return [[], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: '.gitignore',\n      ext: '',\n      content: `\n# 项目的环境文件\n.DS_Store\nnode_modules\n/dist\n\n\n# 本地环境文件\n.env.local\n.env.*.local\n\n# 日志文件\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n*-debug.log\n\n# 编辑目录和文件\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\nlocal\n\n# 此文件需要提交，该文件旨在跟踪被安装的每个软件包的确切版本，以便产品可以以相同的方式被 100％ 复制\npackage-lock.json\nyarn.lock\npnpm-lock.yaml\n\n# 排除本地文件\nlocal/\n\ndist.zip\n            `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: '.npmrc',\n      ext: '',\n      content: `\n@dc-basic-component:registry=https://nexus.dct99.com/repository/npm-public/\n@dc:registry=https://nexus.dct99.com/repository/npm-public/\nshamefully-hoist=true\nstrict-peer-dependencies=false\n            `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: '.prettierignore',\n      ext: '',\n      content: `\nnode_modules\n.vscode\n.idea\ndist\n/public\n.eslintrc.js\n*.yml\n*.yaml\n*.md\n*.min.js\n            `\n    }\n  ];\n}\n\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: '.prettierrc',\n      ext: 'yml',\n      content: `\n# 每行代码长度（默认80）\nprintWidth: 160\n# 每个tab相当于多少个空格（默认2）\ntabWidth: 4\n# 是否使用tab进行缩进（默认false）\nuseTabs: true\n# 使用单引号（默认false）\nsingleQuote: true\n# 声明结尾使用分号(默认true)\nsemi: false\n# 多行使用拖尾逗号（默认none）\ntrailingComma: none\n# 对象字面量的大括号间使用空格（默认true）\nbracketSpacing: true\n# 只有一个参数的箭头函数的参数是否带圆括号（默认avoid）\narrowParens: 'avoid'\n# 行结束问题处理, lf\nendOfLine: lf\n            `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'index',\n      ext: 'html',\n      content: `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\"/>\n    <link rel=\"icon\" type=\"image/png\" href=\"/logo.png\"/>\n    <meta name=\"viewport\"\n          content=\"width=device-width, initial-scale=1.0, user-scalable=1.0, minimum-scale=1.0, maximum-scale=1.0, viewport-fit=cover\"/>\n    <title>码铺</title>\n  <!--微信web view api-->\n  <script type=\"text/javascript\" src=\"https://res.wx.qq.com/open/js/jweixin-1.3.2.js\"></script>\n</head>\n<body>\n<div id=\"app\">\n    <div class=\"loading\" style=\"display: flex;justify-content: center;align-items: center;height: 100vh\">\n        <div class=\"loading__icon\"></div>\n        <div class=\"loading__text\">请稍等，页面加载中...</div>\n    </div>\n</div>\n<script type=\"module\" src=\"/src/main.ts\"></script>\n</body>\n</html>\n            `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'postcss.config',\n      ext: 'cjs',\n      content: '// postcss.config.js\\n' +\n        'module.exports = {\\n' +\n        '  plugins: {\\n' +\n        '   \\'postcss-px-to-viewport\\': {\\n' +\n        '    // 设计稿宽度\\n' +\n        '    viewportWidth: 375,\\n' +\n        '    // 排除 node_modules\\n' +\n        '    // exclude: /(\\\\/|\\\\\\\\)(node_modules)(\\\\/|\\\\\\\\)/,\\n' +\n        '    // 不转换的类名\\n' +\n        '    selectorBlackList: [\\'.ignore\\', \\'.hairlines\\']\\n' +\n        '   }\\n' +\n        '  }\\n' +\n        '}'\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'tsconfig',\n      ext: 'json',\n      content: `\n{\n  \"compilerOptions\": {\n    \"target\": \"ESNext\",\n    \"useDefineForClassFields\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"strict\": true,\n    \"jsx\": \"preserve\",\n    \"sourceMap\": true,\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"esModuleInterop\": true,\n    \"lib\": [\"ESNext\", \"DOM\"],\n    \"skipLibCheck\": true,\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/*\": [\"src/*\"]\n    }\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"],\n  \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n            `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'tsconfig.node',\n      ext: 'json',\n      content: `\n{\n  \"compilerOptions\": {\n    \"composite\": true,\n    \"module\": \"ESNext\",\n    \"moduleResolution\": \"Node\",\n    \"allowSyntheticDefaultImports\": true\n  },\n  \"include\": [\"vite.config.ts\"]\n}\n            `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\n\nexport default function getFile(): [string[], ResultFile] {\n  return [\n    [],\n    {\n      name: 'vite.config',\n      ext: 'ts',\n      content: `\nimport { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport viteCompression from 'vite-plugin-compression'\nimport * as path from 'path'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '/expressH5/',\n plugins: [vue(), viteCompression()],\n resolve: {\n  alias: {\n   '@': path.resolve(__dirname, './src'),\n   '~@': path.resolve(__dirname, './src')\n  }\n },\n server: {\n  // host: '127.0.0.1',\n  host: '0.0.0.0',\n  port: 3212,\n  cors: true,\n  proxy: {\n   '/api': {\n    target: 'http://localhost:9933/',\n    changeOrigin: true,\n    ws: true,\n    rewrite: path => path.replace(/\\\\\\/api/g, '/')\n   }\n  }\n },\n css: {\n  preprocessorOptions: {\n   less: {\n    javascriptEnabled: true\n   }\n  }\n },\n   define: {\n    __VUE_OPTIONS_API__: true,\n    __VUE_PROD_DEVTOOLS__: false,\n    __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false\n   },\n // 配置打包块大小\n build: {\n  chunkSizeWarningLimit: 1500\n },\n optimizeDeps: {\n  exclude: ['@dc/vue-h5-base'],\n  include: ['axios']\n }\n})\n      `\n    }\n  ];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'global',\n    'scss',\n    `\n* {\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n.page {\n  // 不显示滚动条\n  scrollbar-width: none; /* Firefox */\n  background: #fff;\n\n  &::-webkit-scrollbar {\n    display: none; /* Chrome Safari */\n  }\n\n  height: 100vh;\n  width: 100vw;\n  display: flex;\n  flex-direction: column;\n  overflow: hidden scroll;\n  box-sizing: border-box;\n\n  // 子元素高度问题处理\n  & > * {\n    flex: 0 0 auto;\n  }\n\n  & > & {\n    flex: 1 1 auto;\n  }\n}\n\n.van-uploader {\n  flex: 1 1 auto;\n}\n\n.van-search {\n  background: #ffffff;\n  padding: 10px 16px;\n  border-top: 1px solid #f3f3f3;\n\n  @at-root &__content--round {\n    background: #f3f3f3;\n    padding: 4px 16px;\n  }\n}\n\n// 管理页面\n.manage-page {\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  padding-bottom: 16px;\n\n  --van-tab-text-color: var(--van-text-color-3);\n  --van-tab-active-text-color: var(--van-primary-color);\n  --van-tabs-bottom-bar-color: var(--van-primary-color);\n\n  .van-pull-refresh {\n    flex: 1 1 auto;\n    overflow-y: scroll;\n    padding: 16px;\n  }\n}\n\n// 详情页面\n.detail-page {\n  flex: 1 1 auto;\n  overflow-y: auto;\n  font-size: 14px;\n  font-weight: 400;\n  color: #9b9ba3;\n  padding-bottom: 16px;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n\n  .detail {\n    display: grid;\n    grid-template-columns: max-content 1fr;\n    box-shadow: 0 0 0.5rem 0 rgba(35, 24, 21, 0.1);\n    grid-row-gap: 16px;\n    column-gap: 16px;\n    background: white;\n    margin: 16px 16px 0 16px;\n    padding: 16px;\n    border-radius: 10px;\n\n    @at-root &__label {\n      color: #51515c;\n      display: flex;\n      align-items: center;\n      grid-column: 1;\n\n      &:before {\n        content: '';\n        width: 6px;\n        height: 6px;\n        border-radius: 3px;\n        background: #aeaeb4;\n        margin-right: 6px;\n        display: inline-block;\n      }\n    }\n\n    @at-root &__value {\n      grid-column: 2;\n      color: #9b9ba3;\n      flex: 1 1 auto;\n      text-align: right;\n    }\n\n    @at-root &__images {\n      grid-column: 1/-1;\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n\n      .van-image {\n        width: 100%;\n        min-height: 60px;\n        aspect-ratio: 1;\n      }\n    }\n\n    .van-divider {\n      grid-column: span 2;\n      margin: 0;\n    }\n  }\n}\n\n// 弹窗页面\n.overlay-page {\n  width: 100vw;\n  height: 100vh;\n\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n\n  background: transparent;\n  padding: 16px;\n\n\n  .van-form {\n    flex: 0 0 auto;\n    overflow-y: auto;\n    display: flex;\n    flex-direction: column;\n    background: white;\n    border-radius: 10px;\n\n    .van-button {\n      margin: 15px 16px;\n    }\n  }\n\n  .van-cell.tip {\n    color: #d46b08;\n  }\n}\n\n.card__actions {\n  grid-column: 1 / -1;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: 10px;\n\n  @at-root &__button {\n    font-size: 12px;\n    font-weight: 500;\n    border-radius: 18px;\n    padding: 0 8px;\n    height: 24px;\n\n  }\n}\n\n/*占位*/\n.spacer {\n  flex: 1 1 auto;\n}\n\n.spacer-2 {\n  flex: 2 1 auto;\n}\n`,\n  );\n\n  return [['src', 'assets', 'scss'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'mixin',\n    'scss',\n    `\n//sass常用混合器(应该合理使用)\n// 弹性布局混合器\n@mixin flexMixer($justify: center, $align: center, $flex: row) {\n\\t// 申明为弹性盒子\n\\tdisplay: flex;\n\\t// 排列方式\n\\tflex-direction: $flex;\n\\t// 主（副）轴的对齐方式\n\\tjustify-content: $justify;\n\\t// 主（副）轴的对齐方式\n\\talign-items: $align;\n}\n// 定位混合器\n@mixin positionMixer($position: static, $left: auto, $top: auto, $right: auto, $bottom: auto) {\n\\tposition: $position;\n\\tleft: $left;\n\\ttop: $top;\n\\tright: $right;\n\\tbottom: $bottom;\n}\n// 浮动混合器\n@mixin floatMixer($float: left) {\n\\tfloat: $float;\n}\n// 设置背景混合器\n@mixin bgMixer($url, $position: center center, $size: 100% 100%, $repeat: no-repeat) {\n\\tbackground: $url $repeat $position;\n\\tbackground-size: $size;\n}\n// 宽高混合器\n@mixin widthMixer($width: 100px, $height: 100px) {\n\\twidth: $width;\n\\theight: $height;\n}\n// 文字混合器\n@mixin fontMixer($fontSize: 16px, $color: #515a6e, $weight: 500, $font-familyt: Source Han Sans SC) {\n\\tfont-family: $font-familyt;\n\\tfont-size: $fontSize;\n\\tfont-weight: $weight;\n\\tcolor: $color;\n}\n\n// 多行字体省略混合器\n@mixin pointMixer($line: 2) {\n\\tdisplay: -webkit-box; //必须结合的属性 ，将对象作为弹性伸缩盒子模型显示 。\n\\tword-break: break-all;\n\\t-webkit-line-clamp: $line;\n\\tline-clamp: $line;\n\\toverflow: hidden;\n\\ttext-overflow: ellipsis; //可以用来多行文本的情况下，用省略号“…”隐藏超出范围的文本 。\n\\twhite-space: normal;\n\\t/* autoprefixer: off */\n\\t-webkit-box-orient: vertical; //必须结合的属性 ，设置或检索伸缩盒对象的子元素的排列方式 。\n\\t/* autoprefixer: on */\n}\n`,\n  );\n\n  return [['src', 'assets', 'scss'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'theme',\n    'css',\n    `\n@import '@dc/vue-h5-base/src/assets/scss/theme.css';\n\n:root {\n\\t--van-primary-color: #008fff;\n\\t/* Color Palette */\n\\t--van-gray-9: #eeeeee;\n\\t--van-gray-10: #bdbdbd;\n\\t--van-gray-11: #cccccc;\n\\t--van-blue-1: #008fff;\n\\t--van-blue-2: #3296fb;\n\\t--van-orange-1: #f27623;\n\n\\t/* --------------------------------------------- */\n\\t/* tabbar height */\n\\t--van-tabbar-height: 50px;\n\n\\t/* --------------------------------------------- */\n\\t/* input 背景色*/\n\\t--input-background-color: #f4f4f4;\n\n\\t/* --------------------------------------------- */\n\\t/* 浙里办主题 */\n\n\\t/* 圆角*/\n\\t--zlb-radius-r5: 10px;\n\\t--zlb-radius-r6: 12px;\n\\t--zlb-radius-r7: 14px;\n\\t--zlb-radius-r8: 16px;\n\\t--zlb-radius-r9: 18px;\n\n\\t/* --------------------------------------------- */\n\\t/* 字体颜色 */\n\\t--van-text-color-4: #7897ba;\n\\t--van-text-color-5: #232d2d;\n\\t/*--van-text-size2: 18px;*/\n\n\\t/* --------------------------------------------- */\n\\t/* 字体 */\n\\t/*已有字体，可以不用覆写*/\n\\t--van-font-size-xs: 10px;\n\\t--van-font-size-sm: 12px;\n\\t--van-font-size-md: 14px;\n\\t--van-font-size-lg: 16px;\n\\t/*追加一个超大号字体*/\n\\t--van-font-size-ml: 18px;\n\n\\t/* --------------------------------------------- */\n\\t/*输入框样式*/\n\\t--van-field-label-color: var(--van-text-color);\n\\t--van-field-placeholder-text-color: var(--van-text-color-3);\n\n\\t/* --------------------------------------------- */\n\\t/*输入框样式*/\n\\t/*--van-uploader-size: 69px;*/\n\\t/*--van-uploader-delete-icon-size: 18px;*/\n\n\\t--title-bar-height: 50px;\n\\t--title-bar-padding-top: 0;\n\n\\t--van-cascader-active-color: var(--van-primary-color);\n\\t--van-cascader-tab-color: var(--van-primary-color);\n\\t--van-tabs-bottom-bar-color: var(--van-primary-color);\n}\n  `,\n  );\n\n  return [['src', 'assets', 'scss'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'App',\n    'vue',\n    `\n<template>\n\\t<router-view v-slot=\"{ Component }\">\n\\t\\t<!--\\t\\t<keep-alive>-->\n\\t\\t<component :is=\"Component\" />\n\\t\\t<!--\\t\\t</keep-alive>-->\n\\t</router-view>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onMounted } from 'vue'\nimport { useRequestStore } from '@dc/vue-h5-base/src/store/request'\n\nlet store = useRequestStore()\n\nonMounted(() => {\n\\tstore.$reset()\n})\n</script>\n\n<style>\n.amap-logo {\n\\tdisplay: none;\n\\topacity: 0 !important;\n}\n\n.amap-copyright {\n\\topacity: 0;\n}\n</style>\n  `,\n  );\n\n  return [['src'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'main',\n    'ts',\n    `\nimport { createApp } from 'vue'\nimport App from './App.vue'\n\n/**\n * 状态管理\n */\nimport { createPinia } from 'pinia'\nimport piniaPluginPersist from 'pinia-plugin-persist'\n// 路由\nimport router from './router'\n/**\n * vant 组件，按需引入\n */\nimport Vant from 'vant'\nimport 'vant/lib/index.css'\n\n// 覆盖主题样式\nimport '@/assets/scss/theme.css'\n\n/* 这里是基础框架的样式 */\nimport '@/assets/scss/global.scss'\nimport '@dc/vue-h5-base/src/assets/font/iconfont.css'\nimport '@dckj-npm/lowcode-vue-materials/style.css'\n\nconst apiBaseUrl = import.meta.env.VITE_APP_API_BASE_URL || '/api'\nconst app = createApp(App)\napp.config.globalProperties.$lowcodeApiBaseUrl = apiBaseUrl\n\napp\n\t.use(createPinia().use(piniaPluginPersist))\n\t.use(Vant)\n\t// 路由\n\t.use(router)\n\t.mount('#app')\n\n  `,\n  );\n\n  return [['src'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'vite-env.d',\n    'ts',\n    `\ndeclare module '*.vue' {\n  import type { DefineComponent } from 'vue'\n  const component: DefineComponent<{}, {}, any>\n  export default component\n}\n\ninterface ImportMetaEnv {\n  // 登录的接口地址\n  readonly VITE_APP_API_LOGIN: string\n  // 登录的接口地址\n  readonly VITE_APP_API_LOGIN_OUT: string\n  // 登录的接口地址\n  readonly VITE_APP_API_BASE_URL: string\n  //文件预览地址前缀\n  readonly VITE_APP_API_FILE_REVIEW: string\n\n  // copyright\n  readonly VITE_APP_COPYRIGHT: string\n  // 默认的请求遮罩层是否开启\n  readonly VITE_APP_DEFAULT_MASK: boolean\n}\n\ninterface ImportMeta {\n  readonly env: ImportMetaEnv\n}\n\ndeclare module '@vue/runtime-core' {\n  interface ComponentCustomProperties {\n    $lowcodeApiBaseUrl: string\n  }\n}\n  `,\n  );\n\n  return [['src'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'Welcome',\n    'vue',\n    `\n<template>\n    <div></div>\n</template>\n\n<script lang=\"ts\" setup>\n</script>\n\n<style lang=\"scss\" scoped>\n</style>\n  `,\n  );\n\n  return [['src', 'views', 'baseIndexA'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n  const file = createResultFile(\n    'tabs',\n    'ts',\n    `\n// import home from '@/assets/images/index/home.png'\n// import homeActive from '@/assets/images/index/home-active.png'\n// import housekeeper from '@/assets/images/index/housekeeper.png'\n// import housekeeperActive from '@/assets/images/index/housekeeper-active.png'\n// import mine from '@/assets/images/index/mine.png'\n// import mineActive from '@/assets/images/index/mine-active.png'\n//\n// export interface TabItem {\n//  /**\n//   * 标题\n//   */\n//  label: string\n//  /**\n//   * 图标\n//   */\n//  icon: string\n//  /**\n//   * 激活图标\n//   */\n//  activeIcon: string\n//  /**\n//   * 路由地址\n//   */\n//  router: string\n// }\n//\n// export const tabs: Array<TabItem> = [\n//  {\n//   label: '首页',\n//   icon: home,\n//   activeIcon: homeActive,\n//   router: '/home'\n//  },\n//  {\n//   label: '消息',\n//   icon: housekeeper,\n//   activeIcon: housekeeperActive,\n//   router: '/message'\n//  },\n//  {\n//   label: '我的',\n//   icon: mine,\n//   activeIcon: mineActive,\n//   router: '/mine'\n//  }\n// ]\n  `,\n  );\n\n  return [['src', 'views', 'baseIndexA'], file];\n}\n","import { ResultFile } from '@alilc/lowcode-types';\nimport { createResultFile } from '../../../../../../../../utils/resultHelper';\n\nexport default function getFile(): [string[], ResultFile] {\n    const file = createResultFile(\n        'utils',\n        'ts',\n        `\nexport default {\n    /**\n     * 跳转到指定的pathId，仅限预览页面\n     * @param pageId\n     * @param isNew\n     */\n    gotoByPageId: (pageId: string, isNew: boolean) => {\n      // 获取已有的path参数信息\n      const oldPageId = getValueFromQueryByName('pageId')\n      if (!oldPageId) {\n        console.error('pageId is not exist')\n        return\n      }\n      // 添加地址栏中的pathId参数信息\n      const resultPath = window.location.href.replace(\\`pageId=\\${oldPageId}\\`, \\`pageId=\\${pageId}\\`)\n      if (isNew) {\n        window.open(resultPath)\n      } else {\n        window.location.href = resultPath\n      }\n    },\n    /**\n     * 获取地址栏参数值\n     * @param queryName 参数名\n     * @param defaultValue 默认值\n     */\n    getValueFromQueryByName: (queryName: string, defaultValue: string = '') => {\n      return getValueFromQueryByName(queryName, defaultValue)\n    },\n    /**\n     * 获取cookie中的值\n     * @param cookieName\n     * @param defaultValue\n     */\n    getValueFromCookieByName: (cookieName: string, defaultValue: string = '') => {\n      const reg = new RegExp('(^| )' + cookieName + '=([^;]*)(;|$)')\n      const arr = document.cookie.match(reg)\n      if (arr) {\n        return unescape(arr[2])\n      } else {\n        return defaultValue\n      }\n    },\n    /**\n     * 获取localStorage中的值\n     * @param key\n     * @param defaultValue\n     */\n    getValueFromLocalStorage: (key: string, defaultValue: string = '') => {\n      return localStorage.getItem(key) || defaultValue\n    },\n    /**\n     * 获取sessionStorage中的值\n     * @param key\n     * @param defaultValue\n     */\n    getValueFromSessionStorage: (key: string, defaultValue: string = '') => {\n      return sessionStorage.getItem(key) || defaultValue\n    }\n}\n  `,\n    );\n\n    return [['src', 'utils'], file];\n}\n","import { ResultDir } from '@alilc/lowcode-types';\n\nimport { createResultDir } from '../../../../../utils/resultHelper';\nimport { runFileGenerator } from '../../../../../utils/templateHelper';\n\nimport file12 from './files/env';\nimport file11 from './files/eslintignore';\nimport file10 from './files/eslintrc.yml';\nimport file9 from './files/gitignore';\nimport file8 from './files/npmrc';\nimport file7 from './files/prettierignore';\nimport file6 from './files/prettierrc.yml';\nimport file5 from './files/index.html';\nimport file4 from './files/postcss.config.cjs';\nimport file13 from './files/tsconfig.json';\nimport file16 from './files/tsconfig.node.json';\nimport file17 from './files/vite.config.ts';\nimport file18 from './files/css/global.scss';\nimport file19 from './files/css/mixin.scss';\nimport file20 from './files/css/theme.css';\nimport file14 from './files/src/App.vue';\nimport file15 from './files/src/main';\nimport file3 from './files/src/vite-env';\nimport file21 from './files/src/views/baseIndexA/welcome.vue';\nimport file22 from './files/src/views/baseIndexA/tabs';\nimport file23 from './files/src/utils/utils';\n\nexport function generateStaticFiles(root = createResultDir('.')): ResultDir {\n  runFileGenerator(root, file3);\n  runFileGenerator(root, file4);\n  runFileGenerator(root, file5);\n  runFileGenerator(root, file6);\n  runFileGenerator(root, file7);\n  runFileGenerator(root, file8);\n  runFileGenerator(root, file9);\n  runFileGenerator(root, file10);\n  runFileGenerator(root, file11);\n  runFileGenerator(root, file12);\n  runFileGenerator(root, file13);\n  runFileGenerator(root, file14);\n  runFileGenerator(root, file15);\n  runFileGenerator(root, file16);\n  runFileGenerator(root, file17);\n  runFileGenerator(root, file18);\n  runFileGenerator(root, file19);\n  runFileGenerator(root, file20);\n  runFileGenerator(root, file21);\n  runFileGenerator(root, file22);\n  runFileGenerator(root, file23);\n\n  return root;\n}\n","import { ResultDir } from '@alilc/lowcode-types';\nimport { IProjectTemplate } from '../../../../../types';\nimport { generateStaticFiles } from './static-files';\n\nconst vuejs3Template: IProjectTemplate = {\n  slots: {\n    // 不能少，会报错\n    components: {\n      path: ['src', 'components'],\n    },\n    // 不能少，会报错\n    pages: {\n      path: ['src', 'views'],\n    },\n    router: {\n      path: ['src', 'router'],\n      fileName: 'index',\n    },\n    // 路由二级页面\n    routerModules: {\n      path: ['src', 'router', 'modules']\n    },\n    // entry: {\n    //   path: ['src'],\n    //   fileName: 'app',\n    // },\n    // constants: {\n    //   path: ['src'],\n    //   fileName: 'constants',\n    // },\n    // 不能少，会报错\n    utils: {\n      path: ['src', 'utils'],\n      fileName: 'utils',\n    },\n    // 不能少，会报错\n    i18n: {\n      path: ['src'],\n      fileName: 'i18n',\n    },\n    // globalStyle: {\n    //   path: ['src'],\n    //   fileName: 'global',\n    // },\n    // htmlEntry: {\n    //   path: ['public'],\n    //   fileName: 'index',\n    // },\n    packageJSON: {\n      path: [],\n      fileName: 'package',\n    },\n    // 接口api\n    api: {\n      path: ['src', 'api'],\n    },\n    // 主入口首页\n    main: {\n      path: ['src', 'views', 'baseIndexA'],\n      fileName: 'Index',\n    },\n    //表单页面\n    form: {\n      path: ['src', 'views'],\n    },\n    // hooks\n    hooks: {\n      path: ['src', 'hooks'],\n    },\n  },\n\n  generateTemplate(): ResultDir {\n    return generateStaticFiles();\n  },\n};\n\nexport default vuejs3Template;\n","import { PackageJSON } from '@alilc/lowcode-types';\n\nimport { COMMON_CHUNK_NAME } from '../../../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n} from '../../../../../types';\n// todo 后续考虑自定义axios请求，再从schema中获取数据源依赖\n// import { buildDataSourceDependencies } from '../../../../../utils/dataSource';\n\ninterface IIceJsPackageJSON extends PackageJSON {\n  type: string;\n}\n\nexport interface IceJsPackageJsonPluginConfig {\n  /**\n   * 数据源配置\n   */\n  datasourceConfig?: {\n    /** 数据源引擎的版本 */\n    engineVersion?: string;\n    /** 数据源引擎的包名 */\n    enginePackage?: string;\n    /** 数据源 handlers 的版本 */\n    handlersVersion?: {\n      [key: string]: string;\n    };\n    /** 数据源 handlers 的包名 */\n    handlersPackages?: {\n      [key: string]: string;\n    };\n  };\n  /** 包名 */\n  packageName?: string;\n  /** 版本 */\n  packageVersion?: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<IceJsPackageJsonPluginConfig> = (cfg) => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    const packageJson: IIceJsPackageJSON = {\n      name: cfg?.packageName || 'vuejs3-demo-app',\n      private: true,\n      version: cfg?.packageVersion || '0.0.1',\n      type: 'module',\n      scripts: {\n        dev: 'vite',\n        build: 'vite build',\n        preview: 'vite preview',\n      },\n      description: 'vue3基础项目',\n      dependencies: {\n        axios: '^1.7.7',\n        dayjs: '^1.11.9',\n        'js-base64': '^3.7.5',\n        pinia: '^2.0.20',\n        'pinia-plugin-persist': '^1.0.0',\n        'postcss-px-to-viewport': '^1.1.1',\n        vant: '^3.6.4',\n        vue: '^3.3',\n        'vue-router': '^4.1.3',\n        '@dckj-npm/lowcode-vue-materials': '^1.2.107',\n        'ant-design-vue': '^4.2.5',\n        jsencrypt: '^3.3.2',\n      },\n      devDependencies: {\n        '@dc/vue-h5-base': '^1.0.59',\n        '@types/node': '^17.0.45',\n        '@typescript-eslint/eslint-plugin': '^5.56.0',\n        '@typescript-eslint/parser': '^5.56.0',\n        '@vitejs/plugin-vue': '^3.2.0',\n        '@vue/compiler-sfc': '3.2.33',\n        '@vue/eslint-config-prettier': '^7.1.0',\n        eslint: '^8.36.0',\n        'eslint-plugin-prettier': '^4.2.1',\n        'eslint-plugin-vue': '^8.7.1',\n        prettier: '^2.8.6',\n        sass: '^1.60.0',\n        typescript: '^4.9.5',\n        vite: '^3.2.5',\n        'vite-plugin-compression': '^0.5.1',\n        'vite-plugin-eslint': '^1.8.1',\n        'vite-plugin-style-import': '^2.0.0',\n        'vue-eslint-parser': '^8.3.0',\n        'vue-tsc': '^0.40.13',\n      },\n    };\n\n    // ir.packages.forEach((packageInfo) => {\n    //   packageJson.dependencies[packageInfo.package] = packageInfo.version;\n    // });\n\n    next.chunks.push({\n      type: ChunkType.JSON,\n      fileType: FileType.JSON,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: packageJson,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { RouterInfoItem } from \"../types\";\n\n/**\n * 获取一级路由信息\n * @param routes\n */\nexport function getRouters(routes: RouterInfoItem[]) {\n    return routes.filter(item => item.firstPage != 'false').map(route => {\n                return `\n                            {\n                                path: '${route.path}',\n                                name: '${route.title}',\n                                component: () => import(\"@/views/${route.componentName}/${\n                                route.isFormRouter ? 'Manage.vue' : 'Index.vue'\n                        }\"),\n                            }`\n    })\n}\n\n/**\n * 获取二级路由信息\n * @param routes\n */\nexport function getSecondRouters(routes: RouterInfoItem[]) {\n    return routes.filter(item => item.firstPage == 'false').map(route => {\n        return `{\n                      path: '${route.path}',\n                      name: '${route.componentName}',\n                      component: () => import(\"@/views/${route.componentName}/${\n            route.isFormRouter ? 'Manage.vue' : 'Index.vue'\n        }\"),\n                    }`\n    })\n}","import { COMMON_CHUNK_NAME } from '../../../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IRouterInfo,\n} from '../../../../../types';\nimport {getRouters} from \"../../../../../utils/routerHandle\";\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IRouterInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: `\n        import {\n          \\tcreateRouter,\n          \\tcreateWebHashHistory,\n          \\tcreateWebHistory,\n          \\tNavigationGuardNext,\n          \\tRouteLocationNormalized,\n          \\tRouteLocationNormalizedLoaded,\n          \\tRouteRecordRaw\n        } from \"vue-router\"\n        import { useSystemStore } from \"@dc/vue-h5-base/src/store/system\"\n        import { setRouter, defaultBeforeEach } from \"@dc/vue-h5-base/src/router\"\n        import { useUserStore } from '@dc/vue-h5-base/src/store/user'\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.FileVarDefine,\n      content: `\n// 动态导入所有modules下的路由文件信息\nconst modelsFile = import.meta.globEager<Record<\"default\", Array<RouteRecordRaw>>>(\"./modules/**/*.ts\")\n\n// 路由去中心化\nconst children =\n  Object.keys(modelsFile)\n    .map((key: string) => modelsFile[key].default)\n    .flat(1) || []\n\n/**\n * 系统路由信息\n */\nconst routes: RouteRecordRaw[] = [\n    {\n        path: \"/\",\n        redirect: \"${ir.routes[0].path}\",\n        name: \"index\",\n        meta: {\n            keepAlive: true\n        },\n        component: () => import(\"@/views/baseIndexA/Index.vue\"),\n        children: [\n            ${getRouters(ir.routes).join(',')}\n        ]\n    },\n    {\n        path: \"/business\",\n        name: \"business\",\n        component: () => import(\"@dc/vue-h5-base/src/views/Main.vue\"),\n        children: children,\n        // 这里用来显示标题\n        props: (route: RouteLocationNormalizedLoaded) => ({\n            title: route.query.title || route.query.title || route.name\n        })\n    },\n    {\n        path: \"/login\",\n        name: \"登录\",\n        component: () => import(\"@dc/vue-h5-base/src/views/login/Login.vue\")\n    }\n]\nconst router = createRouter({\n    history: createWebHashHistory(import.meta.env.BASE_URL),\n    routes,\n})\n\n// 设置基础框架中的路由信息\nsetRouter(router)\n\n/**\n * 开启路由前置守卫\n */\nrouter.beforeEach(defaultBeforeEach)\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.FileExport,\n      content: `\n        export default router;\n      `,\n      linkAfter: [\n        COMMON_CHUNK_NAME.ExternalDepsImport,\n        COMMON_CHUNK_NAME.InternalDepsImport,\n        COMMON_CHUNK_NAME.FileVarDefine,\n        COMMON_CHUNK_NAME.FileMainContent,\n      ],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { IPublicTypeJSExpression, PackageJSON } from '@alilc/lowcode-types';\n\nimport { COMMON_CHUNK_NAME } from '../../../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  HandlerSet,\n  ICodeStruct,\n  IContainerInfo,\n  IProjectInfo,\n  IScope,\n  NodeGeneratorConfig,\n  Tab,\n} from '../../../../../types';\nimport { transformJsExpr } from '../../../../../core/vue/handlers/transformJsExpression';\nimport { generateExpression } from '../../../../../utils/jsExpression';\nimport { transformThis2Context } from '../../../../../core/vue/handlers/transformThis2Context';\nimport { generateCompositeType } from '../../../../../utils/compositeType';\nimport { Scope } from '../../../../../utils/Scope';\nimport { createVueNodeGenerator, generateByName } from '../../../../../utils/nodeToTemplate';\nimport { PluginConfig } from '../../../../component/vue/template';\n\ninterface IIceJsPackageJSON extends PackageJSON {\n  type: string;\n}\n\nconst pluginFactory: BuilderComponentPluginFactory<PluginConfig> = (config?) => {\n  const cfg = {\n    fileType: FileType.VUE,\n    // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n    nodeTypeMapping: {} as Record<string, string>,\n    ...config,\n  };\n  const { nodeTypeMapping } = cfg;\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const { tolerateEvalErrors = true } = next.contextData;\n\n    // 这里会将内部的一些子上下文的访问(this.xxx)转换为 __$$context.xxx 的形式\n    // 与 Rax 所不同的是，这里不会将最顶层的 this 转换掉\n    const customHandlers: HandlerSet<string> = {\n      expression(input: IPublicTypeJSExpression, scope: IScope, config2) {\n        return transformJsExpr(generateExpression(input, scope), scope, {\n          dontWrapEval: !(config2?.tolerateEvalErrors ?? tolerateEvalErrors),\n          dontTransformThis2ContextAtRootScope: true,\n        });\n      },\n      function(input, scope: IScope) {\n        return transformThis2Context(\n          generateCompositeType(\n            {\n              type: 'JSFunction',\n              value: input.value || 'function () {}',\n            },\n            Scope.createRootScope(),\n          ),\n          scope,\n          { ignoreRootScope: true },\n        );\n      },\n    };\n\n    //  定义了如何处理属性（如 ref）、标签映射和错误容忍机制\n    const generatorPlugins: NodeGeneratorConfig = {\n      handlers: customHandlers,\n      tagMapping: (v) => nodeTypeMapping[v] || v,\n      tolerateEvalErrors,\n    };\n\n    const ir = next.ir.containers[0] as IContainerInfo;\n    const scope: IScope = Scope.createRootScope();\n    // 生成底部导航栏\n    const { code, node } = generateByName(generatorPlugins, 'Navigation', ir, scope, {\n      'v-model': 'active',\n    });\n    next.chunks.push({\n      zIndex: code ? 1 : 0,\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: COMMON_CHUNK_NAME.FileMainContent,\n      content: `\n<template>\n\t<div class=\"page\">\n\t\t<!--首页-->\n\t\t<router-view v-slot=\"{ Component, route }\">\n\t\t\t<keep-alive>\n\t\t\t\t<component :is=\"Component\" :key=\"route.fullPath\" />\n\t\t\t</keep-alive>\n\t\t</router-view>\n\n\t\t<!--底部导航栏-->\n        ${code}\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onMounted, ref, watchEffect } from \"vue\"\nimport { useRoute, useRouter } from 'vue-router'\nimport { Navigation } from '@dckj-npm/lowcode-vue-materials';\n\nlet router = useRouter()\n\n/**\n * 当前激活的tab\n */\nconst active = ref(0)\nconst tabInfo = [\n${(node.props?.itemArray as unknown as Tab[])\n  ? (node.props.itemArray as unknown as Tab[])\n    .map(\n      (item) =>\n        `    {text: '${item.text ?? ''}', icon: '${item.icon ?? ''}', pageId: '${\n          item.pageId ?? ''\n        }', selectedIcon: '${item.selectedIcon ?? ''}'}`,\n    )\n    .join(',\\n')\n  : ''}]\n\n/**\n* 跳转页面\n* @param params\n* @param extParams\n*/\nfunction goPage(params, ...extParams) {\n  const { pathId } = extParams.find(obj => obj.hasOwnProperty('pathId')) || {};\n  const pageId = params ? params : pathId;\n  router.replace(pageId);\n}\n\n/**\n * 从界面进入，选中tab\n */\nlet route = useRoute()\nwatchEffect(() => {\n\tlet number = tabInfo.findIndex((tab) => tab.pageId == route?.path)\n\tif (number != -1) {\n\t\tactive.value = number\n\t}\n})\n</script>\n\n<style lang=\"scss\" scoped>\n</style>`,\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","const suffix = 'Request';\n/**\n * 获取api名称\n */\nexport function getApiName(apiId: string) {\n  return apiId + suffix;\n}\n","export interface DynamicColumnDataType {\n  /**\n   * 编码\n   */\n  code: number;\n  /**\n   * 名称\n   */\n  name: string;\n  /**\n   * 数据库类型\n   */\n  dbTypeName: string;\n}\n\n/**\n * 枚举类型的通用结构\n */\nexport interface BaseEnumType {\n  /**\n   * 枚举的代码值\n   */\n  code: number;\n  /**\n   * 枚举的名称描述\n   */\n  name: string;\n  /**\n   * 枚举的排序值（可选）\n   */\n  ordinal?: number;\n}\n\nexport const DYNAMIC_COLUMN_DATA_TYPE_TEXT: DynamicColumnDataType = {\n  code: 1,\n  name: '单行文本',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_TEXTAREA: DynamicColumnDataType = {\n  code: 2,\n  name: '多行文本',\n  dbTypeName: 'text',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_INT: DynamicColumnDataType = {\n  code: 3,\n  name: '整数',\n  dbTypeName: 'int',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_MONEY: DynamicColumnDataType = {\n  code: 15,\n  name: '金额',\n  dbTypeName: 'numeric',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_NUMBER: DynamicColumnDataType = {\n  code: 35,\n  name: '数值',\n  dbTypeName: 'numeric',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_ID_CARD: DynamicColumnDataType = {\n  code: 11,\n  name: '身份证',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_MOBILE: DynamicColumnDataType = {\n  code: 12,\n  name: '手机',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_EMAIL: DynamicColumnDataType = {\n  code: 36,\n  name: '邮箱',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_DATE: DynamicColumnDataType = {\n  code: 6,\n  name: '日期',\n  dbTypeName: 'date',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_DATETIME: DynamicColumnDataType = {\n  code: 7,\n  name: '日期时间',\n  dbTypeName: 'datetime',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_LABEL: DynamicColumnDataType = {\n  code: 10,\n  name: '文本说明',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_SWITCH: DynamicColumnDataType = {\n  code: 29,\n  name: '开关',\n  dbTypeName: 'tinyint',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_RADIO: DynamicColumnDataType = {\n  code: 4,\n  name: '单选框',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_CHECKBOX: DynamicColumnDataType = {\n  code: 5,\n  name: '复选框',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_USER: DynamicColumnDataType = {\n  code: 18,\n  name: '联系人',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_DEPT: DynamicColumnDataType = {\n  code: 17,\n  name: '组织架构部门',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_ORGAN: DynamicColumnDataType = {\n  code: 25,\n  name: '组织架构单位',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_SELECT: DynamicColumnDataType = {\n  code: 19,\n  name: '下拉框',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_CASCADE: DynamicColumnDataType = {\n  code: 13,\n  name: '级联/分类',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_PICTURE: DynamicColumnDataType = {\n  code: 14,\n  name: '图片',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_VIDEO: DynamicColumnDataType = {\n  code: 30,\n  name: '视频',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_AUDIO: DynamicColumnDataType = {\n  code: 37,\n  name: '音频',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_DOC: DynamicColumnDataType = {\n  code: 34,\n  name: '文档',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_ATTACHMENTS: DynamicColumnDataType = {\n  code: 16,\n  name: '附件',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_AUTO: DynamicColumnDataType = {\n  code: 26,\n  name: '自动生成',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_EDITOR: DynamicColumnDataType = {\n  code: 31,\n  name: '富文本',\n  dbTypeName: 'longtext',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_POSITIONING: DynamicColumnDataType = {\n  code: 39,\n  name: '定位',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_SIGNATURE: DynamicColumnDataType = {\n  code: 40,\n  name: '签名',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_GRADE: DynamicColumnDataType = {\n  code: 41,\n  name: '等级',\n  dbTypeName: 'numeric',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_BUTTON: DynamicColumnDataType = {\n  code: 46,\n  name: '按钮',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_CHILDREN_TABLE: DynamicColumnDataType = {\n  code: 47,\n  name: '子表单',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_QUOTE: DynamicColumnDataType = {\n  code: 48,\n  name: '引用字段',\n  dbTypeName: 'varchar',\n};\nexport const DYNAMIC_COLUMN_DATA_TYPE_LINKAGE: DynamicColumnDataType = {\n  code: 49,\n  name: '联动字段',\n  dbTypeName: 'varchar',\n};\n\n/**\n * 列类型接口\n */\nexport interface ColumnType {\n  /**\n   * 列的唯一标识符\n   */\n  id: string;\n  /**\n   * 关联的表 ID\n   */\n  fkTableId: string;\n  /**\n   * 表名\n   */\n  tableName: string;\n  /**\n   * 列名\n   */\n  columnName: string;\n  /**\n   * 选择操作类型\n   */\n  selectActionType: number;\n  /**\n   * 选择操作类型的枚举\n   */\n  selectActionTypeEnum: BaseEnumType;\n  /**\n   * 列键类型\n   */\n  columnKeyType: number;\n  /**\n   * 列键类型的枚举\n   */\n  columnKeyTypeEnum: BaseEnumType;\n  /**\n   * 列的数据类型\n   */\n  columnType: string;\n  /**\n   * 列的大小\n   */\n  columnSize: number;\n  /**\n   * 列的小数位数\n   */\n  columnDecimal: number;\n  /**\n   * 默认值\n   */\n  defaultValue: string;\n  /**\n   * 默认值类型\n   */\n  defaultValueType: number;\n  /**\n   * 默认值类型的枚举\n   */\n  defaultValueTypeEnum: BaseEnumType;\n  /**\n   * 是否必填（0：否，1：是）\n   */\n  isRequired: number;\n  /**\n   * 是否必填的枚举\n   */\n  isRequiredEnum: BaseEnumType;\n  /**\n   * 列的注释\n   */\n  columnComment: string;\n  /**\n   * 显示添加类型\n   */\n  showAddType: number;\n  /**\n   * 显示添加类型的枚举\n   */\n  showAddTypeEnum: BaseEnumType;\n  /**\n   * 显示更新类型\n   */\n  showUpdateType: number;\n  /**\n   * 显示更新类型的枚举\n   */\n  showUpdateTypeEnum: BaseEnumType;\n  /**\n   * 列在列表中的显示类型\n   */\n  showListType: number;\n  /**\n   * 列在列表中的显示类型的枚举\n   */\n  showListTypeEnum: BaseEnumType;\n  /**\n   * 列在视图中的显示类型\n   */\n  showViewType: number;\n  /**\n   * 列在视图中的显示类型的枚举\n   */\n  showViewTypeEnum: BaseEnumType;\n  /**\n   * 搜索类型\n   */\n  searchType: number;\n  /**\n   * 搜索类型的枚举\n   */\n  searchTypeEnum: BaseEnumType;\n  /**\n   * 更新类型\n   */\n  updateType: number;\n  /**\n   * 更新类型的枚举\n   */\n  updateTypeEnum: BaseEnumType;\n  /**\n   * 评分代码\n   */\n  scoreCode: number;\n  /**\n   * 字段宽度\n   */\n  fieldWidth: number;\n  /**\n   * 字段前缀\n   */\n  fieldPrefix: string;\n  /**\n   * 显示条件\n   */\n  showCondition: string;\n  /**\n   * 唯一性验证\n   */\n  validationUnique: number;\n  /**\n   * 唯一性验证的枚举\n   */\n  validationUniqueEnum: BaseEnumType;\n  /**\n   * 显示样式\n   */\n  showStyle: string;\n  /**\n   * 自定义函数\n   */\n  customFunction: string;\n  /**\n   * 列选项列表\n   */\n  columnOptionList: any[];\n  /**\n   * 属性列表\n   */\n  propList: {\n    /**\n     * 属性的唯一标识符\n     */\n    id: string;\n    /**\n     * 属性名称\n     */\n    propName: string;\n    /**\n     * 属性值\n     */\n    propValue: string;\n  }[];\n  /**\n   * 引导文字\n   */\n  guideWords: string;\n  /**\n   * 校验表达式\n   */\n  fieldValidation: string;\n  /**\n   * 校验类型\n   */\n  fieldValidationType: string;\n  /**\n   * 字段后缀\n   */\n  fieldSuffix: string;\n  /**\n   * 关联字段\n   */\n  joinColumn: string;\n  /**\n   * 关联表单\n   */\n  joinTable: string;\n  /**\n   * 关联表单信息\n   */\n  joinTableInfo: JoinTableInfo;\n  /**\n   * 连表字段\n   */\n  linkageColumn: string;\n  /**\n   * 连表字段\n   */\n  linkageTableColumn: string;\n  /**\n   * 选择操作调用的接口\n   */\n  selectAction: string;\n  /**\n   * 下拉框选择的标签\n   */\n  selectActionLabel: string;\n  /**\n   * 下拉框显示的标签\n   */\n  selectActionLabelArr: string[];\n  /**\n   * 下拉框选择的标签\n   */\n  selectActionValue: string;\n}\n\nexport interface JoinTableInfo {\n  id: string;\n  joinAlias: string;\n  joinColumnList: JoinColumnList[];\n  joinNum: number;\n  joinSerial: number;\n  joinTableId: string;\n  joinTitle: string;\n  joinType: number;\n  mainTableId: string;\n  relationId: string;\n  showColumnList: [];\n  showColumns: string;\n  showType: number;\n  tableComment: string;\n  valueColumn: string;\n}\n\nexport interface JoinColumnList {\n  id: string;\n  conditionKey: string;\n  conditionValue: string;\n  fkJoinId: string;\n  groupSerial: number;\n  relation: string;\n  valueType: number;\n}\n","import {\n  DYNAMIC_COLUMN_DATA_TYPE_ATTACHMENTS,\n  DYNAMIC_COLUMN_DATA_TYPE_AUDIO,\n  DYNAMIC_COLUMN_DATA_TYPE_AUTO,\n  DYNAMIC_COLUMN_DATA_TYPE_CASCADE,\n  DYNAMIC_COLUMN_DATA_TYPE_CHECKBOX,\n  DYNAMIC_COLUMN_DATA_TYPE_CHILDREN_TABLE,\n  DYNAMIC_COLUMN_DATA_TYPE_DATE,\n  DYNAMIC_COLUMN_DATA_TYPE_DATETIME,\n  DYNAMIC_COLUMN_DATA_TYPE_DEPT,\n  DYNAMIC_COLUMN_DATA_TYPE_DOC,\n  DYNAMIC_COLUMN_DATA_TYPE_EDITOR,\n  DYNAMIC_COLUMN_DATA_TYPE_EMAIL,\n  DYNAMIC_COLUMN_DATA_TYPE_GRADE,\n  DYNAMIC_COLUMN_DATA_TYPE_ID_CARD,\n  DYNAMIC_COLUMN_DATA_TYPE_LABEL,\n  DYNAMIC_COLUMN_DATA_TYPE_LINKAGE,\n  DYNAMIC_COLUMN_DATA_TYPE_MOBILE,\n  DYNAMIC_COLUMN_DATA_TYPE_MONEY,\n  DYNAMIC_COLUMN_DATA_TYPE_NUMBER,\n  DYNAMIC_COLUMN_DATA_TYPE_ORGAN,\n  DYNAMIC_COLUMN_DATA_TYPE_PICTURE,\n  DYNAMIC_COLUMN_DATA_TYPE_POSITIONING,\n  DYNAMIC_COLUMN_DATA_TYPE_QUOTE,\n  DYNAMIC_COLUMN_DATA_TYPE_RADIO,\n  DYNAMIC_COLUMN_DATA_TYPE_SELECT,\n  DYNAMIC_COLUMN_DATA_TYPE_SWITCH,\n  DYNAMIC_COLUMN_DATA_TYPE_TEXT,\n  DYNAMIC_COLUMN_DATA_TYPE_TEXTAREA,\n  DYNAMIC_COLUMN_DATA_TYPE_USER,\n  DYNAMIC_COLUMN_DATA_TYPE_VIDEO,\n  DYNAMIC_COLUMN_DATA_TYPE_INT,\n} from '../types/column-type';\n\nexport const getFieldType = (columnKeyType: number) => {\n  switch (columnKeyType) {\n    // 单行文本 整数 金额 数值 身份证\n    case DYNAMIC_COLUMN_DATA_TYPE_TEXT.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_INT.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_MONEY.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_NUMBER.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_ID_CARD.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_MOBILE.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_EMAIL.code:\n      return 'field';\n\n    // 多行文本\n    case DYNAMIC_COLUMN_DATA_TYPE_TEXTAREA.code:\n      return 'textarea';\n\n    // 日期\n    case DYNAMIC_COLUMN_DATA_TYPE_DATE.code:\n      return 'date-picker';\n\n    // 日期时间\n    case DYNAMIC_COLUMN_DATA_TYPE_DATETIME.code:\n      return 'time-picker';\n\n    // 文本说明\n    case DYNAMIC_COLUMN_DATA_TYPE_LABEL.code:\n      return 'text';\n\n    // 开关\n    case DYNAMIC_COLUMN_DATA_TYPE_SWITCH.code:\n      return 'switch';\n\n    // 单选框\n    case DYNAMIC_COLUMN_DATA_TYPE_RADIO.code:\n      return 'radio';\n\n    // 复选框\n    case DYNAMIC_COLUMN_DATA_TYPE_CHECKBOX.code:\n      return 'checkbox';\n\n    // 联系人 组织架构部门 组织架构单位 下拉框\n    case DYNAMIC_COLUMN_DATA_TYPE_USER.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_DEPT.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_ORGAN.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_SELECT.code:\n      return 'picker';\n\n    // 级联\n    case DYNAMIC_COLUMN_DATA_TYPE_CASCADE.code:\n      return 'cascader';\n\n    // 图片 视频 音频\n    case DYNAMIC_COLUMN_DATA_TYPE_PICTURE.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_VIDEO.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_AUDIO.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_DOC.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_ATTACHMENTS.code:\n      return 'uploader';\n\n    //自动生成\n    case DYNAMIC_COLUMN_DATA_TYPE_AUTO.code:\n      return 'auto-complete';\n\n    // 富文本\n    case DYNAMIC_COLUMN_DATA_TYPE_EDITOR.code:\n      return 'rich-text';\n\n    // 定位\n    case DYNAMIC_COLUMN_DATA_TYPE_POSITIONING.code:\n      return 'amap';\n\n    // 等级\n    case DYNAMIC_COLUMN_DATA_TYPE_GRADE.code:\n      return 'rate';\n\n    // 按钮 签名\n\n    // 子表单 引用字段 联动字段\n    case DYNAMIC_COLUMN_DATA_TYPE_CHILDREN_TABLE.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_QUOTE.code:\n    case DYNAMIC_COLUMN_DATA_TYPE_LINKAGE.code:\n      return 'picker';\n    default:\n      return 'field';\n  }\n};\n","import { InterpretDataSourceConfig } from '@alilc/lowcode-types';\nimport {\n  COMMON_CHUNK_NAME,\n  DEFAULT_LINK_AFTER,\n  TEMPLATE_DEFINE_CHUNK_NAME,\n  VUE_DEFAULT_LINK_AFTER,\n} from '../../../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IRouterInfo,\n  ICodeChunk,\n  IContainerInfo,\n  IFormInfo,\n} from '../../../../../types';\nimport { isValidContainerType } from '../../../../../utils/schema';\nimport { getApiName } from '../../../../../utils/apiHandler';\nimport { getFieldType } from '../../../../../utils/columnType';\nimport {\n  ColumnType,\n  DYNAMIC_COLUMN_DATA_TYPE_AUTO,\n  DYNAMIC_COLUMN_DATA_TYPE_BUTTON,\n  DYNAMIC_COLUMN_DATA_TYPE_CHILDREN_TABLE,\n  DYNAMIC_COLUMN_DATA_TYPE_DEPT,\n  DYNAMIC_COLUMN_DATA_TYPE_LINKAGE,\n  DYNAMIC_COLUMN_DATA_TYPE_ORGAN,\n  DYNAMIC_COLUMN_DATA_TYPE_QUOTE,\n  DYNAMIC_COLUMN_DATA_TYPE_USER,\n} from '../../../../../types/column-type';\nimport { camelize } from '../../../../../utils/common';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IFormInfo;\n\n    const columnList = ir.dataSource?.extra[\n      ir.dataSource.list[0].id\n    ].columnToAttribute?.formData?.filter(\n      (item: ColumnType) =>\n        item.columnKeyType !== DYNAMIC_COLUMN_DATA_TYPE_BUTTON.code &&\n        item.columnKeyType !== DYNAMIC_COLUMN_DATA_TYPE_AUTO.code,\n    ) || [];\n    console.log(columnList);\n    //根据ir生成表单文件夹,包括Add.vue和field.ts（暂时）\n\n    //add-fields.ts\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      subModule: 'add-field',\n      content: `\n        import { FieldProps } from '@dc/vue-h5-base/src/components/form-item/field-props'\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.FileVarDefine,\n      subModule: 'add-field',\n      content: `\n      export const fields = (id?: string | undefined) => {\n        return [\n          ${columnList.map((field: ColumnType) => {\n            return `\n              {\n                name: '${field.columnName}',\n                label: '${field.columnComment}',\n                type: '${getFieldType(field.columnKeyType)}',\n                placeholder: '${field.guideWords}',\n                show: ${field.showAddType == 0 ? false : true},\n                required: ${field.isRequired == 0 ? false : true},\n                rules: [\n                  {\n                    required: ${field.isRequired == 0 ? false : true},\n                    message: '${field.guideWords}',\n                  },\n                  ${\n                    field.fieldValidation\n                      ? `\n                    {\n                      pattern: '${field.fieldValidation}',\n                      message: '${field.columnComment}格式不正确'\n                    }\n                    `\n                      : ''\n                  }\n                ],\n                typeValue: { \n                  ${\n                    field.selectActionLabel\n                      ? `\n                    fieldNames: {\n                      label: '${field.selectActionLabel}',\n                      value: '${field.selectActionValue}'\n                    },\n                    `\n                      : ''\n                  }\n                  ${field.fieldSuffix ? `addonAfter: ${field.fieldSuffix}` : ''}\n                  ${\n                    field.columnOptionList\n                      ? `\n                      options: [${field.columnOptionList.map((item) => {\n                        console.log(JSON.stringify(item));\n                        return JSON.stringify(item);\n                      })}]\n                      `\n                      : ''\n                  }\n                }\n              }\n              `;\n          })}\n        ]\n      }\n      `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport],\n    });\n\n    //Add.vue\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom,\n      subModule: 'Add',\n      content: `\n        <template>\n          <van-form ref=\"form\">\n            <template v-for=\"(item, index) of addFields\">\n              <base-form-item\n                v-if=\"item.show\"\n                :key=\"index\"\n                v-model:value=\"formState[item.name]\"\n                :label=\"item.label\"\n                :name=\"item.name\"\n                :placeholder=\"item.placeholder\"\n                :required=\"true\"\n                :rules=\"item.rules\"\n                :type=\"item.type\"\n                :typeValue=\"item.typeValue\"\n                @update:extraValue=\"extraValueChange\"\n              />\n            </template>\n          </van-form>\n          <van-button round type=\"primary\" color=\"#FB663E\" @click=\"onSubmit\">提交</van-button>\n        </template>\n      `,\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n      subModule: 'Add',\n      content: `\n      <script setup lang=\"ts\">\n      import router from '@/router'\n      import { fields } from './add-field'\n      import { computed, onMounted, reactive, ref, defineProps, onBeforeMount } from 'vue'\n      import BaseFormItem from '@dc/vue-h5-base/src/components/form-item/BaseFormItem.vue'\n      import { messageMethod } from '@dc/vue-h5-base/src/utils/message-util'\n      import { GetRequestModel, PostRequestModel } from '@dc/vue-h5-base/src/http/request-model'\n      import { OptionProps, SelectProps, FieldProps, ExtraProps } from '@dc/vue-h5-base/src/components/form-item/field-props'\n      import {\n        ColumnField,\n        handleFileList,\n        handleLinkageFields,\n        handleRemoteSearch,\n        LinkageField,\n        getDefaultValues,\n        handleColumnOptions,\n        FilterField,\n        handleFilterField\n      } from '@/sources/hooks/index'\n      `,\n      linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart],\n    });\n\n    // dataSource\n    const dataSourceConfig = isValidContainerType(pre.ir) ? pre.ir.dataSource : null;\n    const dataSourceItems: InterpretDataSourceConfig[] =\n      (dataSourceConfig && dataSourceConfig.list) || [];\n    //定义有选择项的控件列表\n    const selectActionTypeFieldList: ColumnType[] = ir.dataSource?.extra[\n      ir.dataSource.list[0].id\n    ].columnToAttribute?.formData?.filter(\n      (field: ColumnType) =>\n        field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_USER.code ||\n        field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_DEPT.code ||\n        field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_ORGAN.code ||\n        field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_CHILDREN_TABLE.code ||\n        field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_QUOTE.code ||\n        field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_LINKAGE.code,\n    ) || [];\n    //定义引用字段的控件\n    const quoteFieldList: ColumnType[] = selectActionTypeFieldList.filter(\n      (field: ColumnType) => field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_QUOTE.code,\n    );\n\n    if (dataSourceItems.length > 0) {\n      dataSourceItems.forEach((ds) => {\n        const dsType = ds.type || 'fetch';\n        // 处理非自定义数据源\n        if (dsType !== 'custom') {\n          // Add.vue\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            subModule: 'Add',\n            name: TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport,\n            content: `import  ${getApiName(ds.id)} from '@/api/${ds.id}';`,\n            linkAfter: [...DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport]],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n            subModule: 'Add',\n            content: `\nconst form = ref(null)\n\nconst props = defineProps<{\n  id?: string\n}>()\n\nconst addFields = ref(fields(''))\nconst formState = reactive({\n  id: props.id\n})\n            `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent,\n            subModule: 'Add',\n            content: `\n            ${selectActionTypeFieldList.map((field: ColumnType) => {\n              return `\n// 请求字段远程数据\nonBeforeMount(async () => {\n  const fieldsItem = addFields.find(item => item.name === '${field.columnComment}')\n  if (fieldsItem) {\n    const typeValue = reactive<SelectProps>(fieldsItem.typeValue as SelectProps)\n    const { data } = await new ${\n      field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_CHILDREN_TABLE.code ||\n      field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_QUOTE.code ||\n      field.columnKeyType == DYNAMIC_COLUMN_DATA_TYPE_LINKAGE.code\n        ? 'Post'\n        : 'Get'\n    }RequestModel<Array<OptionProps>>('${field.selectAction}', {}).request()\n    typeValue.isFetching = data.length >= 100\n    typeValue.options = data ?? []\n    // 直接更新原始 item 的 typeValue\n    fieldsItem.typeValue = typeValue\n  }\n})\n                  `;\n            })}\nonMounted(async () => {\n  ${selectActionTypeFieldList\n    .map((field: ColumnType) => {\n      return `\n    await get${camelize(field.columnName)}()\n    `;\n    })\n    .join('')}\n  \n  //查详情并显示\n  if (props.id) {\n    const { data } = await ${getApiName(ds.id)}.getById(props.id)\n    Object.assign(formState, data)\n  } \n})\n            `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.Method,\n            subModule: 'Add',\n            content: `\n${selectActionTypeFieldList.map((field: ColumnType) => {\n  return `\n      const get${camelize(field.columnName)} = async () => {\n        const typeValue = reactive<SelectProps>(fieldsItem.typeValue as SelectProps)\n        const { data } = await new ${\n          field.selectActionType == 14 || field.selectActionType == 15 ? 'Post' : 'Get'\n        }RequestModel<Array<OptionProps>>('${field.selectAction}', {}).request()\n\n        typeValue.isFetching = data.length >= 100\n        \n        typeValue.options = data ?? []\n        \n        // 直接更新原始 item 的 typeValue\n        fieldsItem.typeValue = typeValue\n      }\n    `;\n})}\n/**\n * 表单字段值改变触发\n **/\nfunction extraValueChange(name: string, option: ExtraProps) {\n  ${\n    quoteFieldList\n      ? `\n      //引用字段\n      const referenceFields: ColumnField[] = [\n      ${quoteFieldList.map((field: ColumnType) => {\n        return `\n              {\n                fieldName: '${camelize(field.columnName)}',\n                joinTableInfoId: '${field.joinTableInfo.id}',\n              }\n            `;\n      })}\n  ]\n                `\n      : ''\n  }\n              ${\n                quoteFieldList\n                  ? `\n  //有筛选关系字段\n  const filterFields: FilterField[] = [\n  ${quoteFieldList.map((field: ColumnType) => {\n    console.log(field.joinTableInfo.joinColumnList);\n    return `\n          {\n            fieldName: '${camelize(field.columnName)}',\n            columnName: '${field.columnName}',\n            columnKeyType: ${field.columnKeyType},\n            selectAction: '${field.selectAction}',\n            selectActionLabelArr: [],\n            joinColumnList: [${field.joinTableInfo.joinColumnList\n              .map((item) => JSON.stringify(item))\n              .join(', \\n')}]\n          }\n        `;\n  })}\n    \n  ]\n// 处理筛选字段\nif(filterFields.length > 0) handleFilterField<IDynamicTbSpxx>(name, option, formState, addFields, filterFields)\n                `\n                  : ''\n              }\n\n    }\n    /**\n     * 提交数据\n     **/\n    async function onSubmit () {\n      if (props.id) {\n      const { message } = await ${getApiName(ds.id)}.update(formState)\n        messageMethod.success(message)\n      } else {\n        const { message } = await ${getApiName(ds.id)}.add(formState)\n        messageMethod.success(message)\n      }\n    }\n            `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd,\n            subModule: 'Add',\n            content: `\n            </script>\n            `,\n            linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd]],\n          });\n\n          // Manage.vue文件\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.TemplateDom,\n            subModule: 'Manage',\n            content: `\n        <template>\n            <div class=\"page\">\n              <div class=\"action\">\n                  <SearchBar\n                    placeholder=\"请输入关键词\"\n                    :searchText=\"true\"\n                    v-model:search-value=\"searchValue\"\n                    @confirm=\"handleSearch\"\n                    @clear=\"handleSearch\"\n                    :autofocus=\"true\"\n                  >\n                  </SearchBar>\n                  <Icon type=\"add\" />\n              </div>\n              <van-pull-refresh :disabled=\"true\" v-model=\"refreshing\" @refresh=\"onRefresh\" v-if=\"list.length > 0\">\n                <van-list v-model:loading=\"loading\" :finished=\"finished\" finished-text=\"没有更多了\" @load=\"onLoad\">\n                  <div class=\"list\">\n                    <div class=\"list-item\" v-for=\"item in list\" :key=\"item.id\">\n                    ${\n                      columnList.length > 3\n                        ? columnList.slice(0, 3).map((item: ColumnType) => {\n                            return `\n                            <div class=\"list-item-column\" >${item.columnComment}: {{item['${item.columnName}']}}</div>\n                          `;\n                          })\n                        : columnList.map((item: ColumnType) => {\n                            return `\n                            <div class=\"list-item-column\" >${item.columnComment}: {{item['${item.columnName}']}}</div>\n                          `;\n                          })\n                    }\n                    </div>\n                  </div>\n                </van-list>\n              </van-pull-refresh>\n            </div>\n        </template>\n      `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.TemplateStart],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.ExternalDepsImport,\n            subModule: 'Manage',\n            content: `\n      <script setup lang=\"ts\">\n            import { SearchBar, Icon } from '@dckj-npm/lowcode-vue-materials'\n            import { ref, onMounted } from 'vue'\n      `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.ScriptStart],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            subModule: 'Manage',\n            name: TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport,\n            content: `import  ${getApiName(ds.id)} from '@/api/${ds.id}';`,\n            linkAfter: [...DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport]],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.ConstVar,\n            subModule: 'Manage',\n            content: `\n            const pageNum = ref(1)\n            let loading = ref(false)\n            const finished = ref(false)\n            const refreshing = ref(false)\n            const isLastPage = ref(false)\n            let list = ref<any[]>([])\n            `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.InternalDepsImport],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.OnMountedContent,\n            subModule: 'Manage',\n            content: `\n          onMounted(() => {\n            onRefresh()\n          })\n          `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.OnMountedStart],\n          });\n\n          next.chunks.push({\n            type: ChunkType.STRING,\n            fileType: FileType.VUE,\n            name: TEMPLATE_DEFINE_CHUNK_NAME.Method,\n            subModule: 'Manage',\n            content: `\n            const onRefresh = async () => {\n              // 清空列表数据\n              finished.value = false\n      \n              // 重新加载数据\n              // 将 loading 设置为 true，表示处于加载状态\n              loading.value = true\n              pageNum.value = 1\n              await onLoad()\n            }\n              const onLoad = async () => {\n                if (refreshing.value) {\n                  list.value = []\n                  refreshing.value = false\n                }\n                // 避免重复加载\n                // if (loading.value || finished.value) return\n      \n                let { data } = await ${getApiName(\n                  ds.id,\n                )}.page({ pageNum: pageNum.value, pageSize: 10 })\n                console.log('data', data.list)\n                \n                isLastPage.value = data.isLastPage\n                if (data.pageNum === 1) {\n                  list.value = data.list\n                } else {\n                  list.value?.push(...data.list)\n                }\n                loading.value = false\n                pageNum.value = pageNum.value + 1\n                if (isLastPage.value || list.value.length >= data.total) {\n                  finished.value = true\n                  console.log(finished.value)\n                }\n              }\n            `,\n            linkAfter: [TEMPLATE_DEFINE_CHUNK_NAME.UnMountedEnd],\n          });\n        }\n      });\n    }\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd,\n      subModule: 'Manage',\n      content: `\n      </script>\n      `,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd]],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.VUE,\n      name: TEMPLATE_DEFINE_CHUNK_NAME.CssStyleImport,\n      subModule: 'Manage',\n      content: `\n      <style lang=\"scss\">\n        .page {\n          width: 100%;\n          display: flex;\n          flex-direction: column;\n          .action {\n            width: 100%;\n            display: flex;\n            align-items: center;\n          }\n          .list {\n            width: 100%;\n            display: flex;\n            flex-direction: column;\n            .list-item {\n              width: 100%;\n              display: flex;\n              flex-direction: column;\n              .list-item-column {\n                display: flex;\n                align-items: center;\n              }\n            }\n          }\n        }\n      </style>\n      `,\n      linkAfter: [...VUE_DEFAULT_LINK_AFTER[TEMPLATE_DEFINE_CHUNK_NAME.ScriptEnd]],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import { COMMON_CHUNK_NAME } from '../../../../../const';\n\nimport {\n  BuilderComponentPlugin,\n  BuilderComponentPluginFactory,\n  ChunkType,\n  FileType,\n  ICodeStruct,\n  IProjectInfo,\n  IRouterInfo,\n} from '../../../../../types';\n\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    const ir = next.ir as IProjectInfo;\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: `\n        import { BasePo, BusinessPO } from '@dc/vue-h5-base/src/entity/common/base'\n        import { ExtraProps, FieldProps, SelectProps } from '@dc/vue-h5-base/src/components/form-item/field-props'\n        import { PostRequestModel, QueryType } from '@dc/vue-h5-base/src/http/request-model'\n        import { OptionProps } from 'ant-design-vue/es/vc-select/Option'\n\t\timport { UnwrapNestedRefs } from 'vue'\n\t\timport { BaseUtil } from '@dc/vue-h5-base/src/utils/base-util'\n\t\timport { CascaderProps, UploadFile, UploadProps } from 'ant-design-vue'\n        `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport],\n    });\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.TS,\n      name: COMMON_CHUNK_NAME.FileVarDefine,\n      content: `\nexport interface IColumnOption {\n\t/**\n\t * 是否是默认值\n\t */\n\tisDefault: number\n\t/**\n\t * 选项名称\n\t */\n\toptionName: string\n\t/**\n\t * 选项值\n\t */\n\toptionValue: string | number\n\n\t[key: string]: string | number | string[]\n}\nexport interface FilterField {\n\tfieldName: string\n\tcolumnName: string\n\tcolumnKeyType: number\n\tselectAction: string\n\tselectActionLabelArr: string[]\n\tjoinColumnList: {\n\t\tconditionKey: string\n\t\tconditionValue: string\n\t}[]\n}\nexport interface LinkageField {\n\tselectAction: string\n\tselectActionValue: string\n\tselectActionLabel: string\n}\n\nexport function handleFilterField<T extends BusinessPO | BasePo>(\n\tname: string,\n\toption: ExtraProps,\n\tformState: Record<string, unknown>,\n\tfieldList: Array<FieldProps<T>>,\n\tfilterFields: FilterField[]\n) {\n\tconst relationColumns = filterFields.filter(column => column.joinColumnList.find(joinColumn => joinColumn.conditionKey === name))\n\tif (relationColumns.length > 0) {\n\t\tlet itemList: Record<string, QueryType>[] = []\n\t\titemList = relationColumns.map(relationColumn => {\n\t\t\treturn {\n\t\t\t\tcolumnName: relationColumn.columnName,\n\t\t\t\tcolumnValue: option.values ? (formState[relationColumn.fieldName] as QueryType) : ''\n\t\t\t}\n\t\t})\n\t\tconst field = filterFields.find(field => field.fieldName === name)\n\t\titemList.push({\n\t\t\tcolumnName: field?.columnName,\n\t\t\tcolumnValue: formState[field?.fieldName as string] as string\n\t\t})\n\t\trelationColumns.forEach(column => {\n\t\t\tconst { columnKeyType, selectAction, selectActionLabelArr } = column\n\t\t\tif (columnKeyType !== 47) {\n\t\t\t\tnew PostRequestModel<Array<IColumnOption>>(selectAction, itemList ? { itemList } : {}).request().then(({ data }) => {\n\t\t\t\t\tconst fieldTypeValue = fieldList.find(field => field.name === column.fieldName)?.typeValue as SelectProps\n\t\t\t\t\tif (fieldTypeValue) fieldTypeValue.options = data ?? []\n\t\t\t\t\tconst isMultipleField = selectActionLabelArr && selectActionLabelArr.length > 1\n\t\t\t\t\tif (isMultipleField) {\n\t\t\t\t\t\tdata?.forEach(item => {\n\t\t\t\t\t\t\tconst label: string[] = []\n\t\t\t\t\t\t\tselectActionLabelArr.forEach(labelName => label.push(<string>item[labelName]))\n\t\t\t\t\t\t\titem.label = label.join(',')\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport const handleColumnOptions = <T>(data: Array<T>, selectActionType: number, selectActionLabel: string, selectActionValue: string) => {\n\tlet columnOptionList = []\n\tswitch (selectActionType) {\n\t\tcase 6:\n\t\t\t// 部门用户列表\n\t\t\tcolumnOptionList = JSON.parse(\n\t\t\t\tJSON.stringify(data)\n\t\t\t\t\t.replace(/\"deptName\"/g, \\`\"\\${selectActionLabel}\"\\`)\n\t\t\t\t\t.replace(/\"deptId\"/g, \\`\"\\${selectActionValue}\"\\`)\n\t\t\t\t\t.replace(/\"userList\"/g, '\"options\"')\n\t\t\t)\n\t\t\tbreak\n\t\tcase 7:\n\t\t\t// 部门用户树\n\t\t\tcolumnOptionList = JSON.parse(\n\t\t\t\tJSON.stringify(flattenDeptUserTree(data as Array<any>))\n\t\t\t\t\t.replace(/\"deptName\"/g, \\`\"\\${selectActionLabel}\"\\`)\n\t\t\t\t\t.replace(/\"deptId\"/g, \\`\"\\${selectActionValue}\"\\`)\n\t\t\t)\n\t\t\tbreak\n\t\tcase 8:\n\t\t\t// 单位部门用户列表\n\t\t\tcolumnOptionList = JSON.parse(\n\t\t\t\tJSON.stringify(flatten(data as Array<any>))\n\t\t\t\t\t.replace(/\"orgName\"/g, \\`\"\\${selectActionLabel}\"\\`)\n\t\t\t\t\t.replace(/\"orgId\"/g, \\`\"\\${selectActionValue}\"\\`)\n\t\t\t\t\t.replace(/\"deptName\"/g, \\`\"\\${selectActionLabel}\"\\`)\n\t\t\t\t\t.replace(/\"deptId\"/g, \\`\"\\${selectActionValue}\"\\`)\n\t\t\t\t\t.replace(/\"deptUserList\"/g, '\"children\"')\n\t\t\t\t\t.replace(/\"userList\"/g, '\"children\"')\n\t\t\t)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tcolumnOptionList = data\n\t}\n\treturn columnOptionList\n}\n\t\n/**\n * 转化文件类型\n * @param fileTypeString\n */\nexport const convertFileTypeString = (fileTypeString: string): string => {\n\tconst parts = fileTypeString.split('/')\n\tif (parts.length > 0) {\n\t\treturn parts.flatMap(part => part.split(',').map(type => \\`.\\${type}\\`)).join(',')\n\t} else {\n\t\treturn fileTypeString\n\t\t\t.split(',')\n\t\t\t.map(item => \\`.\\${item}\\`)\n\t\t\t.join(',')\n\t}\n}\n\t/**\n * 处理远程搜索钩子函数\n * @param fieldList 表单字段列表\n * @param linkageFields 有关联关系的字段\n * @param name 字段名\n * @param value 值\n */\nexport const handleRemoteSearch = async <T extends BusinessPO | BasePo>(\n\tfieldList: Array<FieldProps<T>>,\n\tlinkageFields: Record<string, LinkageField>,\n\tname: string,\n\tvalue: string\n) => {\n\tif (fieldList.length === 0) return\n\tconst typeValue = fieldList.find(item => item.name === name)?.typeValue as SelectProps\n\tconst itemField = Object.keys(linkageFields).find(item => item === name)\n\tif (itemField && typeValue && typeValue?.isFetching) {\n\t\tconst { data } = await new PostRequestModel<Array<IColumnOption>>(linkageFields[itemField as string].selectAction, {\n\t\t\titemList: [{ columnName: linkageFields[itemField].selectActionLabel, columnValue: value }]\n\t\t}).request()\n\t\ttypeValue.options = data\n\t}\n}\nexport interface ColumnField {\n\tfieldName: string\n\tjoinTableInfoId?: string\n\tlinkageTable?: string\n\tlinkageTableColumn?: string\n}\n\t/**\n * 处理关联字段钩子函数\n * @param referenceFields 引用字段\n * @param linkageFields 关联字段\n * @param name 字段名\n * @param options 选择项\n * @param formState 表单字段\n */\nexport const handleLinkageFields = <T>(\n\treferenceFields: Array<ColumnField>,\n\tlinkageFields: Array<ColumnField>,\n\tname: string,\n\toptions: Array<OptionProps>,\n\tformState: UnwrapNestedRefs<Partial<T>>\n) => {\n\tconst localReference = referenceFields.filter(field => field?.fieldName === name)\n\n\tif (localReference.length > 0) {\n\t\tconst localLinkage = linkageFields.filter(field => field.linkageTable === localReference[0].joinTableInfoId)\n\t\tif (localLinkage.length > 0) {\n\t\t\tlocalLinkage.flatMap(item => {\n\t\t\t\tformState[item.fieldName as keyof UnwrapNestedRefs<Partial<T>>] = options[0][item.linkageTableColumn as string]\n\t\t\t})\n\t\t}\n\t}\n}\n/**\n * 处理附件列表钩子\n * @param formState 表单数据\n * @param fieldList 字段列表数据\n */\nexport const handleFileList = <T extends BusinessPO | BasePo>(formState: UnwrapNestedRefs<Partial<T>>, fieldList: Array<FieldProps<T>>) => {\n\tconst uploadComponents = fieldList.filter(item => item.type === 'upload')\n\tif (uploadComponents.length > 0) {\n\t\tfieldList\n\t\t\t.filter(item => item.type === 'upload')\n\t\t\t.forEach(item => {\n\t\t\t\tconst typeValue = item.typeValue as UploadProps\n\t\t\t\tconst fieldValue = formState[\\`\\${item.name as string}FileList\\` as keyof UnwrapNestedRefs<Partial<T>>] as LogFile[]\n\t\t\t\tif (typeValue && fieldValue && fieldValue.length > 0) {\n\t\t\t\t\ttypeValue.fileList = []\n\t\t\t\t\ttypeValue.fileList =\n\t\t\t\t\t\t(fieldValue\n\t\t\t\t\t\t\t?.filter(item => item)\n\t\t\t\t\t\t\t.map(item => ({\n\t\t\t\t\t\t\t\tuid: item.id,\n\t\t\t\t\t\t\t\turl: BaseUtil.getUploadPath(item.uploadPath)\n\t\t\t\t\t\t\t})) as UploadFile<LogFile>[]) ?? []\n\t\t\t\t}\n\t\t\t})\n\t}\n}\n/**\n * 获取默认值钩子函数\n * @param formState 表单数据\n * @param tableId\n * @param id 主键id\n */\nexport const getDefaultValues = <T extends BusinessPO | BasePo>(formState: Record<string, any>, tableId: string, id?: string | undefined) => {\n\tdynamicRequest\n\t\t.getDefaultValue({\n\t\t\ttableId,\n\t\t\tid,\n\t\t\trecordMap: formState\n\t\t})\n\t\t.then(({ data }) => {\n\t\t\tdata.forEach(item => {\n\t\t\t\tformState[item.columnName as string] = item.columnValue\n\t\t\t})\n\t\t})\n}\nexport type PickType = 'date' | 'week' | 'month' | 'quarter' | 'year'\n/**\n * 设置日期选择器类型和日期格式钩子函数\n * @param dateFormat 日期格式\n */\nexport const setDatePickProps = (dateFormat?: string, showTime?: boolean) => {\n\tlet type: PickType = 'date'\n\tlet dateFormatUpper = dateFormat?.replace(/yyyy/g, 'YYYY').replace(/dd/g, 'DD') || 'YYYY-MM-DD'\n\tif (showTime) dateFormatUpper = dateFormat?.replace(/yyyy/g, 'YYYY').replace(/dd/g, 'DD') || 'YYYY-MM-DD HH:mm'\n\tif (dateFormat) {\n\t\tconst formatLowerCase = dateFormat.toLowerCase()\n\t\tif (formatLowerCase.includes('w') || formatLowerCase.includes('ww')) {\n\t\t\ttype = 'week'\n\t\t} else if (formatLowerCase.includes('q')) {\n\t\t\ttype = 'quarter'\n\t\t} else if (!formatLowerCase.includes('dd')) {\n\t\t\ttype = 'month'\n\t\t\tif (!formatLowerCase.includes('mm')) {\n\t\t\t\ttype = 'year'\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tpickType: type,\n\t\tformat: dateFormatUpper,\n\t\tvalueFormat: dateFormatUpper\n\t}\n}\n\n        `,\n      linkAfter: [COMMON_CHUNK_NAME.ExternalDepsImport, COMMON_CHUNK_NAME.InternalDepsImport],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","import template from './template';\nimport packageJSON from './plugins/packageJSON';\nimport router from './plugins/router';\nimport main from './plugins/main';\nimport form from './plugins/form';\nimport hooks from './plugins/hooks';\n\nexport default {\n  template,\n  plugins: {\n    packageJSON,\n    router,\n    main,\n    form,\n    hooks,\n  },\n};\n","import { createProjectBuilder } from '../generator/ProjectBuilder';\nimport containerVue from '../plugins/component/vue/containerVue';\nimport template from '../plugins/component/vue/template';\nimport vueCommonDeps from '../plugins/component/vue/vueCommonDeps';\nimport apiImport from '../plugins/component/vue/apiImport';\nimport esmodule from '../plugins/component/vue/esmodule';\nimport containerInitVariable from '../plugins/component/vue/containerInitVariable';\nimport containerLifeCycle from '../plugins/component/vue/containerLifeCycle';\nimport containerInjectDataSourceEngine from '../plugins/component/vue/containerInjectDataSourceEngine';\nimport containerMethod from '../plugins/component/vue/containerMethod';\nimport dataSourceMap from '../plugins/component/vue/dataSourceMap';\nimport routerSecond from '../plugins/component/vue/routerSecond';\nimport vuejs3 from '../plugins/project/framework/vuejs3';\nimport { prettier } from '../postprocessor';\n\nexport default function createDcSolutionProjectBuilder() {\n  return createProjectBuilder({\n    template: vuejs3.template,\n    plugins: {\n      components: [],\n      pages: [\n        template({\n          nodeTypeMapping: {\n            Div: 'div',\n            Component: 'div',\n            Page: 'div',\n            Block: 'div',\n          },\n        }),\n        vueCommonDeps(),\n        esmodule({ fileType: 'vue' }),\n        containerVue(),\n        apiImport(),\n        containerInitVariable(),\n        dataSourceMap(),\n        containerLifeCycle(),\n        containerMethod(),\n      ],\n      router: [\n        // CodeGen.plugins.common.esModule(),\n        vuejs3.plugins.router(),\n      ],\n      // entry: [CodeGen.solutionParts.icejs.plugins.entry()],\n      // constants: [CodeGen.plugins.project.constants()],\n      utils: [],\n      i18n: [],\n      // globalStyle: [CodeGen.solutionParts.icejs.plugins.globalStyle()],\n      // htmlEntry: [CodeGen.solutionParts.icejs.plugins.entryHtml()],\n      packageJSON: [vuejs3.plugins.packageJSON()],\n      api: [containerInjectDataSourceEngine()],\n      main: [vuejs3.plugins.main()],\n      form: [vuejs3.plugins.form()],\n      hooks: [vuejs3.plugins.hooks()],\n      routerModules: [routerSecond()]\n    },\n    postProcessors: [prettier()],\n  });\n}\nexport const plugins = {\n  template,\n  vueCommonDeps,\n  esmodule,\n  containerVue,\n  apiImport,\n  containerInitVariable,\n  dataSourceMap,\n  containerLifeCycle,\n  containerMethod,\n  vuejs3,\n};\n","import { COMMON_CHUNK_NAME } from '../../const/generator';\n\nimport { BuilderComponentPlugin, BuilderComponentPluginFactory, ChunkType, FileType, ICodeStruct } from '../../types';\n\n// TODO: How to merge this logic to common deps\nconst pluginFactory: BuilderComponentPluginFactory<unknown> = () => {\n  const plugin: BuilderComponentPlugin = async (pre: ICodeStruct) => {\n    const next: ICodeStruct = {\n      ...pre,\n    };\n\n    next.chunks.push({\n      type: ChunkType.STRING,\n      fileType: FileType.JSX,\n      name: COMMON_CHUNK_NAME.InternalDepsImport,\n      content: 'import * from \\'react\\';',\n      linkAfter: [],\n    });\n\n    return next;\n  };\n  return plugin;\n};\n\nexport default pluginFactory;\n","// 本文件是要导出到外面的，注意只导出比较稳定的东西\nimport * as common from './common';\nimport * as compositeType from './compositeType';\nimport * as jsExpression from './jsExpression';\nimport * as jsSlot from './jsSlot';\nimport * as nodeToJSX from './nodeToJSX';\nimport * as resultHelper from './resultHelper';\nimport * as templateHelper from './templateHelper';\nimport * as validate from './validate';\nimport * as schema from './schema';\nimport * as version from './version';\nimport * as scope from './Scope';\nimport * as expressionParser from './expressionParser';\nimport * as dataSource from './dataSource';\nimport * as pathHelper from './pathHelper';\n\nexport {\n  common,\n  compositeType,\n  jsExpression,\n  jsSlot,\n  nodeToJSX,\n  resultHelper,\n  templateHelper,\n  validate,\n  schema,\n  version,\n  scope,\n  expressionParser,\n  dataSource,\n  pathHelper,\n};\n"]}