From c4c081ae3a279ec891236460386b48cf7128d737 Mon Sep 17 00:00:00 2001 From: winixt Date: Fri, 5 Sep 2025 22:40:22 +0800 Subject: [PATCH] feat: esm --- .npmrc | 1 - eslint.config.js | 1 - package.json | 15 +- .../LICENSE | 0 .../README.md | 0 .../package.json | 35 +- .../src/commands/build/getBuildConfig.ts} | 25 +- .../builder-vite/src/commands/build/index.ts | 40 + .../src/commands/dev/getDevConfig.ts} | 23 +- .../src/commands/dev/index.ts} | 29 +- .../src/commands/dev/viteMiddlewarePlugin.ts} | 10 +- .../src/common/SFCConfigBlockPlugin.ts} | 6 +- .../src/common/connectHistoryMiddleware.ts | 26 + .../src/common/getConfig.ts} | 25 +- .../src/common/getDefine.ts} | 10 +- .../src/common/vite-plugin-html.ts} | 253 +- .../src/features/viteAnalyze.ts} | 14 +- .../src/features/viteHtml.ts} | 7 +- .../src/features/viteLegacy.ts} | 7 +- .../builder-vite/src/features/viteOption.ts | 22 + .../src/features/viteVueJsx.ts} | 6 +- .../src/features/viteVuePlugin.ts} | 6 +- packages/builder-vite/src/index.ts | 30 + packages/builder-vite/src/registerBuilder.ts | 7 + .../src/registerMethods.ts} | 4 +- .../src/registerType.ts} | 3 +- packages/builder-vite/src/shared.ts | 19 + packages/builder-vite/tsconfig.json | 9 + packages/builder-vite/tsconfig.tsbuildinfo | 1 + packages/builder-vite/tsup.config.ts | 24 + packages/builder-vite/types.d.ts | 21 + .../LICENSE | 0 .../README.md | 0 .../package.json | 37 +- packages/builder-webpack/src/index.ts | 46 + .../src/plugins/commands/build/build.ts} | 4 +- .../src/plugins/commands/build/index.ts} | 26 +- .../commands/dev/connectHistoryMiddleware.ts} | 8 +- .../src/plugins/commands/dev/devServer.ts} | 29 +- .../src/plugins/commands/dev/index.ts} | 33 +- .../src/plugins/commands}/index-default.html | 0 .../src/plugins/commands/pitcher.ts | 9 + .../src/plugins/commands/webpack/index.ts} | 33 +- .../src/plugins/common/buildDevUtils.ts} | 95 +- .../src/plugins/common/webpackConfig/css.ts} | 71 +- .../plugins/common/webpackConfig/define.ts} | 16 +- .../common/webpackConfig/getBabelOpts.ts} | 50 +- .../src/plugins/common/webpackConfig/html.ts | 107 + .../plugins/common/webpackConfig/index.ts} | 87 +- .../common/webpackConfig/minimizer.ts} | 24 +- .../src/plugins/common/webpackConfig/vue.ts | 35 + .../src/plugins/features/analyze.ts} | 12 +- .../src/plugins/features/chainWebpack.ts} | 4 +- .../src/plugins/features/copy.ts} | 4 +- .../src/plugins/features/cssLoader.ts} | 4 +- .../src/plugins/features/devServer.ts} | 4 +- .../src/plugins/features/devtool.ts} | 4 +- .../src/plugins/features/exportStatic.ts} | 4 +- .../src/plugins/features/externals.ts} | 4 +- .../plugins/features/extraBabelPlugins.ts} | 4 +- .../plugins/features/extraBabelPresets.ts} | 4 +- .../src/plugins/features/extraCSS.ts} | 4 +- .../plugins/features/extraPostCSSPlugins.ts} | 4 +- .../src/plugins/features/html.ts} | 4 +- .../src/plugins/features/lessLoader.ts} | 4 +- .../plugins/features/nodeModulesTransform.ts} | 4 +- .../src/plugins/features/postcssLoader.ts} | 4 +- .../src/plugins/features/vueLoader.ts} | 4 +- .../src/plugins/registerBuilder.ts | 7 + .../src/plugins/registerMethods.ts} | 4 +- .../src/plugins/registerType.ts} | 3 +- packages/builder-webpack/src/shared.ts | 72 + .../src/utils/generateExports.ts} | 32 +- packages/builder-webpack/tsconfig.json | 9 + packages/builder-webpack/tsconfig.tsbuildinfo | 1 + packages/builder-webpack/tsup.config.ts | 38 + packages/builder-webpack/types.d.ts | 6 + packages/{fes-compiler => compiler}/LICENSE | 0 packages/{fes-compiler => compiler}/README.md | 3 - .../{fes-compiler => compiler}/package.json | 24 +- .../index.js => compiler/src/config/index.ts} | 159 +- .../compiler/src/config/utils/configUtils.ts | 28 + packages/compiler/src/config/utils/isEqual.ts | 18 + .../src/config/utils/mergeDefault.ts} | 9 +- packages/compiler/src/index.ts | 12 + packages/compiler/src/service/enums.ts | 49 + packages/compiler/src/service/getPaths.ts | 39 + .../src/service/index.ts} | 376 +- .../src/service/pluginAPI.ts} | 103 +- .../src/service/plugins/builder.ts} | 6 +- .../compiler/src/service/utils/isPromise.ts | 12 + .../src/service/utils/loadDotEnv.ts} | 8 +- .../compiler/src/service/utils/pluginUtils.ts | 214 + packages/compiler/src/shared.ts | 7 + packages/compiler/src/types.ts | 94 + packages/compiler/tsconfig.json | 9 + packages/compiler/tsup.config.ts | 11 + packages/create-fes-app/README.md | 3 - packages/create-fes-app/package.json | 28 +- packages/create-fes-app/src/cli.js | 18 +- packages/create-fes-app/src/index.js | 34 +- packages/create-fes-app/src/utils.js | 7 +- .../templates/plugin/scripts/build.js | 33 +- .../src/commands/build/index.js | 42 - .../src/common/connectHistoryMiddleware.js | 15 - .../src/features/viteOption.js | 11 - packages/fes-builder-vite/src/index.js | 25 - .../fes-builder-vite/src/registerBuilder.js | 5 - packages/fes-builder-vite/types.d.ts | 15 - packages/fes-builder-webpack/src/index.js | 35 - .../src/plugins/common/webpackConfig/html.js | 82 - .../plugins/common/webpackConfig/pitcher.js | 10 - .../src/plugins/common/webpackConfig/vue.js | 25 - .../src/plugins/registerBuilder.js | 5 - packages/fes-builder-webpack/types.d.ts | 63 - .../src/config/utils/configUtils.js | 16 - .../fes-compiler/src/config/utils/isEqual.js | 16 - packages/fes-compiler/src/index.js | 12 - .../fes-compiler/src/service/babelRegister.js | 56 - packages/fes-compiler/src/service/enums.js | 33 - packages/fes-compiler/src/service/getPaths.js | 36 - .../src/service/utils/isPromise.js | 7 - .../src/service/utils/pluginUtils.js | 167 - packages/fes-plugin-access/build.config.js | 4 - packages/fes-plugin-enums/build.config.js | 4 - packages/fes-plugin-icon/build.config.js | 4 - packages/fes-plugin-jest/README.md | 104 - .../helpers/transformers/javascript.js | 8 - packages/fes-plugin-jest/package.json | 47 - .../src/createDefaultConfig.js | 57 - packages/fes-plugin-jest/src/index.js | 93 - packages/fes-plugin-jest/src/jestArgs.js | 546 - packages/fes-plugin-layout/README.md | 104 - packages/fes-plugin-layout/build.config.js | 3 - packages/fes-plugin-locale/build.config.js | 4 - packages/fes-plugin-login/README.md | 104 - packages/fes-plugin-login/build.config.js | 3 - packages/fes-plugin-model/README.md | 104 - packages/fes-plugin-model/build.config.js | 4 - packages/fes-plugin-monaco-editor/README.md | 104 - .../fes-plugin-monaco-editor/build.config.js | 4 - packages/fes-plugin-pinia/README.md | 104 - packages/fes-plugin-pinia/build.config.js | 4 - packages/fes-plugin-qiankun/README.md | 104 - packages/fes-plugin-qiankun/build.config.js | 4 - .../examples/webpack-micro/tsconfig.json | 37 - packages/fes-plugin-request/README.md | 104 - .../fes-plugin-request/__tests__/request.js | 5 - packages/fes-plugin-request/build.config.js | 3 - packages/fes-plugin-sass/.fatherrc.js | 3 - packages/fes-plugin-sass/README.md | 104 - packages/fes-plugin-sass/package.json | 38 - packages/fes-plugin-vuex/README.md | 104 - packages/fes-plugin-vuex/build.config.js | 3 - packages/fes-plugin-vuex/package.json | 39 - packages/fes-plugin-vuex/src/helper.js | 174 - packages/fes-plugin-vuex/src/index.js | 65 - packages/fes-plugin-vuex/src/runtime/core.tpl | 28 - .../fes-plugin-vuex/src/runtime/runtime.js | 6 - packages/fes-plugin-vuex/types.d.ts | 19 - packages/fes-plugin-watermark/README.md | 104 - packages/fes-plugin-watermark/build.config.js | 4 - packages/fes-plugin-windicss/README.md | 104 - packages/fes-plugin-windicss/package.json | 40 - packages/fes-plugin-windicss/src/index.js | 73 - packages/fes-plugin-windicss/types.d.ts | 11 - packages/fes-preset-built-in/README.md | 104 - packages/fes-preset-built-in/src/index.js | 40 - .../src/plugins/commands/info/index.js | 24 - .../src/utils/constants.js | 4 - packages/fes-runtime/LICENSE | 21 - packages/fes-runtime/README.md | 104 - packages/fes-runtime/build.config.js | 4 - packages/fes-runtime/src/utils/assert.js | 3 - packages/fes-runtime/types.d.ts | 21 - packages/fes-template-h5/.fes.js | 4 +- packages/fes-template-h5/index.html | 2 +- packages/fes-template-h5/package.json | 38 +- packages/fes-template-vite/.fes.js | 20 +- packages/fes-template-vite/package.json | 12 +- packages/fes-template-vite/postcss.config.mjs | 7 + packages/fes-template-vite/src/global.css | 4 +- packages/fes-template-vite/src/global.scss | 10 - .../fes-template-vite/src/pages/index.vue | 12 +- packages/fes-template-vite/test.js | 5 + packages/fes-template/package.json | 11 +- packages/fes-utils/LICENSE | 21 - packages/fes-utils/README.md | 104 - packages/fes-utils/src/changePort.js | 6 - packages/fes-utils/src/cleanRequireCache.js | 21 - .../fes-utils/src/compatESModuleRequire.js | 3 - packages/fes-utils/src/delay.js | 1 - packages/fes-utils/src/getHostName.js | 1 - packages/fes-utils/src/getPort.js | 7 - .../src/getTargetsAndBrowsersList.js | 17 - packages/fes-utils/src/mergeConfig.js | 15 - packages/fes-utils/src/parseRequireDeps.js | 37 - packages/fes-utils/src/resolvePkg.js | 6 - packages/fes/README.md | 2 - packages/fes/bin/fes.js | 13 - packages/fes/bin/fes.mjs | 4 + packages/fes/build.config.js | 3 - packages/fes/package.json | 64 +- .../fes/{src/index.js => public/browser.js} | 4 - packages/fes/public/node.js | 3 + packages/fes/src/{cli.js => cli.ts} | 27 +- .../fes/src/{forkedDev.js => forkedDev.ts} | 21 +- packages/fes/src/hackFesInBuild.js | 20 - packages/fes/src/serviceWithBuiltIn.js | 22 - packages/fes/src/serviceWithBuiltIn.ts | 25 + packages/fes/src/types/index.ts | 31 + packages/fes/src/utils/{fork.js => fork.ts} | 16 +- .../fes/src/utils/{getCwd.js => getCwd.ts} | 5 +- packages/fes/src/utils/getPkg.js | 16 - packages/fes/src/utils/getPkg.ts | 17 + packages/fes/src/utils/shared.ts | 4 + packages/fes/tsconfig.json | 9 + packages/fes/tsup.config.ts | 13 + packages/fes/types.d.ts | 9 +- .../LICENSE | 0 .../README.md | 3 - .../package.json | 43 +- .../index.js => plugin-access/src/index.ts} | 17 +- .../src/runtime/core.tpl | 0 .../src/runtime/createComponent.js | 0 .../src/runtime/createDirective.js | 0 .../src/runtime/runtime.js | 0 packages/plugin-access/tsconfig.json | 9 + packages/plugin-access/tsup.config.ts | 13 + .../types.d.ts | 2 +- .../LICENSE | 0 packages/plugin-enums/README.md | 101 + .../package.json | 35 +- .../index.js => plugin-enums/src/index.ts} | 16 +- .../src/runtime/core.tpl | 0 packages/plugin-enums/tsconfig.json | 9 + packages/plugin-enums/tsup.config.ts | 13 + .../types.d.ts | 0 .../{fes-plugin-icon => plugin-icon}/LICENSE | 0 packages/plugin-icon/README.md | 101 + .../package.json | 15 +- .../src/index.js => plugin-icon/src/index.ts} | 13 +- .../src/optimizeSvg.ts} | 15 +- .../src/runtime/Icon/Icon.jsx | 0 .../src/runtime/Icon/icon.less | 0 .../src/runtime/Icon/index.js | 0 .../src/runtime/icons.tpl | 0 .../src/runtime/runtime.tpl | 0 packages/plugin-icon/tsconfig.json | 9 + packages/plugin-icon/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-layout/README.md | 101 + .../package.json | 18 +- .../index.js => plugin-layout/src/index.ts} | 18 +- .../src/node/helper.ts} | 2 +- .../src/runtime/assets/403.png | Bin .../src/runtime/assets/404.png | Bin .../src/runtime/assets/logo.png | Bin .../src/runtime/helpers/fillMenu.js | 0 .../src/runtime/helpers/getConfig.tpl | 0 .../src/runtime/helpers/pluginAccess.js.tpl | 0 .../src/runtime/helpers/pluginLocale.js | 0 .../src/runtime/helpers/svg.js | 0 .../src/runtime/helpers/utils.js | 0 .../src/runtime/index.js | 0 .../src/runtime/locales/layout/en-US.js | 0 .../src/runtime/locales/layout/zh-CN.js | 0 .../src/runtime/runtime.js.tpl | 0 .../src/runtime/useLayout.js | 0 .../src/runtime/views/403.vue | 0 .../src/runtime/views/404.vue | 0 .../src/runtime/views/BaseLayout.vue | 0 .../src/runtime/views/Menu.vue | 0 .../src/runtime/views/MenuIcon.vue | 0 .../src/runtime/views/MultiTabProvider.vue | 0 .../src/runtime/views/components/Wrapper.vue | 0 .../src/runtime/views/index.jsx | 0 .../src/runtime/views/page.vue | 0 packages/plugin-layout/tsconfig.json | 9 + packages/plugin-layout/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 .../README.md | 3 - .../package.json | 43 +- .../index.js => plugin-locale/src/index.ts} | 17 +- .../src/runtime/core.js.tpl | 0 .../src/runtime/langUConfigMap.js | 0 .../src/runtime/locales.js.tpl | 0 .../src/runtime/runtime.js | 0 .../src/runtime/views/SelectLang.vue | 0 .../src/utils/index.ts} | 8 +- packages/plugin-locale/tsconfig.json | 9 + packages/plugin-locale/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-login/README.md | 101 + .../package.json | 35 +- .../index.js => plugin-login/src/index.ts} | 22 +- .../src/runtime/runtime.js | 0 packages/plugin-login/tsconfig.json | 9 + packages/plugin-login/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-model/README.md | 101 + .../package.json | 39 +- .../index.js => plugin-model/src/index.ts} | 24 +- .../src/runtime/core.tpl | 0 .../src/runtime/models/initialState.js | 0 .../src/utils/getModels.ts} | 6 +- .../src/utils/getTmpFile.ts} | 22 +- .../src/utils/index.ts} | 87 +- packages/plugin-model/tsconfig.json | 9 + packages/plugin-model/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-monaco-editor/README.md | 101 + .../package.json | 45 +- .../src/index.ts} | 29 +- .../src/runtime/core.tpl | 0 .../src/runtime/editor.tpl | 0 .../src/runtime/loader.tpl | 0 .../src/runtime/runtime.tpl | 0 .../src/runtime/theme/default.js | 0 packages/plugin-monaco-editor/tsconfig.json | 9 + packages/plugin-monaco-editor/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-pinia/README.md | 101 + .../package.json | 41 +- .../helper.js => plugin-pinia/src/helper.ts} | 19 +- .../index.js => plugin-pinia/src/index.ts} | 19 +- .../src/runtime/core.tpl | 0 .../src/runtime/runtime.js | 0 packages/plugin-pinia/tsconfig.json | 9 + packages/plugin-pinia/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-qiankun/README.md | 101 + .../examples/vite-main/.env | 0 .../examples/vite-main/.fes.js | 3 - .../examples/vite-main/index.html | 0 .../examples/vite-main}/package.json | 61 +- .../examples/vite-main/src/app.jsx | 0 .../vite-main/src/components/PageLoading.vue | 0 .../examples/vite-main/src/global.css | 0 .../examples/vite-main/src/images/icon.png | Bin .../examples/vite-main}/src/pages/index.vue | 4 +- .../vite-main/src/pages/vite/index.vue | 0 .../vite-main/src/pages/vite/test.vue | 0 .../vite-main/src/pages/webpack/index.vue | 0 .../vite-main/src/pages/webpack/test.vue | 0 .../examples/vite-main/tsconfig.json | 0 .../examples/vite-micro/.env | 0 .../examples/vite-micro/.fes.js | 0 .../examples/vite-micro/index.html | 0 .../examples/vite-micro/package.json | 59 +- .../examples/vite-micro/src/app.jsx | 0 .../vite-micro/src/components/PageLoading.vue | 0 .../examples/vite-micro/src/global.css | 0 .../examples/vite-micro/src/images/icon.png | Bin .../vite-micro/src/pages/vite/index.vue | 4 +- .../vite-micro/src/pages/vite/test.vue | 0 .../examples/vite-micro/tsconfig.json | 0 .../examples/webpack-main/.env | 0 .../examples/webpack-main/.fes.js | 12 +- .../examples/webpack-main/package.json | 59 +- .../examples/webpack-main/src/app.jsx | 0 .../src/components/PageLoading.vue | 0 .../examples/webpack-main/src/global.css | 0 .../examples/webpack-main/src/images/icon.png | Bin .../webpack-main}/src/pages/index.vue | 5 +- .../webpack-main/src/pages/vite/index.vue} | 4 + .../webpack-main/src/pages/vite/test.vue} | 4 + .../webpack-main/src/pages/webpack/index.vue | 4 + .../webpack-main/src/pages/webpack/test.vue | 4 + .../examples/webpack-main/tsconfig.json | 0 .../examples/webpack-micro/.env | 0 .../examples/webpack-micro/.fes.js | 0 .../examples/webpack-micro}/package.json | 57 +- .../examples/webpack-micro/src/app.js | 0 .../src/components/PageLoading.vue | 0 .../examples/webpack-micro/src/global.css | 0 .../webpack-micro/src/images/icon.png | Bin .../webpack-micro/src/pages/webpack/index.vue | 0 .../webpack-micro/src/pages/webpack/test.vue | 0 .../examples/webpack-micro/tsconfig.json | 35 + .../package.json | 48 +- .../src/constants.ts} | 6 + .../index.js => plugin-qiankun/src/index.ts} | 11 +- .../src/main/index.ts} | 14 +- .../src/main/modifyRoutes.ts} | 13 +- .../src/main/runtime/MicroApp.tpl | 0 .../main/runtime/MicroAppRouteComponent.tpl | 0 .../main/runtime/MicroAppWithMemoHistory.jsx | 0 .../src/main/runtime/qiankunModel.tpl | 0 .../src/main/runtime/runtime.tpl | 0 .../src/micro/index.ts} | 15 +- .../src/micro/runtime/lifecycle.tpl | 0 .../src/micro/runtime/qiankunModel.tpl | 0 .../src/micro/runtime/runtime.tpl | 0 packages/plugin-qiankun/tsconfig.json | 9 + packages/plugin-qiankun/tsup.config.ts | 17 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-request/README.md | 101 + .../package.json | 13 +- .../index.js => plugin-request/src/index.ts} | 14 +- .../src/template/request.js | 0 packages/plugin-request/tsconfig.json | 9 + packages/plugin-request/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/plugin-sass/README.md | 101 + packages/plugin-sass/package.json | 41 + .../src/index.js => plugin-sass/src/index.ts} | 14 +- packages/plugin-sass/tsconfig.json | 9 + packages/plugin-sass/tsup.config.ts | 11 + .../types.d.ts | 0 .../{fes-plugin-sass => plugin-swc}/LICENSE | 0 .../{fes-plugin-swc => plugin-swc}/README.md | 3 - .../package.json | 48 +- .../src/index.js => plugin-swc/src/index.ts} | 54 +- .../src/swcOptions.ts} | 13 +- packages/plugin-swc/tsconfig.json | 9 + packages/plugin-swc/tsup.config.ts | 11 + .../{fes-plugin-swc => plugin-swc}/types.d.ts | 0 .../LICENSE | 0 packages/plugin-watermark/README.md | 101 + .../package.json | 41 +- .../src/index.ts} | 12 +- .../src/runtime/core.js | 0 packages/plugin-watermark/src/shared.ts | 4 + packages/plugin-watermark/tsconfig.json | 9 + packages/plugin-watermark/tsup.config.ts | 13 + .../types.d.ts | 0 .../LICENSE | 0 packages/preset-built-in/README.md | 101 + .../package.json | 22 +- packages/preset-built-in/src/index.ts | 42 + .../src/plugins/commands/help/index.ts} | 0 .../plugins/core/entry/defaultContainer.tpl | 0 .../src/plugins/core/entry/fes.tpl | 0 .../src/plugins/core/entry/index.ts} | 7 +- .../src/plugins/core/entry/initialState.tpl | 0 .../src/plugins/core/exports/coreExports.tpl | 0 .../src/plugins/core/exports/coreExports.ts} | 13 +- .../src/plugins/core/exports/doc.md | 0 .../plugins/core/exports/pluginExports.ts} | 0 .../src/plugins/core/plugin/index.ts} | 9 +- .../src/plugins/core/plugin/plugin.tpl | 0 .../plugins/core/plugin/pluginRegister.tpl | 0 .../src/plugins/core/route/index.ts} | 107 +- .../core/route/template/routeExports.tpl | 0 .../plugins/core/route/template/routes.tpl | 0 .../plugins/core/route/template/runtime.tpl | 0 .../src/plugins/features/alias.ts} | 0 .../src/plugins/features/autoprefixer.ts} | 0 .../src/plugins/features/console.ts} | 0 .../src/plugins/features/define.ts} | 0 .../src/plugins/features/dynamicImport.ts} | 0 .../src/plugins/features/globalCSS.ts} | 0 .../src/plugins/features/inlineLimit.ts} | 0 .../src/plugins/features/mock.ts} | 87 +- .../src/plugins/features/mountElementId.ts} | 0 .../src/plugins/features/outputPath.ts} | 0 .../src/plugins/features/plugins.ts} | 0 .../src/plugins/features/presets.ts} | 0 .../src/plugins/features/proxy.ts} | 0 .../src/plugins/features/publicPath.ts} | 0 .../src/plugins/features/singular.ts} | 0 .../src/plugins/features/targets.ts} | 0 .../src/plugins/features/terserOptions.ts} | 0 .../src/plugins/features/title.ts} | 0 .../src/plugins/features/useExtraCSS.ts} | 0 .../src/plugins/registerMethods.ts} | 0 .../src/plugins/registerType.ts} | 0 .../src/plugins/watch/watchMode.ts} | 0 .../src/plugins/watch/watchPkg.ts} | 0 packages/preset-built-in/src/shared.ts | 12 + .../preset-built-in/src/utils/constants.ts | 5 + .../src/utils/generateExports.ts} | 4 +- packages/preset-built-in/tsconfig.json | 9 + packages/preset-built-in/tsup.config.ts | 64 + .../types.d.ts | 9 +- .../{fes-plugin-watermark => runtime}/LICENSE | 0 packages/runtime/README.md | 101 + .../{fes-runtime => runtime}/package.json | 37 +- .../src/index.js => runtime/src/index.ts} | 18 +- .../index.js => runtime/src/plugin/index.ts} | 95 +- packages/runtime/src/utils/assert.ts | 5 + .../index.js => runtime/src/utils/index.ts} | 0 packages/runtime/tsconfig.json | 9 + packages/runtime/tsup.config.ts | 14 + .../{fes-plugin-windicss => shared}/LICENSE | 0 .../{fes-plugin-icon => shared}/README.md | 2 - packages/shared/package.json | 35 + packages/shared/src/index.ts | 1 + packages/shared/src/types/config.ts | 84 + packages/shared/src/types/core.ts | 26 + packages/shared/src/types/plugin.ts | 109 + packages/shared/tsconfig.json | 9 + packages/shared/tsup.config.ts | 11 + packages/typescript-config/base.json | 11 + packages/typescript-config/package.json | 5 + .../{fes-preset-built-in => utils}/LICENSE | 0 .../{fes-plugin-enums => utils}/README.md | 2 - packages/{fes-utils => utils}/package.json | 36 +- .../Generator.js => utils/src/Generator.ts} | 45 +- packages/utils/src/changePort.ts | 8 + packages/utils/src/compatESModuleRequire.ts | 3 + packages/utils/src/delay.ts | 1 + .../getAppPath.js => utils/src/getAppPath.ts} | 6 +- packages/utils/src/getHostName.ts | 3 + packages/utils/src/getPort.ts | 7 + .../utils/src/getTargetsAndBrowsersList.ts | 31 + .../src/index.js => utils/src/index.ts} | 82 +- .../src/logger.js => utils/src/logger.ts} | 16 +- packages/utils/src/mergeConfig.ts | 22 + .../src/resolveRuntimeEnv.ts} | 6 +- .../src/stringifyObjValue.ts} | 4 +- .../src/winPath.js => utils/src/winPath.ts} | 2 +- packages/utils/tsconfig.json | 9 + packages/utils/tsup.config.ts | 11 + pnpm-lock.yaml | 24720 ++++++++-------- scripts/build.mjs | 30 +- scripts/compiler.mjs | 13 +- scripts/shared.mjs | 21 + tsconfig.base.json | 4 +- 529 files changed, 18480 insertions(+), 17638 deletions(-) rename packages/{fes-builder-vite => builder-vite}/LICENSE (100%) rename packages/{fes-builder-vite => builder-vite}/README.md (100%) rename packages/{fes-builder-vite => builder-vite}/package.json (63%) rename packages/{fes-builder-vite/src/commands/build/getBuildConfig.js => builder-vite/src/commands/build/getBuildConfig.ts} (66%) create mode 100644 packages/builder-vite/src/commands/build/index.ts rename packages/{fes-builder-vite/src/commands/dev/getDevConfig.js => builder-vite/src/commands/dev/getDevConfig.ts} (64%) rename packages/{fes-builder-vite/src/commands/dev/index.js => builder-vite/src/commands/dev/index.ts} (64%) rename packages/{fes-builder-vite/src/commands/dev/viteMiddlewarePlugin.js => builder-vite/src/commands/dev/viteMiddlewarePlugin.ts} (56%) rename packages/{fes-builder-vite/src/common/SFCConfigBlockPlugin.js => builder-vite/src/common/SFCConfigBlockPlugin.ts} (60%) create mode 100644 packages/builder-vite/src/common/connectHistoryMiddleware.ts rename packages/{fes-builder-vite/src/common/getConfig.js => builder-vite/src/common/getConfig.ts} (78%) rename packages/{fes-builder-vite/src/common/getDefine.js => builder-vite/src/common/getDefine.ts} (53%) rename packages/{fes-builder-vite/src/common/vite-plugin-html.js => builder-vite/src/common/vite-plugin-html.ts} (61%) rename packages/{fes-builder-vite/src/features/viteAnalyze.js => builder-vite/src/features/viteAnalyze.ts} (55%) rename packages/{fes-builder-vite/src/features/viteHtml.js => builder-vite/src/features/viteHtml.ts} (57%) rename packages/{fes-builder-vite/src/features/viteLegacy.js => builder-vite/src/features/viteLegacy.ts} (57%) create mode 100644 packages/builder-vite/src/features/viteOption.ts rename packages/{fes-builder-vite/src/features/viteVueJsx.js => builder-vite/src/features/viteVueJsx.ts} (57%) rename packages/{fes-builder-vite/src/features/viteVuePlugin.js => builder-vite/src/features/viteVuePlugin.ts} (58%) create mode 100644 packages/builder-vite/src/index.ts create mode 100644 packages/builder-vite/src/registerBuilder.ts rename packages/{fes-builder-vite/src/registerMethods.js => builder-vite/src/registerMethods.ts} (50%) rename packages/{fes-builder-vite/src/registerType.js => builder-vite/src/registerType.ts} (53%) create mode 100644 packages/builder-vite/src/shared.ts create mode 100644 packages/builder-vite/tsconfig.json create mode 100644 packages/builder-vite/tsconfig.tsbuildinfo create mode 100644 packages/builder-vite/tsup.config.ts create mode 100644 packages/builder-vite/types.d.ts rename packages/{fes-builder-webpack => builder-webpack}/LICENSE (100%) rename packages/{fes-builder-webpack => builder-webpack}/README.md (100%) rename packages/{fes-builder-webpack => builder-webpack}/package.json (70%) create mode 100644 packages/builder-webpack/src/index.ts rename packages/{fes-builder-webpack/src/plugins/commands/build/build.js => builder-webpack/src/plugins/commands/build/build.ts} (78%) rename packages/{fes-builder-webpack/src/plugins/commands/build/index.js => builder-webpack/src/plugins/commands/build/index.ts} (75%) rename packages/{fes-builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.js => builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.ts} (67%) rename packages/{fes-builder-webpack/src/plugins/commands/dev/devServer.js => builder-webpack/src/plugins/commands/dev/devServer.ts} (71%) rename packages/{fes-builder-webpack/src/plugins/commands/dev/index.js => builder-webpack/src/plugins/commands/dev/index.ts} (80%) rename packages/{fes-builder-webpack/src/plugins/common/webpackConfig => builder-webpack/src/plugins/commands}/index-default.html (100%) create mode 100644 packages/builder-webpack/src/plugins/commands/pitcher.ts rename packages/{fes-builder-webpack/src/plugins/commands/webpack/index.js => builder-webpack/src/plugins/commands/webpack/index.ts} (50%) rename packages/{fes-builder-webpack/src/plugins/common/buildDevUtils.js => builder-webpack/src/plugins/common/buildDevUtils.ts} (65%) rename packages/{fes-builder-webpack/src/plugins/common/webpackConfig/css.js => builder-webpack/src/plugins/common/webpackConfig/css.ts} (58%) rename packages/{fes-builder-webpack/src/plugins/common/webpackConfig/define.js => builder-webpack/src/plugins/common/webpackConfig/define.ts} (52%) rename packages/{fes-builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.js => builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.ts} (54%) create mode 100644 packages/builder-webpack/src/plugins/common/webpackConfig/html.ts rename packages/{fes-builder-webpack/src/plugins/common/webpackConfig/index.js => builder-webpack/src/plugins/common/webpackConfig/index.ts} (73%) rename packages/{fes-builder-webpack/src/plugins/common/webpackConfig/minimizer.js => builder-webpack/src/plugins/common/webpackConfig/minimizer.ts} (63%) create mode 100644 packages/builder-webpack/src/plugins/common/webpackConfig/vue.ts rename packages/{fes-builder-webpack/src/plugins/features/analyze.js => builder-webpack/src/plugins/features/analyze.ts} (74%) rename packages/{fes-builder-webpack/src/plugins/features/chainWebpack.js => builder-webpack/src/plugins/features/chainWebpack.ts} (65%) rename packages/{fes-builder-webpack/src/plugins/features/copy.js => builder-webpack/src/plugins/features/copy.ts} (83%) rename packages/{fes-builder-webpack/src/plugins/features/cssLoader.js => builder-webpack/src/plugins/features/cssLoader.ts} (91%) rename packages/{fes-builder-webpack/src/plugins/features/devServer.js => builder-webpack/src/plugins/features/devServer.ts} (91%) rename packages/{fes-builder-webpack/src/plugins/features/devtool.js => builder-webpack/src/plugins/features/devtool.ts} (64%) rename packages/{fes-builder-webpack/src/plugins/features/exportStatic.js => builder-webpack/src/plugins/features/exportStatic.ts} (85%) rename packages/{fes-builder-webpack/src/plugins/features/externals.js => builder-webpack/src/plugins/features/externals.ts} (76%) rename packages/{fes-builder-webpack/src/plugins/features/extraBabelPlugins.js => builder-webpack/src/plugins/features/extraBabelPlugins.ts} (65%) rename packages/{fes-builder-webpack/src/plugins/features/extraBabelPresets.js => builder-webpack/src/plugins/features/extraBabelPresets.ts} (65%) rename packages/{fes-builder-webpack/src/plugins/features/extraCSS.js => builder-webpack/src/plugins/features/extraCSS.ts} (76%) rename packages/{fes-builder-webpack/src/plugins/features/extraPostCSSPlugins.js => builder-webpack/src/plugins/features/extraPostCSSPlugins.ts} (66%) rename packages/{fes-builder-webpack/src/plugins/features/html.js => builder-webpack/src/plugins/features/html.ts} (77%) rename packages/{fes-builder-webpack/src/plugins/features/lessLoader.js => builder-webpack/src/plugins/features/lessLoader.ts} (68%) rename packages/{fes-builder-webpack/src/plugins/features/nodeModulesTransform.js => builder-webpack/src/plugins/features/nodeModulesTransform.ts} (78%) rename packages/{fes-builder-webpack/src/plugins/features/postcssLoader.js => builder-webpack/src/plugins/features/postcssLoader.ts} (65%) rename packages/{fes-builder-webpack/src/plugins/features/vueLoader.js => builder-webpack/src/plugins/features/vueLoader.ts} (73%) create mode 100644 packages/builder-webpack/src/plugins/registerBuilder.ts rename packages/{fes-builder-webpack/src/plugins/registerMethods.js => builder-webpack/src/plugins/registerMethods.ts} (75%) rename packages/{fes-builder-webpack/src/plugins/registerType.js => builder-webpack/src/plugins/registerType.ts} (53%) create mode 100644 packages/builder-webpack/src/shared.ts rename packages/{fes-builder-webpack/src/utils/generateExports.js => builder-webpack/src/utils/generateExports.ts} (60%) create mode 100644 packages/builder-webpack/tsconfig.json create mode 100644 packages/builder-webpack/tsconfig.tsbuildinfo create mode 100644 packages/builder-webpack/tsup.config.ts create mode 100644 packages/builder-webpack/types.d.ts rename packages/{fes-compiler => compiler}/LICENSE (100%) rename packages/{fes-compiler => compiler}/README.md (91%) rename packages/{fes-compiler => compiler}/package.json (57%) rename packages/{fes-compiler/src/config/index.js => compiler/src/config/index.ts} (61%) create mode 100644 packages/compiler/src/config/utils/configUtils.ts create mode 100644 packages/compiler/src/config/utils/isEqual.ts rename packages/{fes-compiler/src/config/utils/mergeDefault.js => compiler/src/config/utils/mergeDefault.ts} (59%) create mode 100644 packages/compiler/src/index.ts create mode 100644 packages/compiler/src/service/enums.ts create mode 100644 packages/compiler/src/service/getPaths.ts rename packages/{fes-compiler/src/service/index.js => compiler/src/service/index.ts} (60%) rename packages/{fes-compiler/src/service/pluginAPI.js => compiler/src/service/pluginAPI.ts} (67%) rename packages/{fes-compiler/src/service/plugins/builder.js => compiler/src/service/plugins/builder.ts} (59%) create mode 100644 packages/compiler/src/service/utils/isPromise.ts rename packages/{fes-compiler/src/service/utils/loadDotEnv.js => compiler/src/service/utils/loadDotEnv.ts} (58%) create mode 100644 packages/compiler/src/service/utils/pluginUtils.ts create mode 100644 packages/compiler/src/shared.ts create mode 100644 packages/compiler/src/types.ts create mode 100644 packages/compiler/tsconfig.json create mode 100644 packages/compiler/tsup.config.ts delete mode 100644 packages/fes-builder-vite/src/commands/build/index.js delete mode 100644 packages/fes-builder-vite/src/common/connectHistoryMiddleware.js delete mode 100644 packages/fes-builder-vite/src/features/viteOption.js delete mode 100644 packages/fes-builder-vite/src/index.js delete mode 100644 packages/fes-builder-vite/src/registerBuilder.js delete mode 100644 packages/fes-builder-vite/types.d.ts delete mode 100644 packages/fes-builder-webpack/src/index.js delete mode 100644 packages/fes-builder-webpack/src/plugins/common/webpackConfig/html.js delete mode 100644 packages/fes-builder-webpack/src/plugins/common/webpackConfig/pitcher.js delete mode 100644 packages/fes-builder-webpack/src/plugins/common/webpackConfig/vue.js delete mode 100644 packages/fes-builder-webpack/src/plugins/registerBuilder.js delete mode 100644 packages/fes-builder-webpack/types.d.ts delete mode 100644 packages/fes-compiler/src/config/utils/configUtils.js delete mode 100644 packages/fes-compiler/src/config/utils/isEqual.js delete mode 100644 packages/fes-compiler/src/index.js delete mode 100644 packages/fes-compiler/src/service/babelRegister.js delete mode 100644 packages/fes-compiler/src/service/enums.js delete mode 100644 packages/fes-compiler/src/service/getPaths.js delete mode 100644 packages/fes-compiler/src/service/utils/isPromise.js delete mode 100644 packages/fes-compiler/src/service/utils/pluginUtils.js delete mode 100644 packages/fes-plugin-access/build.config.js delete mode 100644 packages/fes-plugin-enums/build.config.js delete mode 100644 packages/fes-plugin-icon/build.config.js delete mode 100644 packages/fes-plugin-jest/README.md delete mode 100644 packages/fes-plugin-jest/helpers/transformers/javascript.js delete mode 100644 packages/fes-plugin-jest/package.json delete mode 100644 packages/fes-plugin-jest/src/createDefaultConfig.js delete mode 100644 packages/fes-plugin-jest/src/index.js delete mode 100644 packages/fes-plugin-jest/src/jestArgs.js delete mode 100644 packages/fes-plugin-layout/README.md delete mode 100644 packages/fes-plugin-layout/build.config.js delete mode 100644 packages/fes-plugin-locale/build.config.js delete mode 100644 packages/fes-plugin-login/README.md delete mode 100644 packages/fes-plugin-login/build.config.js delete mode 100644 packages/fes-plugin-model/README.md delete mode 100644 packages/fes-plugin-model/build.config.js delete mode 100644 packages/fes-plugin-monaco-editor/README.md delete mode 100644 packages/fes-plugin-monaco-editor/build.config.js delete mode 100644 packages/fes-plugin-pinia/README.md delete mode 100644 packages/fes-plugin-pinia/build.config.js delete mode 100644 packages/fes-plugin-qiankun/README.md delete mode 100644 packages/fes-plugin-qiankun/build.config.js delete mode 100644 packages/fes-plugin-qiankun/examples/webpack-micro/tsconfig.json delete mode 100644 packages/fes-plugin-request/README.md delete mode 100644 packages/fes-plugin-request/__tests__/request.js delete mode 100644 packages/fes-plugin-request/build.config.js delete mode 100644 packages/fes-plugin-sass/.fatherrc.js delete mode 100644 packages/fes-plugin-sass/README.md delete mode 100644 packages/fes-plugin-sass/package.json delete mode 100644 packages/fes-plugin-vuex/README.md delete mode 100644 packages/fes-plugin-vuex/build.config.js delete mode 100644 packages/fes-plugin-vuex/package.json delete mode 100644 packages/fes-plugin-vuex/src/helper.js delete mode 100644 packages/fes-plugin-vuex/src/index.js delete mode 100644 packages/fes-plugin-vuex/src/runtime/core.tpl delete mode 100644 packages/fes-plugin-vuex/src/runtime/runtime.js delete mode 100644 packages/fes-plugin-vuex/types.d.ts delete mode 100644 packages/fes-plugin-watermark/README.md delete mode 100644 packages/fes-plugin-watermark/build.config.js delete mode 100644 packages/fes-plugin-windicss/README.md delete mode 100644 packages/fes-plugin-windicss/package.json delete mode 100644 packages/fes-plugin-windicss/src/index.js delete mode 100644 packages/fes-plugin-windicss/types.d.ts delete mode 100644 packages/fes-preset-built-in/README.md delete mode 100644 packages/fes-preset-built-in/src/index.js delete mode 100644 packages/fes-preset-built-in/src/plugins/commands/info/index.js delete mode 100644 packages/fes-preset-built-in/src/utils/constants.js delete mode 100644 packages/fes-runtime/LICENSE delete mode 100644 packages/fes-runtime/README.md delete mode 100644 packages/fes-runtime/build.config.js delete mode 100644 packages/fes-runtime/src/utils/assert.js delete mode 100644 packages/fes-runtime/types.d.ts create mode 100644 packages/fes-template-vite/postcss.config.mjs delete mode 100644 packages/fes-template-vite/src/global.scss create mode 100644 packages/fes-template-vite/test.js delete mode 100644 packages/fes-utils/LICENSE delete mode 100644 packages/fes-utils/README.md delete mode 100644 packages/fes-utils/src/changePort.js delete mode 100644 packages/fes-utils/src/cleanRequireCache.js delete mode 100644 packages/fes-utils/src/compatESModuleRequire.js delete mode 100644 packages/fes-utils/src/delay.js delete mode 100644 packages/fes-utils/src/getHostName.js delete mode 100644 packages/fes-utils/src/getPort.js delete mode 100644 packages/fes-utils/src/getTargetsAndBrowsersList.js delete mode 100644 packages/fes-utils/src/mergeConfig.js delete mode 100644 packages/fes-utils/src/parseRequireDeps.js delete mode 100644 packages/fes-utils/src/resolvePkg.js delete mode 100755 packages/fes/bin/fes.js create mode 100755 packages/fes/bin/fes.mjs delete mode 100644 packages/fes/build.config.js rename packages/fes/{src/index.js => public/browser.js} (70%) create mode 100644 packages/fes/public/node.js rename packages/fes/src/{cli.js => cli.ts} (72%) rename packages/fes/src/{forkedDev.js => forkedDev.ts} (75%) delete mode 100644 packages/fes/src/hackFesInBuild.js delete mode 100644 packages/fes/src/serviceWithBuiltIn.js create mode 100644 packages/fes/src/serviceWithBuiltIn.ts create mode 100644 packages/fes/src/types/index.ts rename packages/fes/src/utils/{fork.js => fork.ts} (77%) rename packages/fes/src/utils/{getCwd.js => getCwd.ts} (70%) delete mode 100644 packages/fes/src/utils/getPkg.js create mode 100644 packages/fes/src/utils/getPkg.ts create mode 100644 packages/fes/src/utils/shared.ts create mode 100644 packages/fes/tsconfig.json create mode 100644 packages/fes/tsup.config.ts rename packages/{fes-plugin-access => plugin-access}/LICENSE (100%) rename packages/{fes-plugin-access => plugin-access}/README.md (91%) rename packages/{fes-plugin-access => plugin-access}/package.json (69%) rename packages/{fes-plugin-access/src/index.js => plugin-access/src/index.ts} (75%) rename packages/{fes-plugin-access => plugin-access}/src/runtime/core.tpl (100%) rename packages/{fes-plugin-access => plugin-access}/src/runtime/createComponent.js (100%) rename packages/{fes-plugin-access => plugin-access}/src/runtime/createDirective.js (100%) rename packages/{fes-plugin-access => plugin-access}/src/runtime/runtime.js (100%) create mode 100644 packages/plugin-access/tsconfig.json create mode 100644 packages/plugin-access/tsup.config.ts rename packages/{fes-plugin-access => plugin-access}/types.d.ts (100%) rename packages/{fes-plugin-enums => plugin-enums}/LICENSE (100%) create mode 100644 packages/plugin-enums/README.md rename packages/{fes-plugin-enums => plugin-enums}/package.json (70%) rename packages/{fes-plugin-enums/src/index.js => plugin-enums/src/index.ts} (72%) rename packages/{fes-plugin-enums => plugin-enums}/src/runtime/core.tpl (100%) create mode 100644 packages/plugin-enums/tsconfig.json create mode 100644 packages/plugin-enums/tsup.config.ts rename packages/{fes-plugin-enums => plugin-enums}/types.d.ts (100%) rename packages/{fes-plugin-icon => plugin-icon}/LICENSE (100%) create mode 100644 packages/plugin-icon/README.md rename packages/{fes-plugin-icon => plugin-icon}/package.json (71%) rename packages/{fes-plugin-icon/src/index.js => plugin-icon/src/index.ts} (82%) rename packages/{fes-plugin-icon/src/optimizeSvg.js => plugin-icon/src/optimizeSvg.ts} (82%) rename packages/{fes-plugin-icon => plugin-icon}/src/runtime/Icon/Icon.jsx (100%) rename packages/{fes-plugin-icon => plugin-icon}/src/runtime/Icon/icon.less (100%) rename packages/{fes-plugin-icon => plugin-icon}/src/runtime/Icon/index.js (100%) rename packages/{fes-plugin-icon => plugin-icon}/src/runtime/icons.tpl (100%) rename packages/{fes-plugin-icon => plugin-icon}/src/runtime/runtime.tpl (100%) create mode 100644 packages/plugin-icon/tsconfig.json create mode 100644 packages/plugin-icon/tsup.config.ts rename packages/{fes-plugin-icon => plugin-icon}/types.d.ts (100%) rename packages/{fes-plugin-jest => plugin-layout}/LICENSE (100%) create mode 100644 packages/plugin-layout/README.md rename packages/{fes-plugin-layout => plugin-layout}/package.json (70%) rename packages/{fes-plugin-layout/src/index.js => plugin-layout/src/index.ts} (88%) rename packages/{fes-plugin-layout/src/node/helper.js => plugin-layout/src/node/helper.ts} (94%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/assets/403.png (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/assets/404.png (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/assets/logo.png (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/helpers/fillMenu.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/helpers/getConfig.tpl (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/helpers/pluginAccess.js.tpl (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/helpers/pluginLocale.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/helpers/svg.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/helpers/utils.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/index.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/locales/layout/en-US.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/locales/layout/zh-CN.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/runtime.js.tpl (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/useLayout.js (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/403.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/404.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/BaseLayout.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/Menu.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/MenuIcon.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/MultiTabProvider.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/components/Wrapper.vue (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/index.jsx (100%) rename packages/{fes-plugin-layout => plugin-layout}/src/runtime/views/page.vue (100%) create mode 100644 packages/plugin-layout/tsconfig.json create mode 100644 packages/plugin-layout/tsup.config.ts rename packages/{fes-plugin-layout => plugin-layout}/types.d.ts (100%) rename packages/{fes-plugin-layout => plugin-locale}/LICENSE (100%) rename packages/{fes-plugin-locale => plugin-locale}/README.md (91%) rename packages/{fes-plugin-locale => plugin-locale}/package.json (67%) rename packages/{fes-plugin-locale/src/index.js => plugin-locale/src/index.ts} (87%) rename packages/{fes-plugin-locale => plugin-locale}/src/runtime/core.js.tpl (100%) rename packages/{fes-plugin-locale => plugin-locale}/src/runtime/langUConfigMap.js (100%) rename packages/{fes-plugin-locale => plugin-locale}/src/runtime/locales.js.tpl (100%) rename packages/{fes-plugin-locale => plugin-locale}/src/runtime/runtime.js (100%) rename packages/{fes-plugin-locale => plugin-locale}/src/runtime/views/SelectLang.vue (100%) rename packages/{fes-plugin-locale/src/utils/index.js => plugin-locale/src/utils/index.ts} (89%) create mode 100644 packages/plugin-locale/tsconfig.json create mode 100644 packages/plugin-locale/tsup.config.ts rename packages/{fes-plugin-locale => plugin-locale}/types.d.ts (100%) rename packages/{fes-plugin-locale => plugin-login}/LICENSE (100%) create mode 100644 packages/plugin-login/README.md rename packages/{fes-plugin-login => plugin-login}/package.json (71%) rename packages/{fes-plugin-login/src/index.js => plugin-login/src/index.ts} (64%) rename packages/{fes-plugin-login => plugin-login}/src/runtime/runtime.js (100%) create mode 100644 packages/plugin-login/tsconfig.json create mode 100644 packages/plugin-login/tsup.config.ts rename packages/{fes-plugin-login => plugin-login}/types.d.ts (100%) rename packages/{fes-plugin-login => plugin-model}/LICENSE (100%) create mode 100644 packages/plugin-model/README.md rename packages/{fes-plugin-model => plugin-model}/package.json (70%) rename packages/{fes-plugin-model/src/index.js => plugin-model/src/index.ts} (75%) rename packages/{fes-plugin-model => plugin-model}/src/runtime/core.tpl (100%) rename packages/{fes-plugin-model => plugin-model}/src/runtime/models/initialState.js (100%) rename packages/{fes-plugin-model/src/utils/getModels.js => plugin-model/src/utils/getModels.ts} (71%) rename packages/{fes-plugin-model/src/utils/getTmpFile.js => plugin-model/src/utils/getTmpFile.ts} (76%) rename packages/{fes-plugin-model/src/utils/index.js => plugin-model/src/utils/index.ts} (75%) create mode 100644 packages/plugin-model/tsconfig.json create mode 100644 packages/plugin-model/tsup.config.ts rename packages/{fes-plugin-model => plugin-model}/types.d.ts (100%) rename packages/{fes-plugin-model => plugin-monaco-editor}/LICENSE (100%) create mode 100644 packages/plugin-monaco-editor/README.md rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/package.json (68%) rename packages/{fes-plugin-monaco-editor/src/index.js => plugin-monaco-editor/src/index.ts} (74%) rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/src/runtime/core.tpl (100%) rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/src/runtime/editor.tpl (100%) rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/src/runtime/loader.tpl (100%) rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/src/runtime/runtime.tpl (100%) rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/src/runtime/theme/default.js (100%) create mode 100644 packages/plugin-monaco-editor/tsconfig.json create mode 100644 packages/plugin-monaco-editor/tsup.config.ts rename packages/{fes-plugin-monaco-editor => plugin-monaco-editor}/types.d.ts (100%) rename packages/{fes-plugin-monaco-editor => plugin-pinia}/LICENSE (100%) create mode 100644 packages/plugin-pinia/README.md rename packages/{fes-plugin-pinia => plugin-pinia}/package.json (68%) rename packages/{fes-plugin-pinia/src/helper.js => plugin-pinia/src/helper.ts} (72%) rename packages/{fes-plugin-pinia/src/index.js => plugin-pinia/src/index.ts} (75%) rename packages/{fes-plugin-pinia => plugin-pinia}/src/runtime/core.tpl (100%) rename packages/{fes-plugin-pinia => plugin-pinia}/src/runtime/runtime.js (100%) create mode 100644 packages/plugin-pinia/tsconfig.json create mode 100644 packages/plugin-pinia/tsup.config.ts rename packages/{fes-plugin-pinia => plugin-pinia}/types.d.ts (100%) rename packages/{fes-plugin-pinia => plugin-qiankun}/LICENSE (100%) create mode 100644 packages/plugin-qiankun/README.md rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/.env (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/.fes.js (89%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/index.html (100%) rename packages/{fes-plugin-qiankun/examples/webpack-micro => plugin-qiankun/examples/vite-main}/package.json (57%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/app.jsx (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/components/PageLoading.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/global.css (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/images/icon.png (100%) rename packages/{fes-plugin-qiankun/examples/webpack-main => plugin-qiankun/examples/vite-main}/src/pages/index.vue (99%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/pages/vite/index.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/pages/vite/test.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/pages/webpack/index.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/src/pages/webpack/test.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-main/tsconfig.json (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/.env (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/.fes.js (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/index.html (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/package.json (68%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/src/app.jsx (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/src/components/PageLoading.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/src/global.css (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/src/images/icon.png (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/src/pages/vite/index.vue (76%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/src/pages/vite/test.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/vite-micro/tsconfig.json (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/.env (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/.fes.js (88%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/package.json (59%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/src/app.jsx (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/src/components/PageLoading.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/src/global.css (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/src/images/icon.png (100%) rename packages/{fes-plugin-qiankun/examples/vite-main => plugin-qiankun/examples/webpack-main}/src/pages/index.vue (97%) rename packages/{fes-plugin-qiankun/examples/webpack-main/src/pages/vite/test.vue => plugin-qiankun/examples/webpack-main/src/pages/vite/index.vue} (76%) rename packages/{fes-plugin-qiankun/examples/webpack-main/src/pages/vite/index.vue => plugin-qiankun/examples/webpack-main/src/pages/vite/test.vue} (77%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/src/pages/webpack/index.vue (78%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/src/pages/webpack/test.vue (78%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-main/tsconfig.json (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/.env (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/.fes.js (100%) rename packages/{fes-plugin-qiankun/examples/vite-main => plugin-qiankun/examples/webpack-micro}/package.json (65%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/src/app.js (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/src/components/PageLoading.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/src/global.css (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/src/images/icon.png (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/src/pages/webpack/index.vue (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/examples/webpack-micro/src/pages/webpack/test.vue (100%) create mode 100644 packages/plugin-qiankun/examples/webpack-micro/tsconfig.json rename packages/{fes-plugin-qiankun => plugin-qiankun}/package.json (81%) rename packages/{fes-plugin-qiankun/src/constants.js => plugin-qiankun/src/constants.ts} (61%) rename packages/{fes-plugin-qiankun/src/index.js => plugin-qiankun/src/index.ts} (52%) rename packages/{fes-plugin-qiankun/src/main/index.js => plugin-qiankun/src/main/index.ts} (87%) rename packages/{fes-plugin-qiankun/src/main/modifyRoutes.js => plugin-qiankun/src/main/modifyRoutes.ts} (85%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/main/runtime/MicroApp.tpl (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/main/runtime/MicroAppRouteComponent.tpl (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/main/runtime/MicroAppWithMemoHistory.jsx (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/main/runtime/qiankunModel.tpl (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/main/runtime/runtime.tpl (100%) rename packages/{fes-plugin-qiankun/src/micro/index.js => plugin-qiankun/src/micro/index.ts} (95%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/micro/runtime/lifecycle.tpl (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/micro/runtime/qiankunModel.tpl (100%) rename packages/{fes-plugin-qiankun => plugin-qiankun}/src/micro/runtime/runtime.tpl (100%) create mode 100644 packages/plugin-qiankun/tsconfig.json create mode 100644 packages/plugin-qiankun/tsup.config.ts rename packages/{fes-plugin-qiankun => plugin-qiankun}/types.d.ts (100%) rename packages/{fes-plugin-qiankun => plugin-request}/LICENSE (100%) create mode 100644 packages/plugin-request/README.md rename packages/{fes-plugin-request => plugin-request}/package.json (73%) rename packages/{fes-plugin-request/src/index.js => plugin-request/src/index.ts} (62%) rename packages/{fes-plugin-request => plugin-request}/src/template/request.js (100%) create mode 100644 packages/plugin-request/tsconfig.json create mode 100644 packages/plugin-request/tsup.config.ts rename packages/{fes-plugin-request => plugin-request}/types.d.ts (100%) rename packages/{fes-plugin-request => plugin-sass}/LICENSE (100%) create mode 100644 packages/plugin-sass/README.md create mode 100644 packages/plugin-sass/package.json rename packages/{fes-plugin-sass/src/index.js => plugin-sass/src/index.ts} (74%) create mode 100644 packages/plugin-sass/tsconfig.json create mode 100644 packages/plugin-sass/tsup.config.ts rename packages/{fes-plugin-sass => plugin-sass}/types.d.ts (100%) rename packages/{fes-plugin-sass => plugin-swc}/LICENSE (100%) rename packages/{fes-plugin-swc => plugin-swc}/README.md (92%) rename packages/{fes-plugin-swc => plugin-swc}/package.json (56%) rename packages/{fes-plugin-swc/src/index.js => plugin-swc/src/index.ts} (73%) rename packages/{fes-plugin-swc/src/swcOptions.js => plugin-swc/src/swcOptions.ts} (77%) create mode 100644 packages/plugin-swc/tsconfig.json create mode 100644 packages/plugin-swc/tsup.config.ts rename packages/{fes-plugin-swc => plugin-swc}/types.d.ts (100%) rename packages/{fes-plugin-swc => plugin-watermark}/LICENSE (100%) create mode 100644 packages/plugin-watermark/README.md rename packages/{fes-plugin-watermark => plugin-watermark}/package.json (71%) rename packages/{fes-plugin-watermark/src/index.js => plugin-watermark/src/index.ts} (76%) rename packages/{fes-plugin-watermark => plugin-watermark}/src/runtime/core.js (100%) create mode 100644 packages/plugin-watermark/src/shared.ts create mode 100644 packages/plugin-watermark/tsconfig.json create mode 100644 packages/plugin-watermark/tsup.config.ts rename packages/{fes-plugin-watermark => plugin-watermark}/types.d.ts (100%) rename packages/{fes-plugin-vuex => preset-built-in}/LICENSE (100%) create mode 100644 packages/preset-built-in/README.md rename packages/{fes-preset-built-in => preset-built-in}/package.json (64%) create mode 100644 packages/preset-built-in/src/index.ts rename packages/{fes-preset-built-in/src/plugins/commands/help/index.js => preset-built-in/src/plugins/commands/help/index.ts} (100%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/entry/defaultContainer.tpl (100%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/entry/fes.tpl (100%) rename packages/{fes-preset-built-in/src/plugins/core/entry/index.js => preset-built-in/src/plugins/core/entry/index.ts} (94%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/entry/initialState.tpl (100%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/exports/coreExports.tpl (100%) rename packages/{fes-preset-built-in/src/plugins/core/exports/coreExports.js => preset-built-in/src/plugins/core/exports/coreExports.ts} (79%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/exports/doc.md (100%) rename packages/{fes-preset-built-in/src/plugins/core/exports/pluginExports.js => preset-built-in/src/plugins/core/exports/pluginExports.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/core/plugin/index.js => preset-built-in/src/plugins/core/plugin/index.ts} (90%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/plugin/plugin.tpl (100%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/plugin/pluginRegister.tpl (100%) rename packages/{fes-preset-built-in/src/plugins/core/route/index.js => preset-built-in/src/plugins/core/route/index.ts} (84%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/route/template/routeExports.tpl (100%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/route/template/routes.tpl (100%) rename packages/{fes-preset-built-in => preset-built-in}/src/plugins/core/route/template/runtime.tpl (100%) rename packages/{fes-preset-built-in/src/plugins/features/alias.js => preset-built-in/src/plugins/features/alias.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/autoprefixer.js => preset-built-in/src/plugins/features/autoprefixer.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/console.js => preset-built-in/src/plugins/features/console.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/define.js => preset-built-in/src/plugins/features/define.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/dynamicImport.js => preset-built-in/src/plugins/features/dynamicImport.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/globalCSS.js => preset-built-in/src/plugins/features/globalCSS.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/inlineLimit.js => preset-built-in/src/plugins/features/inlineLimit.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/mock.js => preset-built-in/src/plugins/features/mock.ts} (72%) rename packages/{fes-preset-built-in/src/plugins/features/mountElementId.js => preset-built-in/src/plugins/features/mountElementId.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/outputPath.js => preset-built-in/src/plugins/features/outputPath.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/plugins.js => preset-built-in/src/plugins/features/plugins.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/presets.js => preset-built-in/src/plugins/features/presets.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/proxy.js => preset-built-in/src/plugins/features/proxy.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/publicPath.js => preset-built-in/src/plugins/features/publicPath.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/singular.js => preset-built-in/src/plugins/features/singular.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/targets.js => preset-built-in/src/plugins/features/targets.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/terserOptions.js => preset-built-in/src/plugins/features/terserOptions.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/title.js => preset-built-in/src/plugins/features/title.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/features/useExtraCSS.js => preset-built-in/src/plugins/features/useExtraCSS.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/registerMethods.js => preset-built-in/src/plugins/registerMethods.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/registerType.js => preset-built-in/src/plugins/registerType.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/watch/watchMode.js => preset-built-in/src/plugins/watch/watchMode.ts} (100%) rename packages/{fes-preset-built-in/src/plugins/watch/watchPkg.js => preset-built-in/src/plugins/watch/watchPkg.ts} (100%) create mode 100644 packages/preset-built-in/src/shared.ts create mode 100644 packages/preset-built-in/src/utils/constants.ts rename packages/{fes-preset-built-in/src/utils/generateExports.js => preset-built-in/src/utils/generateExports.ts} (96%) create mode 100644 packages/preset-built-in/tsconfig.json create mode 100644 packages/preset-built-in/tsup.config.ts rename packages/{fes-preset-built-in => preset-built-in}/types.d.ts (97%) rename packages/{fes-plugin-watermark => runtime}/LICENSE (100%) create mode 100644 packages/runtime/README.md rename packages/{fes-runtime => runtime}/package.json (67%) rename packages/{fes-runtime/src/index.js => runtime/src/index.ts} (79%) rename packages/{fes-runtime/src/plugin/index.js => runtime/src/plugin/index.ts} (67%) create mode 100644 packages/runtime/src/utils/assert.ts rename packages/{fes-runtime/src/utils/index.js => runtime/src/utils/index.ts} (100%) create mode 100644 packages/runtime/tsconfig.json create mode 100644 packages/runtime/tsup.config.ts rename packages/{fes-plugin-windicss => shared}/LICENSE (100%) rename packages/{fes-plugin-icon => shared}/README.md (94%) create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/types/config.ts create mode 100644 packages/shared/src/types/core.ts create mode 100644 packages/shared/src/types/plugin.ts create mode 100644 packages/shared/tsconfig.json create mode 100644 packages/shared/tsup.config.ts create mode 100644 packages/typescript-config/base.json create mode 100644 packages/typescript-config/package.json rename packages/{fes-preset-built-in => utils}/LICENSE (100%) rename packages/{fes-plugin-enums => utils}/README.md (94%) rename packages/{fes-utils => utils}/package.json (69%) rename packages/{fes-utils/src/Generator.js => utils/src/Generator.ts} (62%) create mode 100644 packages/utils/src/changePort.ts create mode 100644 packages/utils/src/compatESModuleRequire.ts create mode 100644 packages/utils/src/delay.ts rename packages/{fes-utils/src/getAppPath.js => utils/src/getAppPath.ts} (63%) create mode 100644 packages/utils/src/getHostName.ts create mode 100644 packages/utils/src/getPort.ts create mode 100644 packages/utils/src/getTargetsAndBrowsersList.ts rename packages/{fes-utils/src/index.js => utils/src/index.ts} (86%) rename packages/{fes-utils/src/logger.js => utils/src/logger.ts} (57%) create mode 100644 packages/utils/src/mergeConfig.ts rename packages/{fes-utils/src/resolveRuntimeEnv.js => utils/src/resolveRuntimeEnv.ts} (64%) rename packages/{fes-utils/src/stringifyObjValue.js => utils/src/stringifyObjValue.ts} (62%) rename packages/{fes-utils/src/winPath.js => utils/src/winPath.ts} (73%) create mode 100644 packages/utils/tsconfig.json create mode 100644 packages/utils/tsup.config.ts create mode 100644 scripts/shared.mjs diff --git a/.npmrc b/.npmrc index 5bf3c616..56044b94 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,2 @@ registry=https://registry.npmmirror.com -auto-install-peers=true shamefully-hoist=true diff --git a/eslint.config.js b/eslint.config.js index cf4a93c8..f3789d5e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,7 +2,6 @@ import antfu from '@antfu/eslint-config'; export default await antfu({ - // TODO: 使用 ignore 代替 cli 命令中的配置 stylistic: { indent: 4, quotes: 'single', diff --git a/package.json b/package.json index f23f0245..1fccc333 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "version": "3.4.12", "private": true, - "packageManager": "pnpm@8.6.6", + "packageManager": "pnpm@10.14.0", "description": "一个好用的前端管理台快速开发框架", "preferGlobal": true, "workspaces": [ @@ -37,23 +37,24 @@ "enquirer": "^2.3.6", "execa": "^6.1.0", "minimist": "^1.2.6", - "semver": "^7.3.6" + "semver": "^7.3.6", + "tsup": "^8.5.0" }, "devDependencies": { - "@antfu/eslint-config": "^3.8.0", + "@antfu/eslint-config": "^5.2.2", "@commitlint/cli": "^18.4.4", "@commitlint/config-conventional": "^18.4.4", "chokidar": "^3.5.3", "commitizen": "^4.3.1", "cz-conventional-changelog": "^3.3.0", "deepmerge": "^4.2.2", - "eslint": "^9.13.0", - "fs-extra": "^11.1.1", + "eslint": "^9.34.0", + "fs-extra": "^11.3.1", "lint-staged": "^15.2.0", "simple-git-hooks": "^2.9.0", - "typescript": "^5.6.3", + "typescript": "^5.9.2", "vitepress": "1.0.0-alpha.73", - "vue": "^3.3.4", + "vue": "^3.5.21", "yargs-parser": "^21.1.1" }, "simple-git-hooks": { diff --git a/packages/fes-builder-vite/LICENSE b/packages/builder-vite/LICENSE similarity index 100% rename from packages/fes-builder-vite/LICENSE rename to packages/builder-vite/LICENSE diff --git a/packages/fes-builder-vite/README.md b/packages/builder-vite/README.md similarity index 100% rename from packages/fes-builder-vite/README.md rename to packages/builder-vite/README.md diff --git a/packages/fes-builder-vite/package.json b/packages/builder-vite/package.json similarity index 63% rename from packages/fes-builder-vite/package.json rename to packages/builder-vite/package.json index fad705b8..ded4b817 100644 --- a/packages/fes-builder-vite/package.json +++ b/packages/builder-vite/package.json @@ -8,7 +8,7 @@ "repository": { "type": "git", "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-builder-vite" + "directory": "packages/builder-vite" }, "bugs": { "url": "https://github.com/WeBankFinTech/fes.js/issues" @@ -16,44 +16,49 @@ "keywords": [ "fes" ], - "main": "lib/index.js", + "main": "dist/index.mjs", + "module": "dist/index.mjs", "files": [ - "lib", + "dist", "types.d.ts" ], + "scripts": { + "dev": "tsup --watch --sourcemap", + "build": "tsup" + }, "publishConfig": { "access": "public" }, "peerDependencies": { "@fesjs/fes": "^3.1.12", - "core-js": "^3.29.1" + "core-js": "^3.45.1" }, "dependencies": { - "@babel/core": "^7.23.3", - "@fesjs/utils": "^3.0.3", + "@fesjs/shared": "workspace:*", + "@fesjs/utils": "workspace:*", "@rollup/pluginutils": "^5.1.0", - "@vitejs/plugin-basic-ssl": "^1.0.2", - "@vitejs/plugin-legacy": "^5.2.0", - "@vitejs/plugin-vue": "^4.5.0", - "@vitejs/plugin-vue-jsx": "^3.1.0", - "autoprefixer": "^10.4.4", + "@vitejs/plugin-basic-ssl": "^2.1.0", + "@vitejs/plugin-legacy": "^7.2.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vitejs/plugin-vue-jsx": "^5.1.1", + "autoprefixer": "^10.4.21", "colorette": "^2.0.16", "connect-history-api-fallback": "^2.0.0", - "consola": "^2.15.3", + "consola": "^3.4.2", "dotenv": "^16.0.0", "dotenv-expand": "^8.0.2", "ejs": "^3.1.6", "fast-glob": "^3.2.11", - "fs-extra": "^10.0.1", + "fs-extra": "^11.3.1", "html-minifier-terser": "^6.1.0", "less": "^4.2.0", "node-html-parser": "^5.3.3", "pathe": "^0.2.0", "postcss-flexbugs-fixes": "^5.0.2", "postcss-safe-parser": "^6.0.0", - "rollup-plugin-visualizer": "^5.9.3", + "rollup-plugin-visualizer": "^6.0.3", "terser": "^5.24.0", - "vite": "^5.0.3" + "vite": "^7.1.4" }, "typings": "./types.d.ts" } diff --git a/packages/fes-builder-vite/src/commands/build/getBuildConfig.js b/packages/builder-vite/src/commands/build/getBuildConfig.ts similarity index 66% rename from packages/fes-builder-vite/src/commands/build/getBuildConfig.js rename to packages/builder-vite/src/commands/build/getBuildConfig.ts index 5a0af176..34febe8c 100644 --- a/packages/fes-builder-vite/src/commands/build/getBuildConfig.js +++ b/packages/builder-vite/src/commands/build/getBuildConfig.ts @@ -1,9 +1,14 @@ -import { splitVendorChunkPlugin } from 'vite'; +import type { IPluginAPI } from '@fesjs/shared'; +import type { InlineConfig, UserConfig } from 'vite'; +import type { ViteBuildConfig } from '../../shared'; import legacy from '@vitejs/plugin-legacy'; +import autoprefixer from 'autoprefixer'; +import postcssFlexbugsFixes from 'postcss-flexbugs-fixes'; +import postcssSafeParser from 'postcss-safe-parser'; import { getInnerCommonConfig } from '../../common/getConfig'; -function getEsbuildTarget(targets) { - const result = []; +function getEsbuildTarget(targets: any): string[] { + const result: string[] = []; ['chrome', 'edge', 'firefox', 'hermes', 'ios', 'node', 'opera', 'rhino', 'safari'].forEach((key) => { if (targets[key]) { result.push(`${key}${targets[key]}`); @@ -12,20 +17,20 @@ function getEsbuildTarget(targets) { return result; } -export default async (api) => { +export default async (api: IPluginAPI): Promise => { const { deepmerge, getTargetsAndBrowsersList } = api.utils; - const { build = {} } = api.config.viteOption; + const { build = {} } = api.config.vite || api.config.viteOption as UserConfig; const { targets, browserslist } = getTargetsAndBrowsersList({ config: api.config }); - const bundleConfig = deepmerge(getInnerCommonConfig(api), { + const bundleConfig: InlineConfig = deepmerge(getInnerCommonConfig(api), { mode: 'production', css: { postcss: { plugins: [ - require('postcss-flexbugs-fixes'), - require('postcss-safe-parser'), - require('autoprefixer')({ + postcssFlexbugsFixes, + postcssSafeParser, + autoprefixer({ ...api.config.autoprefixer, overrideBrowserslist: browserslist, }), @@ -39,12 +44,10 @@ export default async (api) => { targets, ...api.config.viteLegacy, }), - splitVendorChunkPlugin(), ], build: { ...build, terserOptions: build.terserOptions || api.config.terserOptions, - target: build.target || getEsbuildTarget(targets), outDir: build.outDir || api.config.outputPath || 'dist', assetsDir: build.assetsDir || 'static', assetsInlineLimit: build.assetsInlineLimit || api.config.inlineLimit || 8192, diff --git a/packages/builder-vite/src/commands/build/index.ts b/packages/builder-vite/src/commands/build/index.ts new file mode 100644 index 00000000..81a83847 --- /dev/null +++ b/packages/builder-vite/src/commands/build/index.ts @@ -0,0 +1,40 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { InlineConfig } from 'vite'; +import { existsSync } from 'node:fs'; +import process from 'node:process'; +import { build } from 'vite'; +import getBuildConfig from './getBuildConfig'; + +export default function (api: IPluginAPI) { + const { + paths, + utils: { rimraf }, + } = api; + + api.registerCommand({ + command: 'build', + description: 'build application for production', + async fn() { + rimraf.sync(paths.absTmpPath); + + // generate files + await api.applyPlugins({ + key: 'onGenerateFiles', + type: api.ApplyPluginsType.event, + }); + + const bundleConfig: InlineConfig = await getBuildConfig(api); + // clear output path before exec build + if (process.env.CLEAR_OUTPUT !== 'none') { + if (paths.absOutputPath && existsSync(paths.absOutputPath)) { + rimraf.sync(paths.absOutputPath); + } + } + + await build(bundleConfig); + if (process.env.RM_TMPDIR !== 'none') { + rimraf.sync(paths.absTmpPath); + } + }, + }); +} diff --git a/packages/fes-builder-vite/src/commands/dev/getDevConfig.js b/packages/builder-vite/src/commands/dev/getDevConfig.ts similarity index 64% rename from packages/fes-builder-vite/src/commands/dev/getDevConfig.js rename to packages/builder-vite/src/commands/dev/getDevConfig.ts index 1a79c1a5..05ad93c8 100644 --- a/packages/fes-builder-vite/src/commands/dev/getDevConfig.js +++ b/packages/builder-vite/src/commands/dev/getDevConfig.ts @@ -1,16 +1,27 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { InlineConfig } from 'vite'; +import process from 'node:process'; import basicSsl from '@vitejs/plugin-basic-ssl'; import { getInnerCommonConfig } from '../../common/getConfig'; import viteMiddlewarePlugin from './viteMiddlewarePlugin'; -export default async (api, args) => { +interface Args { + port?: string | number; + https?: boolean; + [key: string]: any; +} + +export default async (api: IPluginAPI, args: Args): Promise => { const { deepmerge, getPort, changePort, getHostName } = api.utils; - const port = await getPort(process.env.PORT || args.port || api.config.viteOption.server?.port); + const viteOption = api.config.vite || api.config.viteOption || {}; + + const port = await getPort(process.env.PORT || args.port || viteOption.server?.port); changePort(port); - const hostname = getHostName(api.config.viteOption.server?.host); + const hostname = getHostName(viteOption.server?.host); - const { server } = api.config.viteOption; + const { server } = viteOption; const beforeMiddlewares = await api.applyPlugins({ key: 'addBeforeMiddlewares', @@ -25,9 +36,9 @@ export default async (api, args) => { args: {}, }); - const isHTTPS = !!(process.env.HTTPS || args.https || api.config.viteOption.server?.https); + const isHTTPS = !!(process.env.HTTPS || args.https || viteOption.server?.https); - const bundleConfig = deepmerge(getInnerCommonConfig(api), { + const bundleConfig: InlineConfig = deepmerge(getInnerCommonConfig(api), { mode: 'development', plugins: [viteMiddlewarePlugin(beforeMiddlewares, middlewares), isHTTPS && basicSsl()].filter(Boolean), server: { diff --git a/packages/fes-builder-vite/src/commands/dev/index.js b/packages/builder-vite/src/commands/dev/index.ts similarity index 64% rename from packages/fes-builder-vite/src/commands/dev/index.js rename to packages/builder-vite/src/commands/dev/index.ts index de0b6880..b149ea5e 100644 --- a/packages/fes-builder-vite/src/commands/dev/index.js +++ b/packages/builder-vite/src/commands/dev/index.ts @@ -1,16 +1,28 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { ViteDevServer } from 'vite'; +import process from 'node:process'; import { createServer } from 'vite'; import getDevConfig from './getDevConfig'; -export default (api) => { +interface Args { + args?: Record; + rawArgv?: Record; + options?: Record; + program?: any; +} + +export default (api: IPluginAPI) => { const { paths, utils: { chalk, rimraf }, } = api; - let server; + let server: ViteDevServer | undefined; function destroy() { - server?.close(); + if (server) { + server.close().catch(() => {}); + } } api.registerCommand({ @@ -26,7 +38,7 @@ export default (api) => { description: 'whether to turn on the https service', }, ], - async fn({ args = {} }) { + async fn({ args = {} }: Args) { rimraf.sync(paths.absTmpPath); await api.applyPlugins({ @@ -50,11 +62,14 @@ export default (api) => { api.registerMethod({ name: 'restartServer', fn() { + // eslint-disable-next-line no-console console.log(chalk.gray('Try to restart dev server...')); destroy(); - process.send({ - type: 'RESTART', - }); + if (typeof process !== 'undefined' && process.send) { + process.send({ + type: 'RESTART', + }); + } }, }); }; diff --git a/packages/fes-builder-vite/src/commands/dev/viteMiddlewarePlugin.js b/packages/builder-vite/src/commands/dev/viteMiddlewarePlugin.ts similarity index 56% rename from packages/fes-builder-vite/src/commands/dev/viteMiddlewarePlugin.js rename to packages/builder-vite/src/commands/dev/viteMiddlewarePlugin.ts index e95648a5..3b66a3b4 100644 --- a/packages/fes-builder-vite/src/commands/dev/viteMiddlewarePlugin.js +++ b/packages/builder-vite/src/commands/dev/viteMiddlewarePlugin.ts @@ -1,6 +1,12 @@ -export default (beforeMiddlewares = [], afterMiddlewares = []) => ({ +import type { Plugin } from 'vite'; + +interface Middleware { + (req: any, res: any, next: any): void; +} + +export default (beforeMiddlewares: Middleware[] = [], afterMiddlewares: Middleware[] = []): Plugin => ({ name: 'server-middleware-plugin', - configureServer(server) { + configureServer(server: any) { beforeMiddlewares.forEach((middleware) => { server.middlewares.use(middleware); }); diff --git a/packages/fes-builder-vite/src/common/SFCConfigBlockPlugin.js b/packages/builder-vite/src/common/SFCConfigBlockPlugin.ts similarity index 60% rename from packages/fes-builder-vite/src/common/SFCConfigBlockPlugin.js rename to packages/builder-vite/src/common/SFCConfigBlockPlugin.ts index 567e4aef..b72c0600 100644 --- a/packages/fes-builder-vite/src/common/SFCConfigBlockPlugin.js +++ b/packages/builder-vite/src/common/SFCConfigBlockPlugin.ts @@ -1,8 +1,10 @@ +import type { Plugin } from 'vite'; + export default { name: 'sfc-config', - transform(code, id) { + transform(code: string, id: string) { if (/vue&type=config/.test(id)) { return `export default ''`; } }, -}; +} as Plugin; diff --git a/packages/builder-vite/src/common/connectHistoryMiddleware.ts b/packages/builder-vite/src/common/connectHistoryMiddleware.ts new file mode 100644 index 00000000..12c3863c --- /dev/null +++ b/packages/builder-vite/src/common/connectHistoryMiddleware.ts @@ -0,0 +1,26 @@ +import type { Connect } from 'vite'; +import { join } from 'node:path'; +import historyFallback from 'connect-history-api-fallback'; +import { pathExistsSync } from 'fs-extra/esm'; + +interface ViteConfig { + publicDir: string; +} + +interface HistoryParams { + [key: string]: any; +} + +function proxyMiddleware(viteConfig: ViteConfig, params: HistoryParams): Connect.NextHandleFunction { + return (req: any, res: any, next: any) => { + const fileName = join(viteConfig.publicDir, req.url); + if (req.url.length > 1 && req.url.startsWith('/') && pathExistsSync(fileName)) { + return next(); + } + + const history = historyFallback(params); + history(req, res, next); + }; +} + +export default proxyMiddleware; diff --git a/packages/fes-builder-vite/src/common/getConfig.js b/packages/builder-vite/src/common/getConfig.ts similarity index 78% rename from packages/fes-builder-vite/src/common/getConfig.js rename to packages/builder-vite/src/common/getConfig.ts index f59583d4..f18f9186 100644 --- a/packages/fes-builder-vite/src/common/getConfig.js +++ b/packages/builder-vite/src/common/getConfig.ts @@ -1,23 +1,15 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { InlineConfig } from 'vite'; import { join } from 'node:path'; -import { existsSync } from 'node:fs'; import vue from '@vitejs/plugin-vue'; import vueJsx from '@vitejs/plugin-vue-jsx'; -import { createHtmlPlugin } from './vite-plugin-html'; -import SFCConfigBlockPlugin from './SFCConfigBlockPlugin'; import getDefine from './getDefine'; +import SFCConfigBlockPlugin from './SFCConfigBlockPlugin'; +import { createHtmlPlugin } from './vite-plugin-html'; -function getPostcssConfig(api) { - // TODO 支持其他 postcss 配置文件类型 - const configPath = `${api.paths.cwd}/postcss.config.js`; - if (existsSync(configPath)) - return require(`${api.paths.cwd}/postcss.config.js`); - - return {}; -} - -export function getInnerCommonConfig(api) { +export function getInnerCommonConfig(api: IPluginAPI): InlineConfig { const { deepmerge, resolveRuntimeEnv } = api.utils; - const { base, ...otherViteOption } = api.config.viteOption; + const { base, ...otherViteOption } = (api.config.vite || api.config.viteOption); const publicPath = base || api.config.publicPath || '/'; @@ -27,11 +19,6 @@ export function getInnerCommonConfig(api) { configFile: false, define: getDefine(api, publicPath), cacheDir: join(api.cwd, '.cache'), - css: { - postcss: { - ...getPostcssConfig(api), - }, - }, plugins: [ vue(api.config.viteVuePlugin || {}), SFCConfigBlockPlugin, diff --git a/packages/fes-builder-vite/src/common/getDefine.js b/packages/builder-vite/src/common/getDefine.ts similarity index 53% rename from packages/fes-builder-vite/src/common/getDefine.js rename to packages/builder-vite/src/common/getDefine.ts index 4feb2122..1ff9f4fb 100644 --- a/packages/fes-builder-vite/src/common/getDefine.js +++ b/packages/builder-vite/src/common/getDefine.ts @@ -1,17 +1,19 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { ViteBuildConfig } from '../shared'; import { resolveRuntimeEnv, stringifyObjValue } from '@fesjs/utils'; -export default (api, publicPath) => { - const viteOption = api.config.viteOption; +export default (api: IPluginAPI, publicPath: string): Record => { + const viteOption = api.config.vite || api.config.viteOption; const env = resolveRuntimeEnv(publicPath); const define = stringifyObjValue({ ...api.config.define, - ...viteOption.define, + ...(viteOption ? viteOption.define : {}), }); const formatEnv = Object.keys(env).reduce((acc, cur) => { acc[`process.env.${cur}`] = JSON.stringify(env[cur]); return acc; - }, {}); + }, {} as Record); return { ...formatEnv, diff --git a/packages/fes-builder-vite/src/common/vite-plugin-html.js b/packages/builder-vite/src/common/vite-plugin-html.ts similarity index 61% rename from packages/fes-builder-vite/src/common/vite-plugin-html.js rename to packages/builder-vite/src/common/vite-plugin-html.ts index 350146f2..f426b015 100644 --- a/packages/fes-builder-vite/src/common/vite-plugin-html.js +++ b/packages/builder-vite/src/common/vite-plugin-html.ts @@ -1,34 +1,52 @@ +import type { ConfigEnv, Plugin, ResolvedConfig, ViteDevServer } from 'vite'; import process from 'node:process'; -import { render } from 'ejs'; -import { expand } from 'dotenv-expand'; -import dotenv from 'dotenv'; -import path, { dirname, join } from 'pathe'; -import fse from 'fs-extra'; -import { normalizePath } from 'vite'; -import { parse } from 'node-html-parser'; -import fg from 'fast-glob'; -import consola from 'consola'; -import { dim } from 'colorette'; -import { minify } from 'html-minifier-terser'; import { createFilter } from '@rollup/pluginutils'; +import { dim } from 'colorette'; +import consola from 'consola'; +import dotenv from 'dotenv'; +import { expand } from 'dotenv-expand'; +import { render } from 'ejs'; +import fg from 'fast-glob'; +import fse from 'fs-extra'; +import { minify } from 'html-minifier-terser'; +import { parse } from 'node-html-parser'; +import path, { dirname, join } from 'pathe'; +import { normalizePath } from 'vite'; import history from './connectHistoryMiddleware'; -function lookupFile(dir, formats, pathOnly = false) { - for (const format of formats) { - const fullPath = join(dir, format); - if (fse.pathExistsSync(fullPath) && fse.statSync(fullPath).isFile()) - return pathOnly ? fullPath : fse.readFileSync(fullPath, 'utf-8'); - } - const parentDir = dirname(dir); - if (parentDir !== dir) - return lookupFile(parentDir, formats, pathOnly); +interface Env { + [key: string]: string; } -function loadEnv(mode, envDir, prefix = '') { - if (mode === 'local') - throw new Error(`"local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.`); +interface ParsedUrl { + pathname: string; + path: string; +} - const env = {}; +interface Rewrites { + from: RegExp; + to: (params: { parsedUrl: ParsedUrl }) => string; +} + +function lookupFile(dir: string, formats: string[], pathOnly = false): string | undefined { + for (const format of formats) { + const fullPath = join(dir, format); + if (fse.pathExistsSync(fullPath) && fse.statSync(fullPath).isFile()) { + return pathOnly ? fullPath : fse.readFileSync(fullPath, 'utf-8'); + } + } + const parentDir = dirname(dir); + if (parentDir !== dir) { + return lookupFile(parentDir, formats, pathOnly); + } +} + +function loadEnv(mode: string, envDir: string, prefix = ''): Env { + if (mode === 'local') { + throw new Error(`"local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.`); + } + + const env: Env = {}; const envFiles = [`.env.${mode}.local`, `.env.${mode}`, `.env.local`, `.env`]; for (const file of envFiles) { const _path = lookupFile(envDir, [file], true); @@ -39,18 +57,20 @@ function loadEnv(mode, envDir, prefix = '') { ignoreProcessEnv: true, }); for (const [key, value] of Object.entries(parsed)) { - if (key.startsWith(prefix) && env[key] === undefined) + if (key.startsWith(prefix) && env[key] === undefined) { env[key] = value; + } - else if (key === 'NODE_ENV') + else if (key === 'NODE_ENV') { process.env.VITE_USER_NODE_ENV = value; + } } } } return env; } -async function isDirEmpty(dir) { +async function isDirEmpty(dir: string): Promise { return fse.readdir(dir).then(files => files.length === 0); } @@ -58,19 +78,44 @@ const DEFAULT_TEMPLATE = 'index.html'; const ignoreDirs = ['.', '', '/']; const bodyInjectRE = /<\/body>/; -function createPlugin(userOptions = {}) { +interface UserOptions { + entry?: string; + template?: string; + pages?: Page[]; + verbose?: boolean; + injectOptions?: InjectOptions; + _minify?: boolean; + [key: string]: any; +} + +interface Page { + filename?: string; + template?: string; + entry?: string; + injectOptions?: InjectOptions; +} + +interface InjectOptions { + data?: Record; + ejsOptions?: any; + tags?: any[]; +} + +function createPlugin(userOptions: UserOptions = {}): Plugin { const { entry, template = DEFAULT_TEMPLATE, pages = [], verbose = false } = userOptions; - let viteConfig; - let env = {}; + let viteConfig: ResolvedConfig; + let env: Env = {}; return { name: 'vite:html', - order: 'pre', - configResolved(resolvedConfig) { - viteConfig = resolvedConfig; - env = loadEnv(viteConfig.mode, viteConfig.root, ''); + enforce: 'pre', + configResolved(resolvedConfig: ResolvedConfig) { + viteConfig = resolvedConfig!; + if (viteConfig.mode && viteConfig.root) { + env = loadEnv(viteConfig.mode, viteConfig.root, ''); + } }, - config(conf) { - const input = createInput(userOptions, conf); + config(config: any, env: ConfigEnv) { + const input = createInput(userOptions, env); if (input) { return { build: { @@ -81,9 +126,9 @@ function createPlugin(userOptions = {}) { }; } }, - configureServer(server) { - let _pages = []; - const rewrites = []; + configureServer(server: ViteDevServer) { + const _pages: Page[] = []; + const rewrites: Rewrites[] = []; if (!isMpa(viteConfig)) { const template2 = userOptions.template || DEFAULT_TEMPLATE; const filename = DEFAULT_TEMPLATE; @@ -93,24 +138,25 @@ function createPlugin(userOptions = {}) { }); } else { - _pages = pages.map(page => ({ + _pages.push(...pages.map(page => ({ filename: page.filename || DEFAULT_TEMPLATE, template: page.template || DEFAULT_TEMPLATE, - })); + }))); } const proxy = viteConfig.server?.proxy ?? {}; const baseUrl = viteConfig.base ?? '/'; const keys = Object.keys(proxy); - let indexPage = null; + let indexPage: Page | null = null; for (const page of _pages) { - if (page.filename !== 'index.html') - rewrites.push(createRewire(page.template, page, baseUrl, keys)); + if (page.filename !== 'index.html') { + rewrites.push(createRewire(page.template || '', page, baseUrl, keys)); + } - else - indexPage = page; + else { indexPage = page; } } - if (indexPage) + if (indexPage) { rewrites.push(createRewire('', indexPage, baseUrl, keys)); + } server.middlewares.use( history(viteConfig, { @@ -122,7 +168,7 @@ function createPlugin(userOptions = {}) { }, transformIndexHtml: { order: 'pre', - async handler(html, ctx) { + handler: async (html: string, ctx: any) => { const url = ctx.filename; const base = viteConfig.base; const excludeBaseUrl = url.replace(base, '/'); @@ -144,18 +190,22 @@ function createPlugin(userOptions = {}) { }, }, async closeBundle() { - const outputDirs = []; + const outputDirs: string[] = []; if (isMpa(viteConfig) || pages.length) { for (const page of pages) { - const dir = path.dirname(page.template); - if (!ignoreDirs.includes(dir)) - outputDirs.push(dir); + if (page.template) { + const dir = path.dirname(page.template); + if (!ignoreDirs.includes(dir)) { + outputDirs.push(dir); + } + } } } else { const dir = path.dirname(template); - if (!ignoreDirs.includes(dir)) + if (!ignoreDirs.includes(dir)) { outputDirs.push(dir); + } } const cwd = path.resolve(viteConfig.root, viteConfig.build.outDir); const htmlFiles = await fg( @@ -176,41 +226,45 @@ function createPlugin(userOptions = {}) { await Promise.all( htmlDirs.map(async (item) => { const isEmpty = await isDirEmpty(item); - if (isEmpty) + if (isEmpty) { return fse.remove(item); + } }), ); }, }; } -function createInput({ pages = [], template = DEFAULT_TEMPLATE }, viteConfig) { - const input = {}; +function createInput({ pages = [], template = DEFAULT_TEMPLATE }: UserOptions, viteConfig: any) { + const input: Record = {}; if (isMpa(viteConfig) || pages?.length) { const templates = pages.map(page => page.template); - templates.forEach((temp) => { - let dirName = path.dirname(temp); - const file = path.basename(temp); - dirName = dirName.replace(/\s+/g, '').replace(/\//g, '-'); - const key = dirName === '.' || dirName === 'public' || !dirName ? file.replace(/\.html/, '') : dirName; - input[key] = path.resolve(viteConfig.root, temp); + templates?.forEach((temp) => { + if (temp) { + let dirName = path.dirname(temp); + const file = path.basename(temp); + dirName = dirName.replace(/\s+/g, '').replace(/\//g, '-'); + const key = dirName === '.' || dirName === 'public' || !dirName ? file.replace(/\.html/, '') : dirName; + input[key] = path.resolve(viteConfig?.root || '', temp); + } }); return input; } - const dir = path.dirname(template); - if (ignoreDirs.includes(dir)) + const dir = path.dirname(template || DEFAULT_TEMPLATE); + if (ignoreDirs.includes(dir)) { return undefined; + } - const file = path.basename(template); + const file = path.basename(template || DEFAULT_TEMPLATE); const key = file.replace(/\.html/, ''); return { - [key]: path.resolve(viteConfig.root, template), + [key]: path.resolve(viteConfig?.root || '', template || DEFAULT_TEMPLATE), }; } -async function renderHtml(html, config) { +async function renderHtml(html: string, config: any): Promise { const { injectOptions, viteConfig, env, entry, verbose } = config; - const { data, ejsOptions } = injectOptions; + const { data, ejsOptions } = injectOptions || {}; const ejsData = { ...(viteConfig?.env ?? {}), ...(viteConfig?.define ?? {}), @@ -225,43 +279,45 @@ async function renderHtml(html, config) { return result; } -function getPage({ pages = [], entry, template = DEFAULT_TEMPLATE, inject = {} }, name, viteConfig) { +function getPage(userOptions: UserOptions, name: string, viteConfig: ResolvedConfig | undefined) { + const { pages = [], entry, template = DEFAULT_TEMPLATE, inject = {} } = userOptions; let page; - if (isMpa(viteConfig) || pages?.length) + if (isMpa(viteConfig) || pages?.length) { page = getPageConfig(name, pages, DEFAULT_TEMPLATE); + } - else - page = createSpaPage(entry, template, inject); + else { page = createSpaPage(entry, template, inject); } return page; } -function isMpa(viteConfig) { +function isMpa(viteConfig: ResolvedConfig | undefined): boolean { const input = viteConfig?.build?.rollupOptions?.input ?? undefined; return typeof input !== 'string' && Object.keys(input || {}).length > 1; } -function removeEntryScript(html, verbose = false) { - if (!html) +function removeEntryScript(html: string, verbose = false): string { + if (!html) { return html; + } const root = parse(html); const scriptNodes = root.querySelectorAll('script[type=module]') || []; - const removedNode = []; + const removedNode: string[] = []; scriptNodes.forEach((item) => { removedNode.push(item.toString()); item.parentNode.removeChild(item); }); - verbose - && removedNode.length - && consola.warn(`vite-plugin-html: Since you have already configured entry, ${dim( + if (verbose && removedNode.length) { + consola.warn(`vite-plugin-html: Since you have already configured entry, ${dim( removedNode.toString(), )} is deleted. You may also delete it from the index.html. `); + } return root.toString(); } -function createSpaPage(entry, template, inject = {}) { +function createSpaPage(entry: string | undefined, template: string, inject: InjectOptions = {}): Page { return { entry, filename: 'index.html', @@ -270,7 +326,7 @@ function createSpaPage(entry, template, inject = {}) { }; } -function getPageConfig(htmlName, pages, defaultPage) { +function getPageConfig(htmlName: string, pages: Page[], defaultPage: string) { const defaultPageOption = { filename: defaultPage, template: `./${defaultPage}`, @@ -279,15 +335,16 @@ function getPageConfig(htmlName, pages, defaultPage) { return page ?? defaultPageOption ?? undefined; } -function createRewire(reg, page, baseUrl, proxyUrlKeys) { +function createRewire(reg: string, page: Page, baseUrl: string, proxyUrlKeys: string[]): Rewrites { return { from: new RegExp(`^/${reg}*`), - to({ parsedUrl }) { + to({ parsedUrl }: { parsedUrl: ParsedUrl }) { const pathname = parsedUrl.pathname; const excludeBaseUrl = pathname.replace(baseUrl, '/'); - const template = path.resolve(baseUrl, page.template); - if (excludeBaseUrl === '/') + const template = path.resolve(baseUrl, page.template || ''); + if (excludeBaseUrl === '/') { return template; + } const isApiUrl = proxyUrlKeys.some(item => pathname.startsWith(path.resolve(baseUrl, item))); return isApiUrl ? parsedUrl.path : template; @@ -297,7 +354,7 @@ function createRewire(reg, page, baseUrl, proxyUrlKeys) { const htmlFilter = createFilter(['**/*.html']); -function getOptions(_minify) { +function getOptions(_minify: boolean) { return { collapseWhitespace: _minify, keepClosingSlash: _minify, @@ -310,27 +367,30 @@ function getOptions(_minify) { }; } -async function minifyHtml(html, minify$1) { - if (typeof minify$1 === 'boolean' && !minify$1) +async function minifyHtml(html: string, minifyOptions: boolean | any): Promise { + if (typeof minifyOptions === 'boolean' && !minifyOptions) { return html; + } - let minifyOptions = minify$1; - if (typeof minify$1 === 'boolean' && minify$1) - minifyOptions = getOptions(minify$1); + let minifyConfig = minifyOptions; + if (typeof minifyOptions === 'boolean' && minifyOptions) { + minifyConfig = getOptions(minifyOptions); + } - const res = await minify(html, minifyOptions); + const res = await minify(html, minifyConfig); return res; } -function createMinifyHtmlPlugin({ _minify = true } = {}) { +function createMinifyHtmlPlugin({ _minify = true } = {}): Plugin { return { name: 'vite:minify-html', - order: 'post', + apply: 'build', async generateBundle(_, outBundle) { if (_minify) { for (const bundle of Object.values(outBundle)) { - if (bundle.type === 'asset' && htmlFilter(bundle.fileName) && typeof bundle.source === 'string') + if (bundle.type === 'asset' && htmlFilter(bundle.fileName) && typeof bundle.source === 'string') { bundle.source = await minifyHtml(bundle.source, _minify); + } } } }, @@ -339,8 +399,9 @@ function createMinifyHtmlPlugin({ _minify = true } = {}) { consola.wrapConsole(); -function createHtmlPlugin(userOptions = {}) { +function createHtmlPlugin(userOptions: UserOptions = {}): Plugin[] { return [createPlugin(userOptions), createMinifyHtmlPlugin(userOptions)]; } export { createHtmlPlugin }; +export type { InjectOptions, Page, UserOptions }; diff --git a/packages/fes-builder-vite/src/features/viteAnalyze.js b/packages/builder-vite/src/features/viteAnalyze.ts similarity index 55% rename from packages/fes-builder-vite/src/features/viteAnalyze.js rename to packages/builder-vite/src/features/viteAnalyze.ts index 8c91faaf..799b4c2f 100644 --- a/packages/fes-builder-vite/src/features/viteAnalyze.js +++ b/packages/builder-vite/src/features/viteAnalyze.ts @@ -1,8 +1,12 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; +import process from 'node:process'; +import { visualizer } from 'rollup-plugin-visualizer'; + +export default (api: IPluginAPI<{ viteAnalyze: Record }>) => { api.describe({ key: 'viteAnalyze', config: { - schema(joi) { + schema(joi: any) { return joi.object(); }, default: {}, @@ -10,14 +14,14 @@ export default (api) => { enableBy: () => !!process.env.ANALYZE, }); - api.modifyBundleConfig((memo) => { + api.modifyBundleConfig((memo: any) => { memo.plugins.push( - require('rollup-plugin-visualizer').visualizer({ + visualizer({ filename: './.cache/visualizer/stats.html', open: true, gzipSize: true, brotliSize: true, - ...api.viteAnalyze, + ...api.config.viteAnalyze, }), ); diff --git a/packages/fes-builder-vite/src/features/viteHtml.js b/packages/builder-vite/src/features/viteHtml.ts similarity index 57% rename from packages/fes-builder-vite/src/features/viteHtml.js rename to packages/builder-vite/src/features/viteHtml.ts index 68792060..bec6333c 100644 --- a/packages/fes-builder-vite/src/features/viteHtml.js +++ b/packages/builder-vite/src/features/viteHtml.ts @@ -1,8 +1,11 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; +import process from 'node:process'; + +export default (api: IPluginAPI) => { api.describe({ key: 'viteHtml', config: { - schema(joi) { + schema(joi: any) { return joi.object(); }, default: {}, diff --git a/packages/fes-builder-vite/src/features/viteLegacy.js b/packages/builder-vite/src/features/viteLegacy.ts similarity index 57% rename from packages/fes-builder-vite/src/features/viteLegacy.js rename to packages/builder-vite/src/features/viteLegacy.ts index 9f833202..83d916ab 100644 --- a/packages/fes-builder-vite/src/features/viteLegacy.js +++ b/packages/builder-vite/src/features/viteLegacy.ts @@ -1,8 +1,11 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; +import process from 'node:process'; + +export default (api: IPluginAPI) => { api.describe({ key: 'viteLegacy', config: { - schema(joi) { + schema(joi: any) { return joi.object(); }, default: {}, diff --git a/packages/builder-vite/src/features/viteOption.ts b/packages/builder-vite/src/features/viteOption.ts new file mode 100644 index 00000000..470e638d --- /dev/null +++ b/packages/builder-vite/src/features/viteOption.ts @@ -0,0 +1,22 @@ +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { + api.describe({ + key: 'viteOption', + config: { + schema(joi: any) { + return joi.object(); + }, + default: {}, + }, + }); + api.describe({ + key: 'vite', + config: { + schema(joi: any) { + return joi.object(); + }, + default: {}, + }, + }); +}; diff --git a/packages/fes-builder-vite/src/features/viteVueJsx.js b/packages/builder-vite/src/features/viteVueJsx.ts similarity index 57% rename from packages/fes-builder-vite/src/features/viteVueJsx.js rename to packages/builder-vite/src/features/viteVueJsx.ts index 088a685d..f133f83a 100644 --- a/packages/fes-builder-vite/src/features/viteVueJsx.js +++ b/packages/builder-vite/src/features/viteVueJsx.ts @@ -1,8 +1,10 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'viteVueJsx', config: { - schema(joi) { + schema(joi: any) { return joi.object(); }, default: {}, diff --git a/packages/fes-builder-vite/src/features/viteVuePlugin.js b/packages/builder-vite/src/features/viteVuePlugin.ts similarity index 58% rename from packages/fes-builder-vite/src/features/viteVuePlugin.js rename to packages/builder-vite/src/features/viteVuePlugin.ts index ea6e6217..4f601ef6 100644 --- a/packages/fes-builder-vite/src/features/viteVuePlugin.js +++ b/packages/builder-vite/src/features/viteVuePlugin.ts @@ -1,8 +1,10 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'viteVuePlugin', config: { - schema(joi) { + schema(joi: any) { return joi.object(); }, default: {}, diff --git a/packages/builder-vite/src/index.ts b/packages/builder-vite/src/index.ts new file mode 100644 index 00000000..8008b68f --- /dev/null +++ b/packages/builder-vite/src/index.ts @@ -0,0 +1,30 @@ +import { join } from 'node:path'; +import { OWNER_DIR, ViteBuildConfig } from './shared'; + +interface BuilderPlugin { + plugins: string[]; +} + +export { ViteBuildConfig }; + +export default function (): BuilderPlugin { + return { + plugins: [ + join(OWNER_DIR, 'dist/registerBuilder.mjs'), + join(OWNER_DIR, 'dist/registerMethods.mjs'), + join(OWNER_DIR, 'dist/registerType.mjs'), + + // bundle configs + join(OWNER_DIR, 'dist/features/viteHtml.mjs'), + join(OWNER_DIR, 'dist/features/viteOption.mjs'), + join(OWNER_DIR, 'dist/features/viteVueJsx.mjs'), + join(OWNER_DIR, 'dist/features/viteVuePlugin.mjs'), + join(OWNER_DIR, 'dist/features/viteAnalyze.mjs'), + join(OWNER_DIR, 'dist/features/viteLegacy.mjs'), + + // commands + join(OWNER_DIR, 'dist/commands/build/index.mjs'), + join(OWNER_DIR, 'dist/commands/dev/index.mjs'), + ], + }; +} diff --git a/packages/builder-vite/src/registerBuilder.ts b/packages/builder-vite/src/registerBuilder.ts new file mode 100644 index 00000000..3b5d8e6d --- /dev/null +++ b/packages/builder-vite/src/registerBuilder.ts @@ -0,0 +1,7 @@ +import type { IPluginAPI } from '@fesjs/shared'; + +export default function (api: IPluginAPI) { + api.registerBuilder({ + name: 'vite', + }); +} diff --git a/packages/fes-builder-vite/src/registerMethods.js b/packages/builder-vite/src/registerMethods.ts similarity index 50% rename from packages/fes-builder-vite/src/registerMethods.js rename to packages/builder-vite/src/registerMethods.ts index f551707a..6eb82819 100644 --- a/packages/fes-builder-vite/src/registerMethods.js +++ b/packages/builder-vite/src/registerMethods.ts @@ -1,4 +1,6 @@ -export default function (api) { +import type { IPluginAPI } from '@fesjs/shared'; + +export default function (api: IPluginAPI) { ['modifyBundleConfig'].forEach((name) => { api.registerMethod({ name }); }); diff --git a/packages/fes-builder-vite/src/registerType.js b/packages/builder-vite/src/registerType.ts similarity index 53% rename from packages/fes-builder-vite/src/registerType.js rename to packages/builder-vite/src/registerType.ts index a771cb04..76167a07 100644 --- a/packages/fes-builder-vite/src/registerType.js +++ b/packages/builder-vite/src/registerType.ts @@ -1,6 +1,7 @@ +import type { IPluginAPI } from '@fesjs/shared'; import { name } from '../package.json'; -export default function (api) { +export default function (api: IPluginAPI) { api.addConfigType(() => ({ source: name, })); diff --git a/packages/builder-vite/src/shared.ts b/packages/builder-vite/src/shared.ts new file mode 100644 index 00000000..84075670 --- /dev/null +++ b/packages/builder-vite/src/shared.ts @@ -0,0 +1,19 @@ +import type { Options as PolyfillOptions } from '@vitejs/plugin-legacy'; +import type { Options } from '@vitejs/plugin-vue'; +import type createPlugin from '@vitejs/plugin-vue-jsx'; +import type { HTMLOptions, UserConfig } from 'vite'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export const OWNER_DIR: string = join(dirname(fileURLToPath(import.meta.url)), '..'); + +export interface ViteBuildConfig { + viteOption?: UserConfig; + vite?: UserConfig; + viteVuePlugin?: Options; + viteVueJsx?: Parameters[0]; + viteLegacy?: PolyfillOptions; + viteHtml?: HTMLOptions; + viteAnalyze?: any; + viteOptionConfig?: UserConfig; +} diff --git a/packages/builder-vite/tsconfig.json b/packages/builder-vite/tsconfig.json new file mode 100644 index 00000000..e4c560ab --- /dev/null +++ b/packages/builder-vite/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": ["@fesjs/typescript-config/base.json"], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./build" + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} diff --git a/packages/builder-vite/tsconfig.tsbuildinfo b/packages/builder-vite/tsconfig.tsbuildinfo new file mode 100644 index 00000000..e7d8c6f2 --- /dev/null +++ b/packages/builder-vite/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/client-stats.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/hmrpayload.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/dist/node/modulerunnertransport-bwuzbvlx.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/customevent.d.ts","../../node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","../../node_modules/.pnpm/rollup@4.50.0/node_modules/rollup/dist/rollup.d.ts","../../node_modules/.pnpm/rollup@4.50.0/node_modules/rollup/dist/parseast.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/hot.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/.pnpm/esbuild@0.25.9/node_modules/esbuild/lib/main.d.ts","../../node_modules/.pnpm/@jridgewell+trace-mapping@0.3.30/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts","../../node_modules/.pnpm/@jridgewell+trace-mapping@0.3.30/node_modules/@jridgewell/trace-mapping/types/types.d.mts","../../node_modules/.pnpm/@jridgewell+trace-mapping@0.3.30/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts","../../node_modules/.pnpm/@jridgewell+trace-mapping@0.3.30/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts","../../node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts","../../node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/types/types.d.mts","../../node_modules/.pnpm/@jridgewell+gen-mapping@0.3.13/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts","../../node_modules/.pnpm/@jridgewell+source-map@0.3.11/node_modules/@jridgewell/source-map/types/source-map.d.mts","../../node_modules/.pnpm/terser@5.44.0/node_modules/terser/tools/terser.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/internal/terseroptions.d.ts","../../node_modules/.pnpm/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/previous-map.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/input.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/declaration.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/root.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/warning.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/processor.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/result.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/document.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/rule.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/node.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/comment.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/container.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/at-rule.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/list.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.ts","../../node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.d.mts","../../node_modules/.pnpm/lightningcss@1.30.1/node_modules/lightningcss/node/ast.d.ts","../../node_modules/.pnpm/lightningcss@1.30.1/node_modules/lightningcss/node/targets.d.ts","../../node_modules/.pnpm/lightningcss@1.30.1/node_modules/lightningcss/node/index.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/internal/lightningcssoptions.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/deprecations.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/util/promise_or.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/importer.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/logger/source_location.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/logger/source_span.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/logger/index.d.ts","../../node_modules/.pnpm/immutable@5.1.3/node_modules/immutable/dist/immutable.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/boolean.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/calculation.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/color.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/function.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/list.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/map.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/mixin.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/number.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/string.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/argument_list.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/value/index.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/options.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/compile.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/exception.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/legacy/exception.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/legacy/plugin_this.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/legacy/function.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/legacy/importer.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/legacy/options.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/legacy/render.d.ts","../../node_modules/.pnpm/sass@1.92.0/node_modules/sass/types/index.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/internal/csspreprocessoroptions.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/importglob.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/types/metadata.d.ts","../../node_modules/.pnpm/vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningcss@1.30.1_sass@1.92.0_terser@5.44.0_yaml@2.8.1/node_modules/vite/dist/node/index.d.ts","./src/shared.ts","./src/index.ts","./src/registerbuilder.ts","./src/registermethods.ts","./package.json","./src/registertype.ts","../../node_modules/.pnpm/@vitejs+plugin-legacy@7.2.1_terser@5.44.0_vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less_8c545db804c473991679422b4e7556a9/node_modules/@vitejs/plugin-legacy/dist/index.d.ts","../../node_modules/.pnpm/browserslist@4.25.4/node_modules/browserslist/index.d.ts","../../node_modules/.pnpm/autoprefixer@10.4.21_postcss@8.5.6/node_modules/autoprefixer/lib/autoprefixer.d.ts","../../node_modules/.pnpm/@babel+types@7.28.2/node_modules/@babel/types/lib/index.d.ts","../../node_modules/.pnpm/@vue+shared@3.5.21/node_modules/@vue/shared/dist/shared.d.ts","../../node_modules/.pnpm/@babel+parser@7.28.3/node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/.pnpm/@vue+compiler-core@3.5.21/node_modules/@vue/compiler-core/dist/compiler-core.d.ts","../../node_modules/.pnpm/magic-string@0.30.18/node_modules/magic-string/dist/magic-string.es.d.mts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/typescript.d.ts","../../node_modules/.pnpm/@vue+compiler-sfc@3.5.21/node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts","../../node_modules/.pnpm/vue@3.5.21_typescript@5.9.2/node_modules/vue/compiler-sfc/index.d.mts","../../node_modules/.pnpm/@vitejs+plugin-vue@6.0.1_vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightningc_e096ceff8aa60744830cacee1bd6b178/node_modules/@vitejs/plugin-vue/dist/index.d.ts","../../node_modules/.pnpm/@types+babel__generator@7.27.0/node_modules/@types/babel__generator/index.d.ts","../../node_modules/.pnpm/@types+babel__template@7.4.4/node_modules/@types/babel__template/index.d.ts","../../node_modules/.pnpm/@types+babel__traverse@7.28.0/node_modules/@types/babel__traverse/index.d.ts","../../node_modules/.pnpm/@types+babel__core@7.20.5/node_modules/@types/babel__core/index.d.ts","../../node_modules/.pnpm/@vue+babel-plugin-resolve-type@1.5.0_@babel+core@7.28.3/node_modules/@vue/babel-plugin-resolve-type/dist/index.d.mts","../../node_modules/.pnpm/@vue+babel-plugin-jsx@1.5.0_@babel+core@7.28.3/node_modules/@vue/babel-plugin-jsx/dist/index.d.mts","../../node_modules/.pnpm/@vitejs+plugin-vue-jsx@5.1.1_vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_lightn_94d940c81f69a8aeabcdb089b175a797/node_modules/@vitejs/plugin-vue-jsx/dist/index.d.ts","./src/common/getdefine.ts","./src/common/sfcconfigblockplugin.ts","../../node_modules/.pnpm/@rollup+pluginutils@5.2.0_rollup@4.50.0/node_modules/@rollup/pluginutils/types/index.d.ts","../../node_modules/.pnpm/colorette@2.0.20/node_modules/colorette/index.d.ts","../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/core.d.mts","../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/browser.d.mts","../../node_modules/.pnpm/dotenv@16.6.1/node_modules/dotenv/lib/main.d.ts","../../node_modules/.pnpm/dotenv-expand@8.0.3/node_modules/dotenv-expand/lib/main.d.ts","../../node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/types/index.d.ts","../../node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts","../../node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/settings.d.ts","../../node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/providers/async.d.ts","../../node_modules/.pnpm/@nodelib+fs.stat@2.0.5/node_modules/@nodelib/fs.stat/out/index.d.ts","../../node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/types/index.d.ts","../../node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts","../../node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/settings.d.ts","../../node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/providers/async.d.ts","../../node_modules/.pnpm/@nodelib+fs.scandir@2.1.5/node_modules/@nodelib/fs.scandir/out/index.d.ts","../../node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/types/index.d.ts","../../node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/settings.d.ts","../../node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/reader.d.ts","../../node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/readers/async.d.ts","../../node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/providers/async.d.ts","../../node_modules/.pnpm/@nodelib+fs.walk@1.2.8/node_modules/@nodelib/fs.walk/out/index.d.ts","../../node_modules/.pnpm/fast-glob@3.3.3/node_modules/fast-glob/out/types/index.d.ts","../../node_modules/.pnpm/fast-glob@3.3.3/node_modules/fast-glob/out/settings.d.ts","../../node_modules/.pnpm/fast-glob@3.3.3/node_modules/fast-glob/out/managers/tasks.d.ts","../../node_modules/.pnpm/fast-glob@3.3.3/node_modules/fast-glob/out/index.d.ts","../../node_modules/.pnpm/@types+jsonfile@6.1.4/node_modules/@types/jsonfile/index.d.ts","../../node_modules/.pnpm/@types+jsonfile@6.1.4/node_modules/@types/jsonfile/utils.d.ts","../../node_modules/.pnpm/@types+fs-extra@11.0.4/node_modules/@types/fs-extra/index.d.ts","../../node_modules/.pnpm/@types+html-minifier-terser@6.1.0/node_modules/@types/html-minifier-terser/index.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/void-tag.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/nodes/type.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/nodes/node.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/nodes/html.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/nodes/comment.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/nodes/text.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/parse.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/valid.d.ts","../../node_modules/.pnpm/node-html-parser@5.4.2/node_modules/node-html-parser/dist/index.d.ts","../../node_modules/.pnpm/@types+mime@1.3.5/node_modules/@types/mime/index.d.ts","../../node_modules/.pnpm/@types+send@0.17.5/node_modules/@types/send/index.d.ts","../../node_modules/.pnpm/@types+qs@6.14.0/node_modules/@types/qs/index.d.ts","../../node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","../../node_modules/.pnpm/@types+express-serve-static-core@4.19.6/node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/.pnpm/@types+connect-history-api-fallback@1.5.4/node_modules/@types/connect-history-api-fallback/index.d.ts","../../node_modules/.pnpm/@types+fs-extra@11.0.4/node_modules/@types/fs-extra/esm.d.mts","./src/common/connecthistorymiddleware.ts","./src/common/vite-plugin-html.ts","./src/common/getconfig.ts","./src/commands/build/getbuildconfig.ts","./src/commands/build/index.ts","../../node_modules/.pnpm/@vitejs+plugin-basic-ssl@2.1.0_vite@7.1.4_@types+node@24.3.0_jiti@2.5.1_less@4.4.1_ligh_e47437b011d7678aa80c8785bdee7fab/node_modules/@vitejs/plugin-basic-ssl/dist/index.d.mts","./src/commands/dev/vitemiddlewareplugin.ts","./src/commands/dev/getdevconfig.ts","./src/commands/dev/index.ts","../../node_modules/.pnpm/open@8.4.2/node_modules/open/index.d.ts","../../node_modules/.pnpm/rollup-plugin-visualizer@6.0.3_rollup@4.50.0/node_modules/rollup-plugin-visualizer/dist/plugin/template-types.d.ts","../../node_modules/.pnpm/rollup-plugin-visualizer@6.0.3_rollup@4.50.0/node_modules/rollup-plugin-visualizer/dist/shared/create-filter.d.ts","../../node_modules/.pnpm/rollup-plugin-visualizer@6.0.3_rollup@4.50.0/node_modules/rollup-plugin-visualizer/dist/plugin/index.d.ts","./src/features/viteanalyze.ts","./src/features/vitehtml.ts","./src/features/vitelegacy.ts","./src/features/viteoption.ts","./src/features/vitevuejsx.ts","./src/features/vitevueplugin.ts","../../node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","../../node_modules/.pnpm/@types+body-parser@1.19.6/node_modules/@types/body-parser/index.d.ts","../../node_modules/.pnpm/@types+bonjour@3.5.13/node_modules/@types/bonjour/index.d.ts","../../node_modules/.pnpm/@types+conventional-commits-parser@5.0.1/node_modules/@types/conventional-commits-parser/index.d.ts","../../node_modules/.pnpm/@types+ms@2.1.0/node_modules/@types/ms/index.d.ts","../../node_modules/.pnpm/@types+debug@4.1.12/node_modules/@types/debug/index.d.ts","../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts","../../node_modules/.pnpm/@types+eslint@9.6.1/node_modules/@types/eslint/use-at-your-own-risk.d.ts","../../node_modules/.pnpm/@types+eslint@9.6.1/node_modules/@types/eslint/index.d.ts","../../node_modules/.pnpm/@types+eslint-scope@3.7.7/node_modules/@types/eslint-scope/index.d.ts","../../node_modules/.pnpm/@types+http-errors@2.0.5/node_modules/@types/http-errors/index.d.ts","../../node_modules/.pnpm/@types+serve-static@1.15.8/node_modules/@types/serve-static/index.d.ts","../../node_modules/.pnpm/@types+express@4.17.23/node_modules/@types/express/index.d.ts","../../node_modules/.pnpm/@types+graceful-fs@4.1.9/node_modules/@types/graceful-fs/index.d.ts","../../node_modules/.pnpm/@types+http-proxy@1.17.16/node_modules/@types/http-proxy/index.d.ts","../../node_modules/.pnpm/@types+istanbul-lib-coverage@2.0.6/node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/.pnpm/@types+istanbul-lib-report@3.0.3/node_modules/@types/istanbul-lib-report/index.d.ts","../../node_modules/.pnpm/@types+istanbul-reports@3.0.4/node_modules/@types/istanbul-reports/index.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/common.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/array.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/collection.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/date.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/function.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/lang.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/math.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/number.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/object.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/seq.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/string.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/util.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/index.d.ts","../../node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","../../node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","../../node_modules/.pnpm/@types+minimist@1.2.5/node_modules/@types/minimist/index.d.ts","../../node_modules/.pnpm/@types+mustache@4.2.6/node_modules/@types/mustache/index.d.ts","../../node_modules/.pnpm/@types+node-forge@1.3.14/node_modules/@types/node-forge/index.d.ts","../../node_modules/.pnpm/@types+normalize-package-data@2.4.4/node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/.pnpm/@types+resolve@1.20.6/node_modules/@types/resolve/index.d.ts","../../node_modules/.pnpm/@types+retry@0.12.2/node_modules/@types/retry/index.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/inc.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/classes/semver.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/parse.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/valid.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/clean.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/diff.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/major.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/minor.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/patch.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/compare.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/sort.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/gt.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/lt.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/eq.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/neq.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/gte.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/lte.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/classes/range.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/index.d.ts","../../node_modules/.pnpm/@types+serve-index@1.9.4/node_modules/@types/serve-index/index.d.ts","../../node_modules/.pnpm/@types+sockjs@0.3.36/node_modules/@types/sockjs/index.d.ts","../../node_modules/.pnpm/@types+stack-utils@2.0.3/node_modules/@types/stack-utils/index.d.ts","../../node_modules/.pnpm/@types+strip-bom@3.0.0/node_modules/@types/strip-bom/index.d.ts","../../node_modules/.pnpm/@types+strip-json-comments@0.0.30/node_modules/@types/strip-json-comments/index.d.ts","../../node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/lib/index.d.ts","../../node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/index.d.ts","../../node_modules/.pnpm/@types+web-bluetooth@0.0.20/node_modules/@types/web-bluetooth/index.d.ts","../../node_modules/.pnpm/@types+ws@8.18.1/node_modules/@types/ws/index.d.ts","../../node_modules/.pnpm/@types+yargs-parser@21.0.3/node_modules/@types/yargs-parser/index.d.ts","../../node_modules/.pnpm/@types+yargs@17.0.33/node_modules/@types/yargs/index.d.ts"],"fileIdsList":[[84,130,265],[84,130],[84,130,193,195],[84,130,194],[84,130,193,196],[84,130,191,193],[84,130,190,191,192],[84,130,190,193],[84,130,293,294],[84,130,294,295,296,297],[84,130,180,294,296],[84,130,293,295],[84,130,143,180],[84,130,143,180,289],[84,130,289,290,291,292],[84,130,289,291],[84,130,290],[84,130,162,180,298,299,300,303],[84,130,299,300,302],[84,130,142,180,298,299,300,301],[84,130,300],[84,130,298,299],[84,130,180,298],[84,130,184,185],[84,130,265,267,274,275,276],[84,130,265,267],[84,130,145,180,348],[84,130,136,180],[84,130,173,180,326],[84,130,145,180],[84,130,162,180],[84,130,352],[84,130,184,185,356],[84,130,184,185,354,355],[84,130,356],[84,130,142,145,180,323,324,325],[84,130,324,326,349,359],[84,130,311],[84,130,143,180,309,310],[84,130,142,145,147,150,162,173,180],[84,130,363],[84,130,364],[84,130,143,173,180],[84,130,366,368,369,370,371,372,373,374,375,376,377,378],[84,130,366,367,369,370,371,372,373,374,375,376,377,378],[84,130,367,368,369,370,371,372,373,374,375,376,377,378],[84,130,366,367,368,370,371,372,373,374,375,376,377,378],[84,130,366,367,368,369,371,372,373,374,375,376,377,378],[84,130,366,367,368,369,370,372,373,374,375,376,377,378],[84,130,366,367,368,369,370,371,373,374,375,376,377,378],[84,130,366,367,368,369,370,371,372,374,375,376,377,378],[84,130,366,367,368,369,370,371,372,373,375,376,377,378],[84,130,366,367,368,369,370,371,372,373,374,376,377,378],[84,130,366,367,368,369,370,371,372,373,374,375,377,378],[84,130,366,367,368,369,370,371,372,373,374,375,376,378],[84,130,366,367,368,369,370,371,372,373,374,375,376,377],[84,130,379],[84,130,180],[84,127,130],[84,129,130],[130],[84,130,135,165],[84,130,131,136,142,150,162,173],[84,130,131,132,142,150],[84,130,133,174],[84,130,134,135,143,151],[84,130,135,162,170],[84,130,136,138,142,150],[84,129,130,137],[84,130,138,139],[84,130,140,142],[84,129,130,142],[84,130,142,143,144,162,173],[84,130,142,143,144,157,162,165],[84,125,130],[84,125,130,138,142,145,150,162,173],[84,130,142,143,145,146,150,162,170,173],[84,130,145,147,162,170,173],[82,83,84,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179],[84,130,142,148],[84,130,149,173],[84,130,138,142,150,162],[84,130,151],[84,130,152],[84,129,130,153],[84,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179],[84,130,155],[84,130,156],[84,130,142,157,158],[84,130,157,159,174,176],[84,130,142,162,163,165],[84,130,164,165],[84,130,162,163],[84,130,165],[84,130,166],[84,127,130,162,167],[84,130,142,168,169],[84,130,168,169],[84,130,135,150,162,170],[84,130,171],[84,130,150,172],[84,130,145,156,173],[84,130,135,174],[84,130,162,175],[84,130,149,176],[84,130,177],[84,130,142,144,153,162,165,173,175,176,178],[84,130,162,179],[84,130,388,426],[84,130,388,411,426],[84,130,387,426],[84,130,426],[84,130,388],[84,130,388,412,426],[84,130,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425],[84,130,412,426],[84,130,143,162,180,322],[84,130,143,360],[84,130,145,180,323,358],[84,130,432],[84,130,142,145,147,150,162,170,173,179,180],[84,130,436],[84,130,255],[84,130,255,279],[84,130,255,272],[84,130,265,277,278],[84,130,271,277],[84,130,265,266,267],[84,130,219,265,267,268,269,270],[84,130,219,263],[84,130,285],[84,130,173,180],[84,130,180,305,306,307],[84,130,305,306],[84,130,305],[84,130,180,304],[84,130,220,221],[84,130,314,315,316,317,318,319,320],[84,130,314,315,316],[84,130,313,314,315],[84,130,314,316],[84,130,316],[84,130,131],[84,130,215],[84,130,213,215],[84,130,204,212,213,214,216,218],[84,130,202],[84,130,205,210,215,218],[84,130,201,218],[84,130,205,206,209,210,211,218],[84,130,205,206,207,209,210,218],[84,130,202,203,204,205,206,210,211,212,214,215,216,218],[84,130,218],[84,130,200,202,203,204,205,206,207,209,210,211,212,213,214,215,216,217],[84,130,200,218],[84,130,205,207,208,210,211,218],[84,130,209,218],[84,130,210,211,215,218],[84,130,203,213],[84,130,185,254,255,338,339,340],[84,130,185,254,255],[84,130,200,242],[84,130,229],[84,130,225,242],[84,130,224,225,226,229,241,242,243,244,245,246,247,248,249,250],[84,130,246],[84,130,224,226,229,247,248],[84,130,245,249],[84,130,224,227,228],[84,130,227],[84,130,224,225,226,229,241],[84,130,230,235,241],[84,130,241],[84,130,230,241],[84,130,230,231,232,233,234,235,236,237,238,239,240],[84,130,197],[84,92,95,98,99,130,173],[84,95,130,162,173],[84,95,99,130,173],[84,130,162],[84,89,130],[84,93,130],[84,91,92,95,130,173],[84,130,150,170],[84,89,130,180],[84,91,95,130,150,173],[84,86,87,88,90,94,130,142,162,173],[84,95,103,130],[84,87,93,130],[84,95,119,120,130],[84,87,90,95,130,165,173,180],[84,95,130],[84,91,95,130,173],[84,86,130],[84,89,90,91,93,94,95,96,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,130],[84,95,112,115,130,138],[84,95,103,104,105,130],[84,93,95,104,106,130],[84,94,130],[84,87,89,95,130],[84,95,99,104,106,130],[84,99,130],[84,93,95,98,130,173],[84,87,91,95,103,130],[84,95,112,130],[84,89,95,119,130,165,178,180],[84,130,142,143,145,146,147,150,162,170,173,179,180,181,182,183,185,186,188,189,199,219,223,252,253,254,255],[84,130,181,182,183,187],[84,130,181],[84,130,183],[84,130,251],[84,130,222],[84,130,198],[84,130,185,255],[84,130,271],[84,130,255,262,264,331],[84,130,143,154,255,332],[84,130,154,255,331,334,335],[84,130,255,336],[84,130,152,255,327,328],[84,130,152,255,273,280,281,282,330],[84,130,154,255,283,284,286,287,288,308,311,312,321,329],[84,130,154,341],[84,130,152,255,256],[84,130,260],[84,130,152,173]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"4bc0794175abedf989547e628949888c1085b1efcd93fc482bccd77ee27f8b7c","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","impliedFormat":1},{"version":"af13e99445f37022c730bfcafcdc1761e9382ce1ea02afb678e3130b01ce5676","impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","impliedFormat":1},{"version":"f4b4faedc57701ae727d78ba4a83e466a6e3bdcbe40efbf913b17e860642897c","affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6310806c6aa3154773976dd083a15659d294700d9ad8f6b8a2e10c3dc461ff1","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"db39d9a16e4ddcd8a8f2b7b3292b362cc5392f92ad7ccd76f00bccf6838ac7de","affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"622b67a408a881e15ab38043547563b9d29ca4b46f5b7a7e4a4fc3123d25d19f","impliedFormat":1},{"version":"2617f1d06b32c7b4dfd0a5c8bc7b5de69368ec56788c90f3d7f3e3d2f39f0253","impliedFormat":1},{"version":"bd8b644c5861b94926687618ec2c9e60ad054d334d6b7eb4517f23f53cb11f91","impliedFormat":1},{"version":"bcbabfaca3f6b8a76cb2739e57710daf70ab5c9479ab70f5351c9b4932abf6bd","impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","impliedFormat":1},{"version":"966dd0793b220e22344c944e0f15afafdc9b0c9201b6444ea0197cd176b96893","impliedFormat":1},{"version":"c54f0b30a787b3df16280f4675bd3d9d17bf983ae3cd40087409476bc50b922d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"5e9f8c1e042b0f598a9be018fc8c3cb670fe579e9f2e18e3388b63327544fe16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"e07c573ac1971ea89e2c56ff5fd096f6f7bba2e6dbcd5681d39257c8d954d4a8","impliedFormat":1},{"version":"363eedb495912790e867da6ff96e81bf792c8cfe386321e8163b71823a35719a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"07199a85560f473f37363d8f1300fac361cda2e954caf8a40221f83a6bfa7ade","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"c9231cf03fd7e8cfd78307eecbd24ff3f0fa55d0f6d1108c4003c124d168adc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d5d50cd0667d9710d4d2f6e077cc4e0f9dc75e106cccaea59999b36873c5a0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","impliedFormat":1},{"version":"f8529fe0645fd9af7441191a4961497cc7638f75a777a56248eac6a079bb275d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4445f6ce6289c5b2220398138da23752fd84152c5c95bb8b58dedefc1758c036","impliedFormat":1},{"version":"a51f786b9f3c297668f8f322a6c58f85d84948ef69ade32069d5d63ec917221c","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"5c31dea483b64cbb341ea8a7073c457720d1574f87837e71cccb70ce91196211","impliedFormat":99},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"8ccaa1a30e1c213a5ea06fc5388cc0846026c179d1400eceef42f94db200fc90","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"217d7b67dacf8438f0be82b846f933981a1e6527e63c082c56adaf4782d62ab4","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"971f12a5fc236419ced0b7b9f23a53c1758233713f565635bbf4b85e2b23f55a","impliedFormat":99},{"version":"76de3321ce519928f1ff7d7a30391c0dc7374af20f81d9167919f038895b5cb0","impliedFormat":99},{"version":"094b9210da23b8711709b0535c59841186267bf6b83c1609aa9b515f830ab274","impliedFormat":99},{"version":"fbfbb4e99c6259ff5ccc4a5a62b3b63c0c8cae6e84737786c4a4c761c9a9de91","impliedFormat":99},{"version":"604887bbd5b0a93234ce882543a465f008636185c52e0f0353330e2bc38b03b6","impliedFormat":99},{"version":"32bf912173e8a9533631f9e9d8dc90a2ac7b52c2355611ddd886beab24dfd182","impliedFormat":99},{"version":"82695324abf7f3278b6d9f0582f4a544e8f7055c8cbe1065ab5cbacde1719c4c","impliedFormat":99},{"version":"43bba542e50e19241ec64bc13cfc0d9273e6198f36563cecad1f4e4b78ad47f3","impliedFormat":99},{"version":"b8cb3b69c0e8114f758bb8ef8efeef1cc80f8911bfd21126def73d2174ce479e","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"f7eebe1b25040d805aefe8971310b805cd49b8602ec206d25b38dc48c542f165","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"509f8efdfc5f9f6b52284170e8d7413552f02d79518d1db691ee15acc0088676","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"3b86b11cb6b75631e0d53e0c36b538404aa793805c50fd3c3dd5cbd3387e09bb","impliedFormat":1},{"version":"71b110829b8f5e7653352a132544ece2b9a10e93ba1c77453187673bd46f13ee","impliedFormat":1},{"version":"7b0537621a997a853ead2b46a4d85e654beeb96b9d034ea09bf3387348521d40","impliedFormat":1},{"version":"1223780c318ef42fd33ac772996335ed92d57cf7c0fc73178acab5e154971aab","impliedFormat":1},{"version":"0d04cbe88c8a25c2debd2eef03ec5674563e23ca9323fa82ede3577822653bd2","impliedFormat":1},{"version":"aaa70439f135c3fa0a34313de49e94cae3db954c8b8d6af0d56a46c998c2923f","impliedFormat":1},{"version":"2cee3ea4c39a53326148e6e78109affd48fa69eae386871c1f440315a6120f40","impliedFormat":1},{"version":"daf07c1ca8ccfb21ad958833546a4f414c418fe096dcebdbb90b02e12aa5c3a2","impliedFormat":1},{"version":"89ac5224feeb2de76fc52fc2a91c5f6448a98dbe4e8d726ecb1730fa64cd2d30","impliedFormat":1},{"version":"7feb39ba69b3fc6d55faca4f91f06d77d15ffedd3931b0ef7740e8b6fd488b15","impliedFormat":1},{"version":"acf00cfabe8c4de18bea655754ea39c4d04140257556bbf283255b695d00e36f","impliedFormat":1},{"version":"39b70d5f131fcfdeba404ee63aba25f26d8376a73bacd8275fb5a9f06219ac77","impliedFormat":1},{"version":"cdae26c737cf4534eeec210e42eab2d5f0c3855240d8dde3be4aee9194e4e781","impliedFormat":1},{"version":"5aa0c50083d0d9a423a46afaef78c7f42420759cfa038ad40e8b9e6cafc38831","impliedFormat":1},{"version":"10d6a49a99a593678ba4ea6073d53d005adfc383df24a9e93f86bf47de6ed857","impliedFormat":1},{"version":"1b7ea32849a7982047c2e5d372300a4c92338683864c9ab0f5bbd1acadae83a3","impliedFormat":1},{"version":"224083e6fcec1d300229da3d1dafc678c642863996cbfed7290df20954435a55","impliedFormat":1},{"version":"4248ac3167b1a1ce199fda9307abc314b3132527aeb94ec30dbcfe4c6a417b1b","impliedFormat":1},{"version":"c1606128c2ac5c6a3cc2cc24c4582a437141a8ed6542d7f5cbb7623835939831","impliedFormat":1},{"version":"ca055d26105248f745ea6259b4c498ebeed18c9b772e7f2b3a16f50226ff9078","impliedFormat":1},{"version":"ea6b2badb951d6dfa24bb7d7eb733327e5f9a15fc994d6dc1c54b2c7a83b6a0b","impliedFormat":1},{"version":"03fdf8dba650d830388b9985750d770dd435f95634717f41cea814863a9ac98b","impliedFormat":1},{"version":"6fd08e3ef1568cd0dc735c9015f6765e25143a4a0331d004a29c51b50eec402a","impliedFormat":1},{"version":"2e988cd4d24edac4936449630581c79686c8adac10357eb0cdb410c24f47c7f0","impliedFormat":1},{"version":"b813f62a37886ed986b0f6f8c5bf323b3fcae32c1952b71d75741e74ea9353cf","impliedFormat":1},{"version":"44a1a722038365972b1b52841e1132785bf5d75839dbc6cc1339f2d36f8507a1","impliedFormat":1},{"version":"83fe1053701101ac6d25364696fea50d2ceb2f81d1456bc11e682a20aaeac52e","impliedFormat":1},{"version":"4f228cb2089a5a135a1a8cefe612d5aebcef8258f7dbe3b7c4dad4e26a81ec08","impliedFormat":1},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59f8dc89b9e724a6a667f52cdf4b90b6816ae6c9842ce176d38fcc973669009e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e4af494f7a14b226bbe732e9c130d8811f8c7025911d7c58dd97121a85519715","impliedFormat":1},{"version":"4150e2f93fe41be23af39caba4fe8dcf732e1344b41309ea08b12b164aa29c94","impliedFormat":99},"dbad64ab0c633d9a90afba3b96c573d9ab2b6965387dd63a5003660684c90ea8","bb96d4ff0f7528c19956f45568f9588ba8f4ed8a4d0b6093ea5c81d7fa112841","9b9405986c4cbad42c577e69ad0d32444810847f85eb6f47fc401d9b81ebc597","ff9a0d4f1b30e23c2ebf178c69177c47cf1cbc4f865babd5b86b6a4b362ed0fa","ab40f13a69a6f3b437daa7b199edf3e916c56056656bdbbab95220cdeaa0d868","a67bbff5bf9a733b3b1fb2f05c6fcd759003f886abd7c0d558c9ae04d7dcfcf3",{"version":"dcc6724dac2ff1aeee98af18afc740163e6bcbe6f39f5b08aad37b50dd07cebf","impliedFormat":99},{"version":"88623aa2028777d8f073c61590feb7f3abde4513918329d868c8c0cb38d2d000","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f21bd6e22ec4af7e666f033455090f6cc26a692c1524acb113526a38f07d48e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a28ac3e717907284b3910b8e9b3f9844a4e0b0a861bea7b923e5adf90f620330","impliedFormat":1},{"version":"f468b74459f1ad4473b36a36d49f2b255f3c6b5d536c81239c2b2971df089eaf","impliedFormat":1},{"version":"82e5a50e17833a10eb091923b7e429dc846d42f1c6161eb6beeb964288d98a15","impliedFormat":1},{"version":"947942f1c1822a3a751c26d5a971664bd1cf2c1030940288d6a092fcda9ac55f","impliedFormat":1},{"version":"2be2227c3810dfd84e46674fd33b8d09a4a28ad9cb633ed536effd411665ea1e","impliedFormat":99},{"version":"bddc8143c3b0fe2a6462f9811d3b28ea422ffee80d75d3d97d65d6b69f583fad","impliedFormat":1},{"version":"83eeb5fc6bc433785dec98525eb003a02134024a8630134ecc67404d0075c26e","impliedFormat":1},{"version":"3feec212c0aeb91e5a6e62caaf9f128954590210f8c302910ea377c088f6b61a","impliedFormat":99},{"version":"7fd978ea8f69444fb258da99a6d1174ab08aa1f2ff8220d0a3bbe30f4de1e0cc","impliedFormat":99},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"86d818ada2f5f0cfffca153af94205b67ba50f8e36524a413d66652f34ef19af","impliedFormat":99},{"version":"40afd49a15d0bafef682b42664ff21c274e02dcc60052f2df85dd53c70d9394f","impliedFormat":99},{"version":"72f80222dfed851994a9f957086d51c3e5b83813a9ed82bd0b0cf416e88843f2","impliedFormat":99},"ddc3343ab5c536298e510dc7476261673097d1ef2cbb074f5fc11fe95275eaf8","c35fa0cacaa46b5d10bdd56a2012f182024f0671d6389110f99543ec374fd93c",{"version":"abc2a3d5e2d3dd761edf42f6b701d37ae9df764862acbee50a10871c5a4b7260","impliedFormat":1},{"version":"c8adda9f45d2f7ec9fb28c59859db32da6c2835f1fec96433e2729e5805fa46f","impliedFormat":99},{"version":"1c20c07324915c372d074a627114144edbb43df6f20431df5ccb06aec2c42e3a","impliedFormat":99},{"version":"da8145d4bea9c4067ba4c238747e082356b42d77a5d1481a163bb74e8e282f66","impliedFormat":99},{"version":"0c5f112b6d3377b9e8214d8920e1a69d8098b881d941f2ab3ca45234d13d68de","impliedFormat":1},{"version":"08bb8fb1430620b088894ecbb0a6cb972f963d63911bb3704febfa0d3a2f6ea5","impliedFormat":1},{"version":"46324183533e34fad2461b51174132e8e0e4b3ac1ceb5032e4952992739d1eab","impliedFormat":1},{"version":"d3fa0530dfb1df408f0abd76486de39def69ca47683d4a3529b2d22fce27c693","impliedFormat":1},{"version":"d9be977c415df16e4defe4995caeca96e637eeef9d216d0d90cdba6fc617e97e","impliedFormat":1},{"version":"98e0c2b48d855a844099123e8ec20fe383ecd1c5877f3895b048656befe268d0","impliedFormat":1},{"version":"ff53802a97b7d11ab3c4395aa052baa14cd12d2b1ed236b520a833fdd2a15003","impliedFormat":1},{"version":"fce9262f840a74118112caf685b725e1cc86cd2b0927311511113d90d87cc61e","impliedFormat":1},{"version":"d7a7cac49af2a3bfc208fe68831fbfa569864f74a7f31cc3a607f641e6c583fd","impliedFormat":1},{"version":"9a80e3322d08274f0e41b77923c91fe67b2c8a5134a5278c2cb60a330441554e","impliedFormat":1},{"version":"2460af41191009298d931c592fb6d4151beea320f1f25b73605e2211e53e4e88","impliedFormat":1},{"version":"2f87ea988d84d1c617afdeba9d151435473ab24cd5fc456510c8db26d8bd1581","impliedFormat":1},{"version":"b7336c1c536e3deaedbda956739c6250ac2d0dd171730c42cb57b10368f38a14","impliedFormat":1},{"version":"6fb67d664aaab2f1d1ad4613b58548aecb4b4703b9e4c5dba6b865b31bd14722","impliedFormat":1},{"version":"4414644199b1a047b4234965e07d189781a92b578707c79c3933918d67cd9d85","impliedFormat":1},{"version":"04a4b38c6a1682059eac00e7d0948d99c46642b57003d61d0fe9ccc9df442887","impliedFormat":1},{"version":"f12ea658b060da1752c65ae4f1e4c248587f6cd4cb4acabbf79a110b6b02ff75","impliedFormat":1},{"version":"011b2857871a878d5eae463bedc4b3dd14755dc3a67d5d10f8fbb7823d119294","impliedFormat":1},{"version":"d406b797d7b2aff9f8bd6c023acfaa5a5fc415bfbf01975e23d415d3f54857af","impliedFormat":1},{"version":"7d71b2d1a537fe41760a16441cd95d98fcb59ddf9c714aba2fecba961ab253b6","impliedFormat":1},{"version":"a9bd8a2bbd03a72054cbdf0cd2a77fabea4e3ae591dd02b8f58bda0c34e50c1c","impliedFormat":1},{"version":"386cc88a3bdee8bc651ead59f8afc9dc5729fc933549bbd217409eabad05ba3e","impliedFormat":1},{"version":"211440ce81e87b3491cdf07155881344b0a61566df6e749acff0be7e8b9d1a07","impliedFormat":1},{"version":"5d9a0b6e6be8dbb259f64037bce02f34692e8c1519f5cd5d467d7fa4490dced4","impliedFormat":1},{"version":"880da0e0f3ebca42f9bd1bc2d3e5e7df33f2619d85f18ee0ed4bd16d1800bc32","impliedFormat":1},{"version":"ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","impliedFormat":1},{"version":"6d54b6fa71d128953c2a7dd5a6a689007d10a7d457581d6531e8469ea1f6ea38","impliedFormat":1},{"version":"59a50afa27798d65c7a71e987ee0d9ce9e114bb06bac138a73f3c49c12b63487","impliedFormat":1},{"version":"008e16bd8ad7e578bdb01150675b3dd8a138fc3ccd885b8706af68a8b2dac48a","impliedFormat":1},{"version":"d261d1df92111dd223aa8ec38876196cbbfcb8d7370cdb645460cf465c6ec5b9","impliedFormat":1},{"version":"da539db884c45ac3842a45c1be2b8a74a26fb5826c5990c9ca1acbe3399a8c99","impliedFormat":1},{"version":"f43baa4f186c9cc41560483f0dd1f24b514815719df78779fa5a823a1a51cf36","impliedFormat":1},{"version":"a27830571004b47d0dbdb8a23ef6c634716735bde15c49c5c687a5d2ea1a988c","impliedFormat":1},{"version":"56170e6aa335d7d939d2f0d3f5664aa451f27fdeaf04e6daca73ddcd2191a9a5","impliedFormat":1},{"version":"0b405601d4da11d9ccbdea90129027f546f557a365c127136c4284f459b68230","impliedFormat":1},{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c","impliedFormat":1},{"version":"2d4de9f50939c496d60cb25b13180d87484aac704d728d20fbceba64a7e23b68","impliedFormat":99},"6509334c16bc6d20be25d20c91d4611591349d6f3138c04aa977a3dd6d7329d6",{"version":"778f1e32782f332c4e2a34eff50deaf80046ad06a98f97c653ea2274ae5ffa7f","signature":"cfa3bfa1711d528f35377e19ff0686177d89671d8af077c28f888cabb4dc34e8"},{"version":"5c92308632410a6494ce2cc4eddfc3b408649f451653a1f61cd430c2d9f90bd5","signature":"67e77a3e32d2bfd91e08e7d7c45165414e0d4149200e8a029b07dec719a5b20c"},{"version":"a4f6a4837b877dc83d43b63b39f68b1de273f51807639ed05eaf643041b16b4f","signature":"309dc4bacb9b04b3f1a5590949a4f70515ca0650731c0e73424d2853dcbf13fb"},{"version":"a431b9227886926a002786f616c91a63e33daa2df554e3a494c90b324ab1c16b","signature":"f307433994a17c3c0c32f9477eaa5af396ff694b6e0b74f6178bca6ffa441579"},{"version":"5220dcb988aa2dd3d17a2dd61c4fdad467f8aa169491ec8968e8a7ea7180d0e7","impliedFormat":99},"f8a79dca1ea290e47150c4162b91efefc14de71efc1c9a5469c4a6a920a8ca84",{"version":"1c23a9db1e8f03cf8066c85e0f22b256fc52b6b9b4a459c2f7b7e7d9f088a7ab","signature":"79f1458f222bc4e5d604e437ec7c6da6e1f40b18904d28961e68be578e71023f"},{"version":"f13a0c19e4e1f06453e808ae74a6ef9c90ed8d8fe9f3d6fecac8a763af6a316e","signature":"eb28aa3c20501a0bc8cc6d5886f04b3c2dae13a53b4de7c3dbd5a93b593b320d"},{"version":"ac0e45806dfb87684696b8a268697c8e789c50e29fd285fec047830e773f9832","impliedFormat":1},{"version":"c08965aaf521decac994d0d48227a9132a9d1051cddd33272875a47e98143740","impliedFormat":1},{"version":"0eb1d2c95f6a0504d93e73d5352a5917ce9af4bdcfd1326d8ceeedca45a54206","impliedFormat":1},{"version":"310258741b123b2a9396ad26dc67c80f341a0dd8a3d80f3649eaa2806a5ee489","impliedFormat":1},"a5cc40c626f1e1183d75882fe946e8b1d1b872f76ca51841d737fa41c327dee2","bb26d42adaa5a7ed7fdc279c066e9e2adaa08f686111ee58c83f256dea80ccd9","ad800c70aa166eb397210b676ae3440c519c03df7b65d25f8aae0a310bad406c","090e9d132ab8b4f3e4996def8827554a6e5a1fb23be3f0b5ef1818ab296c4e8e","f8241bf76cf0a6390e1496d31bfd6511590b525032875e8a6adc16a10e597d75","2efc82b3d025cb8882ae7b69ad651e54e3828cf8a5dd3b523437cc0793ac3ce2",{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","impliedFormat":1},{"version":"f96f3c445afc7d65d4790386e37c5b57f095f285cc89b8315b209fe0c81837c1","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","impliedFormat":1},{"version":"bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","impliedFormat":1},{"version":"1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5","impliedFormat":1},{"version":"63786b6f821dee19eb898afb385bd58f1846e6cba593a35edcf9631ace09ba25","impliedFormat":1},{"version":"035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","impliedFormat":1},{"version":"a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","impliedFormat":1},{"version":"5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","impliedFormat":1},{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"0b24a72109c8dd1b41f94abfe1bb296ba01b3734b8ac632db2c48ffc5dccaf01","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"b88749bdb18fc1398370e33aa72bc4f88274118f4960e61ce26605f9b33c5ba2","impliedFormat":1},{"version":"0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","impliedFormat":1},{"version":"b58c81d4cc365d3986aee6c2a86592edc50f141b796899079196ffb103047390","impliedFormat":1},{"version":"7fadb2778688ebf3fd5b8d04f63d5bf27a43a3e420bc80732d3c6239067d1a4b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"5aca5a3bc07d2e16b6824a76c30378d6fb1b92e915d854315e1d1bd2d00974c9","impliedFormat":1},{"version":"510616459e6edd01acbce333fb256e06bdffdad43ca233a9090164bf8bb83912","impliedFormat":1},{"version":"ce6a3f09b8db73a7e9701aca91a04b4fabaf77436dd35b24482f9ee816016b17","impliedFormat":1},{"version":"20e086e5b64fdd52396de67761cc0e94693494deadb731264aac122adf08de3f","impliedFormat":1},{"version":"6e78f75403b3ec65efb41c70d392aeda94360f11cedc9fb2c039c9ea23b30962","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"eefd2bbc8edb14c3bd1246794e5c070a80f9b8f3730bd42efb80df3cc50b9039","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a56fe175741cc8841835eb72e61fa5a34adcbc249ede0e3494c229f0750f6b85","impliedFormat":1},{"version":"ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","impliedFormat":1},{"version":"1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","impliedFormat":1},{"version":"ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","impliedFormat":1},{"version":"4006c872e38a2c4e09c593bc0cdd32b7b4f5c4843910bea0def631c483fff6c5","impliedFormat":1},{"version":"ab6aa3a65d473871ee093e3b7b71ed0f9c69e07d1d4295f45c9efd91a771241d","impliedFormat":1},{"version":"15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e","impliedFormat":1},{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"6451264601a58c77b5f347234485ce0ac09e9fafcc5228a3c60f5ccb3fc8524e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7","impliedFormat":1}],"root":[[256,259],261,281,282,[329,333],[335,337],[342,347]],"options":{"composite":true,"declaration":true,"declarationMap":true,"module":99,"newLine":1,"noEmitOnError":true,"noImplicitAny":false,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[267,1],[265,2],[196,3],[194,2],[195,4],[197,5],[192,6],[190,2],[193,7],[191,8],[295,9],[298,10],[297,11],[296,12],[294,13],[290,14],[293,15],[292,16],[291,17],[289,13],[304,18],[303,19],[302,20],[301,21],[300,22],[299,23],[283,24],[277,25],[274,1],[275,26],[276,1],[349,27],[350,28],[327,29],[348,30],[351,31],[353,32],[357,33],[356,34],[355,35],[184,2],[326,36],[360,37],[328,38],[311,39],[361,13],[312,2],[358,2],[362,40],[363,2],[364,41],[365,42],[354,2],[309,43],[310,2],[367,44],[368,45],[366,46],[369,47],[370,48],[371,49],[372,50],[373,51],[374,52],[375,53],[376,54],[377,55],[378,56],[380,57],[322,2],[381,2],[352,2],[382,2],[383,58],[127,59],[128,59],[129,60],[84,61],[130,62],[131,63],[132,64],[82,2],[133,65],[134,66],[135,67],[136,68],[137,69],[138,70],[139,70],[141,2],[140,71],[142,72],[143,73],[144,74],[126,75],[83,2],[145,76],[146,77],[147,78],[180,79],[148,80],[149,81],[150,82],[151,83],[152,84],[153,85],[154,86],[155,87],[156,88],[157,89],[158,89],[159,90],[160,2],[161,2],[162,91],[164,92],[163,93],[165,94],[166,95],[167,96],[168,97],[169,98],[170,99],[171,100],[172,101],[173,102],[174,103],[175,104],[176,105],[177,106],[178,107],[179,108],[384,2],[324,2],[325,2],[385,2],[386,2],[411,109],[412,110],[388,111],[391,112],[409,109],[410,109],[400,109],[399,113],[397,109],[392,109],[405,109],[403,109],[407,109],[387,109],[404,109],[408,109],[393,109],[394,109],[406,109],[389,109],[395,109],[396,109],[398,109],[402,109],[413,114],[401,109],[390,109],[426,115],[425,2],[420,114],[422,116],[421,114],[414,114],[415,114],[417,114],[419,114],[423,116],[424,116],[416,116],[418,116],[323,117],[427,118],[359,119],[428,30],[429,2],[430,2],[431,2],[433,120],[432,2],[379,2],[434,2],[435,121],[436,2],[437,122],[334,123],[262,123],[280,124],[273,125],[279,126],[278,127],[268,128],[271,129],[266,2],[264,130],[263,2],[85,2],[284,2],[286,131],[285,2],[288,58],[287,132],[189,2],[308,133],[307,134],[306,135],[305,136],[230,2],[220,2],[222,137],[221,2],[269,2],[321,138],[317,139],[316,140],[315,141],[318,139],[314,2],[319,142],[320,142],[313,2],[338,143],[216,144],[214,145],[215,146],[203,147],[204,145],[211,148],[202,149],[207,150],[217,2],[208,151],[213,152],[219,153],[218,154],[201,155],[209,156],[210,157],[205,158],[212,144],[206,159],[341,160],[339,2],[340,2],[186,161],[185,24],[243,162],[224,2],[244,163],[226,164],[251,165],[245,2],[247,166],[248,166],[249,167],[246,2],[250,168],[229,169],[227,2],[228,170],[242,171],[225,2],[240,172],[231,173],[232,174],[233,174],[234,173],[241,175],[235,174],[236,172],[237,173],[238,174],[239,173],[200,2],[198,176],[80,2],[81,2],[13,2],[15,2],[14,2],[2,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[3,2],[24,2],[25,2],[4,2],[26,2],[30,2],[27,2],[28,2],[29,2],[31,2],[32,2],[33,2],[5,2],[34,2],[35,2],[36,2],[37,2],[6,2],[41,2],[38,2],[39,2],[40,2],[42,2],[7,2],[43,2],[48,2],[49,2],[44,2],[45,2],[46,2],[47,2],[8,2],[53,2],[50,2],[51,2],[52,2],[54,2],[9,2],[55,2],[56,2],[57,2],[59,2],[58,2],[60,2],[61,2],[10,2],[62,2],[63,2],[64,2],[11,2],[65,2],[66,2],[67,2],[68,2],[69,2],[1,2],[70,2],[71,2],[12,2],[75,2],[73,2],[78,2],[77,2],[72,2],[76,2],[74,2],[79,2],[270,2],[103,177],[114,178],[101,179],[115,180],[124,181],[92,182],[93,183],[91,184],[123,58],[118,185],[122,186],[95,187],[111,188],[94,189],[121,190],[89,191],[90,185],[96,192],[97,2],[102,193],[100,192],[87,194],[125,195],[116,196],[106,197],[105,192],[107,198],[109,199],[104,200],[108,201],[119,58],[98,202],[99,203],[110,204],[88,180],[113,205],[112,192],[117,2],[86,2],[120,206],[255,207],[188,208],[182,209],[183,209],[181,2],[187,210],[253,2],[252,211],[223,212],[199,213],[254,214],[272,215],[260,2],[332,216],[333,217],[336,218],[337,219],[335,123],[329,220],[331,221],[281,2],[282,123],[330,222],[342,223],[343,2],[344,2],[345,2],[346,2],[347,2],[257,224],[258,2],[259,2],[261,225],[256,226]],"semanticDiagnosticsPerFile":[[330,[{"start":8285,"length":4,"code":2339,"category":1,"messageText":"Property 'root' does not exist on type 'ConfigEnv'."},{"start":8634,"length":4,"code":2339,"category":1,"messageText":"Property 'root' does not exist on type 'ConfigEnv'."},{"start":9789,"length":5,"code":2339,"category":1,"messageText":"Property 'build' does not exist on type 'ConfigEnv'."},{"start":13304,"length":11,"code":2559,"category":1,"messageText":"Type 'UserOptions' has no properties in common with type '{ _minify?: boolean | undefined; }'."}]]],"affectedFilesPendingEmit":[332,333,336,337,335,329,331,281,282,330,342,343,344,345,346,347,257,258,259,261,256],"emitSignatures":[256,257,258,259,261,281,282,329,330,331,332,333,335,336,337,342,343,344,345,346,347],"version":"5.9.2"} \ No newline at end of file diff --git a/packages/builder-vite/tsup.config.ts b/packages/builder-vite/tsup.config.ts new file mode 100644 index 00000000..8896efef --- /dev/null +++ b/packages/builder-vite/tsup.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: [ + 'src/index.ts', + 'src/registerBuilder.ts', + 'src/registerMethods.ts', + 'src/registerType.ts', + 'src/features/viteHtml.ts', + 'src/features/viteOption.ts', + 'src/features/viteVueJsx.ts', + 'src/features/viteVuePlugin.ts', + 'src/features/viteAnalyze.ts', + 'src/features/viteLegacy.ts', + 'src/commands/build/index.ts', + 'src/commands/dev/index.ts', + ], + splitting: false, + sourcemap: false, + clean: true, + dts: true, + shims: true, + format: ['esm'], +}); diff --git a/packages/builder-vite/types.d.ts b/packages/builder-vite/types.d.ts new file mode 100644 index 00000000..b00ef754 --- /dev/null +++ b/packages/builder-vite/types.d.ts @@ -0,0 +1,21 @@ +import type { ServerOptions } from 'vite'; +// eslint-disable-next-line antfu/no-import-dist +import type { ViteBuildConfig } from './dist/index.d.mjs'; + +declare module '@fesjs/fes' { + interface PluginBuildConfig extends ViteBuildConfig { + + } + + interface FesConfig { + terserOptions?: any; + inlineLimit?: number; + outputPath?: string; + proxy?: ServerOptions['proxy']; + title?: string; + mountElementId?: string; + publicPath?: string; + alias?: Record; + autoprefixer?: any; + } +} diff --git a/packages/fes-builder-webpack/LICENSE b/packages/builder-webpack/LICENSE similarity index 100% rename from packages/fes-builder-webpack/LICENSE rename to packages/builder-webpack/LICENSE diff --git a/packages/fes-builder-webpack/README.md b/packages/builder-webpack/README.md similarity index 100% rename from packages/fes-builder-webpack/README.md rename to packages/builder-webpack/README.md diff --git a/packages/fes-builder-webpack/package.json b/packages/builder-webpack/package.json similarity index 70% rename from packages/fes-builder-webpack/package.json rename to packages/builder-webpack/package.json index f343fba8..d6ec1680 100644 --- a/packages/fes-builder-webpack/package.json +++ b/packages/builder-webpack/package.json @@ -8,7 +8,7 @@ "repository": { "type": "git", "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-builder-webpack" + "directory": "packages/builder-webpack" }, "bugs": { "url": "https://github.com/WeBankFinTech/fes.js/issues" @@ -16,30 +16,35 @@ "keywords": [ "fes" ], - "main": "lib/index.js", - "types": "types.d.ts", + "main": "dist/index.mjs", + "module": "dist/index.mjs", "files": [ - "lib", + "dist", "types.d.ts" ], + "scripts": { + "dev": "tsup --watch --sourcemap", + "build": "tsup" + }, "publishConfig": { "access": "public" }, "peerDependencies": { "@fesjs/fes": "^3.1.17", - "core-js": "^3.29.1" + "core-js": "^3.45.1" }, "dependencies": { - "@babel/core": "^7.23.2", + "@babel/core": "^7.28.3", "@babel/plugin-proposal-do-expressions": "^7.22.5", "@babel/plugin-proposal-export-default-from": "^7.22.17", "@babel/plugin-proposal-function-bind": "^7.22.5", "@babel/plugin-proposal-pipeline-operator": "^7.22.15", - "@babel/plugin-transform-runtime": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/preset-typescript": "^7.23.2", - "@fesjs/utils": "^3.0.3", - "@vue/babel-plugin-jsx": "^1.2.2", + "@babel/plugin-transform-runtime": "^7.28.3", + "@babel/preset-env": "^7.28.3", + "@babel/preset-typescript": "^7.27.1", + "@fesjs/shared": "workspace:*", + "@fesjs/utils": "workspace:*", + "@vue/babel-plugin-jsx": "^1.5.0", "ajv": "^8.12.0", "autoprefixer": "^10.4.14", "babel-loader": "^9.1.2", @@ -49,13 +54,13 @@ "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^5.0.0", - "fs-extra": "^11.1.1", - "get-folder-size": "^2.0.1", + "fs-extra": "^11.3.1", + "get-folder-size": "^5.0.0", "html-webpack-plugin": "^5.5.0", "html-webpack-tags-plugin": "^3.0.2", "less": "^4.1.3", "less-loader": "^11.1.0", - "mini-css-extract-plugin": "^2.8.1", + "mini-css-extract-plugin": "^2.9.4", "postcss": "^8.4.33", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^7.1.0", @@ -63,8 +68,8 @@ "style-loader": "^3.3.2", "terser-webpack-plugin": "^5.3.6", "vue-loader": "^17.4.2", - "webpack": "^5.90.3", - "webpack-5-chain": "^8.0.1", + "webpack": "^5.101.3", + "webpack-5-chain": "^8.0.2", "webpack-bundle-analyzer": "^4.4.0", "webpack-dev-server": "^5.1.0", "webpackbar": "^7.0.0" diff --git a/packages/builder-webpack/src/index.ts b/packages/builder-webpack/src/index.ts new file mode 100644 index 00000000..edbf248c --- /dev/null +++ b/packages/builder-webpack/src/index.ts @@ -0,0 +1,46 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { WebpackBuildConfig } from './shared'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +export { + WebpackBuildConfig, +}; + +export default function () { + return { + plugins: [ + join(__dirname, './plugins/registerBuilder.mjs'), + + // register methods + join(__dirname, './plugins/registerMethods.mjs'), + join(__dirname, './plugins/registerType.mjs'), + + // bundle configs + join(__dirname, './plugins/features/analyze.mjs'), + join(__dirname, './plugins/features/chainWebpack.mjs'), + join(__dirname, './plugins/features/cssLoader.mjs'), + join(__dirname, './plugins/features/copy.mjs'), + join(__dirname, './plugins/features/devServer.mjs'), + join(__dirname, './plugins/features/devtool.mjs'), + join(__dirname, './plugins/features/externals.mjs'), + join(__dirname, './plugins/features/exportStatic.mjs'), + join(__dirname, './plugins/features/extraBabelPlugins.mjs'), + join(__dirname, './plugins/features/extraBabelPresets.mjs'), + join(__dirname, './plugins/features/extraPostCSSPlugins.mjs'), + join(__dirname, './plugins/features/html.mjs'), + join(__dirname, './plugins/features/lessLoader.mjs'), + join(__dirname, './plugins/features/postcssLoader.mjs'), + join(__dirname, './plugins/features/nodeModulesTransform.mjs'), + join(__dirname, './plugins/features/vueLoader.mjs'), + join(__dirname, './plugins/features/extraCSS.mjs'), + + // commands + join(__dirname, './plugins/commands/build/index.mjs'), + join(__dirname, './plugins/commands/dev/index.mjs'), + join(__dirname, './plugins/commands/webpack/index.mjs'), + ], + }; +} diff --git a/packages/fes-builder-webpack/src/plugins/commands/build/build.js b/packages/builder-webpack/src/plugins/commands/build/build.ts similarity index 78% rename from packages/fes-builder-webpack/src/plugins/commands/build/build.js rename to packages/builder-webpack/src/plugins/commands/build/build.ts index fa50b1c6..feb4be83 100644 --- a/packages/fes-builder-webpack/src/plugins/commands/build/build.js +++ b/packages/builder-webpack/src/plugins/commands/build/build.ts @@ -1,9 +1,9 @@ import webpack from 'webpack'; -export async function build({ bundleConfig }) { +export async function build(bundleConfig: webpack.Configuration): Promise<{ stats?: webpack.Stats }> { return new Promise((resolve, reject) => { const compiler = webpack(bundleConfig); - compiler.run((err, stats) => { + compiler!.run((err, stats) => { if (err) { console.error(err); return reject(new Error('build failed')); diff --git a/packages/fes-builder-webpack/src/plugins/commands/build/index.js b/packages/builder-webpack/src/plugins/commands/build/index.ts similarity index 75% rename from packages/fes-builder-webpack/src/plugins/commands/build/index.js rename to packages/builder-webpack/src/plugins/commands/build/index.ts index c0fc5304..47f77986 100644 --- a/packages/fes-builder-webpack/src/plugins/commands/build/index.js +++ b/packages/builder-webpack/src/plugins/commands/build/index.ts @@ -1,13 +1,12 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/blob/master/packages/preset-built-in/src/plugins/commands/build/build.ts - */ - -import { relative } from 'path'; -import { existsSync } from 'fs'; +import type { IPluginAPI } from '@fesjs/shared'; +import type { WebpackBuildConfig } from '../../../shared'; +import { existsSync } from 'node:fs'; +import { relative } from 'node:path'; +import process from 'node:process'; import { cleanTmpPathExceptCache, getBundleAndConfigs, printFileSizes } from '../../common/buildDevUtils'; +import { build } from './build'; -export default function (api) { +export default function (api: IPluginAPI) { const { paths, utils: { rimraf, logger }, @@ -17,8 +16,6 @@ export default function (api) { command: 'build', description: 'build application for production', async fn() { - const { build } = require('./build'); - cleanTmpPathExceptCache({ absTmpPath: paths.absTmpPath, }); @@ -40,11 +37,13 @@ export default function (api) { } } - const { stats } = await build({ bundleConfig }); + const { stats } = await build(bundleConfig); if (process.env.RM_TMPDIR !== 'none') { rimraf.sync(paths.absTmpPath); } - printFileSizes(stats, relative(process.cwd(), paths.absOutputPath)); + if (stats) { + printFileSizes({ stats, dir: relative(process.cwd(), paths.absOutputPath) }); + } await api.applyPlugins({ key: 'onBuildComplete', type: api.ApplyPluginsType.event, @@ -52,7 +51,8 @@ export default function (api) { stats, }, }); - } catch (err) { + } + catch (err) { await api.applyPlugins({ key: 'onBuildComplete', type: api.ApplyPluginsType.event, diff --git a/packages/fes-builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.js b/packages/builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.ts similarity index 67% rename from packages/fes-builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.js rename to packages/builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.ts index 065a66ac..38fa97e1 100644 --- a/packages/fes-builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.js +++ b/packages/builder-webpack/src/plugins/commands/dev/connectHistoryMiddleware.ts @@ -1,14 +1,16 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { WebpackBuildConfig } from '../../../shared'; import { extname } from 'node:path'; import historyFallback from 'connect-history-api-fallback'; const ASSET_EXT_NAMES = ['.ico', '.png', '.jpg', '.jpeg', '.gif', '.svg']; -function proxyMiddleware(api) { - return (req, res, next) => { +function proxyMiddleware(api: IPluginAPI) { + return (req: any, res: any, next: any) => { const proxyConfig = api.config.proxy; if (proxyConfig) { if (Array.isArray(proxyConfig)) { - if (proxyConfig.some(item => item.context.some(path => path && req.url.startsWith(path)))) { + if (proxyConfig.some(item => item.context.some((path: string) => path && req.url.startsWith(path)))) { return next(); } } diff --git a/packages/fes-builder-webpack/src/plugins/commands/dev/devServer.js b/packages/builder-webpack/src/plugins/commands/dev/devServer.ts similarity index 71% rename from packages/fes-builder-webpack/src/plugins/commands/dev/devServer.js rename to packages/builder-webpack/src/plugins/commands/dev/devServer.ts index c10d1096..9a8d2e3a 100644 --- a/packages/fes-builder-webpack/src/plugins/commands/dev/devServer.js +++ b/packages/builder-webpack/src/plugins/commands/dev/devServer.ts @@ -1,8 +1,20 @@ +import type { WebpackBuildConfig } from '../../../shared'; import { chalk } from '@fesjs/utils'; import webpack from 'webpack'; import WebpackDevServer from 'webpack-dev-server'; -function formatProxy(proxy) { +interface StartDevServerOptions { + webpackConfig: webpack.Configuration; + host: string; + port: number; + proxy: any; + https: boolean | { key: string; cert: string }; + beforeMiddlewares: any[]; + afterMiddlewares: any[]; + customerDevServerConfig?: WebpackBuildConfig['devServer']; +} + +function formatProxy(proxy: any) { if (!proxy) { return []; } @@ -19,8 +31,11 @@ function formatProxy(proxy) { }); } -export function startDevServer({ webpackConfig, host, port, proxy, https, beforeMiddlewares, afterMiddlewares, customerDevServerConfig }) { - const options = { +export function startDevServer({ webpackConfig, host, port, proxy, https, beforeMiddlewares, afterMiddlewares, customerDevServerConfig }: StartDevServerOptions) { + const headers: Record = { + 'access-control-allow-origin': '*', + }; + const options: WebpackDevServer.Configuration = { hot: true, allowedHosts: 'all', server: https ? 'https' : 'http', @@ -39,15 +54,17 @@ export function startDevServer({ webpackConfig, host, port, proxy, https, before return middlewares; }, - headers: { - 'access-control-allow-origin': '*', - }, + // @ts-expect-error 不知道这里为啥异常 + headers, ...(customerDevServerConfig || {}), port, host, proxy: formatProxy(proxy), }; const compiler = webpack(webpackConfig); + if (!compiler) { + throw new Error('Failed to create webpack compiler'); + } const server = new WebpackDevServer(options, compiler); if (options.host === '0.0.0.0') { // eslint-disable-next-line no-console diff --git a/packages/fes-builder-webpack/src/plugins/commands/dev/index.js b/packages/builder-webpack/src/plugins/commands/dev/index.ts similarity index 80% rename from packages/fes-builder-webpack/src/plugins/commands/dev/index.js rename to packages/builder-webpack/src/plugins/commands/dev/index.ts index ab440ba7..668e0d03 100644 --- a/packages/fes-builder-webpack/src/plugins/commands/dev/index.js +++ b/packages/builder-webpack/src/plugins/commands/dev/index.ts @@ -1,38 +1,40 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { WebpackBuildConfig } from '../../../shared'; import fs from 'node:fs'; import path from 'node:path'; import process from 'node:process'; +import { removeSync } from 'fs-extra/esm'; +import getFolderSize from 'get-folder-size'; import { cleanTmpPathExceptCache, getBundleAndConfigs } from '../../common/buildDevUtils'; import connectHistoryMiddleware from './connectHistoryMiddleware'; +import { startDevServer } from './devServer'; -async function handleCacheClean(cwd) { - return new Promise((resolve, reject) => { +async function handleCacheClean(cwd: string) { + return new Promise((resolve) => { const cachePath = path.join(cwd, '.cache/webpack'); if (!fs.existsSync(cachePath)) { - return resolve(); + return resolve(0); } - require('get-folder-size')(cachePath, (err, size) => { - if (err) { - return reject(err); - } - // 大于 5G 清除缓存,修复 webpack 缓存无限增长问题 - // https://github.com/webpack/webpack/issues/13291 + // 大于 5G 清除缓存,修复 webpack 缓存无限增长问题 + // https://github.com/webpack/webpack/issues/13291 + getFolderSize.loose(cachePath).then((size) => { if (size > 5 * 1024 * 1024 * 1024) { - require('fs-extra').removeSync(cachePath); + removeSync(cachePath); } resolve(size); }); }); } -export default (api) => { +export default (api: IPluginAPI) => { const { paths, utils: { chalk, getPort, getHostName, changePort, logger }, } = api; - let port; - let hostname; - let server; + let port: number; + let hostname: string; + let server: any; async function destroy() { await server?.stop(); @@ -90,7 +92,6 @@ export default (api) => { args: {}, }); - const { startDevServer } = require('./devServer'); server = startDevServer({ webpackConfig: bundleConfig, host: hostname, @@ -113,7 +114,7 @@ export default (api) => { fn() { logger.info(chalk.gray('Try to restart dev server...')); destroy(); - process.send({ + process.send?.({ type: 'RESTART', }); }, diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/index-default.html b/packages/builder-webpack/src/plugins/commands/index-default.html similarity index 100% rename from packages/fes-builder-webpack/src/plugins/common/webpackConfig/index-default.html rename to packages/builder-webpack/src/plugins/commands/index-default.html diff --git a/packages/builder-webpack/src/plugins/commands/pitcher.ts b/packages/builder-webpack/src/plugins/commands/pitcher.ts new file mode 100644 index 00000000..773b26ff --- /dev/null +++ b/packages/builder-webpack/src/plugins/commands/pitcher.ts @@ -0,0 +1,9 @@ +const pitcher = (code: string): string => code; + +export function pitch(this: any) { + if (/&blockType=config/.test(this.resourceQuery)) { + return ''; + } +} + +export default pitcher; diff --git a/packages/fes-builder-webpack/src/plugins/commands/webpack/index.js b/packages/builder-webpack/src/plugins/commands/webpack/index.ts similarity index 50% rename from packages/fes-builder-webpack/src/plugins/commands/webpack/index.js rename to packages/builder-webpack/src/plugins/commands/webpack/index.ts index a92692e0..05546b1d 100644 --- a/packages/fes-builder-webpack/src/plugins/commands/webpack/index.js +++ b/packages/builder-webpack/src/plugins/commands/webpack/index.ts @@ -1,6 +1,10 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { WebpackBuildConfig } from '../../../shared'; +import { assert } from 'node:console'; +import { highlight } from 'cli-highlight'; import { getBundleAndConfigs } from '../../common/buildDevUtils'; -export default function (api) { +export default function (api: IPluginAPI) { api.registerCommand({ command: 'webpack', description: 'inspect webpack configurations', @@ -26,26 +30,27 @@ export default function (api) { description: 'show full function definitions in output', }, ], - async fn({ options }) { - const assert = require('assert'); - const { toString } = require('webpack-5-chain'); - const { highlight } = require('cli-highlight'); + async fn({ options }: { options: any }) { const { bundleConfig } = await getBundleAndConfigs({ api }); - let config = bundleConfig; + let config: any = bundleConfig; assert(config, 'No valid config found with fes entry.'); if (options.rule) { - config = config.module.rules.find((r) => r.__ruleNames[0] === options.rule); - } else if (options.plugin) { - config = config.plugins.find((p) => p.__pluginName === options.plugin); - } else if (options.rules) { - config = config.module.rules.map((r) => r.__ruleNames[0]); - } else if (options.plugins) { - config = config.plugins.map((p) => p.__pluginName || p.constructor.name); + config = config.module.rules.find((r: any) => r.__ruleNames[0] === options.rule); + } + else if (options.plugin) { + config = config.plugins.find((p: any) => p.__pluginName === options.plugin); + } + else if (options.rules) { + config = config.module.rules.map((r: any) => r.__ruleNames[0]); + } + else if (options.plugins) { + config = config.plugins.map((p: any) => p.__pluginName || p.constructor.name); } - console.log(highlight(toString(config, { verbose: options.verbose }), { language: 'js' })); + // eslint-disable-next-line no-console + console.log(highlight(config.toString({ verbose: options.verbose }), { language: 'js' })); }, }); } diff --git a/packages/fes-builder-webpack/src/plugins/common/buildDevUtils.js b/packages/builder-webpack/src/plugins/common/buildDevUtils.ts similarity index 65% rename from packages/fes-builder-webpack/src/plugins/common/buildDevUtils.js rename to packages/builder-webpack/src/plugins/common/buildDevUtils.ts index 946057ab..1cc1ec8a 100644 --- a/packages/fes-builder-webpack/src/plugins/common/buildDevUtils.js +++ b/packages/builder-webpack/src/plugins/common/buildDevUtils.ts @@ -1,18 +1,25 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/blob/master/packages/preset-built-in/src/plugins/commands/buildDevUtils.ts - */ - -import { join, resolve } from 'path'; -import { existsSync, readFileSync } from 'fs'; -import zlib from 'zlib'; -import { rimraf, chalk } from '@fesjs/utils'; +import type { IPluginAPI } from '@fesjs/shared'; +import type webpack from 'webpack'; +import type { WebpackBuildConfig } from '../../shared'; +import { existsSync, readFileSync } from 'node:fs'; +import { join, resolve } from 'node:path'; +import zlib from 'node:zlib'; +import { chalk, rimraf } from '@fesjs/utils'; +import UI from 'cliui'; import getConfig from './webpackConfig'; -export async function getBundleAndConfigs({ api }) { +interface GetBundleAndConfigsOptions { + api: IPluginAPI; +} + +interface GetBundleAndConfigsResult { + bundleConfig: webpack.Configuration; +} + +export async function getBundleAndConfigs({ api }: GetBundleAndConfigsOptions): Promise { // get config const env = api.env === 'production' ? 'production' : 'development'; - const getConfigOpts = await api.applyPlugins({ + const getConfigOpts: any = await api.applyPlugins({ type: api.ApplyPluginsType.modify, key: 'modifyBundleConfigOpts', initialValue: { @@ -22,22 +29,21 @@ export async function getBundleAndConfigs({ api }) { entry: { index: join(api.paths.absTmpPath, 'fes.js'), }, - // @ts-ignore - async modifyBabelOpts(opts) { + async modifyBabelOpts(opts: any) { return api.applyPlugins({ type: api.ApplyPluginsType.modify, key: 'modifyBabelOpts', initialValue: opts, }); }, - async modifyBabelPresetOpts(opts) { + async modifyBabelPresetOpts(opts: any) { return api.applyPlugins({ type: api.ApplyPluginsType.modify, key: 'modifyBabelPresetOpts', initialValue: opts, }); }, - async chainWebpack(webpackConfig, opts) { + async chainWebpack(webpackConfig: any, opts: any) { return api.applyPlugins({ type: api.ApplyPluginsType.modify, key: 'chainWebpack', @@ -64,7 +70,7 @@ export async function getBundleAndConfigs({ api }) { args: {}, }); - const bundleConfig = await api.applyPlugins({ + const bundleConfig: webpack.Configuration = await api.applyPlugins({ type: api.ApplyPluginsType.modify, key: 'modifyBundleConfig', initialValue: await getConfig({ api, ...getConfigOpts }), @@ -74,7 +80,11 @@ export async function getBundleAndConfigs({ api }) { return { bundleConfig }; } -export function cleanTmpPathExceptCache({ absTmpPath }) { +interface CleanTmpPathExceptCacheOptions { + absTmpPath: string; +} + +export function cleanTmpPathExceptCache({ absTmpPath }: CleanTmpPathExceptCacheOptions) { rimraf.sync(absTmpPath); } @@ -82,15 +92,20 @@ export function cleanTmpPathExceptCache({ absTmpPath }) { const WARN_AFTER_BUNDLE_GZIP_SIZE = 1.8 * 1024 * 1024; const WARN_AFTER_CHUNK_GZIP_SIZE = 1 * 1024 * 1024; -export function printFileSizes(stats, dir) { - const ui = require('cliui')({ width: 80 }); - const json = stats.toJson({ +interface PrintFileSizesOptions { + stats: webpack.Stats; + dir: string; +} + +export function printFileSizes({ stats, dir }: PrintFileSizesOptions) { + const ui = UI({ width: 80 }); + const json: any = stats.toJson({ hash: false, modules: false, chunks: false, }); - const filesize = (bytes) => { + const filesize = (bytes: number) => { bytes = Math.abs(bytes); const radix = 1024; const unit = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; @@ -104,14 +119,14 @@ export function printFileSizes(stats, dir) { return `${bytes.toFixed(1)} ${unit[loop]}`; }; - const assets = json.assets ? json.assets : json?.children?.reduce((acc, child) => acc.concat(child?.assets), []); + const assets: any[] = json.assets ? json.assets : json?.children?.reduce((acc: any, child: any) => acc.concat(child?.assets), []); const seenNames = new Map(); - const isJS = (val) => /\.js$/.test(val); - const isCSS = (val) => /\.css$/.test(val); + const isJS = (val: string) => /\.js$/.test(val); + const isCSS = (val: string) => /\.css$/.test(val); - const orderedAssets = assets - .map((a) => { + const orderedAssets: any[] = assets + .map((a: any) => { a.name = a.name.split('?')[0]; // These sizes are pretty large const isMainBundle = a.name.indexOf('fes.') === 0; @@ -122,20 +137,24 @@ export function printFileSizes(stats, dir) { suggested: isLarge && isJS(a.name), }; }) - .filter((a) => { + .filter((a: any) => { if (seenNames.has(a.name)) { return false; } seenNames.set(a.name, true); return isJS(a.name) || isCSS(a.name); }) - .sort((a, b) => { - if (isJS(a.name) && isCSS(b.name)) return -1; - if (isCSS(a.name) && isJS(b.name)) return 1; + .sort((a: any, b: any) => { + if (isJS(a.name) && isCSS(b.name)) { + return -1; + } + if (isCSS(a.name) && isJS(b.name)) { + return 1; + } return b.size - a.size; }); - function getGzippedSize(asset) { + function getGzippedSize(asset: any) { const filepath = resolve(join(dir, asset.name)); if (existsSync(filepath)) { const buffer = readFileSync(filepath); @@ -144,15 +163,15 @@ export function printFileSizes(stats, dir) { return filesize(0); } - function makeRow(a, b, c) { + function makeRow(a: string, b: string, c: string) { return ` ${a}\t ${b}\t ${c}`; } ui.div( `${makeRow(chalk.cyan.bold('File'), chalk.cyan.bold('Size'), chalk.cyan.bold('Gzipped'))}\n\n${orderedAssets - .map((asset) => + .map((asset: any) => makeRow( - /js$/.test(asset.name) + asset.name.endsWith('js') ? asset.suggested ? chalk.yellow(join(dir, asset.name)) : chalk.green(join(dir, asset.name)) @@ -164,13 +183,19 @@ export function printFileSizes(stats, dir) { .join('\n')}`, ); + // eslint-disable-next-line no-console console.log(`${ui.toString()}\n\n ${chalk.gray('Images and other types of assets omitted.')}\n`); - if (orderedAssets?.some((asset) => asset.suggested)) { + if (orderedAssets?.some((asset: any) => asset.suggested)) { + // eslint-disable-next-line no-console console.log(); + // eslint-disable-next-line no-console console.log(chalk.yellow('The bundle size is significantly larger than recommended.')); + // eslint-disable-next-line no-console console.log(chalk.yellow('Consider reducing it with code splitting')); + // eslint-disable-next-line no-console console.log(chalk.yellow('You can also analyze the project dependencies using ANALYZE=1')); + // eslint-disable-next-line no-console console.log(); } } diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/css.js b/packages/builder-webpack/src/plugins/common/webpackConfig/css.ts similarity index 58% rename from packages/fes-builder-webpack/src/plugins/common/webpackConfig/css.js rename to packages/builder-webpack/src/plugins/common/webpackConfig/css.ts index 10ff415c..e7d07d45 100644 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/css.js +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/css.ts @@ -1,33 +1,41 @@ -// css less post-css mini-css css 压缩 -// extraPostCSSPlugins -// postcssLoader -// lessLoader -// css-loader -// 支持 热加载 -// 性能优化 -// css 压缩 https://github.com/webpack-contrib/css-minimizer-webpack-plugin -// 根据 entry 进行代码块拆分 -// 根据 entry 将文件输出到不同的文件夹 +import type Config from 'webpack-5-chain'; +import type { WebpackBuildConfig } from '../../../shared'; import { deepmerge } from '@fesjs/utils'; +import { esmRequire, esmResolve } from '../../../shared'; -function createRules({ isDev, webpackConfig, config, lang, test, loader, options, browserslist, styleLoaderOption }) { - function applyLoaders(rule, cssLoaderOption = {}) { +interface CreateRulesOptions { + isDev: boolean; + webpackConfig: Config; + config: WebpackBuildConfig; + lang: string; + test: RegExp; + loader?: string; + options?: any; + browserslist: string[]; + styleLoaderOption?: any; +} + +interface ApplyLoadersOptions { + modules?: { + localIdentName: string; + }; +} + +function createRules({ isDev, webpackConfig, config, lang, test, loader, options, browserslist, styleLoaderOption }: CreateRulesOptions) { + function applyLoaders(rule: any, cssLoaderOption: ApplyLoadersOptions = {}) { if (isDev || !config.extraCSS) { - rule.use('extra-css-loader').loader(require.resolve('style-loader')).options(Object.assign({}, styleLoaderOption)); + rule.use('extra-css-loader').loader(esmResolve('style-loader')).options(Object.assign({}, styleLoaderOption)); } else { const loaderOptions = config.extraCSS?.loader ?? {}; - if (!loaderOptions.publicPath && config.publicPath.startsWith('./')) { - loaderOptions.publicPath = '../'; - } rule.use('extra-css-loader') - .loader(require('mini-css-extract-plugin').loader) + .loader(esmRequire('mini-css-extract-plugin').loader) .options(loaderOptions); } rule.use('css-loader') - .loader(require.resolve('css-loader')) + .loader(esmResolve('css-loader')) .options( deepmerge( { @@ -39,16 +47,16 @@ function createRules({ isDev, webpackConfig, config, lang, test, loader, options ); rule.use('postcss-loader') - .loader(require.resolve('postcss-loader')) + .loader(esmResolve('postcss-loader')) .options( deepmerge( { postcssOptions: () => ({ plugins: [ // https://github.com/luisrudge/postcss-flexbugs-fixes - require('postcss-flexbugs-fixes'), - require('postcss-safe-parser'), - [require('autoprefixer'), { ...config.autoprefixer, overrideBrowserslist: browserslist }], + esmRequire('postcss-flexbugs-fixes'), + esmRequire('postcss-safe-parser'), + [esmRequire('autoprefixer'), { overrideBrowserslist: browserslist }], ...(config.extraPostCSSPlugins ? config.extraPostCSSPlugins : []), ], }), @@ -58,7 +66,7 @@ function createRules({ isDev, webpackConfig, config, lang, test, loader, options ); if (loader) { - rule.use(loader).loader(require.resolve(loader)).options(options); + rule.use(loader).loader(esmResolve(loader)).options(options); } } @@ -71,7 +79,14 @@ function createRules({ isDev, webpackConfig, config, lang, test, loader, options applyLoaders(rule.oneOf('css')); } -export default function createCssWebpackConfig({ isDev, config, webpackConfig, browserslist }) { +interface CreateCssWebpackConfigOptions { + isDev: boolean; + config: WebpackBuildConfig; + webpackConfig: Config; + browserslist: string[]; +} + +export default function createCssWebpackConfig({ isDev, config, webpackConfig, browserslist }: CreateCssWebpackConfigOptions) { createRules({ isDev, webpackConfig, @@ -98,7 +113,7 @@ export default function createCssWebpackConfig({ isDev, config, webpackConfig, b }); if (!isDev && config.extraCSS) { - webpackConfig.plugin('extra-css').use(require.resolve('mini-css-extract-plugin'), [ + webpackConfig.plugin('extra-css').use(esmResolve('mini-css-extract-plugin'), [ Object.assign( { filename: 'static/[name].[contenthash:8].css', @@ -110,16 +125,16 @@ export default function createCssWebpackConfig({ isDev, config, webpackConfig, b } if (!isDev) { - webpackConfig.optimization.minimizer('css').use(require.resolve('css-minimizer-webpack-plugin'), [{}]); + webpackConfig.optimization.minimizer('css').use(esmResolve('css-minimizer-webpack-plugin'), [{}]); } - return (options) => { + return (options: Partial) => { createRules({ isDev, config, webpackConfig, browserslist, ...options, - }); + } as CreateRulesOptions); }; } diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/define.js b/packages/builder-webpack/src/plugins/common/webpackConfig/define.ts similarity index 52% rename from packages/fes-builder-webpack/src/plugins/common/webpackConfig/define.js rename to packages/builder-webpack/src/plugins/common/webpackConfig/define.ts index e48baf01..e4fdc712 100644 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/define.js +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/define.ts @@ -1,13 +1,21 @@ -import webpack from 'webpack'; +import type Config from 'webpack-5-chain'; +import type { WebpackBuildConfig } from '../../../shared'; import { resolveRuntimeEnv, stringifyObjValue } from '@fesjs/utils'; +import webpack from 'webpack'; -export default function createDefineWebpackConfig({ config, publicPath, webpackConfig }) { - const env = stringifyObjValue(resolveRuntimeEnv(publicPath)); +interface CreateDefineWebpackConfigOptions { + config: WebpackBuildConfig; + publicPath?: string; + webpackConfig: Config; +} + +export default function createDefineWebpackConfig({ config, publicPath, webpackConfig }: CreateDefineWebpackConfigOptions) { + const env = stringifyObjValue(resolveRuntimeEnv(publicPath || '')); const define = stringifyObjValue({ __VUE_OPTIONS_API__: true, __VUE_PROD_DEVTOOLS__: false, - ...config.define, + ...(config as any).define, }); webpackConfig.plugin('define').use(webpack.DefinePlugin, [ diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.js b/packages/builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.ts similarity index 54% rename from packages/fes-builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.js rename to packages/builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.ts index e0a115ec..87c66c1e 100644 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.js +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/getBabelOpts.ts @@ -1,14 +1,28 @@ +import type { WebpackBuildConfig } from '../../../shared'; +import process from 'node:process'; import { winPath } from '@fesjs/utils'; +import { esmRequire, esmResolve } from '../../../shared'; -function getBabelOpts({ cwd, targets, config, presetOpts }) { - const presets = [ +interface PresetOpts { + transformRuntime: Record; +} + +interface GetBabelOptsOptions { + cwd: string; + targets: Record; + config: WebpackBuildConfig; + presetOpts: PresetOpts; +} + +function getBabelOpts({ cwd, targets, config, presetOpts }: GetBabelOptsOptions) { + const presets: any[] = [ [ - require.resolve('@babel/preset-env'), + esmResolve('@babel/preset-env'), { targets, useBuiltIns: 'usage', corejs: { - version: require('core-js/package.json').version, + version: esmRequire('core-js/package.json').version, proposals: true, }, modules: false, @@ -16,7 +30,7 @@ function getBabelOpts({ cwd, targets, config, presetOpts }) { ], [ // FEATURE 实现类型安全检查 - require('@babel/preset-typescript').default, + esmRequire('@babel/preset-typescript').default, { // https://babeljs.io/docs/en/babel-plugin-transform-typescript#impartial-namespace-support allowNamespaces: true, @@ -26,24 +40,24 @@ function getBabelOpts({ cwd, targets, config, presetOpts }) { ], ...(config.extraBabelPresets || []), ]; - const plugins = [ - require('@babel/plugin-proposal-export-default-from').default, + const plugins: any[] = [ + esmRequire('@babel/plugin-proposal-export-default-from').default, [ - require('@babel/plugin-proposal-pipeline-operator').default, + esmRequire('@babel/plugin-proposal-pipeline-operator').default, { proposal: 'minimal', }, ], - require('@babel/plugin-proposal-do-expressions').default, - require('@babel/plugin-proposal-function-bind').default, + esmRequire('@babel/plugin-proposal-do-expressions').default, + esmRequire('@babel/plugin-proposal-function-bind').default, [ - require.resolve('@babel/plugin-transform-runtime'), + esmResolve('@babel/plugin-transform-runtime'), { useESModules: true, ...presetOpts.transformRuntime, }, ], - require.resolve('@vue/babel-plugin-jsx'), + esmResolve('@vue/babel-plugin-jsx'), ...(config.extraBabelPlugins || []), ]; return { @@ -61,8 +75,16 @@ function getBabelOpts({ cwd, targets, config, presetOpts }) { }; } -export default async ({ cwd, config, modifyBabelOpts, modifyBabelPresetOpts, targets }) => { - let presetOpts = { +interface ExportDefaultOptions { + cwd: string; + config: WebpackBuildConfig; + modifyBabelOpts?: (opts: any) => Promise; + modifyBabelPresetOpts?: (opts: PresetOpts) => Promise; + targets: Record; +} + +export default async ({ cwd, config, modifyBabelOpts, modifyBabelPresetOpts, targets }: ExportDefaultOptions) => { + let presetOpts: PresetOpts = { transformRuntime: {}, }; if (modifyBabelPresetOpts) { diff --git a/packages/builder-webpack/src/plugins/common/webpackConfig/html.ts b/packages/builder-webpack/src/plugins/common/webpackConfig/html.ts new file mode 100644 index 00000000..8ad7da46 --- /dev/null +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/html.ts @@ -0,0 +1,107 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { WebpackBuildConfig } from '../../../shared'; +import { existsSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { resolveRuntimeEnv, winPath } from '@fesjs/utils'; +import { esmResolve } from '../../../shared'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +interface CreateHtmlWebpackConfigOptions { + api: IPluginAPI; + cwd: string; + config: WebpackBuildConfig; + webpackConfig: any; + headScripts?: () => Promise>; + isProd: boolean; + publicPath?: string; +} + +interface Route { + path: string; + meta?: { + title?: string; + }; + children?: Route[]; +} + +export default async function createHtmlWebpackConfig({ api, cwd, config, webpackConfig, headScripts, isProd, publicPath }: CreateHtmlWebpackConfigOptions) { + const htmlOptions: any = { + filename: '[name].html', + ...config.html, + templateParameters: { + title: (api.config as any).title || config.html?.title || 'fes.js', + ...resolveRuntimeEnv(publicPath || ''), + mountElementId: (config as any).mountElementId, + }, + }; + + if (isProd) { + Object.assign(htmlOptions, { + minify: { + removeComments: true, + collapseWhitespace: true, + collapseBooleanAttributes: true, + removeScriptTypeAttributes: true, + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + }); + } + + const htmlPath = join(cwd, 'index.html'); + const defaultHtmlPath = join(__dirname, '../index-default.html'); + const publicCopyIgnore: string[] = []; + + // default, single page setup. + htmlOptions.template = existsSync(htmlPath) ? htmlPath : defaultHtmlPath; + + publicCopyIgnore.push(winPath(htmlOptions.template)); + + webpackConfig.plugin('html').use(esmResolve('html-webpack-plugin'), [htmlOptions]); + + // 如果需要导出html,则根据路由生成对应的html文件 + if ((config as any).exportStatic) { + const routes: Route[] = await (api as any).getRoutes(); + const addHtml = (_routes: Route[] | undefined) => { + if (Array.isArray(_routes)) { + _routes.forEach((route) => { + const _fileName = `${route.path.slice(1) || 'index'}.html`; + if (_fileName !== 'index.html') { + const _htmlOptions = { + ...config.html, + filename: _fileName, + templateParameters: { + title: route?.meta?.title || config.html?.title || (api.config as any).title || 'fes.js', + ...resolveRuntimeEnv(publicPath!), + mountElementId: (config as any).mountElementId, + }, + }; + webpackConfig.plugin(_fileName).use(esmResolve('html-webpack-plugin'), [_htmlOptions]); + } + if (route.children && route.children.length) { + addHtml(route.children); + } + }); + } + }; + addHtml(routes); + } + + if (headScripts) { + const headScriptsMap = await headScripts(); + webpackConfig.plugin('html-tags').use(esmResolve('html-webpack-tags-plugin'), [ + { + append: false, + scripts: headScriptsMap.map(script => ({ + path: script.src, + })), + }, + ]); + } + return { + publicCopyIgnore, + }; +} diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/index.js b/packages/builder-webpack/src/plugins/common/webpackConfig/index.ts similarity index 73% rename from packages/fes-builder-webpack/src/plugins/common/webpackConfig/index.js rename to packages/builder-webpack/src/plugins/common/webpackConfig/index.ts index 482e5133..8ae25537 100644 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/index.js +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/index.ts @@ -1,7 +1,12 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import type { WebpackBuildConfig } from '../../../shared'; import { existsSync } from 'node:fs'; +import { platform } from 'node:os'; import { join } from 'node:path'; import webpack from 'webpack'; import Config from 'webpack-5-chain'; +import pkg from '../../../../package.json' assert { type: 'json' }; +import { esmResolve } from '../../../shared'; import createCssWebpackConfig from './css'; import createDefineWebpackConfig from './define'; import getBabelOpts from './getBabelOpts'; @@ -22,32 +27,54 @@ const DEFAULT_EXCLUDE_NODE_MODULES = [ 'html-entities', ]; -function genTranspileDepRegex(exclude) { +function genTranspileDepRegex(exclude: (string | RegExp)[]) { exclude = exclude.concat(DEFAULT_EXCLUDE_NODE_MODULES); const deps = exclude.map((dep) => { if (typeof dep === 'string') { const depPath = join('node_modules', dep, '/'); - return require('node:os').platform().startsWith('win') ? depPath.replace(/\\/g, '\\\\') : depPath; + return platform().startsWith('win') ? depPath.replace(/\\/g, '\\\\') : depPath; + } + if (dep instanceof RegExp) { + return dep.source; } - if (dep instanceof RegExp) { return dep.source; } throw new Error('exclude only accepts an array of string or regular expressions'); }); return deps.length ? new RegExp(deps.join('|')) : null; } -function handleAlias({ api, webpackConfig }) { +interface HandleAliasOptions { + api: IPluginAPI; + webpackConfig: Config; +} + +function handleAlias({ api, webpackConfig }: HandleAliasOptions) { const config = api.config; if (config.alias) { Object.keys(config.alias).forEach((key) => { - webpackConfig.resolve.alias.set(key, config.alias[key]); + webpackConfig.resolve.alias.set(key, config.alias![key]); }); } webpackConfig.resolve.alias.set('@', api.paths.absSrcPath); webpackConfig.resolve.alias.set('@@', api.paths.absTmpPath); } -export default async function getConfig({ api, cwd, config, env, entry = {}, modifyBabelOpts, modifyBabelPresetOpts, chainWebpack, headScripts, publicPath }) { +interface GetConfigOptions { + api: IPluginAPI; + cwd: string; + config: IPluginAPI['config']; + env: 'development' | 'production'; + entry?: Record; + modifyBabelOpts?: (opts: any) => Promise; + modifyBabelPresetOpts?: (opts: any) => Promise; + chainWebpack?: (webpackConfig: Config, opts: any) => Promise; + headScripts?: () => Promise; + publicPath?: string; +} + +export default async function getConfig( + { api, cwd, config, env, entry = {}, modifyBabelOpts, modifyBabelPresetOpts, chainWebpack, headScripts, publicPath }: GetConfigOptions, +): Promise { const isDev = env === 'development'; const isProd = env === 'production'; const webpackConfig = new Config(); @@ -56,12 +83,15 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod webpackConfig.mode(env); webpackConfig.stats('errors-only'); webpackConfig.externals(config.externals || {}); - webpackConfig.devtool(isDev ? config.devtool || 'cheap-module-source-map' : config.devtool); + const devtool = isDev ? config.devtool || 'cheap-module-source-map' : config.devtool; + if (devtool) { + webpackConfig.devtool(devtool); + } // --------------- cache ----------- webpackConfig.cache({ type: 'filesystem', - version: require('../../../../package.json').version, + version: pkg.version, cacheDirectory: join(cwd, '.cache/webpack'), }); @@ -74,7 +104,7 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod // --------------- output ----------- webpackConfig.output .path(absoluteOutput) - .publicPath(publicPath) + .publicPath(publicPath || '') .filename('static/[name].[contenthash:8].js') .chunkFilename('static/[name].[contenthash:8].chunk.js') .assetModuleFilename('static/[name][hash:8][ext]'); @@ -131,21 +161,23 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod .rule('js') .test(/\.(js|mjs|jsx|ts|tsx)$/) .exclude - .add((filepath) => { + .add((filepath: string) => { // always transpile js in vue files - if (/(\.vue|\.jsx)$/.test(filepath)) { return false; } + if (/\.vue$|\.jsx$/.test(filepath)) { + return false; + } // Don't transpile node_modules return /node_modules/.test(filepath); }) .end() .use('babel-loader') - .loader(require.resolve('babel-loader')) + .loader(esmResolve('babel-loader')) .options(babelOpts); // 为了避免第三方依赖包编译不充分导致线上问题,默认对 node_modules 也进行全编译,只在生产构建的时候进行 if (isProd) { - const transpileDepRegex = genTranspileDepRegex(config.nodeModulesTransform.exclude); + const transpileDepRegex = genTranspileDepRegex(config.nodeModulesTransform?.exclude || []); webpackConfig.module .rule('js-in-node_modules') .test(/\.(js|mjs)$/) @@ -153,14 +185,16 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod .add(/node_modules/) .end() .exclude - .add((filepath) => { - if (transpileDepRegex && transpileDepRegex.test(filepath)) { return true; } + .add((filepath: string) => { + if (transpileDepRegex && transpileDepRegex.test(filepath)) { + return true; + } return false; }) .end() .use('babel-loader') - .loader(require.resolve('babel-loader')) + .loader(esmResolve('babel-loader')) .options(babelOpts); } @@ -190,22 +224,27 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod }); // --------------- copy ----------- + const copyFiles = Array.isArray(config.copy) ? config.copy : config.copy ? [config.copy] : []; const copyPatterns = [ existsSync(join(cwd, 'public')) && { from: join(cwd, 'public'), - filter: (resourcePath) => { - if (resourcePath.includes('.DS_Store')) { return false; } + filter: (resourcePath: string) => { + if (resourcePath.includes('.DS_Store')) { + return false; + } - if (publicCopyIgnore.includes(resourcePath)) { return false; } + if (publicCopyIgnore.includes(resourcePath)) { + return false; + } return true; }, to: absoluteOutput, }, - ...(config.copy || []).map((item) => { + ...copyFiles.map((item: any) => { if (typeof item === 'string') { return { - from: join(cwd, item.from), + from: join(cwd, item), to: absoluteOutput, }; } @@ -217,14 +256,14 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod ].filter(Boolean); // const publicCopyIgnore = ['.DS_Store']; if (copyPatterns.length) { - webpackConfig.plugin('copy').use(require.resolve('copy-webpack-plugin'), [ + webpackConfig.plugin('copy').use(esmResolve('copy-webpack-plugin'), [ { patterns: copyPatterns, }, ]); } - webpackConfig.plugin('progress').use(require.resolve(require.resolve('webpackbar'))); + webpackConfig.plugin('progress').use(esmResolve('webpackbar')); // --------------- define ----------- createDefineWebpackConfig({ @@ -282,7 +321,7 @@ export default async function getConfig({ api, cwd, config, env, entry = {}, mod }); } - const memo = webpackConfig.toConfig(); + const memo: webpack.Configuration = webpackConfig.toConfig(); memo.infrastructureLogging = { level: 'error', ...memo.infrastructureLogging, diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/minimizer.js b/packages/builder-webpack/src/plugins/common/webpackConfig/minimizer.ts similarity index 63% rename from packages/fes-builder-webpack/src/plugins/common/webpackConfig/minimizer.js rename to packages/builder-webpack/src/plugins/common/webpackConfig/minimizer.ts index 507b8c52..45aa8960 100644 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/minimizer.js +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/minimizer.ts @@ -1,4 +1,8 @@ +import type Config from 'webpack-5-chain'; +import type { WebpackBuildConfig } from '../../../shared'; +import process from 'node:process'; import { deepmerge } from '@fesjs/utils'; +import { esmResolve } from '../../../shared'; const defaultTerserOptions = { compress: { @@ -37,14 +41,22 @@ const defaultTerserOptions = { }, }; -const terserOptions = (config) => ({ - terserOptions: deepmerge(defaultTerserOptions, config.terserOptions || {}), - extractComments: false, -}); +function terserOptions(config: WebpackBuildConfig) { + return { + terserOptions: deepmerge(defaultTerserOptions, (config as any).terserOptions || {}), + extractComments: false, + }; +} -export default function createMinimizerWebpackConfig({ isProd, config, webpackConfig }) { +interface CreateMinimizerWebpackConfigOptions { + isProd: boolean; + config: WebpackBuildConfig; + webpackConfig: Config; +} + +export default function createMinimizerWebpackConfig({ isProd, config, webpackConfig }: CreateMinimizerWebpackConfigOptions) { if (isProd) { - webpackConfig.optimization.minimizer('terser').use(require.resolve('terser-webpack-plugin'), [terserOptions(config)]); + webpackConfig.optimization.minimizer('terser').use(esmResolve('terser-webpack-plugin'), [terserOptions(config)]); } if (process.env.FES_ENV === 'test') { webpackConfig.optimization.minimize(false); diff --git a/packages/builder-webpack/src/plugins/common/webpackConfig/vue.ts b/packages/builder-webpack/src/plugins/common/webpackConfig/vue.ts new file mode 100644 index 00000000..2af93560 --- /dev/null +++ b/packages/builder-webpack/src/plugins/common/webpackConfig/vue.ts @@ -0,0 +1,35 @@ +import type Config from 'webpack-5-chain'; +import type { WebpackBuildConfig } from '../../../shared'; +import { join } from 'node:path'; +import { esmRequire, esmResolve, OWNER_DIR } from '../../../shared'; + +interface CreateVueWebpackConfigOptions { + config: WebpackBuildConfig; + webpackConfig: Config; +} + +export default function createVueWebpackConfig({ config, webpackConfig }: CreateVueWebpackConfigOptions) { + webpackConfig.module + .rule('vue') + .test(/\.vue$/) + .use('vue-loader') + .loader(esmResolve('vue-loader')) + .options({ + babelParserPlugins: ['jsx', 'classProperties', 'decorators-legacy'], + ...(config as any).vueLoader || {}, + }) + .end(); + + webpackConfig.module + .rule('vue-custom') + .resourceQuery((query: string) => { + if (!query) { + return false; + } + return query.startsWith('?vue&type=custom'); + }) + .use('vue-custom-loader') + .loader(join(OWNER_DIR, './pitcher.mjs')); + + webpackConfig.plugin('vue-loader-plugin').use(esmRequire('vue-loader').VueLoaderPlugin); +} diff --git a/packages/fes-builder-webpack/src/plugins/features/analyze.js b/packages/builder-webpack/src/plugins/features/analyze.ts similarity index 74% rename from packages/fes-builder-webpack/src/plugins/features/analyze.js rename to packages/builder-webpack/src/plugins/features/analyze.ts index 2176dccb..12d8066f 100644 --- a/packages/fes-builder-webpack/src/plugins/features/analyze.js +++ b/packages/builder-webpack/src/plugins/features/analyze.ts @@ -1,4 +1,10 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; +import type Config from 'webpack-5-chain'; +import type { WebpackBuildConfig } from '../../shared'; +import process from 'node:process'; +import { esmRequire } from '../../shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'analyze', config: { @@ -29,8 +35,8 @@ export default (api) => { }, enableBy: () => !!process.env.ANALYZE, }); - api.chainWebpack((webpackConfig) => { - webpackConfig.plugin('bundle-analyzer').use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [api.config?.analyze || {}]); + (api as any).chainWebpack((webpackConfig: Config) => { + webpackConfig.plugin('bundle-analyzer').use(esmRequire('webpack-bundle-analyzer').BundleAnalyzerPlugin, [api.config?.analyze || {}]); return webpackConfig; }); }; diff --git a/packages/fes-builder-webpack/src/plugins/features/chainWebpack.js b/packages/builder-webpack/src/plugins/features/chainWebpack.ts similarity index 65% rename from packages/fes-builder-webpack/src/plugins/features/chainWebpack.js rename to packages/builder-webpack/src/plugins/features/chainWebpack.ts index d6580d98..2bd91742 100644 --- a/packages/fes-builder-webpack/src/plugins/features/chainWebpack.js +++ b/packages/builder-webpack/src/plugins/features/chainWebpack.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'chainWebpack', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/copy.js b/packages/builder-webpack/src/plugins/features/copy.ts similarity index 83% rename from packages/fes-builder-webpack/src/plugins/features/copy.js rename to packages/builder-webpack/src/plugins/features/copy.ts index e858da1d..a8d165d8 100644 --- a/packages/fes-builder-webpack/src/plugins/features/copy.js +++ b/packages/builder-webpack/src/plugins/features/copy.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'copy', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/cssLoader.js b/packages/builder-webpack/src/plugins/features/cssLoader.ts similarity index 91% rename from packages/fes-builder-webpack/src/plugins/features/cssLoader.js rename to packages/builder-webpack/src/plugins/features/cssLoader.ts index 8592a51f..a1e02c72 100644 --- a/packages/fes-builder-webpack/src/plugins/features/cssLoader.js +++ b/packages/builder-webpack/src/plugins/features/cssLoader.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'cssLoader', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/devServer.js b/packages/builder-webpack/src/plugins/features/devServer.ts similarity index 91% rename from packages/fes-builder-webpack/src/plugins/features/devServer.js rename to packages/builder-webpack/src/plugins/features/devServer.ts index 70efc553..7ca4a066 100644 --- a/packages/fes-builder-webpack/src/plugins/features/devServer.js +++ b/packages/builder-webpack/src/plugins/features/devServer.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'devServer', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/devtool.js b/packages/builder-webpack/src/plugins/features/devtool.ts similarity index 64% rename from packages/fes-builder-webpack/src/plugins/features/devtool.js rename to packages/builder-webpack/src/plugins/features/devtool.ts index 0f0006df..75e6d7fc 100644 --- a/packages/fes-builder-webpack/src/plugins/features/devtool.js +++ b/packages/builder-webpack/src/plugins/features/devtool.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'devtool', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/exportStatic.js b/packages/builder-webpack/src/plugins/features/exportStatic.ts similarity index 85% rename from packages/fes-builder-webpack/src/plugins/features/exportStatic.js rename to packages/builder-webpack/src/plugins/features/exportStatic.ts index a841bac8..dbea25d6 100644 --- a/packages/fes-builder-webpack/src/plugins/features/exportStatic.js +++ b/packages/builder-webpack/src/plugins/features/exportStatic.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'exportStatic', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/externals.js b/packages/builder-webpack/src/plugins/features/externals.ts similarity index 76% rename from packages/fes-builder-webpack/src/plugins/features/externals.js rename to packages/builder-webpack/src/plugins/features/externals.ts index c8c74186..c338cf4d 100644 --- a/packages/fes-builder-webpack/src/plugins/features/externals.js +++ b/packages/builder-webpack/src/plugins/features/externals.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'externals', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/extraBabelPlugins.js b/packages/builder-webpack/src/plugins/features/extraBabelPlugins.ts similarity index 65% rename from packages/fes-builder-webpack/src/plugins/features/extraBabelPlugins.js rename to packages/builder-webpack/src/plugins/features/extraBabelPlugins.ts index c70e294b..d907e98f 100644 --- a/packages/fes-builder-webpack/src/plugins/features/extraBabelPlugins.js +++ b/packages/builder-webpack/src/plugins/features/extraBabelPlugins.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'extraBabelPlugins', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/extraBabelPresets.js b/packages/builder-webpack/src/plugins/features/extraBabelPresets.ts similarity index 65% rename from packages/fes-builder-webpack/src/plugins/features/extraBabelPresets.js rename to packages/builder-webpack/src/plugins/features/extraBabelPresets.ts index 73e3aabc..d9348616 100644 --- a/packages/fes-builder-webpack/src/plugins/features/extraBabelPresets.js +++ b/packages/builder-webpack/src/plugins/features/extraBabelPresets.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'extraBabelPresets', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/extraCSS.js b/packages/builder-webpack/src/plugins/features/extraCSS.ts similarity index 76% rename from packages/fes-builder-webpack/src/plugins/features/extraCSS.js rename to packages/builder-webpack/src/plugins/features/extraCSS.ts index 5b1d1c56..f62b706b 100644 --- a/packages/fes-builder-webpack/src/plugins/features/extraCSS.js +++ b/packages/builder-webpack/src/plugins/features/extraCSS.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'extraCSS', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/extraPostCSSPlugins.js b/packages/builder-webpack/src/plugins/features/extraPostCSSPlugins.ts similarity index 66% rename from packages/fes-builder-webpack/src/plugins/features/extraPostCSSPlugins.js rename to packages/builder-webpack/src/plugins/features/extraPostCSSPlugins.ts index 96fe3d78..e96ad6f5 100644 --- a/packages/fes-builder-webpack/src/plugins/features/extraPostCSSPlugins.js +++ b/packages/builder-webpack/src/plugins/features/extraPostCSSPlugins.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'extraPostCSSPlugins', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/html.js b/packages/builder-webpack/src/plugins/features/html.ts similarity index 77% rename from packages/fes-builder-webpack/src/plugins/features/html.js rename to packages/builder-webpack/src/plugins/features/html.ts index db1113e0..96dd6b3b 100644 --- a/packages/fes-builder-webpack/src/plugins/features/html.js +++ b/packages/builder-webpack/src/plugins/features/html.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'html', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/lessLoader.js b/packages/builder-webpack/src/plugins/features/lessLoader.ts similarity index 68% rename from packages/fes-builder-webpack/src/plugins/features/lessLoader.js rename to packages/builder-webpack/src/plugins/features/lessLoader.ts index a1c08e8c..da2f5a24 100644 --- a/packages/fes-builder-webpack/src/plugins/features/lessLoader.js +++ b/packages/builder-webpack/src/plugins/features/lessLoader.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'lessLoader', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/nodeModulesTransform.js b/packages/builder-webpack/src/plugins/features/nodeModulesTransform.ts similarity index 78% rename from packages/fes-builder-webpack/src/plugins/features/nodeModulesTransform.js rename to packages/builder-webpack/src/plugins/features/nodeModulesTransform.ts index 404320c5..32e993cd 100644 --- a/packages/fes-builder-webpack/src/plugins/features/nodeModulesTransform.js +++ b/packages/builder-webpack/src/plugins/features/nodeModulesTransform.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'nodeModulesTransform', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/postcssLoader.js b/packages/builder-webpack/src/plugins/features/postcssLoader.ts similarity index 65% rename from packages/fes-builder-webpack/src/plugins/features/postcssLoader.js rename to packages/builder-webpack/src/plugins/features/postcssLoader.ts index 6a681cfe..f8a31377 100644 --- a/packages/fes-builder-webpack/src/plugins/features/postcssLoader.js +++ b/packages/builder-webpack/src/plugins/features/postcssLoader.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'postcssLoader', config: { diff --git a/packages/fes-builder-webpack/src/plugins/features/vueLoader.js b/packages/builder-webpack/src/plugins/features/vueLoader.ts similarity index 73% rename from packages/fes-builder-webpack/src/plugins/features/vueLoader.js rename to packages/builder-webpack/src/plugins/features/vueLoader.ts index 3f1d3524..325ccf3a 100644 --- a/packages/fes-builder-webpack/src/plugins/features/vueLoader.js +++ b/packages/builder-webpack/src/plugins/features/vueLoader.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { IPluginAPI } from '@fesjs/shared'; + +export default (api: IPluginAPI) => { api.describe({ key: 'vueLoader', config: { diff --git a/packages/builder-webpack/src/plugins/registerBuilder.ts b/packages/builder-webpack/src/plugins/registerBuilder.ts new file mode 100644 index 00000000..d2698d40 --- /dev/null +++ b/packages/builder-webpack/src/plugins/registerBuilder.ts @@ -0,0 +1,7 @@ +import type { IPluginAPI } from '@fesjs/shared'; + +export default function (api: IPluginAPI) { + api.registerBuilder({ + name: 'webpack', + }); +} diff --git a/packages/fes-builder-webpack/src/plugins/registerMethods.js b/packages/builder-webpack/src/plugins/registerMethods.ts similarity index 75% rename from packages/fes-builder-webpack/src/plugins/registerMethods.js rename to packages/builder-webpack/src/plugins/registerMethods.ts index 174ddc67..5c1a8147 100644 --- a/packages/fes-builder-webpack/src/plugins/registerMethods.js +++ b/packages/builder-webpack/src/plugins/registerMethods.ts @@ -1,4 +1,6 @@ -export default function (api) { +import type { IPluginAPI } from '@fesjs/shared'; + +export default function (api: IPluginAPI) { [ 'addHTMLHeadScripts', 'modifyBundleConfigOpts', diff --git a/packages/fes-builder-webpack/src/plugins/registerType.js b/packages/builder-webpack/src/plugins/registerType.ts similarity index 53% rename from packages/fes-builder-webpack/src/plugins/registerType.js rename to packages/builder-webpack/src/plugins/registerType.ts index 265efede..cd009a20 100644 --- a/packages/fes-builder-webpack/src/plugins/registerType.js +++ b/packages/builder-webpack/src/plugins/registerType.ts @@ -1,6 +1,7 @@ +import type { IPluginAPI } from '@fesjs/shared'; import { name } from '../../package.json'; -export default function (api) { +export default function (api: IPluginAPI) { api.addConfigType(() => ({ source: name, })); diff --git a/packages/builder-webpack/src/shared.ts b/packages/builder-webpack/src/shared.ts new file mode 100644 index 00000000..51777b8f --- /dev/null +++ b/packages/builder-webpack/src/shared.ts @@ -0,0 +1,72 @@ +import type HtmlWebpackPlugin from 'html-webpack-plugin'; +import type { LoaderOptions, PluginOptions } from 'mini-css-extract-plugin'; +import type Config from 'webpack-5-chain'; +import { createRequire } from 'node:module'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export interface CopyFileType { + from: string; + to: string; +} + +export const OWNER_DIR: string = join(dirname(fileURLToPath(import.meta.url)), '..'); + +export const esmRequire = createRequire(import.meta.url); + +export function esmResolve(specifier: string) { + const esmRequire = createRequire(import.meta.url); + return esmRequire.resolve(specifier); +} + +export interface WebpackBuildConfig { + analyze?: { + analyzerMode?: 'server' | 'static' | 'disabled'; + analyzerHost?: string; + analyzerPort?: number | 'auto'; + openAnalyzer?: boolean; + generateStatsFile?: boolean; + statsFilename?: string; + logLevel?: 'info' | 'warn' | 'error' | 'silent'; + defaultSizes?: 'stat' | 'parsed' | 'gzip'; + }; + chainWebpack?: (memo: Config, args: any) => void; + copy?: CopyFileType | CopyFileType[]; + cssLoader?: { + url?: boolean | ((url: string, resourcePath: string) => boolean); + import?: boolean | { filter: (url: string, media: string, resourcePath: string) => boolean }; + modules?: boolean | string | object; + sourceMap?: boolean; + importLoaders?: number; + onlyLocals?: boolean; + esModule?: boolean; + localsConvention?: 'asIs' | 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly'; + }; + devServer?: { + port?: number; + host?: string; + https?: boolean; + headers?: object; + [key: string]: any; + }; + devtool?: Config.DevTool; + exportStatic?: { + htmlSuffix?: boolean; + dynamicRoot?: boolean; + }; + externals?: string | ((data: any) => any); + extraBabelPlugins?: []; + extraBabelPresets?: []; + extraPostCSSPlugins?: []; + html?: HtmlWebpackPlugin.Options; + lessLoader?: Record; + nodeModulesTransform?: { + exclude: string[]; + }; + postcssLoader?: Record; + vueLoader?: object; + extraCSS?: { + loader?: LoaderOptions; + plugin?: PluginOptions; + }; +} diff --git a/packages/fes-builder-webpack/src/utils/generateExports.js b/packages/builder-webpack/src/utils/generateExports.ts similarity index 60% rename from packages/fes-builder-webpack/src/utils/generateExports.js rename to packages/builder-webpack/src/utils/generateExports.ts index c5c9fd6e..bf083e91 100644 --- a/packages/fes-builder-webpack/src/utils/generateExports.js +++ b/packages/builder-webpack/src/utils/generateExports.ts @@ -1,12 +1,30 @@ -import assert from 'assert'; -import path from 'path'; +import assert from 'node:assert'; +import path from 'node:path'; import { lodash, winPath } from '@fesjs/utils'; +interface SpecifierObject { + local: string; + exported: string; +} + +type Specifier = string | SpecifierObject; + +interface Item { + source: string; + exportAll?: boolean; + specifiers?: Specifier[]; +} + +interface GenerateExportsOptions { + item: Item; + fesExportsHook: Record; +} + const reserveLibrarys = ['fes']; // reserve library // todo 插件导出内容冲突问题待解决 const reserveExportsNames = ['Link', 'NavLink', 'Redirect', 'dynamic', 'withRouter', 'Route']; -export default function generateExports(basePath, { item, fesExportsHook }) { +export default function generateExports(basePath: string, { item, fesExportsHook }: GenerateExportsOptions): string { assert(item.source, 'source should be supplied.'); const source = path.relative(path.basename(basePath), item.source); assert(item.exportAll || item.specifiers, 'exportAll or specifiers should be supplied.'); @@ -14,8 +32,8 @@ export default function generateExports(basePath, { item, fesExportsHook }) { if (item.exportAll) { return `export * from '${winPath(source)}';`; } - assert(Array.isArray(item.specifiers), `specifiers should be Array, but got ${item.specifiers.toString()}.`); - const specifiersStrArr = item.specifiers.map((specifier) => { + assert(Array.isArray(item.specifiers), `specifiers should be Array, but got ${item.specifiers?.toString()}.`); + const specifiersStrArr = item.specifiers!.map((specifier) => { if (typeof specifier === 'string') { assert(!reserveExportsNames.includes(specifier), `${specifier} is reserve name, you can use 'exported' to set alias.`); assert(!fesExportsHook[specifier], `${specifier} is Defined, you can use 'exported' to set alias.`); @@ -23,8 +41,8 @@ export default function generateExports(basePath, { item, fesExportsHook }) { return specifier; } assert(lodash.isPlainObject(specifier), `Configure item context should be Plain Object, but got ${specifier}.`); - assert(specifier.local && specifier.exported, 'local and exported should be supplied.'); - return `${specifier.local} as ${specifier.exported}`; + assert((specifier as SpecifierObject).local && (specifier as SpecifierObject).exported, 'local and exported should be supplied.'); + return `${(specifier as SpecifierObject).local} as ${(specifier as SpecifierObject).exported}`; }); return `export { ${specifiersStrArr.join(', ')} } from '${winPath(source)}';`; } diff --git a/packages/builder-webpack/tsconfig.json b/packages/builder-webpack/tsconfig.json new file mode 100644 index 00000000..e4c560ab --- /dev/null +++ b/packages/builder-webpack/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": ["@fesjs/typescript-config/base.json"], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./build" + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} diff --git a/packages/builder-webpack/tsconfig.tsbuildinfo b/packages/builder-webpack/tsconfig.tsbuildinfo new file mode 100644 index 00000000..8d259ded --- /dev/null +++ b/packages/builder-webpack/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.9.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/index.ts","./src/shared.ts","../../node_modules/.pnpm/@babel+types@7.28.2/node_modules/@babel/types/lib/index.d.ts","../../node_modules/.pnpm/@types+babel__generator@7.27.0/node_modules/@types/babel__generator/index.d.ts","../../node_modules/.pnpm/@babel+parser@7.28.3/node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/.pnpm/@types+babel__traverse@7.28.0/node_modules/@types/babel__traverse/index.d.ts","../../node_modules/.pnpm/chalk@4.1.2/node_modules/chalk/index.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/client-stats.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.10.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.3.0/node_modules/@types/node/index.d.ts","../../node_modules/.pnpm/anymatch@3.1.3/node_modules/anymatch/index.d.ts","../../node_modules/.pnpm/chokidar@3.6.0/node_modules/chokidar/types/index.d.ts","../../node_modules/.pnpm/@types+ms@2.1.0/node_modules/@types/ms/index.d.ts","../../node_modules/.pnpm/@types+debug@4.1.12/node_modules/@types/debug/index.d.ts","../../node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/index.d.ts","../../node_modules/.pnpm/minipass@4.2.8/node_modules/minipass/index.d.ts","../../node_modules/.pnpm/lru-cache@10.4.3/node_modules/lru-cache/dist/esm/index.d.ts","../../node_modules/.pnpm/minipass@7.1.2/node_modules/minipass/dist/esm/index.d.ts","../../node_modules/.pnpm/path-scurry@1.11.1/node_modules/path-scurry/dist/esm/index.d.ts","../../node_modules/.pnpm/minimatch@8.0.4/node_modules/minimatch/dist/mjs/ast.d.ts","../../node_modules/.pnpm/minimatch@8.0.4/node_modules/minimatch/dist/mjs/escape.d.ts","../../node_modules/.pnpm/minimatch@8.0.4/node_modules/minimatch/dist/mjs/unescape.d.ts","../../node_modules/.pnpm/minimatch@8.0.4/node_modules/minimatch/dist/mjs/index.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/pattern.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/processor.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/walker.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/ignore.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/glob.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/has-magic.d.ts","../../node_modules/.pnpm/glob@9.3.5/node_modules/glob/dist/mjs/index.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/common.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/array.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/collection.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/date.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/function.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/lang.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/math.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/number.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/object.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/seq.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/string.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/common/util.d.ts","../../node_modules/.pnpm/@types+lodash@4.17.20/node_modules/@types/lodash/index.d.ts","../../node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/mjs/opts-arg.d.ts","../../node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts","../../node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts","../../node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/mjs/use-native.d.ts","../../node_modules/.pnpm/mkdirp@2.1.6/node_modules/mkdirp/dist/mjs/index.d.ts","../../node_modules/.pnpm/@types+mustache@4.2.6/node_modules/@types/mustache/index.d.ts","../../node_modules/.pnpm/@types+mustache@4.2.6/node_modules/@types/mustache/index.d.mts","../../node_modules/.pnpm/portfinder@1.0.37/node_modules/portfinder/lib/portfinder.d.ts","../../node_modules/.pnpm/@types+resolve@1.20.6/node_modules/@types/resolve/index.d.ts","../../node_modules/.pnpm/rimraf@4.4.1/node_modules/rimraf/dist/mjs/index.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/inc.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/classes/semver.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/parse.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/valid.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/clean.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/diff.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/major.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/minor.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/patch.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/compare.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/sort.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/gt.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/lt.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/eq.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/neq.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/gte.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/lte.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/classes/range.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/.pnpm/@types+semver@7.7.1/node_modules/@types/semver/index.d.ts","../../node_modules/.pnpm/@types+yargs-parser@21.0.3/node_modules/@types/yargs-parser/index.d.ts","../utils/dist/index.d.mts","../shared/src/types/config.ts","../shared/src/types/core.ts","../shared/src/types/plugin.ts","./src/plugins/registerbuilder.ts","./src/plugins/registermethods.ts","./package.json","./src/plugins/registertype.ts","../../node_modules/.pnpm/acorn@8.15.0/node_modules/acorn/dist/acorn.d.mts","../../node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts","../../node_modules/.pnpm/@types+eslint@9.6.1/node_modules/@types/eslint/use-at-your-own-risk.d.ts","../../node_modules/.pnpm/@types+eslint@9.6.1/node_modules/@types/eslint/index.d.ts","../../node_modules/.pnpm/@types+eslint-scope@3.7.7/node_modules/@types/eslint-scope/index.d.ts","../../node_modules/.pnpm/schema-utils@4.3.2/node_modules/schema-utils/declarations/validationerror.d.ts","../../node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/types/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/code.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/scope.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/codegen/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/rules.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/util.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/subschema.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/errors.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/validate/datatype.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/required.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/const.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/format/format.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/vocabularies/errors.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/types/json-schema.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/types/jtd-schema.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/runtime/validation_error.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/ref_error.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/core.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/resolve.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/compile/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/types/index.d.ts","../../node_modules/.pnpm/ajv@8.17.1/node_modules/ajv/dist/ajv.d.ts","../../node_modules/.pnpm/schema-utils@4.3.2/node_modules/schema-utils/declarations/validate.d.ts","../../node_modules/.pnpm/schema-utils@4.3.2/node_modules/schema-utils/declarations/index.d.ts","../../node_modules/.pnpm/tapable@2.2.3/node_modules/tapable/tapable.d.ts","../../node_modules/.pnpm/webpack@5.101.3_@swc+core@1.13.5_esbuild@0.25.9/node_modules/webpack/types.d.ts","./src/plugins/commands/build/build.ts","../shared/dist/index.d.mts","../../node_modules/.pnpm/cliui@8.0.1/node_modules/cliui/build/index.d.cts","../../node_modules/.pnpm/webpack-5-chain@8.0.2/node_modules/webpack-5-chain/types/index.d.ts","./src/plugins/common/webpackconfig/css.ts","./src/plugins/common/webpackconfig/define.ts","./src/plugins/common/webpackconfig/getbabelopts.ts","./src/plugins/common/webpackconfig/html.ts","./src/plugins/common/webpackconfig/minimizer.ts","./src/plugins/common/webpackconfig/vue.ts","./src/plugins/common/webpackconfig/index.ts","./src/plugins/common/builddevutils.ts","./src/plugins/commands/build/index.ts","../../node_modules/.pnpm/@types+mime@1.3.5/node_modules/@types/mime/index.d.ts","../../node_modules/.pnpm/@types+send@0.17.5/node_modules/@types/send/index.d.ts","../../node_modules/.pnpm/@types+qs@6.14.0/node_modules/@types/qs/index.d.ts","../../node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","../../node_modules/.pnpm/@types+express-serve-static-core@4.19.6/node_modules/@types/express-serve-static-core/index.d.ts","../../node_modules/.pnpm/@types+connect-history-api-fallback@1.5.4/node_modules/@types/connect-history-api-fallback/index.d.ts","./src/plugins/commands/dev/connecthistorymiddleware.ts","../../node_modules/.pnpm/@types+http-errors@2.0.5/node_modules/@types/http-errors/index.d.ts","../../node_modules/.pnpm/@types+serve-static@1.15.8/node_modules/@types/serve-static/index.d.ts","../../node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","../../node_modules/.pnpm/@types+body-parser@1.19.6/node_modules/@types/body-parser/index.d.ts","../../node_modules/.pnpm/@types+express@4.17.23/node_modules/@types/express/index.d.ts","../../node_modules/.pnpm/webpack-dev-middleware@7.4.2_webpack@5.101.3_@swc+core@1.13.5_esbuild@0.25.9_/node_modules/webpack-dev-middleware/types/utils/getfilenamefromurl.d.ts","../../node_modules/.pnpm/webpack-dev-middleware@7.4.2_webpack@5.101.3_@swc+core@1.13.5_esbuild@0.25.9_/node_modules/webpack-dev-middleware/types/index.d.ts","../../node_modules/.pnpm/bonjour-service@1.3.0/node_modules/bonjour-service/dist/lib/keyvalue.d.ts","../../node_modules/.pnpm/bonjour-service@1.3.0/node_modules/bonjour-service/dist/lib/service.d.ts","../../node_modules/.pnpm/bonjour-service@1.3.0/node_modules/bonjour-service/dist/lib/browser.d.ts","../../node_modules/.pnpm/bonjour-service@1.3.0/node_modules/bonjour-service/dist/index.d.ts","../../node_modules/.pnpm/@types+http-proxy@1.17.16/node_modules/@types/http-proxy/index.d.ts","../../node_modules/.pnpm/http-proxy-middleware@2.0.9_@types+express@4.17.23/node_modules/http-proxy-middleware/dist/types.d.ts","../../node_modules/.pnpm/http-proxy-middleware@2.0.9_@types+express@4.17.23/node_modules/http-proxy-middleware/dist/handlers/response-interceptor.d.ts","../../node_modules/.pnpm/http-proxy-middleware@2.0.9_@types+express@4.17.23/node_modules/http-proxy-middleware/dist/handlers/fix-request-body.d.ts","../../node_modules/.pnpm/http-proxy-middleware@2.0.9_@types+express@4.17.23/node_modules/http-proxy-middleware/dist/handlers/public.d.ts","../../node_modules/.pnpm/http-proxy-middleware@2.0.9_@types+express@4.17.23/node_modules/http-proxy-middleware/dist/handlers/index.d.ts","../../node_modules/.pnpm/http-proxy-middleware@2.0.9_@types+express@4.17.23/node_modules/http-proxy-middleware/dist/index.d.ts","../../node_modules/.pnpm/@types+serve-index@1.9.4/node_modules/@types/serve-index/index.d.ts","../../node_modules/.pnpm/ipaddr.js@2.2.0/node_modules/ipaddr.js/lib/ipaddr.js.d.ts","../../node_modules/.pnpm/open@10.2.0/node_modules/open/index.d.ts","../../node_modules/.pnpm/@types+ws@8.18.1/node_modules/@types/ws/index.d.mts","../../node_modules/.pnpm/@types+sockjs@0.3.36/node_modules/@types/sockjs/index.d.ts","../../node_modules/.pnpm/webpack-dev-server@5.2.2_webpack@5.101.3_@swc+core@1.13.5_esbuild@0.25.9_/node_modules/webpack-dev-server/types/lib/server.d.ts","./src/plugins/commands/dev/devserver.ts","../../node_modules/.pnpm/@types+jsonfile@6.1.4/node_modules/@types/jsonfile/index.d.ts","../../node_modules/.pnpm/@types+jsonfile@6.1.4/node_modules/@types/jsonfile/utils.d.ts","../../node_modules/.pnpm/@types+fs-extra@11.0.4/node_modules/@types/fs-extra/index.d.ts","../../node_modules/.pnpm/@types+fs-extra@11.0.4/node_modules/@types/fs-extra/esm.d.mts","../../node_modules/.pnpm/get-folder-size@5.0.0/node_modules/get-folder-size/index.d.ts","./src/plugins/commands/dev/index.ts","../../node_modules/.pnpm/cli-highlight@2.1.11/node_modules/cli-highlight/dist/theme.d.ts","../../node_modules/.pnpm/cli-highlight@2.1.11/node_modules/cli-highlight/dist/index.d.ts","./src/plugins/commands/webpack/index.ts","./src/plugins/common/webpackconfig/pitcher.ts","./src/plugins/features/analyze.ts","./src/plugins/features/chainwebpack.ts","./src/plugins/features/copy.ts","./src/plugins/features/cssloader.ts","./src/plugins/features/devserver.ts","./src/plugins/features/devtool.ts","./src/plugins/features/exportstatic.ts","./src/plugins/features/externals.ts","./src/plugins/features/extrababelplugins.ts","./src/plugins/features/extrababelpresets.ts","./src/plugins/features/extracss.ts","./src/plugins/features/extrapostcssplugins.ts","./src/plugins/features/html.ts","./src/plugins/features/lessloader.ts","./src/plugins/features/nodemodulestransform.ts","./src/plugins/features/postcssloader.ts","./src/plugins/features/vueloader.ts","./src/utils/generateexports.ts","../../node_modules/.pnpm/@types+babel__template@7.4.4/node_modules/@types/babel__template/index.d.ts","../../node_modules/.pnpm/@types+babel__core@7.20.5/node_modules/@types/babel__core/index.d.ts","../../node_modules/.pnpm/@types+bonjour@3.5.13/node_modules/@types/bonjour/index.d.ts","../../node_modules/.pnpm/@types+conventional-commits-parser@5.0.1/node_modules/@types/conventional-commits-parser/index.d.ts","../../node_modules/.pnpm/@types+graceful-fs@4.1.9/node_modules/@types/graceful-fs/index.d.ts","../../node_modules/.pnpm/@types+html-minifier-terser@6.1.0/node_modules/@types/html-minifier-terser/index.d.ts","../../node_modules/.pnpm/@types+istanbul-lib-coverage@2.0.6/node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/.pnpm/@types+istanbul-lib-report@3.0.3/node_modules/@types/istanbul-lib-report/index.d.ts","../../node_modules/.pnpm/@types+istanbul-reports@3.0.4/node_modules/@types/istanbul-reports/index.d.ts","../../node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","../../node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","../../node_modules/.pnpm/@types+minimist@1.2.5/node_modules/@types/minimist/index.d.ts","../../node_modules/.pnpm/@types+node-forge@1.3.14/node_modules/@types/node-forge/index.d.ts","../../node_modules/.pnpm/@types+normalize-package-data@2.4.4/node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/.pnpm/@types+retry@0.12.2/node_modules/@types/retry/index.d.ts","../../node_modules/.pnpm/@types+stack-utils@2.0.3/node_modules/@types/stack-utils/index.d.ts","../../node_modules/.pnpm/@types+strip-bom@3.0.0/node_modules/@types/strip-bom/index.d.ts","../../node_modules/.pnpm/@types+strip-json-comments@0.0.30/node_modules/@types/strip-json-comments/index.d.ts","../../node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/lib/index.d.ts","../../node_modules/.pnpm/@types+trusted-types@2.0.7/node_modules/@types/trusted-types/index.d.ts","../../node_modules/.pnpm/@types+web-bluetooth@0.0.20/node_modules/@types/web-bluetooth/index.d.ts","../../node_modules/.pnpm/@types+ws@8.18.1/node_modules/@types/ws/index.d.ts","../../node_modules/.pnpm/@types+yargs@17.0.33/node_modules/@types/yargs/index.d.ts"],"fileIdsList":[[84,91,137],[91,137],[84,85,86,87,91,137,409],[84,86,91,137],[91,137,152,187,358],[91,137,143,187],[91,137,180,187,353],[91,137,152,187],[91,137,169,187],[91,137,190],[91,137,281,284],[91,137,281,282,283],[91,137,284],[91,137,149,152,187,350,351,352],[91,137,351,353,357,359],[91,137,383],[91,137,150,187,381,382],[91,137,150,187],[91,137,149,152,154,157,169,180,187],[91,137,415],[91,137,416],[91,137,150,180,187],[91,137,208,210,211,212,213,214,215,216,217,218,219,220],[91,137,208,209,211,212,213,214,215,216,217,218,219,220],[91,137,209,210,211,212,213,214,215,216,217,218,219,220],[91,137,208,209,210,212,213,214,215,216,217,218,219,220],[91,137,208,209,210,211,213,214,215,216,217,218,219,220],[91,137,208,209,210,211,212,214,215,216,217,218,219,220],[91,137,208,209,210,211,212,213,215,216,217,218,219,220],[91,137,208,209,210,211,212,213,214,216,217,218,219,220],[91,137,208,209,210,211,212,213,214,215,217,218,219,220],[91,137,208,209,210,211,212,213,214,215,216,218,219,220],[91,137,208,209,210,211,212,213,214,215,216,217,219,220],[91,137,208,209,210,211,212,213,214,215,216,217,218,220],[91,137,208,209,210,211,212,213,214,215,216,217,218,219],[91,137,418],[91,137,226],[91,137,187],[91,134,137],[91,136,137],[137],[91,137,142,172],[91,137,138,143,149,157,169,180],[91,137,138,139,149,157],[91,137,140,181],[91,137,141,142,150,158],[91,137,142,169,177],[91,137,143,145,149,157],[91,136,137,144],[91,137,145,146],[91,137,147,149],[91,136,137,149],[91,137,149,150,151,169,180],[91,137,149,150,151,164,169,172],[91,132,137],[91,132,137,145,149,152,157,169,180],[91,137,149,150,152,153,157,169,177,180],[91,137,152,154,169,177,180],[89,90,91,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[91,137,149,155],[91,137,156,180],[91,137,145,149,157,169],[91,137,158],[91,137,159],[91,136,137,160],[91,134,135,136,137,138,139,140,141,142,143,144,145,146,147,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[91,137,162],[91,137,163],[91,137,149,164,165],[91,137,164,166,181,183],[91,137,149,169,170,172],[91,137,171,172],[91,137,169,170],[91,137,172],[91,137,173],[91,134,137,169,174],[91,137,149,175,176],[91,137,175,176],[91,137,142,157,169,177],[91,137,178],[91,137,157,179],[91,137,152,163,180],[91,137,142,181],[91,137,169,182],[91,137,156,183],[91,137,184],[91,137,149,151,160,169,172,180,182,183,185],[91,137,169,186],[91,137,232,270],[91,137,232,255,270],[91,137,231,270],[91,137,270],[91,137,232],[91,137,232,256,270],[91,137,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269],[91,137,256,270],[91,137,150,169,187,349],[91,137,150,360],[91,137,152,187,350,356],[91,137,427],[91,137,149,152,154,157,169,177,180,186,187],[91,137,271],[91,137,290,291,295,322,323,325,326,327,329,330],[91,137,288,289],[91,137,288],[91,137,290,330],[91,137,290,291,327,328,330],[91,137,330],[91,137,287,330,331],[91,137,290,291,329,330],[91,137,290,291,293,294,329,330],[91,137,290,291,292,329,330],[91,137,290,291,295,322,323,324,325,326,329,330],[91,137,287,290,291,295,327,329],[91,137,295,330],[91,137,297,298,299,300,301,302,303,304,305,306,330],[91,137,320,330],[91,137,296,307,315,316,317,318,319,321],[91,137,300,330],[91,137,308,309,310,311,312,313,314,330],[91,137,364,365],[91,137,149,363,364],[91,137,149,363],[91,137,149,150,187,188],[91,137,387],[91,137,187,193,196,200,201,204],[91,137,205],[91,137,196,200,203],[91,137,193,196,200,203,204,205,206],[91,137,187,200],[91,137,196,200,201,203],[91,137,187,193,196,201,202,204],[91,137,371],[91,137,369,370],[91,137,368,372],[91,137,152,157,180,187,360,367],[91,137,200],[91,137,197,198,199],[91,137,149,169,187],[91,137,149,173,187],[91,137,221,222,223,224],[91,137,221],[91,137,138],[91,137,150,159,187,194,195],[91,137,150,187,207],[91,137,332],[91,137,282,286,331],[91,137,282,332],[91,99,102,105,106,137,180],[91,102,137,169,180],[91,102,106,137,180],[91,137,169],[91,96,137],[91,100,137],[91,98,99,102,137,180],[91,137,157,177],[91,96,137,187],[91,98,102,137,157,180],[91,93,94,95,97,101,137,149,169,180],[91,102,110,137],[91,94,100,137],[91,102,126,127,137],[91,94,97,102,137,172,180,187],[91,102,137],[91,98,102,137,180],[91,93,137],[91,96,97,98,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,137],[91,102,119,122,137,145],[91,102,110,111,112,137],[91,100,102,111,113,137],[91,101,137],[91,94,96,102,137],[91,102,106,111,113,137],[91,106,137],[91,100,102,105,137,180],[91,94,98,102,110,137],[91,102,119,137],[91,96,102,126,137,172,185,187],[91,137,154,335],[91,137,150,152,332,335,361],[91,137,150,362],[91,137,152,154,157,158,177,189,332,335,353,354,357,360,362,366,373,374,375,376,377,378],[91,137,152,155,157,177,180,183,280,281,282,285,286,332,333,334],[91,137,159,180],[91,137,335],[91,137,150,159,161,336,337,347],[91,137,159,337,354],[91,137,272,335,379],[91,137,150,159,161,337,347,355,380,384,385],[91,137,140,337,347,388],[91,137,150,159,186,272,338,346],[83,91,137,272],[91,137,272,335],[91,137,150,159,180,272],[91,137,150,158,159,272,278,335,339,340,341,342,343,344,345],[91,137,161,272],[83,91,137,161,337],[91,137,275],[91,137,275,278],[91,137,156],[91,134,137,159,272],[91,137,272],[91,137,272,273,274],[85,86,87,88,91,137,189,191,192,207,220,225,227,228,229,230,270,271]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},"84124a24554b7d1bd5b28646bb8a79a80a18393aeebacdc78c5c18bb721dbc60","9ff4bb53d2d77d620bb3b2dbcfdfd33aa2315b8ca66f835fb4b6e1d89a86f892",{"version":"a28ac3e717907284b3910b8e9b3f9844a4e0b0a861bea7b923e5adf90f620330","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"82e5a50e17833a10eb091923b7e429dc846d42f1c6161eb6beeb964288d98a15","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"4bc0794175abedf989547e628949888c1085b1efcd93fc482bccd77ee27f8b7c","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","impliedFormat":1},{"version":"af13e99445f37022c730bfcafcdc1761e9382ce1ea02afb678e3130b01ce5676","impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","impliedFormat":1},{"version":"f4b4faedc57701ae727d78ba4a83e466a6e3bdcbe40efbf913b17e860642897c","affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6310806c6aa3154773976dd083a15659d294700d9ad8f6b8a2e10c3dc461ff1","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"db39d9a16e4ddcd8a8f2b7b3292b362cc5392f92ad7ccd76f00bccf6838ac7de","affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"622b67a408a881e15ab38043547563b9d29ca4b46f5b7a7e4a4fc3123d25d19f","impliedFormat":1},{"version":"2617f1d06b32c7b4dfd0a5c8bc7b5de69368ec56788c90f3d7f3e3d2f39f0253","impliedFormat":1},{"version":"bd8b644c5861b94926687618ec2c9e60ad054d334d6b7eb4517f23f53cb11f91","impliedFormat":1},{"version":"bcbabfaca3f6b8a76cb2739e57710daf70ab5c9479ab70f5351c9b4932abf6bd","impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","impliedFormat":1},{"version":"966dd0793b220e22344c944e0f15afafdc9b0c9201b6444ea0197cd176b96893","impliedFormat":1},{"version":"c54f0b30a787b3df16280f4675bd3d9d17bf983ae3cd40087409476bc50b922d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"5e9f8c1e042b0f598a9be018fc8c3cb670fe579e9f2e18e3388b63327544fe16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"e07c573ac1971ea89e2c56ff5fd096f6f7bba2e6dbcd5681d39257c8d954d4a8","impliedFormat":1},{"version":"363eedb495912790e867da6ff96e81bf792c8cfe386321e8163b71823a35719a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"dba28a419aec76ed864ef43e5f577a5c99a010c32e5949fe4e17a4d57c58dd11","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"07199a85560f473f37363d8f1300fac361cda2e954caf8a40221f83a6bfa7ade","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"c9231cf03fd7e8cfd78307eecbd24ff3f0fa55d0f6d1108c4003c124d168adc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2d5d50cd0667d9710d4d2f6e077cc4e0f9dc75e106cccaea59999b36873c5a0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","impliedFormat":1},{"version":"f8529fe0645fd9af7441191a4961497cc7638f75a777a56248eac6a079bb275d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4445f6ce6289c5b2220398138da23752fd84152c5c95bb8b58dedefc1758c036","impliedFormat":1},{"version":"a51f786b9f3c297668f8f322a6c58f85d84948ef69ade32069d5d63ec917221c","impliedFormat":1},{"version":"eac647a94fb1f09789e12dfecb52dcd678d05159a4796b4e415aa15892f3b103","impliedFormat":1},{"version":"0744807211f8cd16343fb1a796f53a8f7b7f95d4bd278c48febf657679bf28e6","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"146ba4b99c5feb82663e17a671bf9f53bb39c704cd76345d6c5a801c26372f44","impliedFormat":1},{"version":"58b63c0f3bfac04d639c31a9fe094089c0bdcc8cda7bc35f1f23828677aa7926","impliedFormat":1},{"version":"0838507efff4f479c6f603ec812810ddfe14ab32abf8f4a8def140be970fe439","impliedFormat":99},{"version":"4115aa147c5a64817fb55274b44087cbf1bc90f54906bfdfc9ee847a71cd91cf","impliedFormat":99},{"version":"2612d12378afc08cbddaffce6d2cdee3c8ee1d79a6c819a417b9f1d9cf99d323","impliedFormat":99},{"version":"97066cfd7010c2463bfcc2e7c0adc4bf2786ea682035f5a210c21f123ca42237","impliedFormat":99},{"version":"de0199a112f75809a7f80ec071495159dcf3e434bc021347e0175627398264c3","impliedFormat":99},{"version":"1a2bed55cfa62b4649485df27c0e560b04d4da4911e3a9f0475468721495563f","impliedFormat":99},{"version":"b36ccf17824e003356d64693eec1ce25ff4c33f3ec7fb10b4b7a642cbdf3a290","impliedFormat":99},{"version":"d392cdf58e0c7a988c3df400caa63a5c070c0bf13996ec619e3535e19e952a95","impliedFormat":99},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":99},{"version":"2cb450efa129dd4f087914624193554acdb17c37d1e2ed9ba005d2aeb0395413","impliedFormat":99},{"version":"50542cad26bd372cb942d418d42cdeced50a4d4226db390a1e3405f3d9a6103f","impliedFormat":99},{"version":"a9cfdb0638d2756aff94a5cb603fc412db52c74e628a0b12666bdb65e70fe3ad","impliedFormat":99},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":99},{"version":"99c838bd865c4564f6c732b500d50ce68396764d9b3e098251ad97cade902b75","impliedFormat":99},{"version":"380b919bfa0516118edaf25b99e45f855e7bc3fd75ce4163a1cfe4a666388804","impliedFormat":1},{"version":"0b24a72109c8dd1b41f94abfe1bb296ba01b3734b8ac632db2c48ffc5dccaf01","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"b88749bdb18fc1398370e33aa72bc4f88274118f4960e61ce26605f9b33c5ba2","impliedFormat":1},{"version":"0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"f5784612187dad5542233e5f1fb909d845bca88ef3c873f624befa8cdb83a8a6","impliedFormat":99},{"version":"0c144ea2d770452cf3b9fa26af04717685bd96666ed455cc7a6f3f6927fea853","impliedFormat":99},{"version":"5556cb5a70fbd19a0ec9b1f2bb07b03d75b09db16092cdfaff12bb1c2d61e664","impliedFormat":99},{"version":"dc0a2b1055da16b360301fd6fbb5c50a9069e14ff290442e281ff35c0a422c87","impliedFormat":99},{"version":"537f44e770e50d7af6d8f88dc5aee5737c1ad37f749a23e48b0fa6588b578da3","impliedFormat":99},{"version":"b58c81d4cc365d3986aee6c2a86592edc50f141b796899079196ffb103047390","impliedFormat":1},{"version":"361685e1b13e75583717b22dfec48705646a4a465fc8eaa4c14660ef321f722d","impliedFormat":99},{"version":"d16e9cc2bc378c37d000c828e2c480fe209eb48221979d929e02e979611e2d99","impliedFormat":1},{"version":"5aca5a3bc07d2e16b6824a76c30378d6fb1b92e915d854315e1d1bd2d00974c9","impliedFormat":1},{"version":"0641d09322387feb5fe77ec86eed6b40c152e831f37cb98d0dd78390762781ca","impliedFormat":99},{"version":"ce6a3f09b8db73a7e9701aca91a04b4fabaf77436dd35b24482f9ee816016b17","impliedFormat":1},{"version":"20e086e5b64fdd52396de67761cc0e94693494deadb731264aac122adf08de3f","impliedFormat":1},{"version":"6e78f75403b3ec65efb41c70d392aeda94360f11cedc9fb2c039c9ea23b30962","impliedFormat":1},{"version":"c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","impliedFormat":1},{"version":"8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","impliedFormat":1},{"version":"42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","impliedFormat":1},{"version":"ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","impliedFormat":1},{"version":"83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","impliedFormat":1},{"version":"1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","impliedFormat":1},{"version":"0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","impliedFormat":1},{"version":"cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","impliedFormat":1},{"version":"c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","impliedFormat":1},{"version":"eefd2bbc8edb14c3bd1246794e5c070a80f9b8f3730bd42efb80df3cc50b9039","impliedFormat":1},{"version":"0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","impliedFormat":1},{"version":"7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","impliedFormat":1},{"version":"bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","impliedFormat":1},{"version":"52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","impliedFormat":1},{"version":"770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","impliedFormat":1},{"version":"d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","impliedFormat":1},{"version":"799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","impliedFormat":1},{"version":"2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","impliedFormat":1},{"version":"9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","impliedFormat":1},{"version":"397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","impliedFormat":1},{"version":"a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","impliedFormat":1},{"version":"a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","impliedFormat":1},{"version":"c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","impliedFormat":1},{"version":"4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","impliedFormat":1},{"version":"f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","impliedFormat":1},{"version":"cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","impliedFormat":1},{"version":"b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","impliedFormat":1},{"version":"c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","impliedFormat":1},{"version":"14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","impliedFormat":1},{"version":"a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","impliedFormat":1},{"version":"f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","impliedFormat":1},{"version":"3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","impliedFormat":1},{"version":"662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","impliedFormat":1},{"version":"c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","impliedFormat":1},{"version":"2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","impliedFormat":1},{"version":"34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","impliedFormat":1},{"version":"a56fe175741cc8841835eb72e61fa5a34adcbc249ede0e3494c229f0750f6b85","impliedFormat":1},{"version":"bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","impliedFormat":1},{"version":"a24a9f3ee222365e48c35d40615ff1b0045a01c099cb6d1f6492a0447a0ab3ba","impliedFormat":99},"8212d65d3335a86819a624543c22067e37929411258db3328257faf1a8079ae9","19adfee0f797ce0b087415cd134e50577e7e8f1fe8d1ff034890fc46dde8bfaa","606758947df507bd9c6a76bfd7a00b2377b4e202f5a53355edb44c37e39278cb","08183a2ec2a9b69ef816802997142e43a49f25b724b8bdb7d7b907819e739ef4","09d799b0d53f3d74cbfeec7816c86996c4bed0f63d05ee4c12f613d2c538cd1c","01d62894f98641a8ff32606973387acb4298381dd39e9ea73fb2c7ef3354309a","6f175bcfb18238271b85cff04ff1a3c92af5cbdae719d10604ceaa8077578e83",{"version":"a4abbf5d5ecd7367532921a52e2a2762a6f5f38c3e4ad6c25e6e90152c403804","impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","impliedFormat":1},{"version":"bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","impliedFormat":1},{"version":"1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","impliedFormat":1},{"version":"dee5d387e2e6f3015cbf91fc0c13ed6f016f9c5c1f2ad9c62602f4fd398fa83a","impliedFormat":1},{"version":"84bcc7c6b06f4d643a55dc63b56be0c81d990f8d549b66ea615c553268774dc3","impliedFormat":1},{"version":"2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","impliedFormat":1},{"version":"6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","impliedFormat":1},{"version":"c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","impliedFormat":1},{"version":"2973b1b7857ca144251375b97f98474e9847a890331e27132d5a8b3aea9350a8","impliedFormat":1},{"version":"0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","impliedFormat":1},{"version":"237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","impliedFormat":1},{"version":"cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","impliedFormat":1},{"version":"58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","impliedFormat":1},{"version":"7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","impliedFormat":1},{"version":"a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","impliedFormat":1},{"version":"ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","impliedFormat":1},{"version":"8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","impliedFormat":1},{"version":"a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","impliedFormat":1},{"version":"8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","impliedFormat":1},{"version":"1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","impliedFormat":1},{"version":"5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","impliedFormat":1},{"version":"ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","impliedFormat":1},{"version":"6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","impliedFormat":1},{"version":"dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","impliedFormat":1},{"version":"eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","impliedFormat":1},{"version":"25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","impliedFormat":1},{"version":"62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","impliedFormat":1},{"version":"cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","impliedFormat":1},{"version":"4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","impliedFormat":1},{"version":"360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","impliedFormat":1},{"version":"1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","impliedFormat":1},{"version":"7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","impliedFormat":1},{"version":"b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","impliedFormat":1},{"version":"596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","impliedFormat":1},{"version":"adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","impliedFormat":1},{"version":"d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","impliedFormat":1},{"version":"d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","impliedFormat":1},{"version":"3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","impliedFormat":1},{"version":"423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","impliedFormat":1},{"version":"2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","impliedFormat":1},{"version":"feeb73d48cc41c6dd23d17473521b0af877751504c30c18dc84267c8eeea429a","impliedFormat":1},{"version":"25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","impliedFormat":1},{"version":"cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","impliedFormat":1},{"version":"3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","impliedFormat":1},{"version":"b83139ae818dd20f365118f9999335ca4cd84ae518348619adc5728e7e0372d5","impliedFormat":1},{"version":"e0205f04611bea8b5b82168065b8ef1476a8e96236201494eb8c785331c43118","impliedFormat":1},{"version":"62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","impliedFormat":1},{"version":"9941cbf7ca695e95d588f5f1692ab040b078d44a95d231fa9a8f828186b7b77d","impliedFormat":1},{"version":"41b8775befd7ded7245a627e9f4de6110236688ce4c124d2d40c37bc1a3bfe05","impliedFormat":1},{"version":"40b5e0aa8bd96bc2d6f903f3e58f8e8ea824d1f9fb0c8aa09316602c7b0147e8","impliedFormat":1},{"version":"c3fadf993ea46ea745996f8eac6b250722744c3613bde89246b560bef9a815e8","impliedFormat":1},{"version":"5dfcd3fd254102cdc241e8b27fa2b314924939a9cd7acefca10e33ef22ed799f","impliedFormat":1},{"version":"d7ac32ca3f51032907e7f070b478dc0d81a82a955d838a643428fe04a0898334","impliedFormat":1},"c934bffa09d9ccdff9993246c9bb4fcd049d72044554529da4470ab182115390",{"version":"486515bb46d6376b4c4df964bbae742e889aa1262a6cef94a40f2673cf967de8","impliedFormat":99},{"version":"385fceba2f49ee3f91cd436d3f84b389375e1e8f86906b23f47df2e1b9c2b17b","impliedFormat":1},{"version":"537f795b88c8f5e08ce0613ac58026f89cfbbfa69d470d826624d960383a62f7","impliedFormat":1},"501480693344e29a9e4230a7fd75c84c6340a4f5b0dde0dee5fbe6ae74c002f2","7f8deb6dabf836f2dcbf7405da87cb4d94caad5d27b249440abb6ac2055b371c","9b4c90bf7ad9d56e59bb78f3c2f2f16c7129fbcdac304862d572b57bd24dbb6b","a1dd01233f5939352c4d46d06b3d76f98fb1747dc41adaa07d9809cf8b825847","97ff34adc6f0df93fa978ccb7ce2b1db7517cb0ce4836c618ff535b3101ccdc9","793ccafa5b312833141a0f57484ec4e9f8ba1985e29925216db3e22009bd18c5","71987ba8bb1ae36da27320549fcd5e4bbe45932a91bd0e5be96a61d0fd22c170","08dc2083bee93d5fff5523caf8092a47d498d34599a1e5074a60337b8cb9a88f","3b42d3017e943c5d5b1b9d1a1d24b9ac230922d37bdb198858a616eb855a18a8",{"version":"d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","impliedFormat":1},{"version":"b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true,"impliedFormat":1},{"version":"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c","impliedFormat":1},"9eb1d17b446f0ae357b3f4063c2775094db5759ac8131baebaef93b3fbfc8e1b",{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","impliedFormat":1},{"version":"220f2fca1445ec822cc55fb9d8d203ff4598628c7c5a3812de2430df30288f1e","impliedFormat":1},{"version":"28f351ebc69897cefe60adad96e4cdf2639bbe6b9c39f00b64249d44eb134e18","impliedFormat":1},{"version":"743c8570cd33d1f7ea68f15b2d08c00aff25ba50fddea536a035480bbdb1b737","impliedFormat":1},{"version":"aa2239a3fec2f648d474d3cca05d12bab2f1446f9bd8adc2b487048245daf9d8","impliedFormat":1},{"version":"19b5a2f264f136f2d54227fa97481cfbaed57fe37e75699839396472471e867a","impliedFormat":1},{"version":"2cf4aa5376dbf24f140844d01f6c43bd183e0e0df692b6bae5457d84171fd966","impliedFormat":1},{"version":"63786b6f821dee19eb898afb385bd58f1846e6cba593a35edcf9631ace09ba25","impliedFormat":1},{"version":"43a4860173cec933ed8380e55f7a4473dd0df38b43e706b492f443cd8612bd87","impliedFormat":1},{"version":"f90d85d4cb38445499bdb7e7b013e4f64d99d157a6fa0843e998495ceb27b520","impliedFormat":1},{"version":"2e178a87e7bf03a067cfb1cf5573e7c4899fcbc9f462a0b0c67d238e39b794a4","impliedFormat":1},{"version":"901becb8779e1089442378fda5623e607ee4588762a32e7692436f1ea81cf848","impliedFormat":1},{"version":"8286d84d2567b713fd6a1fdfbb1a0abc8cfa668ee1e0e83d7dd4ade5761f2750","impliedFormat":1},{"version":"f28dffc6bf9bbd8b9dc156aadb74d11de7faabf547eb9f0aebb8cd03e8750a6c","impliedFormat":1},{"version":"ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","impliedFormat":1},{"version":"4f64ce354176bc42b9f9647ea28cd2452a798296fca13f281c634c32f1473e52","impliedFormat":1},{"version":"0132e7a32bd600a3b6e0a5e59171a3706df2d1375ffbf6b2239f326a9b0dbaaf","impliedFormat":99},{"version":"316f1486e15cbf7896425f0a16dfe12d447dd57cfb3244b8b119c77df870858f","impliedFormat":99},{"version":"1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","impliedFormat":1},{"version":"65c6c50007716da5a7304eb8e9bc41c078471f0a2242ebf235fa9e283cf68bfc","impliedFormat":1},"4276f7619b5fc5e5f88767a0cae0bc8b4db6471b9b965d16c3498dcf65f24199",{"version":"211440ce81e87b3491cdf07155881344b0a61566df6e749acff0be7e8b9d1a07","impliedFormat":1},{"version":"5d9a0b6e6be8dbb259f64037bce02f34692e8c1519f5cd5d467d7fa4490dced4","impliedFormat":1},{"version":"880da0e0f3ebca42f9bd1bc2d3e5e7df33f2619d85f18ee0ed4bd16d1800bc32","impliedFormat":1},{"version":"2d4de9f50939c496d60cb25b13180d87484aac704d728d20fbceba64a7e23b68","impliedFormat":99},{"version":"4d40684aacfe36c249dff08f86a75b61cce9c1477694cc8e58a52cb59f9b812f","impliedFormat":99},"1b243af9fff742380a81bb46a4de6d062698c23fa5cb7bd88b91e8ce6dc18298",{"version":"873cd666b86714a697e7c9688409fe8c75e6966fef37a4e5347ed2448e4f0b32","impliedFormat":1},{"version":"fa8895d1d2b9ddd9ffe85925c61574149a8d47b928bc93c76f6ac86c64f96be5","impliedFormat":1},"dba17572dd8ae1469445a4d5c173205c741bb9b2f7e4d52483f9e3b89d8bb2d7","8a73dd0ede856277cb5a917a0b7d3f7eb0a6c1e33829f53fec59f03f422e96f6","97ae96995f2299af1747c527645eb4a23e296236655ba2e9b757fca7a97dec8e","ff4760a016d36afbdabed78860fbcd30612196324b76c7a53353a7cb10584580","a51ca632d5fd0879bbc523a51280b80fb3b62d1638bb0794aa811605a9a4e9fc","40507caaef414f34c4f369e0d9dbaf30e829270a70ed4cf1baf1d604c8ce8cad","94b55388c5c6fc53fb4421b6540d5c884fa49925483ebd433cdddb578dd4fc83","495b24baefeeb6d917dad85137a4e66f782b1b616e1eb5c4862d25e2c7eaf819","2521a1838459c9a19f5d4de25c5600233bda780eb8149e8f7da9e651f6336aeb","914d73ea44be94c969d1cc9620d51be59753dcc65db99516f610d89728779737","a89f43af56dec09269b8980915f1f7424a826befa5d3760965768ece1837b928","1d320d2633b12959d084815091f7e5d799c9417017f9ebbb404793968962623d","a133fc1e8b15e29619f149bb30f42b2cd2420f17d4e5a170543b76ac70c079e6","421e71cc63ea932034b4b3c08fb38688178259ab7baeb88ecb587a297d7ebfe7","11e72785a6a2bcfcb23098c33c930855dc1abbf4e72ba5be5e4b672cbd296203","4bf708a93f92568f516d58ebb87c2c6170e8493ca9535a6f7203c74a759f4726","9aa04c108c630c39dcad9b371420e4e68e2c7c9caa0d241f85e9dd906dd288c6","61abc2aab0d9c4b9ddcf6ff8ee0fc1224d0f64449f7e98209a776191dfd3a025","13b784fa2d400fa616b670150bd2c5bbda87dba6033a97a71841cd2066bdbccc","41d5ead0d8da60f3713cacbd8ef51feb377e8ef94bbe168fc71308f719001149",{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","impliedFormat":1},{"version":"f96f3c445afc7d65d4790386e37c5b57f095f285cc89b8315b209fe0c81837c1","impliedFormat":1},{"version":"afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5","impliedFormat":1},{"version":"ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","impliedFormat":1},{"version":"035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","impliedFormat":1},{"version":"a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","impliedFormat":1},{"version":"5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","impliedFormat":1},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","impliedFormat":1},{"version":"7fadb2778688ebf3fd5b8d04f63d5bf27a43a3e420bc80732d3c6239067d1a4b","impliedFormat":1},{"version":"22293bd6fa12747929f8dfca3ec1684a3fe08638aa18023dd286ab337e88a592","impliedFormat":1},{"version":"510616459e6edd01acbce333fb256e06bdffdad43ca233a9090164bf8bb83912","impliedFormat":1},{"version":"ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","impliedFormat":1},{"version":"4006c872e38a2c4e09c593bc0cdd32b7b4f5c4843910bea0def631c483fff6c5","impliedFormat":1},{"version":"ab6aa3a65d473871ee093e3b7b71ed0f9c69e07d1d4295f45c9efd91a771241d","impliedFormat":1},{"version":"15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e","impliedFormat":1},{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"6451264601a58c77b5f347234485ce0ac09e9fafcc5228a3c60f5ccb3fc8524e","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1},{"version":"26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7","impliedFormat":1}],"root":[82,83,276,277,279,336,[340,348],355,380,386,[389,408]],"options":{"composite":true,"declaration":true,"declarationMap":true,"module":99,"newLine":1,"noEmitOnError":true,"noImplicitAny":false,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"target":99},"referencedMap":[[86,1],[84,2],[410,3],[85,1],[409,4],[87,1],[359,5],[411,6],[354,7],[358,8],[412,9],[191,10],[285,11],[284,12],[283,13],[281,2],[353,14],[360,15],[384,16],[383,17],[413,18],[414,2],[356,2],[367,19],[415,2],[416,20],[417,21],[282,2],[381,22],[382,2],[209,23],[210,24],[208,25],[211,26],[212,27],[213,28],[214,29],[215,30],[216,31],[217,32],[218,33],[219,34],[220,35],[419,36],[349,2],[420,2],[190,2],[227,37],[226,2],[421,38],[134,39],[135,39],[136,40],[91,41],[137,42],[138,43],[139,44],[89,2],[140,45],[141,46],[142,47],[143,48],[144,49],[145,50],[146,50],[148,2],[147,51],[149,52],[150,53],[151,54],[133,55],[90,2],[152,56],[153,57],[154,58],[187,59],[155,60],[156,61],[157,62],[158,63],[159,64],[160,65],[161,66],[162,67],[163,68],[164,69],[165,69],[166,70],[167,2],[168,2],[169,71],[171,72],[170,73],[172,74],[173,75],[174,76],[175,77],[176,78],[177,79],[178,80],[179,81],[180,82],[181,83],[182,84],[183,85],[184,86],[185,87],[186,88],[422,2],[351,2],[352,2],[229,2],[423,2],[255,89],[256,90],[232,91],[235,92],[253,89],[254,89],[244,89],[243,93],[241,89],[236,89],[249,89],[247,89],[251,89],[231,89],[248,89],[252,89],[237,89],[238,89],[250,89],[233,89],[239,89],[240,89],[242,89],[246,89],[257,94],[245,89],[234,89],[270,95],[269,2],[264,94],[266,96],[265,94],[258,94],[259,94],[261,94],[263,94],[267,96],[268,96],[260,96],[262,96],[350,97],[374,98],[357,99],[378,8],[424,2],[425,2],[426,2],[428,100],[427,2],[418,2],[429,2],[377,101],[430,101],[271,2],[431,102],[280,2],[331,103],[288,2],[290,104],[289,105],[294,106],[329,107],[326,108],[328,109],[291,108],[292,110],[296,110],[295,111],[293,112],[327,113],[325,108],[330,114],[323,2],[324,2],[297,115],[302,108],[304,108],[299,108],[300,115],[306,108],[307,116],[298,108],[303,108],[305,108],[301,108],[321,117],[320,108],[322,118],[316,108],[318,108],[317,108],[313,108],[319,119],[314,108],[315,120],[308,108],[309,108],[310,108],[311,108],[312,108],[188,2],[366,121],[365,122],[363,2],[364,123],[92,2],[88,2],[189,124],[388,125],[387,2],[338,2],[192,2],[287,2],[385,2],[205,126],[206,127],[204,128],[207,129],[201,130],[202,131],[203,132],[370,8],[372,133],[371,134],[369,8],[373,135],[368,136],[375,2],[194,2],[197,137],[198,137],[200,138],[199,137],[193,139],[195,140],[225,141],[222,142],[223,142],[221,18],[224,142],[376,143],[196,144],[228,2],[230,145],[333,146],[332,147],[286,148],[334,2],[80,2],[81,2],[13,2],[15,2],[14,2],[2,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[3,2],[24,2],[25,2],[4,2],[26,2],[30,2],[27,2],[28,2],[29,2],[31,2],[32,2],[33,2],[5,2],[34,2],[35,2],[36,2],[37,2],[6,2],[41,2],[38,2],[39,2],[40,2],[42,2],[7,2],[43,2],[48,2],[49,2],[44,2],[45,2],[46,2],[47,2],[8,2],[53,2],[50,2],[51,2],[52,2],[54,2],[9,2],[55,2],[56,2],[57,2],[59,2],[58,2],[60,2],[61,2],[10,2],[62,2],[63,2],[64,2],[11,2],[65,2],[66,2],[67,2],[68,2],[69,2],[1,2],[70,2],[71,2],[12,2],[75,2],[73,2],[78,2],[77,2],[72,2],[76,2],[74,2],[79,2],[110,149],[121,150],[108,151],[122,152],[131,153],[99,154],[100,155],[98,156],[130,38],[125,157],[129,158],[102,159],[118,160],[101,161],[128,162],[96,163],[97,157],[103,164],[104,2],[109,165],[107,164],[94,166],[132,167],[123,168],[113,169],[112,164],[114,170],[116,171],[111,172],[115,173],[126,38],[105,174],[106,175],[117,176],[95,152],[120,177],[119,164],[124,2],[93,2],[127,178],[339,179],[362,180],[361,181],[379,182],[335,183],[278,2],[82,184],[336,185],[348,186],[355,187],[380,188],[386,189],[389,190],[347,191],[340,192],[341,193],[342,192],[343,194],[346,195],[344,196],[390,2],[345,192],[391,197],[392,198],[393,2],[394,2],[395,2],[396,2],[397,2],[398,2],[399,2],[400,2],[401,2],[402,2],[403,198],[404,2],[405,2],[406,2],[407,2],[276,198],[277,198],[279,199],[83,200],[408,201],[337,202],[273,2],[274,2],[275,203],[272,204]],"semanticDiagnosticsPerFile":[[340,[{"start":2769,"length":128,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ isDev: any; webpackConfig: any; config: any; lang: string; test: RegExp; browserslist: any; }' is not assignable to parameter of type '{ isDev: any; webpackConfig: any; config: any; lang: any; test: any; loader: any; options: any; browserslist: any; styleLoaderOption: any; }'.","category":1,"code":2345,"next":[{"messageText":"Type '{ isDev: any; webpackConfig: any; config: any; lang: string; test: RegExp; browserslist: any; }' is missing the following properties from type '{ isDev: any; webpackConfig: any; config: any; lang: any; test: any; loader: any; options: any; browserslist: any; styleLoaderOption: any; }': loader, options, styleLoaderOption","category":1,"code":2739}]}},{"start":2917,"length":312,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ isDev: any; webpackConfig: any; config: any; lang: string; test: RegExp; loader: string; options: { lessOptions: any; }; browserslist: any; }' is not assignable to parameter of type '{ isDev: any; webpackConfig: any; config: any; lang: any; test: any; loader: any; options: any; browserslist: any; styleLoaderOption: any; }'.","category":1,"code":2345,"next":[{"messageText":"Property 'styleLoaderOption' is missing in type '{ isDev: any; webpackConfig: any; config: any; lang: string; test: RegExp; loader: string; options: { lessOptions: any; }; browserslist: any; }' but required in type '{ isDev: any; webpackConfig: any; config: any; lang: any; test: any; loader: any; options: any; browserslist: any; styleLoaderOption: any; }'.","category":1,"code":2741}]}}]],[343,[{"start":1418,"length":29,"code":2345,"category":1,"messageText":"Argument of type 'string' is not assignable to parameter of type 'never'."}]],[346,[{"start":6350,"length":12,"code":2345,"category":1,"messageText":"Argument of type 'any' is not assignable to parameter of type 'never'."},{"start":6628,"length":4,"code":2339,"category":1,"messageText":"Property 'from' does not exist on type 'string'."}]],[380,[{"start":1347,"length":8,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'Compiler | null' is not assignable to parameter of type 'Compiler | MultiCompiler'.","category":1,"code":2345,"next":[{"messageText":"Type 'null' is not assignable to type 'Compiler | MultiCompiler'.","category":1,"code":2322}]}}]],[386,[{"start":801,"length":4,"code":2339,"category":1,"messageText":"Property 'than' does not exist on type 'Promise'."}]],[390,[{"start":88,"length":4,"messageText":"'this' implicitly has type 'any' because it does not have a type annotation.","category":1,"code":2683,"relatedInformation":[{"start":54,"length":8,"messageText":"An outer value of 'this' is shadowed by this container.","category":3,"code":2738}]}]],[391,[{"start":1577,"length":12,"code":2339,"category":1,"messageText":"Property 'chainWebpack' does not exist on type 'IPluginAPI>'."}]]],"affectedFilesPendingEmit":[82,336,348,355,380,386,389,347,340,341,342,343,346,344,390,345,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,276,277,279,83,408],"emitSignatures":[82,83,276,277,279,336,340,341,342,343,344,345,346,347,348,355,380,386,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408],"version":"5.9.2"} \ No newline at end of file diff --git a/packages/builder-webpack/tsup.config.ts b/packages/builder-webpack/tsup.config.ts new file mode 100644 index 00000000..12d1e426 --- /dev/null +++ b/packages/builder-webpack/tsup.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: [ + 'src/index.ts', + 'src/plugins/commands/pitcher.ts', + 'src/plugins/registerBuilder.ts', + 'src/plugins/registerMethods.ts', + 'src/plugins/registerType.ts', + 'src/plugins/features/analyze.ts', + 'src/plugins/features/chainWebpack.ts', + 'src/plugins/features/cssLoader.ts', + 'src/plugins/features/copy.ts', + 'src/plugins/features/devServer.ts', + 'src/plugins/features/devtool.ts', + 'src/plugins/features/externals.ts', + 'src/plugins/features/exportStatic.ts', + 'src/plugins/features/extraBabelPlugins.ts', + 'src/plugins/features/extraBabelPresets.ts', + 'src/plugins/features/extraPostCSSPlugins.ts', + 'src/plugins/features/html.ts', + 'src/plugins/features/lessLoader.ts', + 'src/plugins/features/postcssLoader.ts', + 'src/plugins/features/nodeModulesTransform.ts', + 'src/plugins/features/vueLoader.ts', + 'src/plugins/features/extraCSS.ts', + 'src/plugins/commands/build/index.ts', + 'src/plugins/commands/dev/index.ts', + 'src/plugins/commands/webpack/index.ts', + ], + splitting: false, + sourcemap: false, + clean: true, + dts: true, + shims: true, + format: ['esm'], + onSuccess: 'cp -r src/plugins/commands/index-default.html dist/plugins/commands/index-default.html', +}); diff --git a/packages/builder-webpack/types.d.ts b/packages/builder-webpack/types.d.ts new file mode 100644 index 00000000..26d13745 --- /dev/null +++ b/packages/builder-webpack/types.d.ts @@ -0,0 +1,6 @@ +// eslint-disable-next-line antfu/no-import-dist +import type { WebpackBuildConfig } from './dist/index.d.mts'; + +declare module '@fesjs/fes' { + interface PluginBuildConfig extends WebpackBuildConfig {} +} diff --git a/packages/fes-compiler/LICENSE b/packages/compiler/LICENSE similarity index 100% rename from packages/fes-compiler/LICENSE rename to packages/compiler/LICENSE diff --git a/packages/fes-compiler/README.md b/packages/compiler/README.md similarity index 91% rename from packages/fes-compiler/README.md rename to packages/compiler/README.md index 8bf21091..31564991 100644 --- a/packages/fes-compiler/README.md +++ b/packages/compiler/README.md @@ -35,16 +35,13 @@ Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到 | [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | | [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | | [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | | [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | | [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | | [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | | [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | | [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | | [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | | [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | | [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | | [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | diff --git a/packages/fes-compiler/package.json b/packages/compiler/package.json similarity index 57% rename from packages/fes-compiler/package.json rename to packages/compiler/package.json index 3f44a70e..5a1ef565 100644 --- a/packages/fes-compiler/package.json +++ b/packages/compiler/package.json @@ -8,7 +8,7 @@ "repository": { "type": "git", "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-compiler" + "directory": "packages/compiler" }, "bugs": { "url": "https://github.com/WeBankFinTech/fes.js/issues" @@ -16,21 +16,31 @@ "keywords": [ "fes" ], - "main": "lib/index.js", + "main": "./dist/index.mjs", + "module": "./dist/index.mjs", + "types": "dist/index.d.mts", "files": [ - "lib" + "dist" ], + "scripts": { + "dev": "tsup --watch --sourcemap", + "build": "tsup" + }, "publishConfig": { "access": "public" }, "dependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/register": "^7.22.15", - "@fesjs/utils": "^3.0.3", + "@babel/core": "^7.28.3", + "@babel/preset-env": "^7.28.3", + "@fesjs/utils": "workspace:*", "commander": "^7.0.0", "dotenv": "8.2.0", + "fs-extra": "^11.3.1", "joi": "17.3.0", + "package-up": "^5.0.0", "tapable": "^2.2.0" + }, + "devDependencies": { + "@types/fs-extra": "^11.0.4" } } diff --git a/packages/fes-compiler/src/config/index.js b/packages/compiler/src/config/index.ts similarity index 61% rename from packages/fes-compiler/src/config/index.js rename to packages/compiler/src/config/index.ts index 55067a7a..89175eb8 100644 --- a/packages/fes-compiler/src/config/index.js +++ b/packages/compiler/src/config/index.ts @@ -1,71 +1,91 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/tree/master/packages/core - */ - -import { existsSync } from 'fs'; -import { extname, join } from 'path'; -import assert from 'assert'; -import { chalk, chokidar, compatESModuleRequire, deepmerge, cleanRequireCache, lodash, parseRequireDeps, winPath } from '@fesjs/utils'; +import type { ServiceInstance, UserConfig } from '../types'; +import assert from 'node:assert'; +import { existsSync } from 'node:fs'; +import { extname, join } from 'node:path'; +import process from 'node:process'; +import { chalk, chokidar, compatESModuleRequire, deepmerge, lodash, winPath } from '@fesjs/utils'; import joi from 'joi'; import { ServiceStage } from '../service/enums'; import { getUserConfigWithKey, updateUserConfigWithKey } from './utils/configUtils'; import isEqual from './utils/isEqual'; import mergeDefault from './utils/mergeDefault'; -const CONFIG_FILES = ['.fes.js']; +interface ConfigOptions { + cwd?: string; + service: ServiceInstance; + localConfig?: boolean; +} + +interface WatchOptions { + userConfig: UserConfig; + onChange: (params: { + userConfig: UserConfig; + pluginChanged: Array<{ key: string; pluginId: string }>; + valueChanged: Array<{ key: string; pluginId: string }>; + }) => void; +} + +const CONFIG_FILES: string[] = ['.fes.js']; export default class Config { - cwd; + cwd: string; - service; + service: ServiceInstance; - config; + config: any; - localConfig; + localConfig: boolean; - configFile; + configFile: string[]; - constructor(opts) { + constructor(opts: ConfigOptions) { this.cwd = opts.cwd || process.cwd(); this.service = opts.service; - this.localConfig = opts.localConfig; + this.localConfig = opts.localConfig || false; + this.configFile = []; + this.config = null; } - async getDefaultConfig() { + async getDefaultConfig(): Promise> { const pluginIds = Object.keys(this.service.plugins); // collect default config - const defaultConfig = pluginIds.reduce((memo, pluginId) => { + const defaultConfig = pluginIds.reduce((memo: Record, pluginId: string) => { const { key, config = {} } = this.service.plugins[pluginId]; - if ('default' in config) memo[key] = config.default; + if ('default' in config) { + memo[key] = config.default; + } return memo; }, {}); return defaultConfig; } - getConfig({ defaultConfig }) { + async getConfig(defaultConfig: Record): Promise { assert(this.service.stage >= ServiceStage.pluginReady, 'Config.getConfig() failed, it should not be executed before plugin is ready.'); - const userConfig = this.getUserConfig(); + const userConfig = await this.getUserConfig(); // 用于提示用户哪些 key 是未定义的 // TODO: 考虑不排除 false 的 key - const userConfigKeys = Object.keys(userConfig).filter((key) => userConfig[key] !== false); + const userConfigKeys = Object.keys(userConfig).filter(key => userConfig[key] !== false); // get config const pluginIds = Object.keys(this.service.plugins); - pluginIds.forEach((pluginId) => { + pluginIds.forEach((pluginId: string) => { const { key, config = {} } = this.service.plugins[pluginId]; // recognize as key if have schema config - if (!config.schema) return; + if (!config.schema) { + return; + } const value = getUserConfigWithKey({ key, userConfig, }); // 不校验 false 的值,此时已禁用插件 - if (value === false) return; + if (value === false) { + return; + } // do validate const schema = config.schema(joi); @@ -105,39 +125,28 @@ export default class Config { return userConfig; } - getUserConfig() { + async getUserConfig(): Promise { const configFile = this.getConfigFile(); this.configFile = configFile; if (configFile.length > 0) { - // clear require cache and set babel register - const requireDeps = configFile.reduce((memo, file) => { - memo = memo.concat(parseRequireDeps(file)); - return memo; - }, []); - requireDeps.forEach(cleanRequireCache); - this.service.babelRegister.setOnlyMap({ - key: 'config', - value: requireDeps, - }); - - // require config and merge - return this.mergeConfig(...this.requireConfigs(configFile)); + const configs = await this.requireConfigs(configFile); + return this.mergeConfig(configs); } return {}; } - addAffix(file, affix) { + addAffix(file: string, affix: string): string { const ext = extname(file); return file.replace(new RegExp(`${ext}$`), `.${affix}${ext}`); } - requireConfigs(configFiles) { - // eslint-disable-next-line - return configFiles.map((f) => compatESModuleRequire(require(f))); + async requireConfigs(configFiles: string[]): Promise { + const models = await Promise.all(configFiles.map(f => import(f))); + return models.map(m => compatESModuleRequire(m)); } - mergeConfig(...configs) { - let ret = {}; + mergeConfig(configs: any[]): UserConfig { + let ret: UserConfig = {}; for (const config of configs) { // TODO: 精细化处理,比如处理 dotted config key ret = deepmerge(ret, config); @@ -145,12 +154,14 @@ export default class Config { return ret; } - getConfigFile() { + getConfigFile(): string[] { // TODO: support custom config file - let configFile = CONFIG_FILES.find((f) => existsSync(join(this.cwd, f))); - if (!configFile) return []; + let configFile = CONFIG_FILES.find(f => existsSync(join(this.cwd, f))); + if (!configFile) { + return []; + } configFile = winPath(configFile); - let envConfigFile; + let envConfigFile: string | undefined; // 潜在问题: // .local 和 .env 的配置必须有 configFile 才有效 if (process.env.FES_ENV) { @@ -160,45 +171,46 @@ export default class Config { } } const files = [configFile, envConfigFile, this.localConfig && this.addAffix(configFile, 'local')] - .filter((f) => !!f) - .map((f) => join(this.cwd, f)) - .filter((f) => existsSync(f)); - return files; + .filter(f => !!f) + .map(f => join(this.cwd, f as string)) + .filter(f => existsSync(f)); + return files as string[]; } - getWatchFilesAndDirectories() { + getWatchFilesAndDirectories(): string[] { const fesEnv = process.env.FES_ENV; const configFiles = lodash.clone(CONFIG_FILES); CONFIG_FILES.forEach((f) => { - if (this.localConfig) configFiles.push(this.addAffix(f, 'local')); - if (fesEnv) configFiles.push(this.addAffix(f, fesEnv)); + if (this.localConfig) { + configFiles.push(this.addAffix(f, 'local')); + } + if (fesEnv) { + configFiles.push(this.addAffix(f, fesEnv as string)); + } }); const configDir = winPath(join(this.cwd, 'config')); const files = configFiles - .reduce((memo, f) => { + .reduce((memo: string[], f: string) => { const file = winPath(join(this.cwd, f)); - if (existsSync(file)) { - memo = memo.concat(parseRequireDeps(file)); - } else { - memo.push(file); - } + memo.push(file); return memo; }, []) - .filter((f) => !f.startsWith(configDir)); + .filter(f => !f.startsWith(configDir)); return [configDir].concat(files); } - watch(opts) { + watch(opts: WatchOptions): () => void { let paths = this.getWatchFilesAndDirectories(); let userConfig = opts.userConfig; const watcher = chokidar.watch(paths, { ignoreInitial: true, cwd: this.cwd, }); - watcher.on('all', (event, path) => { + watcher.on('all', async (event, path) => { + // eslint-disable-next-line no-console console.log(chalk.green(`[${event}] ${path}`)); const newPaths = this.getWatchFilesAndDirectories(); const diffs = lodash.difference(newPaths, paths); @@ -207,13 +219,15 @@ export default class Config { paths = paths.concat(diffs); } - const newUserConfig = this.getUserConfig(); - const pluginChanged = []; - const valueChanged = []; - Object.keys(this.service.plugins).forEach((pluginId) => { + const newUserConfig = await this.getUserConfig(); + const pluginChanged: Array<{ key: string; pluginId: string }> = []; + const valueChanged: Array<{ key: string; pluginId: string }> = []; + Object.keys(this.service.plugins).forEach((pluginId: string) => { const { key, config = {} } = this.service.plugins[pluginId]; // recognize as key if have schema config - if (!config.schema) return; + if (!config.schema) { + return; + } if (!isEqual(newUserConfig[key], userConfig[key])) { const changed = { key, @@ -221,7 +235,8 @@ export default class Config { }; if (newUserConfig[key] === false || userConfig[key] === false) { pluginChanged.push(changed); - } else { + } + else { valueChanged.push(changed); } } diff --git a/packages/compiler/src/config/utils/configUtils.ts b/packages/compiler/src/config/utils/configUtils.ts new file mode 100644 index 00000000..d649ad75 --- /dev/null +++ b/packages/compiler/src/config/utils/configUtils.ts @@ -0,0 +1,28 @@ +import type { UserConfig } from '../../types'; +import { lodash } from '@fesjs/utils'; + +interface UpdateUserConfigWithKeyOptions { + key: string; + value: any; + userConfig: UserConfig; +} + +interface GetUserConfigWithKeyOptions { + key: string; + userConfig: UserConfig; +} + +export function updateUserConfigWithKey({ + key, + value, + userConfig, +}: UpdateUserConfigWithKeyOptions): void { + lodash.set(userConfig, key, value); +} + +export function getUserConfigWithKey({ + key, + userConfig, +}: GetUserConfigWithKeyOptions): any { + return lodash.get(userConfig, key); +} diff --git a/packages/compiler/src/config/utils/isEqual.ts b/packages/compiler/src/config/utils/isEqual.ts new file mode 100644 index 00000000..94147aba --- /dev/null +++ b/packages/compiler/src/config/utils/isEqual.ts @@ -0,0 +1,18 @@ +import { lodash } from '@fesjs/utils'; + +function funcToStr(obj: any): any { + if (typeof obj === 'function') { + return obj.toString(); + } + if (lodash.isPlainObject(obj)) { + return Object.keys(obj).reduce((memo: Record, key: string) => { + memo[key] = funcToStr(obj[key]); + return memo; + }, {}); + } + return obj; +} + +export default function isEqual(a: any, b: any): boolean { + return lodash.isEqual(funcToStr(a), funcToStr(b)); +} diff --git a/packages/fes-compiler/src/config/utils/mergeDefault.js b/packages/compiler/src/config/utils/mergeDefault.ts similarity index 59% rename from packages/fes-compiler/src/config/utils/mergeDefault.js rename to packages/compiler/src/config/utils/mergeDefault.ts index 3b8bbd1a..56f6a9d7 100644 --- a/packages/fes-compiler/src/config/utils/mergeDefault.js +++ b/packages/compiler/src/config/utils/mergeDefault.ts @@ -1,8 +1,13 @@ import { deepmerge, lodash } from '@fesjs/utils'; -export default ({ defaultConfig, config }) => { +interface MergeDefaultOptions { + defaultConfig: any; + config: any; +} + +export default function mergeDefault({ defaultConfig, config }: MergeDefaultOptions): any { if (lodash.isPlainObject(defaultConfig) && lodash.isPlainObject(config)) { return deepmerge(defaultConfig, config); } return typeof config !== 'undefined' ? config : defaultConfig; -}; +} diff --git a/packages/compiler/src/index.ts b/packages/compiler/src/index.ts new file mode 100644 index 00000000..f344c910 --- /dev/null +++ b/packages/compiler/src/index.ts @@ -0,0 +1,12 @@ +import Config from './config'; +import Service from './service'; +import { PluginType } from './service/enums'; +import { isPluginOrPreset } from './service/utils/pluginUtils'; + +export { Config, isPluginOrPreset, PluginType, Service }; + +export type { + ConfigInstance, + PluginAPIInstance, + ServiceInstance, +} from './types'; diff --git a/packages/compiler/src/service/enums.ts b/packages/compiler/src/service/enums.ts new file mode 100644 index 00000000..64fc5aec --- /dev/null +++ b/packages/compiler/src/service/enums.ts @@ -0,0 +1,49 @@ +/** + * 插件类型枚举 + */ +export enum PluginType { + preset = 'preset', + plugin = 'plugin', + builder = 'builder', +} + +/** + * 服务阶段枚举 + */ +export enum ServiceStage { + uninitialized = 0, + constructor = 1, + init = 2, + initPresets = 3, + initPlugins = 4, + initHooks = 5, + pluginReady = 6, + getConfig = 7, + getPaths = 8, + run = 9, +} + +/** + * 配置变更类型枚举 + */ +export enum ConfigChangeType { + reload = 'reload', + regenerateTmpFiles = 'regenerateTmpFiles', +} + +/** + * 应用插件类型枚举 + */ +export enum ApplyPluginsType { + add = 'add', + modify = 'modify', + event = 'event', +} + +/** + * 启用方式枚举 + */ +export enum EnableBy { + register = 'register', + config = 'config', +} diff --git a/packages/compiler/src/service/getPaths.ts b/packages/compiler/src/service/getPaths.ts new file mode 100644 index 00000000..367f83e8 --- /dev/null +++ b/packages/compiler/src/service/getPaths.ts @@ -0,0 +1,39 @@ +import type { Paths, UserConfig } from '../types'; +import { existsSync, statSync } from 'node:fs'; +import { join } from 'node:path'; +import { lodash, winPath } from '@fesjs/utils'; + +interface GetServicePathsOptions { + cwd: string; + config: UserConfig; + env: string; +} + +function isDirectoryAndExist(path: string): boolean { + return existsSync(path) && statSync(path).isDirectory(); +} + +function normalizeWithWinPath(obj: Record): Record { + return lodash.mapValues(obj, value => winPath(value)); +} + +export default function getServicePaths({ cwd, config, env }: GetServicePathsOptions): Paths { + let absSrcPath = cwd; + if (isDirectoryAndExist(join(cwd, 'src'))) { + absSrcPath = join(cwd, 'src'); + } + + const absPagesPath = config.singular ? join(absSrcPath, 'page') : join(absSrcPath, 'pages'); + + const tmpDir = ['.fes', env !== 'development' && env].filter(Boolean).join('-'); + const paths = { + tmpDir, + cwd, + absNodeModulesPath: join(cwd, 'node_modules'), + absOutputPath: join(cwd, (config.outputPath as string) || './dist'), + absSrcPath, + absPagesPath, + absTmpPath: join(absSrcPath, tmpDir), + }; + return normalizeWithWinPath(paths) as unknown as Paths; +} diff --git a/packages/fes-compiler/src/service/index.js b/packages/compiler/src/service/index.ts similarity index 60% rename from packages/fes-compiler/src/service/index.js rename to packages/compiler/src/service/index.ts index 1faf5cba..8274c93d 100644 --- a/packages/fes-compiler/src/service/index.js +++ b/packages/compiler/src/service/index.ts @@ -1,77 +1,121 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/tree/master/packages/core - */ -import { join } from 'path'; -import { EventEmitter } from 'events'; -import assert from 'assert'; -import { existsSync } from 'fs'; -import { AsyncSeriesWaterfallHook } from 'tapable'; -import { lodash, chalk } from '@fesjs/utils'; +import type commander from 'commander'; +import type { + ApplyPluginsOptions, + CommandOption, + ConfigInstance, + Hook, + Paths, + Plugin, + ResolvePluginsOptions, + ResolvePresetsOptions, + UserConfig, +} from '../types'; +import assert from 'node:assert'; +import { EventEmitter } from 'node:events'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import process from 'node:process'; +import { chalk, lodash } from '@fesjs/utils'; import { Command, Option } from 'commander'; +import { readJSONSync } from 'fs-extra/esm'; +import { AsyncSeriesWaterfallHook } from 'tapable'; import Config from '../config'; import { getUserConfigWithKey } from '../config/utils/configUtils'; -import { resolvePresets, pathToObj, resolvePlugins } from './utils/pluginUtils'; -import loadDotEnv from './utils/loadDotEnv'; -import isPromise from './utils/isPromise'; -import BabelRegister from './babelRegister'; -import PluginAPI from './pluginAPI'; import { ApplyPluginsType, ConfigChangeType, EnableBy, PluginType, ServiceStage } from './enums'; import getPaths from './getPaths'; +import PluginAPI from './pluginAPI'; +import isPromise from './utils/isPromise'; +import loadDotEnv from './utils/loadDotEnv'; +import { pathToObj, resolvePlugins, resolvePresets } from './utils/pluginUtils'; + +interface ServiceOptions { + cwd?: string; + pkg?: Record; + env?: string; + fesPkg?: Record; + presets?: string[]; + plugins?: string[]; +} + +interface SetupOptions { + presets?: string[]; + plugins?: string[]; +} + +interface ApplyAPIOptions { + apply: () => Promise | any; + api: any; +} + +interface InitPresetResult { + presets?: string[]; + plugins?: string[]; +} + +interface ApplyPluginsOptionsExtended extends ApplyPluginsOptions { + args?: any; +} + +interface RunOptions { + rawArgv?: Record; + args?: Record; +} + +interface RunCommandOptions { + rawArgv?: Record; + args?: Record; +} // TODO // 1. duplicated key export default class Service extends EventEmitter { - cwd; + cwd: string; - pkg; + pkg: Record; - skipPluginIds = new Set(); + skipPluginIds: Set = new Set(); // lifecycle stage - stage = ServiceStage.uninitialized; + stage: ServiceStage = ServiceStage.uninitialized; // registered commands - commands = {}; + commands: Record = {}; // including plugins - plugins = {}; + plugins: Record = {}; // 构建 - builder = {}; + builder: Record = {}; // plugin methods - pluginMethods = {}; + pluginMethods: Record void> = {}; // initial presets and plugins from arguments, config, process.env, and package.json - initialPresets = []; + initialPresets: Plugin[] = []; // initial plugins from arguments, config, process.env, and package.json - initialPlugins = []; + initialPlugins: Plugin[] = []; - _extraPresets = []; + _extraPresets: Plugin[] = []; - _extraPlugins = []; + _extraPlugins: Plugin[] = []; // user config - userConfig; + userConfig: UserConfig; - configInstance; + configInstance: ConfigInstance; - config = null; - - // babel register - babelRegister; + config: UserConfig | null = null; // hooks - hooksByPluginId = {}; + hooksByPluginId: Record = {}; - hooks = {}; + hooks: Record = {}; // paths - paths = {}; + paths: Paths; - env; + env: string; ApplyPluginsType = ApplyPluginsType; @@ -81,31 +125,35 @@ export default class Service extends EventEmitter { ServiceStage = ServiceStage; - args; + args: Record | undefined; - constructor(opts) { + fesPkg: Record; + + program: commander.Command; + + ready: Promise; + + constructor(opts: ServiceOptions) { super(); this.cwd = opts.cwd || process.cwd(); // repoDir should be the root dir of repo this.pkg = opts.pkg || this.resolvePackage(); - this.env = opts.env || process.env.NODE_ENV; + this.env = opts.env || process.env.NODE_ENV || 'development'; this.fesPkg = opts.fesPkg || {}; + this.userConfig = {}; assert(existsSync(this.cwd), `cwd ${this.cwd} does not exist.`); - // register babel before config parsing - this.babelRegister = new BabelRegister(); + this.program = this.initCommand(); // load .env or .local.env this.loadEnv(); - // get user config without validation this.configInstance = new Config({ cwd: this.cwd, service: this, localConfig: this.env === 'development', }); - this.userConfig = this.configInstance.getUserConfig(); // get paths this.paths = getPaths({ @@ -114,41 +162,47 @@ export default class Service extends EventEmitter { env: this.env, }); - this.program = this.initCommand(); - - // setup initial plugins - const baseOpts = { - pkg: this.pkg, - cwd: this.cwd, - }; - this.initialPresets = resolvePresets({ - ...baseOpts, - presets: opts.presets || [], - userConfigPresets: this.userConfig.presets || [], - builder: this.userConfig.builder, - }); - this.initialPlugins = resolvePlugins({ - ...baseOpts, - plugins: opts.plugins || [], - userConfigPlugins: this.userConfig.plugins || [], - builder: this.userConfig.builder, - }); + this.ready = this.setup(opts); } - setStage(stage) { + async setup(opts: SetupOptions): Promise { + // get user config without validation + + this.userConfig = await this.configInstance.getUserConfig(); + + // setup initial plugins + const baseOpts: ResolvePresetsOptions & ResolvePluginsOptions = { + pkg: this.pkg, + cwd: this.cwd, + builder: this.userConfig.builder as string, + }; + this.initialPresets = await resolvePresets({ + ...baseOpts, + presets: opts.presets || [], + userConfigPresets: (this.userConfig.presets as string[]) || [], + }); + this.initialPlugins = await resolvePlugins({ + ...baseOpts, + plugins: opts.plugins || [], + userConfigPlugins: (this.userConfig.plugins as string[]) || [], + }); + return true; + } + + setStage(stage: ServiceStage): void { this.stage = stage; } - resolvePackage() { + resolvePackage(): Record { try { - // eslint-disable-next-line - return require(join(this.cwd, "package.json")); - } catch (e) { + return readJSONSync(join(this.cwd, 'package.json')); + } + catch { return {}; } } - loadEnv() { + loadEnv(): void { const basePath = join(this.cwd, '.env'); const localPath = `${basePath}.local`; loadDotEnv(basePath); @@ -158,16 +212,16 @@ export default class Service extends EventEmitter { loadDotEnv(localPath); } - async init() { + async init(): Promise { this.setStage(ServiceStage.init); await this.initPresetsAndPlugins(); // hooksByPluginId -> hooks // hooks is mapped with hook key, prepared for applyPlugins() this.setStage(ServiceStage.initHooks); - Object.keys(this.hooksByPluginId).forEach((id) => { + Object.keys(this.hooksByPluginId).forEach((id: string) => { const hooks = this.hooksByPluginId[id]; - hooks.forEach((hook) => { + hooks.forEach((hook: Hook) => { const { key } = hook; hook.pluginId = id; this.hooks[key] = (this.hooks[key] || []).concat(hook); @@ -190,51 +244,46 @@ export default class Service extends EventEmitter { // merge paths to keep the this.paths ref this.setStage(ServiceStage.getPaths); // config.outputPath may be modified by plugins - if (this.config.outputPath) { - this.paths.absOutputPath = join(this.cwd, this.config.outputPath); + if (this.config?.outputPath) { + this.paths.absOutputPath = join(this.cwd, this.config.outputPath as string); } const paths = await this.applyPlugins({ key: 'modifyPaths', type: ApplyPluginsType.modify, initialValue: this.paths, - }); - Object.keys(paths).forEach((key) => { - this.paths[key] = paths[key]; - }); + }) as Paths; + Object.assign(this.paths, paths); } - async setConfig() { + async setConfig(): Promise { const defaultConfig = await this.applyPlugins({ key: 'modifyDefaultConfig', type: this.ApplyPluginsType.modify, initialValue: await this.configInstance.getDefaultConfig(), - }); + }) as Record; + const initConfig = await this.configInstance.getConfig(defaultConfig); this.config = await this.applyPlugins({ key: 'modifyConfig', type: this.ApplyPluginsType.modify, - initialValue: this.configInstance.getConfig({ - defaultConfig, - }), + initialValue: initConfig, }); } - async initPresetsAndPlugins() { + async initPresetsAndPlugins(): Promise { this.setStage(ServiceStage.initPresets); this._extraPlugins = []; while (this.initialPresets.length) { - // eslint-disable-next-line - await this.initPreset(this.initialPresets.shift()); + await this.initPreset(this.initialPresets.shift()!); } this.setStage(ServiceStage.initPlugins); this._extraPlugins.push(...this.initialPlugins); while (this._extraPlugins.length) { - // eslint-disable-next-line - await this.initPlugin(this._extraPlugins.shift()); + await this.initPlugin(this._extraPlugins.shift()!); } } - getPluginAPI(opts) { + getPluginAPI(opts: { id: string; key: string; service: Service }): PluginAPI { const pluginAPI = new PluginAPI(opts); // register built-in methods @@ -246,17 +295,18 @@ export default class Service extends EventEmitter { }); return new Proxy(pluginAPI, { - get: (target, prop) => { + get: (target, prop: string) => { // 由于 pluginMethods 需要在 register 阶段可用 // 必须通过 proxy 的方式动态获取最新,以实现边注册边使用的效果 - if (this.pluginMethods[prop]) return this.pluginMethods[prop]; + if (this.pluginMethods[prop]) { + return this.pluginMethods[prop]; + } if ( [ 'applyPlugins', 'ApplyPluginsType', 'EnableBy', 'ConfigChangeType', - 'babelRegister', 'stage', 'ServiceStage', 'paths', @@ -273,22 +323,26 @@ export default class Service extends EventEmitter { 'builder', ].includes(prop) ) { + // @ts-expect-error ignore property return typeof this[prop] === 'function' ? this[prop].bind(this) : this[prop]; } + // @ts-expect-error ignore property return target[prop]; }, }); } - async applyAPI(opts) { - let ret = opts.apply()(opts.api); + async applyAPI(opts: ApplyAPIOptions): Promise { + const module = await opts.apply(); + let ret = module(opts.api); + if (isPromise(ret)) { ret = await ret; } return ret || {}; } - async initPreset(preset) { + async initPreset(preset: Plugin): Promise { const { id, key, apply } = preset; preset.isPreset = true; @@ -299,22 +353,23 @@ export default class Service extends EventEmitter { const { presets, plugins } = await this.applyAPI({ api, apply, - }); + }) as InitPresetResult; // register extra presets and plugins if (presets) { assert(Array.isArray(presets), `presets returned from preset ${id} must be Array.`); // 插到最前面,下个 while 循环优先执行 + const _presets = await Promise.all(presets.map(path => + pathToObj({ + type: PluginType.preset, + path, + cwd: this.cwd, + }), + )); this._extraPresets.splice( 0, 0, - ...presets.map((path) => - pathToObj({ - type: PluginType.preset, - path, - cwd: this.cwd, - }), - ), + ..._presets, ); } @@ -322,25 +377,32 @@ export default class Service extends EventEmitter { const extraPresets = lodash.clone(this._extraPresets); this._extraPresets = []; while (extraPresets.length) { - // eslint-disable-next-line - await this.initPreset(extraPresets.shift()); + await this.initPreset(extraPresets.shift()!); } if (plugins) { assert(Array.isArray(plugins), `plugins returned from preset ${id} must be Array.`); + const _plugins = await Promise.all(plugins.map(path => + pathToObj({ + type: PluginType.plugin, + path, + cwd: this.cwd, + }), + )); this._extraPlugins.push( - ...plugins.map((path) => - pathToObj({ - type: PluginType.plugin, - path, - cwd: this.cwd, - }), - ), + ..._plugins, ); } + + // 深度优先 + const extraPlugins = lodash.clone(this._extraPlugins); + this._extraPlugins = []; + while (extraPlugins.length) { + await this.initPlugin(extraPlugins.shift()!); + } } - async initPlugin(plugin) { + async initPlugin(plugin: Plugin): Promise { const { id, key, apply } = plugin; const api = this.getPluginAPI({ @@ -357,25 +419,34 @@ export default class Service extends EventEmitter { }); } - getPluginOptsWithKey(key) { + getPluginOptsWithKey(key: string): any { return getUserConfigWithKey({ key, userConfig: this.userConfig, }); } - registerPlugin(plugin) { + registerPlugin(plugin: Plugin): void { this.plugins[plugin.id] = plugin; } - isPluginEnable(pluginId) { + isPluginEnable(pluginId: string): boolean { // api.skipPlugins() 的插件 - if (this.skipPluginIds.has(pluginId)) return false; + if (this.skipPluginIds.has(pluginId)) { + return false; + } - const { key, enableBy } = this.plugins[pluginId]; + const plugin = this.plugins[pluginId]; + if (!plugin) { + return false; + } + + const { key, enableBy } = plugin; // 手动设置为 false - if (this.userConfig[key] === false) return false; + if (this.userConfig[key] === false) { + return false; + } // 配置开启 if (enableBy === this.EnableBy.config && !(key in this.userConfig)) { @@ -391,77 +462,74 @@ export default class Service extends EventEmitter { return true; } - hasPresets(presetIds) { + hasPresets(presetIds: string[]): boolean { return presetIds.every((presetId) => { const preset = this.plugins[presetId]; return preset && preset.isPreset && this.isPluginEnable(presetId); }); } - hasPlugins(pluginIds) { + hasPlugins(pluginIds: string[]): boolean { return pluginIds.every((pluginId) => { const plugin = this.plugins[pluginId]; return plugin && !plugin.isPreset && this.isPluginEnable(pluginId); }); } - async applyPlugins(opts) { + async applyPlugins(opts: ApplyPluginsOptionsExtended): Promise { const hooks = this.hooks[opts.key] || []; switch (opts.type) { case ApplyPluginsType.add: if ('initialValue' in opts) { assert(Array.isArray(opts.initialValue), 'applyPlugins failed, opts.initialValue must be Array if opts.type is add.'); } - // eslint-disable-next-line - const tAdd = new AsyncSeriesWaterfallHook(["memo"]); + // eslint-disable-next-line no-case-declarations + const tAdd = new AsyncSeriesWaterfallHook(['memo']); for (const hook of hooks) { - if (!this.isPluginEnable(hook.pluginId)) { + if (!this.isPluginEnable(hook.pluginId!)) { continue; } tAdd.tapPromise( { - name: hook.pluginId, + name: hook.pluginId!, stage: hook.stage || 0, - // @ts-ignore before: hook.before, }, async (memo) => { const items = await hook.fn(opts.args); - return memo.concat(items); + return (memo as any[]).concat(items); }, ); } - return tAdd.promise(opts.initialValue || []); + return tAdd.promise(opts.initialValue || []) as Promise; case ApplyPluginsType.modify: - // eslint-disable-next-line - const tModify = new AsyncSeriesWaterfallHook(["memo"]); + // eslint-disable-next-line no-case-declarations + const tModify = new AsyncSeriesWaterfallHook(['memo']); for (const hook of hooks) { - if (!this.isPluginEnable(hook.pluginId)) { + if (!this.isPluginEnable(hook.pluginId!)) { continue; } tModify.tapPromise( { - name: hook.pluginId, + name: hook.pluginId!, stage: hook.stage || 0, - // @ts-ignore before: hook.before, }, - async (memo) => hook.fn(memo, opts.args), + async (memo: any) => hook.fn(memo, opts.args), ); } - return tModify.promise(opts.initialValue); + return tModify.promise(opts.initialValue) as Promise; case ApplyPluginsType.event: - // eslint-disable-next-line - const tEvent = new AsyncSeriesWaterfallHook(["_"]); + // eslint-disable-next-line no-case-declarations + const tEvent = new AsyncSeriesWaterfallHook(['_']); for (const hook of hooks) { - if (!this.isPluginEnable(hook.pluginId)) { + if (!this.isPluginEnable(hook.pluginId!)) { continue; } tEvent.tapPromise( { - name: hook.pluginId, + name: hook.pluginId!, stage: hook.stage || 0, - // @ts-ignore before: hook.before, }, async () => { @@ -469,22 +537,22 @@ export default class Service extends EventEmitter { }, ); } - return tEvent.promise(); + return tEvent.promise(true) as Promise; default: - throw new Error(`applyPlugin failed, type is not defined or is not matched, got ${opts.type}.`); + throw new Error(`applyPlugin failed, type is not defined or is not matched, got ${(opts as any).type}.`); } } - initCommand() { + initCommand(): commander.Command { const command = new Command(); command .usage(' [options]') - .version(`@fesjs/fes ${this.fesPkg.version}`, '-v, --vers', 'output the current version') + .version(`@fesjs/fes ${this.fesPkg.version || ''}`, '-v, --vers', 'output the current version') .description(chalk.cyan('一个好用的前端应用解决方案')); return command; } - async run({ rawArgv = {}, args = {} }) { + async run({ rawArgv = {}, args = {} }: RunOptions): Promise { await this.init(); this.setStage(ServiceStage.run); @@ -499,9 +567,9 @@ export default class Service extends EventEmitter { return this.runCommand({ rawArgv, args }); } - async runCommand({ rawArgv = {}, args = {} }) { + async runCommand({ rawArgv = {}, args = {} }: RunCommandOptions): Promise { assert(this.stage >= ServiceStage.init, 'service is not initialized.'); - Object.keys(this.commands).forEach((command) => { + Object.keys(this.commands).forEach((command: string) => { const commandOptionConfig = this.commands[command]; const program = this.program; let c = program.command(command).description(commandOptionConfig.description); @@ -519,7 +587,7 @@ export default class Service extends EventEmitter { } if (commandOptionConfig.fn) { c.action(async () => { - await commandOptionConfig.fn({ + await commandOptionConfig.fn!({ rawArgv, args, options: c.opts(), @@ -532,13 +600,19 @@ export default class Service extends EventEmitter { return this.parseCommand(); } - async parseCommand() { + async parseCommand(): Promise { this.program.on('--help', () => { + // eslint-disable-next-line no-console console.log(); + // eslint-disable-next-line no-console console.log(` Run ${chalk.cyan('fes --help')} for detailed usage of given command.`); + // eslint-disable-next-line no-console console.log(); }); - this.program.commands.forEach((c) => c.on('--help', () => console.log())); + this.program.commands.forEach(c => c.on('--help', () => { + // eslint-disable-next-line no-console + console.log(); + })); return this.program.parseAsync(process.argv); } } diff --git a/packages/fes-compiler/src/service/pluginAPI.js b/packages/compiler/src/service/pluginAPI.ts similarity index 67% rename from packages/fes-compiler/src/service/pluginAPI.js rename to packages/compiler/src/service/pluginAPI.ts index 5905e144..c4e8d88f 100644 --- a/packages/fes-compiler/src/service/pluginAPI.js +++ b/packages/compiler/src/service/pluginAPI.ts @@ -1,17 +1,36 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/tree/master/packages/core - */ - -import assert from 'assert'; +import type { + CommandOption, + Hook, + Plugin, + PluginConfig, + ServiceInstance, +} from '../types'; +import assert from 'node:assert'; import * as utils from '@fesjs/utils'; -import { isValidPlugin, pathToObj } from './utils/pluginUtils'; import { EnableBy, PluginType, ServiceStage } from './enums'; +import { isValidPlugin, pathToObj } from './utils/pluginUtils'; + +interface PluginAPIOptions { + id: string; + key: string; + service: ServiceInstance; +} + +interface DescribeOptions { + id?: string; + key?: string; + config?: PluginConfig; + enableBy?: EnableBy | (() => boolean); +} -// TODO -// 标准化 logger export default class PluginAPI { - constructor(opts) { + id: string; + key: string; + service: ServiceInstance; + utils: typeof utils; + logger: typeof utils.logger; + + constructor(opts: PluginAPIOptions) { this.id = opts.id; this.key = opts.key; this.service = opts.service; @@ -20,7 +39,7 @@ export default class PluginAPI { } // TODO: reversed keys - describe({ id, key, config, enableBy } = {}) { + describe({ id, key, config, enableBy }: DescribeOptions = {}): void { const { plugins } = this.service; // this.id and this.key is generated automatically // so we need to diff first @@ -46,13 +65,13 @@ export default class PluginAPI { plugins[this.id].enableBy = enableBy || EnableBy.register; } - register(hook) { + register(hook: Hook): void { assert(hook.key && typeof hook.key === 'string', `api.register() failed, hook.key must supplied and should be string, but got ${hook.key}.`); assert(hook.fn && typeof hook.fn === 'function', `api.register() failed, hook.fn must supplied and should be function, but got ${hook.fn}.`); this.service.hooksByPluginId[this.id] = (this.service.hooksByPluginId[this.id] || []).concat(hook); } - registerCommand(commandOption) { + registerCommand(commandOption: CommandOption): void { const { command, fn } = commandOption; assert(!this.service.commands[command], `api.registerCommand() failed, the command ${command} is exists.`); assert(typeof command === 'string', 'api.registerCommand() failed, the command must be string.'); @@ -61,67 +80,69 @@ export default class PluginAPI { } // 在 preset 初始化阶段放后面,在插件注册阶段放前面 - registerPlugins(plugins) { + async registerPlugins(plugins: (string | Plugin)[]): Promise { assert( this.service.stage === ServiceStage.initPresets || this.service.stage === ServiceStage.initPlugins, 'api.registerPlugins() failed, it should only be used in registering stage.', ); assert(Array.isArray(plugins), 'api.registerPlugins() failed, plugins must be Array.'); - const extraPlugins = plugins.map((plugin) => + const extraPlugins = await Promise.all(plugins.map(plugin => isValidPlugin(plugin) ? plugin : pathToObj({ - type: PluginType.plugin, - path: plugin, - cwd: this.service.cwd, - }), + type: PluginType.plugin, + path: plugin as string, + cwd: this.service.cwd, + })), ); if (this.service.stage === ServiceStage.initPresets) { this.service._extraPlugins.push(...extraPlugins); - } else { + } + else { this.service._extraPlugins.splice(0, 0, ...extraPlugins); } } - registerPresets(presets) { + async registerPresets(presets: (string | Plugin)[]): Promise { assert(this.service.stage === ServiceStage.initPresets, 'api.registerPresets() failed, it should only used in presets.'); assert(Array.isArray(presets), 'api.registerPresets() failed, presets must be Array.'); - const extraPresets = presets.map((preset) => + const extraPresets = await Promise.all(presets.map(preset => isValidPlugin(preset) - ? preset + ? preset as Plugin : pathToObj({ - type: PluginType.preset, - path: preset, - cwd: this.service.cwd, - }), - ); + type: PluginType.preset, + path: preset as string, + cwd: this.service.cwd, + }), + )); // 插到最前面,下个 while 循环优先执行 this.service._extraPresets.splice(0, 0, ...extraPresets); } - registerMethod({ name, fn, exitsError = true }) { + registerMethod({ name, fn, exitsError = true }: { name: string; fn?: (...args: any[]) => any; exitsError: boolean }): void { if (this.service.pluginMethods[name]) { if (exitsError) { throw new Error(`api.registerMethod() failed, method ${name} is already exist.`); - } else { + } + else { return; } } - this.service.pluginMethods[name] = - fn || + this.service.pluginMethods[name] + = fn // 这里不能用 arrow function,this 需指向执行此方法的 PluginAPI // 否则 pluginId 会不会,导致不能正确 skip plugin - function (hookFn) { - const hook = { - key: name, - ...(utils.lodash.isPlainObject(hookFn) ? hookFn : { fn: hookFn }), + || function (hookFn: any) { + const hook: Partial = { + key: name, + ...(utils.lodash.isPlainObject(hookFn) ? hookFn : { fn: hookFn }), + }; + // @ts-expect-error this + this.register(hook as Hook); }; - // @ts-ignore - this.register(hook); - }; } - registerBuilder(builder) { + registerBuilder(builder: Record): void { assert(typeof builder === 'object', 'api.registerBuilder() failed, the builder must be object.'); // const { name } = builder; // assert(typeof name === 'string', 'api.registerBuilder() failed, the builder.name must be string.'); @@ -129,7 +150,7 @@ export default class PluginAPI { this.service.builder = builder; } - skipPlugins(pluginIds) { + skipPlugins(pluginIds: string[]): void { pluginIds.forEach((pluginId) => { this.service.skipPluginIds.add(pluginId); }); diff --git a/packages/fes-compiler/src/service/plugins/builder.js b/packages/compiler/src/service/plugins/builder.ts similarity index 59% rename from packages/fes-compiler/src/service/plugins/builder.js rename to packages/compiler/src/service/plugins/builder.ts index 19671a01..b4de05f5 100644 --- a/packages/fes-compiler/src/service/plugins/builder.js +++ b/packages/compiler/src/service/plugins/builder.ts @@ -1,4 +1,6 @@ -export default (api) => { +import type { PluginAPIInstance } from '../../types'; + +export default function builderPlugin(api: PluginAPIInstance): void { api.describe({ key: 'builder', config: { @@ -8,4 +10,4 @@ export default (api) => { default: '', }, }); -}; +} diff --git a/packages/compiler/src/service/utils/isPromise.ts b/packages/compiler/src/service/utils/isPromise.ts new file mode 100644 index 00000000..d1ad0dc4 --- /dev/null +++ b/packages/compiler/src/service/utils/isPromise.ts @@ -0,0 +1,12 @@ +/** + * 判断对象是否为 Promise + * @param obj 待判断的对象 + * @returns 如果是 Promise 返回 true,否则返回 false + */ +export default function isPromise(obj: any): obj is Promise { + return ( + !!obj + && (typeof obj === 'object' || typeof obj === 'function') + && typeof obj.then === 'function' + ); +} diff --git a/packages/fes-compiler/src/service/utils/loadDotEnv.js b/packages/compiler/src/service/utils/loadDotEnv.ts similarity index 58% rename from packages/fes-compiler/src/service/utils/loadDotEnv.js rename to packages/compiler/src/service/utils/loadDotEnv.ts index 78404d1f..3ef2ebe0 100644 --- a/packages/fes-compiler/src/service/utils/loadDotEnv.js +++ b/packages/compiler/src/service/utils/loadDotEnv.ts @@ -1,15 +1,15 @@ -import { readFileSync, existsSync } from 'fs'; +import { existsSync, readFileSync } from 'node:fs'; +import process from 'node:process'; import { parse } from 'dotenv'; /** * dotenv wrapper - * @param envPath string + * @param envPath 环境变量文件路径 */ -export default function loadDotEnv(envPath) { +export default function loadDotEnv(envPath: string): void { if (existsSync(envPath)) { const parsed = parse(readFileSync(envPath, 'utf-8')) || {}; Object.keys(parsed).forEach((key) => { - // eslint-disable-next-line no-prototype-builtins process.env[key] = parsed[key]; }); } diff --git a/packages/compiler/src/service/utils/pluginUtils.ts b/packages/compiler/src/service/utils/pluginUtils.ts new file mode 100644 index 00000000..63efc63a --- /dev/null +++ b/packages/compiler/src/service/utils/pluginUtils.ts @@ -0,0 +1,214 @@ +import type { Plugin } from '../../types'; +import { basename, dirname, extname, join, relative } from 'node:path'; +import process from 'node:process'; +import { chalk, compatESModuleRequire, lodash, resolve, winPath } from '@fesjs/utils'; +import { readJSONSync } from 'fs-extra/esm'; +import { packageUp } from 'package-up'; +import { OWNER_DIR } from '../../shared'; +import { PluginType } from '../enums'; + +interface FilterBuilderOptions { + pkg: Record; + builder?: string; +} + +interface FilterPluginAndPresetOptions { + pkg: Record; + builder?: string; +} + +interface GetPluginsOrPresetsOptions { + presets?: string[]; + plugins?: string[]; + userConfigPresets?: string[]; + userConfigPlugins?: string[]; + pkg: Record; + cwd: string; + builder?: string; +} + +interface PathToObjOptions { + path: string; + type: PluginType; + cwd: string; +} + +interface ResolvePresetsOptions { + presets?: string[]; + userConfigPresets?: string[]; + builder?: string; + pkg: Record; + cwd: string; +} + +interface ResolvePluginsOptions { + plugins?: string[]; + userConfigPlugins?: string[]; + builder?: string; + pkg: Record; + cwd: string; +} + +const RE: Record = { + [PluginType.plugin]: /^(@fesjs\/|@webank\/fes-|fes-)plugin-(.+)$/, + [PluginType.preset]: /^(@fesjs\/|@webank\/fes-|fes-)preset-(.+)$/, + [PluginType.builder]: /^(@fesjs\/|@webank\/fes-|fes-)builder-(.+)$/, +}; + +export function isPluginOrPreset(type: PluginType, name: string): boolean { + const hasScope = name.charAt(0) === '@'; + const re = RE[type]; + if (hasScope) { + return re.test(name.split('/')[1]) || re.test(name); + } + return re.test(name); +} + +function filterBuilder(opts: FilterBuilderOptions): string[] { + const builders = Object.keys(opts.pkg.devDependencies || {}) + .concat(Object.keys(opts.pkg.dependencies || {})) + .filter(isPluginOrPreset.bind(null, PluginType.builder)) + .filter(builder => builder.includes(opts.builder || '')); + if (builders.length > 1) { + // eslint-disable-next-line no-console + console.log(chalk.yellow(`提示:您使用了多个builder,默认使用第一个${builders[0]}`)); + return [builders[0]]; + } + return builders; +} + +function filterPluginAndPreset(type: PluginType, opts: FilterPluginAndPresetOptions): string[] { + const base = Object.keys(opts.pkg.devDependencies || {}) + .concat(Object.keys(opts.pkg.dependencies || {})) + .filter(isPluginOrPreset.bind(null, type)); + if (type === PluginType.preset) { + return base.concat(filterBuilder(opts)); + } + if (type === PluginType.plugin) { + return base.concat(join(OWNER_DIR, './dist/service/plugins/builder.mjs')); + } + return base; +} + +export function getPluginsOrPresets(type: PluginType, opts: GetPluginsOrPresetsOptions): string[] { + const upperCaseType = type.toUpperCase(); + return [ + // opts + ...(opts[type === PluginType.preset ? 'presets' : 'plugins'] || []), + // env + ...(process.env[`FES_${upperCaseType}S`] || '').split(',').filter(Boolean), + ...filterPluginAndPreset(type, opts), + // user config + ...(opts[type === PluginType.preset ? 'userConfigPresets' : 'userConfigPlugins'] || []), + ].map(path => + resolve.sync(path, { + basedir: opts.cwd, + extensions: ['.js', '.ts'], + }), + ); +} + +// e.g. +// initial-state -> initialState +// webpack.css-loader -> webpack.cssLoader +function nameToKey(name: string): string { + return name + .split('.') + .map(part => lodash.camelCase(part)) + .join('.'); +} + +function pkgNameToKey(pkgName: string, type: PluginType): string { + if (pkgName.charAt(0) === '@' && !pkgName.startsWith('@fesjs/')) { + pkgName = pkgName.split('/')[1]; + } + return nameToKey(pkgName.replace(RE[type], '')); +} + +export async function pathToObj({ path, type, cwd }: PathToObjOptions): Promise { + let pkg: Record; + let isPkgPlugin = false; + const pkgJSONPath = await packageUp({ cwd: path }); + if (pkgJSONPath) { + pkg = readJSONSync(pkgJSONPath); + isPkgPlugin = winPath(join(dirname(pkgJSONPath), pkg.main || 'index.js')) === winPath(path); + } + + let id: string; + if (isPkgPlugin) { + id = pkg!.name; + } + else if (winPath(path).startsWith(winPath(cwd))) { + id = `./${winPath(relative(cwd, path))}`; + } + else if (pkgJSONPath) { + id = winPath(join(pkg!.name, relative(dirname(pkgJSONPath!), path))); + } + else { + id = winPath(path); + } + id = id.replace('@fesjs/preset-built-in/dist/plugins', '@@'); + id = id.replace(/\.js$/, ''); + + const key = isPkgPlugin ? pkgNameToKey(pkg!.name, type) : nameToKey(basename(path, extname(path))); + + return { + id, + key, + path: winPath(path), + async apply() { + try { + const ret = await import(path); + // use the default member for es modules + return compatESModuleRequire(ret); + } + catch (e: any) { + throw new Error(`Register ${path} failed, since ${e.message}`); + } + }, + defaultConfig: null, + }; +} + +export async function resolvePresets(opts: ResolvePresetsOptions): Promise { + const type = PluginType.preset; + const presets = await Promise.all([...getPluginsOrPresets(type, opts)].map(path => + pathToObj({ + type, + path, + cwd: opts.cwd, + }), + )); + return presets + .sort((a, b) => { + if (a.id === '@fesjs/preset-built-in') { + return -1; + } + if (b.id === '@fesjs/preset-built-in') { + return 1; + } + if (/^(?:@fesjs\/|@webank\/fes-|fes-)builder-/.test(a.id)) { + return -1; + } + if (/^(?:@fesjs\/|@webank\/fes-|fes-)builder-/.test(b.id)) { + return 1; + } + return 0; + }); +} + +export async function resolvePlugins(opts: ResolvePluginsOptions): Promise { + const type = PluginType.plugin; + const plugins = await Promise.all([...getPluginsOrPresets(type, opts)].map(path => + pathToObj({ + type, + path, + cwd: opts.cwd, + }), + )); + return plugins; +} + +export function isValidPlugin(plugin: any): plugin is Plugin { + return plugin && plugin.id && plugin.key && typeof plugin.apply === 'function'; +} diff --git a/packages/compiler/src/shared.ts b/packages/compiler/src/shared.ts new file mode 100644 index 00000000..7e274ee6 --- /dev/null +++ b/packages/compiler/src/shared.ts @@ -0,0 +1,7 @@ +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +/** + * 获取编译器所有者的目录路径 + */ +export const OWNER_DIR: string = join(dirname(fileURLToPath(import.meta.url)), '..'); diff --git a/packages/compiler/src/types.ts b/packages/compiler/src/types.ts new file mode 100644 index 00000000..0dda147d --- /dev/null +++ b/packages/compiler/src/types.ts @@ -0,0 +1,94 @@ +import type Config from './config'; +import type Service from './service'; +import type { ApplyPluginsType, EnableBy } from './service/enums'; +import type PluginAPI from './service/pluginAPI'; + +export type ConfigInstance = InstanceType; +export type ServiceInstance = InstanceType; +export type PluginAPIInstance = InstanceType; + +// Enums +export type { ApplyPluginsType, ConfigChangeType, EnableBy, PluginType, ServiceStage } from './service/enums'; + +// Utility types +export interface UserConfig { + [key: string]: any; +} + +export interface Paths { + tmpDir: string; + cwd: string; + absNodeModulesPath: string; + absOutputPath: string; + absSrcPath: string; + absPagesPath: string; + absTmpPath: string; +} + +export interface Plugin { + id: string; + key: string; + path: string; + apply: () => Promise | any; + config?: PluginConfig; + enableBy?: EnableBy | (() => boolean); + isPreset?: boolean; + defaultConfig: any; +} + +export interface PluginConfig { + schema?: (joi: any) => any; + default?: any; +} + +export interface Hook { + key: string; + fn: (...args: any[]) => any; + pluginId?: string; + stage?: number; + before?: string; +} + +export interface CommandOption { + command: string; + description: string; + options?: CommandOptionConfig[]; + fn?: (args: CommandArgs) => Promise | void; +} + +export interface CommandOptionConfig { + name: string; + description: string; + default?: any; + choices?: string[]; +} + +export interface CommandArgs { + rawArgv: Record; + args: Record; + options: Record; + program: any; +} + +export interface ApplyPluginsOptions { + key: string; + type: ApplyPluginsType; + initialValue?: any; + args?: any; +} + +export interface ResolvePresetsOptions { + presets?: string[]; + userConfigPresets?: string[]; + builder?: string; + pkg: Record; + cwd: string; +} + +export interface ResolvePluginsOptions { + plugins?: string[]; + userConfigPlugins?: string[]; + builder?: string; + pkg: Record; + cwd: string; +} diff --git a/packages/compiler/tsconfig.json b/packages/compiler/tsconfig.json new file mode 100644 index 00000000..e4c560ab --- /dev/null +++ b/packages/compiler/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": ["@fesjs/typescript-config/base.json"], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./build" + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} diff --git a/packages/compiler/tsup.config.ts b/packages/compiler/tsup.config.ts new file mode 100644 index 00000000..cd316908 --- /dev/null +++ b/packages/compiler/tsup.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: ['src/index.ts', 'src/service/plugins/builder.ts'], + splitting: false, + sourcemap: false, + clean: true, + dts: true, + shims: true, + format: ['esm'], +}); diff --git a/packages/create-fes-app/README.md b/packages/create-fes-app/README.md index 8bf21091..31564991 100644 --- a/packages/create-fes-app/README.md +++ b/packages/create-fes-app/README.md @@ -35,16 +35,13 @@ Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到 | [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | | [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | | [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | | [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | | [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | | [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | | [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | | [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | | [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | | [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | | [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | | [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | diff --git a/packages/create-fes-app/package.json b/packages/create-fes-app/package.json index e472a394..18591232 100644 --- a/packages/create-fes-app/package.json +++ b/packages/create-fes-app/package.json @@ -2,30 +2,30 @@ "name": "@fesjs/create-fes-app", "version": "3.0.7", "description": "create a app base on fes.js", - "main": "lib/index.js", - "files": [ - "lib", - "bin", - "templates/**/*" - ], - "bin": { - "create-fes-app": "bin/create-fes-app.js" - }, + "author": "qlin", + "license": "MIT", + "homepage": "https://github.com/WeBankFinTech/fes.js#readme", "repository": { "type": "git", "url": "git+https://github.com/WeBankFinTech/fes.js.git", "directory": "packages/create-fes-app" }, + "bugs": { + "url": "https://github.com/WeBankFinTech/fes.js/issues" + }, "keywords": [ "fes" ], "sideEffects": false, - "author": "qlin", - "license": "MIT", - "bugs": { - "url": "https://github.com/WeBankFinTech/fes.js/issues" + "main": "lib/index.js", + "bin": { + "create-fes-app": "bin/create-fes-app.js" }, - "homepage": "https://github.com/WeBankFinTech/fes.js#readme", + "files": [ + "bin", + "lib", + "templates/**/*" + ], "publishConfig": { "access": "public" }, diff --git a/packages/create-fes-app/src/cli.js b/packages/create-fes-app/src/cli.js index 5835133a..699643f2 100644 --- a/packages/create-fes-app/src/cli.js +++ b/packages/create-fes-app/src/cli.js @@ -1,7 +1,7 @@ +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import process from 'node:process'; import { chalk, yParser } from '@fesjs/utils'; -import { existsSync } from 'fs'; -import { join } from 'path'; - const args = yParser(process.argv.slice(2), { alias: { @@ -9,9 +9,9 @@ const args = yParser(process.argv.slice(2), { help: ['h'], force: ['f'], merge: ['m'], - proxy: ['x'] + proxy: ['x'], }, - boolean: ['version', 'help', 'merge', 'force'] + boolean: ['version', 'help', 'merge', 'force'], }); if (args._.length > 1) { @@ -25,7 +25,8 @@ if (args.version && !args._[0]) { : ''; const { name, version } = require('../package.json'); console.log(`${name}@${version}${local}`); -} else if (args.help && !args._[0]) { +} +else if (args.help && !args._[0]) { console.log(` Usage: create-fes-app @@ -36,11 +37,12 @@ Options: -m, --merge Merge target directory if it exists -x, --proxy Use specified proxy when creating project `); -} else { +} +else { require('.') .default({ cwd: process.cwd(), - args + args, }) .catch((err) => { console.error(`Create failed, ${err.message}`); diff --git a/packages/create-fes-app/src/index.js b/packages/create-fes-app/src/index.js index 17644640..c8778503 100644 --- a/packages/create-fes-app/src/index.js +++ b/packages/create-fes-app/src/index.js @@ -1,12 +1,15 @@ -import path from 'path'; +import path from 'node:path'; +import process from 'node:process'; import { chalk } from '@fesjs/utils'; -import validateProjectName from 'validate-npm-package-name'; import fs from 'fs-extra'; import inquirer from 'inquirer'; +import validateProjectName from 'validate-npm-package-name'; -import { clearConsole } from './utils'; import AppGenerator from './generator/App'; import PluginGenerator from './generator/Plugin'; +import { clearConsole } from './utils'; + +v; export default async ({ cwd, args }) => { if (args.proxy) { @@ -20,20 +23,21 @@ export default async ({ cwd, args }) => { const result = validateProjectName(name); if (!result.validForNewPackages) { console.error(chalk.red(`Invalid project name: "${name}"`)); - result.errors && - result.errors.forEach((err) => { - console.error(chalk.red.dim(`Error: ${err}`)); - }); - result.warnings && - result.warnings.forEach((warn) => { - console.error(chalk.red.dim(`Warning: ${warn}`)); - }); + result.errors + && result.errors.forEach((err) => { + console.error(chalk.red.dim(`Error: ${err}`)); + }); + result.warnings + && result.warnings.forEach((warn) => { + console.error(chalk.red.dim(`Warning: ${warn}`)); + }); throw new Error('Process exited'); } if (fs.pathExistsSync(targetDir) && !args.merge) { if (args.force) { await fs.remove(targetDir); - } else if (inCurrent) { + } + else if (inCurrent) { clearConsole(); const { ok } = await inquirer.prompt([ { @@ -45,7 +49,8 @@ export default async ({ cwd, args }) => { if (!ok) { return null; } - } else { + } + else { clearConsole(); const { action } = await inquirer.prompt([ { @@ -98,7 +103,8 @@ export default async ({ cwd, args }) => { console.log('$ pnpm i'); console.log('$ pnpm dev'); console.log(); - } else if (template === 'plugin') { + } + else if (template === 'plugin') { const generator = new PluginGenerator({ cwd, args, diff --git a/packages/create-fes-app/src/utils.js b/packages/create-fes-app/src/utils.js index 00183a34..adac0ed7 100644 --- a/packages/create-fes-app/src/utils.js +++ b/packages/create-fes-app/src/utils.js @@ -1,6 +1,7 @@ -import readline from 'readline'; +import process from 'node:process'; +import readline from 'node:readline'; -export const clearConsole = (title) => { +export function clearConsole(title) { if (process.stdout.isTTY) { const blank = '\n'.repeat(process.stdout.rows); console.log(blank); @@ -10,4 +11,4 @@ export const clearConsole = (title) => { console.log(title); } } -}; +} diff --git a/packages/create-fes-app/templates/plugin/scripts/build.js b/packages/create-fes-app/templates/plugin/scripts/build.js index 98b34f29..a0a187ee 100644 --- a/packages/create-fes-app/templates/plugin/scripts/build.js +++ b/packages/create-fes-app/templates/plugin/scripts/build.js @@ -1,17 +1,16 @@ // 关闭 import 规则 -/* eslint import/no-extraneous-dependencies: 0 */ -const fs = require('fs'); -const fse = require('fs-extra'); -const path = require('path'); -const merge = require('deepmerge'); -const chokidar = require('chokidar'); +const fs = require('node:fs'); +const path = require('node:path'); const chalk = require('chalk'); +const chokidar = require('chokidar'); +const merge = require('deepmerge'); +const fse = require('fs-extra'); const argv = require('yargs-parser')(process.argv.slice(2)); +const pkg = require('../package.json'); const compiler = require('./compiler'); const randomColor = require('./randomColor'); -const pkg = require('../package.json'); const ESM_OUTPUT_DIR = 'es'; const NODE_CJS_OUTPUT_DIR = 'lib'; @@ -76,10 +75,12 @@ function transformFile(filePath, outputPath, config, log) { const type = config.target === 'browser' ? ESM_OUTPUT_DIR : NODE_CJS_OUTPUT_DIR; log(`Transform to ${type} for ${config.target === 'browser' ? chalk.yellow(shortFilePath) : chalk.blue(shortFilePath)}`); fse.outputFileSync(outputPath, transformedCode); - } catch (error) { + } + catch (error) { console.error(error); } - } else { + } + else { fse.copySync(filePath, outputPath); } } @@ -92,10 +93,12 @@ function compilerPkg(codeDir, outputDir, config, log) { const fileStats = fs.lstatSync(filePath); if (config.copy.includes(file)) { fse.copySync(filePath, outputFilePath); - } else if (fileStats.isDirectory(filePath) && !/__tests__/.test(file)) { + } + else if (fileStats.isDirectory(filePath) && !/__tests__/.test(file)) { fse.ensureDirSync(outputFilePath); compilerPkg(filePath, outputFilePath, config, log); - } else if (fileStats.isFile(filePath)) { + } + else if (fileStats.isFile(filePath)) { transformFile(filePath, outputFilePath, config, log); } }); @@ -112,11 +115,13 @@ function watchFile(dir, outputDir, config, log) { const outputPath = changeFile.replace(dir, outputDir); const stat = fs.lstatSync(changeFile); log(`[${event}] ${shortChangeFile}`); - if (config.resolveCopy.some((item) => changeFile.startsWith(item))) { + if (config.resolveCopy.some(item => changeFile.startsWith(item))) { fse.copySync(changeFile, outputPath); - } else if (stat.isFile()) { + } + else if (stat.isFile()) { transformFile(changeFile, outputPath, config, log); - } else if (stat.isDirectory()) { + } + else if (stat.isDirectory()) { compilerPkg(changeFile, outputPath, config); } }); diff --git a/packages/fes-builder-vite/src/commands/build/index.js b/packages/fes-builder-vite/src/commands/build/index.js deleted file mode 100644 index cdda650e..00000000 --- a/packages/fes-builder-vite/src/commands/build/index.js +++ /dev/null @@ -1,42 +0,0 @@ -import { build } from 'vite'; -import { existsSync } from 'fs'; -import getBuildConfig from './getBuildConfig'; - -export default function (api) { - const { - paths, - utils: { rimraf }, - } = api; - - api.registerCommand({ - command: 'build', - description: 'build application for production', - async fn() { - rimraf.sync(paths.absTmpPath); - - // generate files - await api.applyPlugins({ - key: 'onGenerateFiles', - type: api.ApplyPluginsType.event, - }); - - const bundleConfig = await getBuildConfig(api); - try { - // clear output path before exec build - if (process.env.CLEAR_OUTPUT !== 'none') { - if (paths.absOutputPath && existsSync(paths.absOutputPath)) { - rimraf.sync(paths.absOutputPath); - } - } - - await build(bundleConfig); - if (process.env.RM_TMPDIR !== 'none') { - rimraf.sync(paths.absTmpPath); - } - } catch (err) { - // throw build error - throw err; - } - }, - }); -} diff --git a/packages/fes-builder-vite/src/common/connectHistoryMiddleware.js b/packages/fes-builder-vite/src/common/connectHistoryMiddleware.js deleted file mode 100644 index 3a6a864a..00000000 --- a/packages/fes-builder-vite/src/common/connectHistoryMiddleware.js +++ /dev/null @@ -1,15 +0,0 @@ -import { join } from 'path'; -import { pathExistsSync } from 'fs-extra'; -import historyFallback from 'connect-history-api-fallback'; - -const proxyMiddleware = (viteConfig, params) => (req, res, next) => { - const fileName = join(viteConfig.publicDir, req.url); - if (req.url.length > 1 && req.url.startsWith('/') && pathExistsSync(fileName)) { - return next(); - } - - const history = historyFallback(params); - history(req, res, next); -}; - -export default proxyMiddleware; diff --git a/packages/fes-builder-vite/src/features/viteOption.js b/packages/fes-builder-vite/src/features/viteOption.js deleted file mode 100644 index 5185d234..00000000 --- a/packages/fes-builder-vite/src/features/viteOption.js +++ /dev/null @@ -1,11 +0,0 @@ -export default (api) => { - api.describe({ - key: 'viteOption', - config: { - schema(joi) { - return joi.object(); - }, - default: {}, - }, - }); -}; diff --git a/packages/fes-builder-vite/src/index.js b/packages/fes-builder-vite/src/index.js deleted file mode 100644 index 101a2fd4..00000000 --- a/packages/fes-builder-vite/src/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import process from 'node:process'; - -export default function () { - process.env.VITE_CJS_IGNORE_WARNING = 'true'; - - return { - plugins: [ - require.resolve('./registerBuilder'), - require.resolve('./registerMethods'), - require.resolve('./registerType'), - - // bundle configs - require.resolve('./features/viteHtml'), - require.resolve('./features/viteOption'), - require.resolve('./features/viteVueJsx'), - require.resolve('./features/viteVuePlugin'), - require.resolve('./features/viteAnalyze'), - require.resolve('./features/viteLegacy'), - - // commands - require.resolve('./commands/build'), - require.resolve('./commands/dev'), - ], - }; -} diff --git a/packages/fes-builder-vite/src/registerBuilder.js b/packages/fes-builder-vite/src/registerBuilder.js deleted file mode 100644 index 12c0a2d5..00000000 --- a/packages/fes-builder-vite/src/registerBuilder.js +++ /dev/null @@ -1,5 +0,0 @@ -export default function (api) { - api.registerBuilder({ - name: 'vite', - }); -} diff --git a/packages/fes-builder-vite/types.d.ts b/packages/fes-builder-vite/types.d.ts deleted file mode 100644 index e1fcc185..00000000 --- a/packages/fes-builder-vite/types.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type {UserConfig} from 'vite'; -import type {Options} from '@vitejs/plugin-vue' -import {Options as PolyfillOptions } from '@vitejs/plugin-legacy' -import createPlugin from '@vitejs/plugin-vue-jsx' -import {createHtmlPlugin} from 'vite-plugin-html' - -declare module "@fesjs/fes" { - interface PluginBuildConfig { - viteOption?: UserConfig; - viteVuePlugin?: Options; - viteVueJsx?: Parameters[0]; - viteLegacy?: PolyfillOptions; - viteHtml?: Parameters[0] - } -} \ No newline at end of file diff --git a/packages/fes-builder-webpack/src/index.js b/packages/fes-builder-webpack/src/index.js deleted file mode 100644 index a7864d3c..00000000 --- a/packages/fes-builder-webpack/src/index.js +++ /dev/null @@ -1,35 +0,0 @@ -export default function () { - return { - plugins: [ - require.resolve('./plugins/registerBuilder'), - - // register methods - require.resolve('./plugins/registerMethods'), - require.resolve('./plugins/registerType'), - - // bundle configs - require.resolve('./plugins/features/analyze'), - require.resolve('./plugins/features/chainWebpack'), - require.resolve('./plugins/features/cssLoader'), - require.resolve('./plugins/features/copy'), - require.resolve('./plugins/features/devServer'), - require.resolve('./plugins/features/devtool'), - require.resolve('./plugins/features/externals'), - require.resolve('./plugins/features/exportStatic'), - require.resolve('./plugins/features/extraBabelPlugins'), - require.resolve('./plugins/features/extraBabelPresets'), - require.resolve('./plugins/features/extraPostCSSPlugins'), - require.resolve('./plugins/features/html'), - require.resolve('./plugins/features/lessLoader'), - require.resolve('./plugins/features/postcssLoader'), - require.resolve('./plugins/features/nodeModulesTransform'), - require.resolve('./plugins/features/vueLoader'), - require.resolve('./plugins/features/extraCSS'), - - // commands - require.resolve('./plugins/commands/build'), - require.resolve('./plugins/commands/dev'), - require.resolve('./plugins/commands/webpack'), - ], - }; -} diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/html.js b/packages/fes-builder-webpack/src/plugins/common/webpackConfig/html.js deleted file mode 100644 index a598b0a3..00000000 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/html.js +++ /dev/null @@ -1,82 +0,0 @@ -import { join, resolve } from 'path'; -import { existsSync } from 'fs'; -import { winPath, resolveRuntimeEnv } from '@fesjs/utils'; - -export default async function createHtmlWebpackConfig({ api, cwd, config, webpackConfig, headScripts, isProd, publicPath }) { - const htmlOptions = { - filename: '[name].html', - ...config.html, - templateParameters: { - title: api.config.title || config.html?.title || 'fes.js', - ...resolveRuntimeEnv(publicPath), - mountElementId: config.mountElementId, - }, - }; - - if (isProd) { - Object.assign(htmlOptions, { - minify: { - removeComments: true, - collapseWhitespace: true, - collapseBooleanAttributes: true, - removeScriptTypeAttributes: true, - // more options: - // https://github.com/kangax/html-minifier#options-quick-reference - }, - }); - } - - const htmlPath = join(cwd, 'index.html'); - const defaultHtmlPath = resolve(__dirname, 'index-default.html'); - const publicCopyIgnore = []; - - // default, single page setup. - htmlOptions.template = existsSync(htmlPath) ? htmlPath : defaultHtmlPath; - - publicCopyIgnore.push(winPath(htmlOptions.template)); - - webpackConfig.plugin('html').use(require.resolve('html-webpack-plugin'), [htmlOptions]); - - // 如果需要导出html,则根据路由生成对应的html文件 - if (config.exportStatic) { - const routes = await api.getRoutes(); - const addHtml = (_routes) => { - if (Array.isArray(_routes)) { - _routes.forEach((route) => { - const _fileName = `${route.path.slice(1) || 'index'}.html`; - if (_fileName !== 'index.html') { - const _htmlOptions = { - ...config.html, - filename: _fileName, - templateParameters: { - title: route?.meta?.title || config.html.title || api.config.title || 'fes.js', - ...resolveRuntimeEnv(publicPath), - mountElementId: config.mountElementId, - }, - }; - webpackConfig.plugin(_fileName).use(require.resolve('html-webpack-plugin'), [_htmlOptions]); - } - if (route.children && route.children.length) { - addHtml(route.children); - } - }); - } - }; - addHtml(routes); - } - - if (headScripts) { - const headScriptsMap = await headScripts(); - webpackConfig.plugin('html-tags').use(require.resolve('html-webpack-tags-plugin'), [ - { - append: false, - scripts: headScriptsMap.map((script) => ({ - path: script.src, - })), - }, - ]); - } - return { - publicCopyIgnore, - }; -} diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/pitcher.js b/packages/fes-builder-webpack/src/plugins/common/webpackConfig/pitcher.js deleted file mode 100644 index 0af92651..00000000 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/pitcher.js +++ /dev/null @@ -1,10 +0,0 @@ -const pitcher = (code) => code; - -export const pitch = function () { - const context = this; - if (/&blockType=config/.test(context.resourceQuery)) { - return ''; - } -}; - -export default pitcher; diff --git a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/vue.js b/packages/fes-builder-webpack/src/plugins/common/webpackConfig/vue.js deleted file mode 100644 index e180b9c5..00000000 --- a/packages/fes-builder-webpack/src/plugins/common/webpackConfig/vue.js +++ /dev/null @@ -1,25 +0,0 @@ -export default function createVueWebpackConfig({ config, webpackConfig }) { - webpackConfig.module - .rule('vue') - .test(/\.vue$/) - .use('vue-loader') - .loader(require.resolve('vue-loader')) - .options({ - babelParserPlugins: ['jsx', 'classProperties', 'decorators-legacy'], - ...(config.vueLoader || {}), - }) - .end(); - - webpackConfig.module - .rule('vue-custom') - .resourceQuery((query) => { - if (!query) { - return false; - } - return query.startsWith('?vue&type=custom'); - }) - .use('vue-custom-loader') - .loader(require.resolve('./pitcher')); - - webpackConfig.plugin('vue-loader-plugin').use(require('vue-loader').VueLoaderPlugin); -} diff --git a/packages/fes-builder-webpack/src/plugins/registerBuilder.js b/packages/fes-builder-webpack/src/plugins/registerBuilder.js deleted file mode 100644 index 3151799a..00000000 --- a/packages/fes-builder-webpack/src/plugins/registerBuilder.js +++ /dev/null @@ -1,5 +0,0 @@ -export default function (api) { - api.registerBuilder({ - name: 'webpack', - }); -} diff --git a/packages/fes-builder-webpack/types.d.ts b/packages/fes-builder-webpack/types.d.ts deleted file mode 100644 index 88786413..00000000 --- a/packages/fes-builder-webpack/types.d.ts +++ /dev/null @@ -1,63 +0,0 @@ -import Config from 'webpack-5-chain'; -import webpack from 'webpack'; -import HtmlWebpackPlugin from 'html-webpack-plugin'; -import { LoaderOptions, PluginOptions } from 'mini-css-extract-plugin'; - -interface CopyFileType { - from: string; - to: string; -} - -declare module '@fesjs/fes' { - interface PluginBuildConfig { - analyze?: { - analyzerMode?: 'server' | 'static' | 'disabled'; - analyzerHost?: string; - analyzerPort?: number | 'auto'; - openAnalyzer?: boolean; - generateStatsFile?: boolean; - statsFilename?: string; - logLevel?: 'info' | 'warn' | 'error' | 'silent'; - defaultSizes?: 'stat' | 'parsed' | 'gzip'; - }; - chainWebpack?: (memo: Config, args: { env: string; webpack: typeof webpack }) => void; - copy?: CopyFileType | CopyFileType[]; - cssLoader?: { - url?: boolean | ((url: string, resourcePath: string) => boolean); - import?: boolean | { filter: (url: string, media: string, resourcePath: string) => boolean }; - modules?: boolean | string | object; - sourceMap?: boolean; - importLoaders?: number; - onlyLocals?: boolean; - esModule?: boolean; - localsConvention?: 'asIs' | 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly'; - }; - devServer?: { - port?: number; - host?: string; - https?: boolean; - headers?: object; - [key: string]: any; - }; - devtool?: string; - exportStatic?: { - htmlSuffix?: boolean; - dynamicRoot?: boolean; - }; - externals?: object | string | Function; - extraBabelPlugins?: []; - extraBabelPresets?: []; - extraPostCSSPlugins?: []; - html?: HtmlWebpackPlugin.Options; - lessLoader?: Record; - nodeModulesTransform?: { - exclude: string[]; - }; - postcssLoader?: Record; - vueLoader?: object; - extraCSS?: { - loader?: LoaderOptions; - plugin?: PluginOptions; - }; - } -} diff --git a/packages/fes-compiler/src/config/utils/configUtils.js b/packages/fes-compiler/src/config/utils/configUtils.js deleted file mode 100644 index b767906c..00000000 --- a/packages/fes-compiler/src/config/utils/configUtils.js +++ /dev/null @@ -1,16 +0,0 @@ -import { lodash } from '@fesjs/utils'; - -export function updateUserConfigWithKey({ - key, - value, - userConfig, -}) { - lodash.set(userConfig, key, value); -} - -export function getUserConfigWithKey({ - key, - userConfig, -}) { - return lodash.get(userConfig, key); -} diff --git a/packages/fes-compiler/src/config/utils/isEqual.js b/packages/fes-compiler/src/config/utils/isEqual.js deleted file mode 100644 index 2e36d326..00000000 --- a/packages/fes-compiler/src/config/utils/isEqual.js +++ /dev/null @@ -1,16 +0,0 @@ -import { lodash } from '@fesjs/utils'; - -function funcToStr(obj) { - if (typeof obj === 'function') return obj.toString(); - if (lodash.isPlainObject(obj)) { - return Object.keys(obj).reduce((memo, key) => { - memo[key] = funcToStr(obj[key]); - return memo; - }, {}); - } - return obj; -} - -export default function (a, b) { - return lodash.isEqual(funcToStr(a), funcToStr(b)); -} diff --git a/packages/fes-compiler/src/index.js b/packages/fes-compiler/src/index.js deleted file mode 100644 index 2645aff1..00000000 --- a/packages/fes-compiler/src/index.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/tree/master/packages/core - */ - -import Config from './config'; -import Service from './service'; -import PluginAPI from './service/pluginAPI'; -import { PluginType } from './service/enums'; -import { isPluginOrPreset } from './service/utils/pluginUtils'; - -export { Config, Service, PluginAPI, isPluginOrPreset, PluginType }; diff --git a/packages/fes-compiler/src/service/babelRegister.js b/packages/fes-compiler/src/service/babelRegister.js deleted file mode 100644 index 42e8dac0..00000000 --- a/packages/fes-compiler/src/service/babelRegister.js +++ /dev/null @@ -1,56 +0,0 @@ -import { lodash, winPath } from '@fesjs/utils'; - -export default class BabelRegister { - only = {}; - - setOnlyMap({ key, value }) { - this.only[key] = value; - this.register(); - } - - register() { - const only = lodash.uniq( - Object.keys(this.only) - .reduce((memo, key) => memo.concat(this.only[key]), []) - .map(winPath), - ); - require('@babel/register')({ - presets: [ - [ - require.resolve('@babel/preset-env'), - { - targets: { - node: 'current', - }, - modules: 'commonjs', - }, - ], - ], - plugins: [ - function () { - return { - visitor: { - ExportAllDeclaration(path) { - if (path.node.source.value.startsWith('@@')) { - path.remove(); - } - }, - }, - }; - }, - ], - only: [ - ...only, - function (filepath) { - if (/@fesjs[/\\]+fes/.test(filepath)) { - return true; - } - return false; - }, - ], - extensions: ['.jsx', '.js', '.ts', '.tsx'], - babelrc: false, - cache: false, - }); - } -} diff --git a/packages/fes-compiler/src/service/enums.js b/packages/fes-compiler/src/service/enums.js deleted file mode 100644 index ff6c2499..00000000 --- a/packages/fes-compiler/src/service/enums.js +++ /dev/null @@ -1,33 +0,0 @@ -export const PluginType = { - preset: 'preset', - plugin: 'plugin', - builder: 'builder', -}; - -export const ServiceStage = { - uninitialized: 0, - constructor: 1, - init: 2, - initPlugins: 3, - initHooks: 4, - pluginReady: 5, - getConfig: 6, - getPaths: 7, - run: 8, -}; - -export const ConfigChangeType = { - reload: 'reload', - regenerateTmpFiles: 'regenerateTmpFiles', -}; - -export const ApplyPluginsType = { - add: 'add', - modify: 'modify', - event: 'event', -}; - -export const EnableBy = { - register: 'register', - config: 'config', -}; diff --git a/packages/fes-compiler/src/service/getPaths.js b/packages/fes-compiler/src/service/getPaths.js deleted file mode 100644 index d0e2bcb4..00000000 --- a/packages/fes-compiler/src/service/getPaths.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copy 该文件代码大部分出自 umi,有需要请参考: - * https://github.com/umijs/umi/tree/master/packages/core - */ - -import { join } from 'path'; -import { existsSync, statSync } from 'fs'; -import { lodash, winPath } from '@fesjs/utils'; - -function isDirectoryAndExist(path) { - return existsSync(path) && statSync(path).isDirectory(); -} - -function normalizeWithWinPath(obj) { - return lodash.mapValues(obj, (value) => winPath(value)); -} - -export default function getServicePaths({ cwd, config, env }) { - let absSrcPath = cwd; - if (isDirectoryAndExist(join(cwd, 'src'))) { - absSrcPath = join(cwd, 'src'); - } - - const absPagesPath = config.singular ? join(absSrcPath, 'page') : join(absSrcPath, 'pages'); - - const tmpDir = ['.fes', env !== 'development' && env].filter(Boolean).join('-'); - return normalizeWithWinPath({ - tmpDir, - cwd, - absNodeModulesPath: join(cwd, 'node_modules'), - absOutputPath: join(cwd, config.outputPath || './dist'), - absSrcPath, - absPagesPath, - absTmpPath: join(absSrcPath, tmpDir), - }); -} diff --git a/packages/fes-compiler/src/service/utils/isPromise.js b/packages/fes-compiler/src/service/utils/isPromise.js deleted file mode 100644 index f3ca143a..00000000 --- a/packages/fes-compiler/src/service/utils/isPromise.js +++ /dev/null @@ -1,7 +0,0 @@ -export default function isPromise(obj) { - return ( - !!obj - && (typeof obj === 'object' || typeof obj === 'function') - && typeof obj.then === 'function' - ); -} diff --git a/packages/fes-compiler/src/service/utils/pluginUtils.js b/packages/fes-compiler/src/service/utils/pluginUtils.js deleted file mode 100644 index 8e3f4fb0..00000000 --- a/packages/fes-compiler/src/service/utils/pluginUtils.js +++ /dev/null @@ -1,167 +0,0 @@ -import { dirname, join, basename, relative, extname } from 'path'; -import { compatESModuleRequire, resolve, winPath, pkgUp, lodash, chalk } from '@fesjs/utils'; - -import { PluginType } from '../enums'; - -const RE = { - [PluginType.plugin]: /^(@fesjs\/|@webank\/fes-|fes-)plugin-/, - [PluginType.preset]: /^(@fesjs\/|@webank\/fes-|fes-)preset-/, - [PluginType.builder]: /^(@fesjs\/|@webank\/fes-|fes-)builder-/, -}; - -export function isPluginOrPreset(type, name) { - const hasScope = name.charAt(0) === '@'; - const re = RE[type]; - if (hasScope) { - return re.test(name.split('/')[1]) || re.test(name); - } - return re.test(name); -} - -function filterBuilder(opts) { - const builders = Object.keys(opts.pkg.devDependencies || {}) - .concat(Object.keys(opts.pkg.dependencies || {})) - .filter(isPluginOrPreset.bind(null, PluginType.builder)) - .filter((builder) => builder.indexOf(opts.builder || '') !== -1); - if (builders.length > 1) { - console.log(chalk.yellow(`提示:您使用了多个builder,默认使用第一个${builders[0]}`)); - return builders[0]; - } - return builders; -} - -function filterPluginAndPreset(type, opts) { - const base = Object.keys(opts.pkg.devDependencies || {}) - .concat(Object.keys(opts.pkg.dependencies || {})) - .filter(isPluginOrPreset.bind(null, type)); - if (type === PluginType.preset) { - return base.concat(filterBuilder(opts)); - } - if (type === PluginType.plugin) { - return base.concat(join(__dirname, '../plugins/builder.js')); - } - return base; -} - -export function getPluginsOrPresets(type, opts) { - const upperCaseType = type.toUpperCase(); - return [ - // opts - ...(opts[type === PluginType.preset ? 'presets' : 'plugins'] || []), - // env - ...(process.env[`FES_${upperCaseType}S`] || '').split(',').filter(Boolean), - ...filterPluginAndPreset(type, opts), - // user config - ...(opts[type === PluginType.preset ? 'userConfigPresets' : 'userConfigPlugins'] || []), - ].map((path) => - resolve.sync(path, { - basedir: opts.cwd, - extensions: ['.js', '.ts'], - }), - ); -} - -// e.g. -// initial-state -> initialState -// webpack.css-loader -> webpack.cssLoader -function nameToKey(name) { - return name - .split('.') - .map((part) => lodash.camelCase(part)) - .join('.'); -} - -function pkgNameToKey(pkgName, type) { - if (pkgName.charAt(0) === '@' && !pkgName.startsWith('@fesjs/')) { - pkgName = pkgName.split('/')[1]; - } - return nameToKey(pkgName.replace(RE[type], '')); -} - -export function pathToObj({ path, type, cwd }) { - let pkg = null; - let isPkgPlugin = false; - const pkgJSONPath = pkgUp.sync({ cwd: path }); - if (pkgJSONPath) { - // eslint-disable-next-line - pkg = require(pkgJSONPath); - isPkgPlugin = winPath(join(dirname(pkgJSONPath), pkg.main || 'index.js')) === winPath(path); - } - - let id; - if (isPkgPlugin) { - id = pkg.name; - } else if (winPath(path).startsWith(winPath(cwd))) { - id = `./${winPath(relative(cwd, path))}`; - } else if (pkgJSONPath) { - id = winPath(join(pkg.name, relative(dirname(pkgJSONPath), path))); - } else { - id = winPath(path); - } - id = id.replace('@fesjs/preset-built-in/lib/plugins', '@@'); - id = id.replace(/\.js$/, ''); - - const key = isPkgPlugin ? pkgNameToKey(pkg.name, type) : nameToKey(basename(path, extname(path))); - - return { - id, - key, - path: winPath(path), - apply() { - // use function to delay require - try { - // eslint-disable-next-line - const ret = require(path); - // use the default member for es modules - return compatESModuleRequire(ret); - } catch (e) { - throw new Error(`Register ${path} failed, since ${e.message}`); - } - }, - defaultConfig: null, - }; -} - -export function resolvePresets(opts) { - const type = PluginType.preset; - const presets = [...getPluginsOrPresets(type, opts)]; - return presets - .map((path) => - pathToObj({ - type, - path, - cwd: opts.cwd, - }), - ) - .sort((a, b) => { - if (a.id === '@fesjs/preset-built-in') { - return -1; - } - if (b.id === '@fesjs/preset-built-in') { - return 1; - } - if (/^(@fesjs\/|@webank\/fes-|fes-)builder-/.test(a.id)) { - return -1; - } - if (/^(@fesjs\/|@webank\/fes-|fes-)builder-/.test(b.id)) { - return 1; - } - return 0; - }); -} - -export function resolvePlugins(opts) { - const type = PluginType.plugin; - const plugins = getPluginsOrPresets(type, opts); - return plugins.map((path) => - pathToObj({ - path, - type, - cwd: opts.cwd, - }), - ); -} - -export function isValidPlugin(plugin) { - return plugin.id && plugin.key && plugin.apply; -} diff --git a/packages/fes-plugin-access/build.config.js b/packages/fes-plugin-access/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-access/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-enums/build.config.js b/packages/fes-plugin-enums/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-enums/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-icon/build.config.js b/packages/fes-plugin-icon/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-icon/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-jest/README.md b/packages/fes-plugin-jest/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-jest/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-jest/helpers/transformers/javascript.js b/packages/fes-plugin-jest/helpers/transformers/javascript.js deleted file mode 100644 index 0b55f913..00000000 --- a/packages/fes-plugin-jest/helpers/transformers/javascript.js +++ /dev/null @@ -1,8 +0,0 @@ -const babelJest = require('babel-jest').default; - -module.exports = babelJest.createTransformer({ - presets: [['@babel/preset-env', { targets: { node: 'current' } }]], - plugins: ['@vue/babel-plugin-jsx'], - babelrc: false, - configFile: false, -}); diff --git a/packages/fes-plugin-jest/package.json b/packages/fes-plugin-jest/package.json deleted file mode 100644 index a646a0b8..00000000 --- a/packages/fes-plugin-jest/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "@fesjs/plugin-jest", - "version": "3.1.2", - "description": "@fesjs/plugin-jest", - "author": "harrywan", - "license": "MIT", - "homepage": "https://github.com/WeBankFinTech/fes.js#readme", - "repository": { - "type": "git", - "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-plugin-jest" - }, - "bugs": { - "url": "https://github.com/WeBankFinTech/fes.js/issues" - }, - "keywords": [ - "fes", - "unit", - "jest" - ], - "main": "lib/index.js", - "files": [ - "helpers", - "lib" - ], - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "publishConfig": { - "access": "public" - }, - "peerDependencies": { - "@fesjs/fes": "^3.1.10" - }, - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@vue/babel-plugin-jsx": "^1.2.2", - "@vue/vue3-jest": "^29.2.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "jest-transform-stub": "^2.0.0", - "jest-watch-typeahead": "^2.2.2", - "ts-jest": "^29.1.0", - "typescript": "^5.0.4" - } -} diff --git a/packages/fes-plugin-jest/src/createDefaultConfig.js b/packages/fes-plugin-jest/src/createDefaultConfig.js deleted file mode 100644 index 4cd43fac..00000000 --- a/packages/fes-plugin-jest/src/createDefaultConfig.js +++ /dev/null @@ -1,57 +0,0 @@ -import { existsSync } from 'fs'; -import { join } from 'path'; - -export default (cwd, args) => { - const testMatchTypes = ['spec', 'test']; - if (args.e2e) { - testMatchTypes.push('e2e'); - } - const hasSrc = existsSync(join(cwd, 'src')); - return { - collectCoverageFrom: [ - 'index.{js,ts,jsx,tsx,vue}', - hasSrc && 'src/**/*.{js,ts,jsx,tsx,vue}', - '!**/.fes/**', - '!**/typings/**', - '!**/types/**', - '!**/fixtures/**', - '!**/examples/**', - '!**/*.d.ts', - ].filter(Boolean), - moduleFileExtensions: [ - 'js', - 'jsx', - 'ts', - 'tsx', - 'json', - // tell Jest to handle *.vue files - 'vue', - ], - transform: { - '.+\\.(css|styl|less|sass|scss|jpg|jpeg|png|svg|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': - require.resolve('jest-transform-stub'), - // process *.vue files with vue-jest - '^.+\\.vue$': require.resolve('@vue/vue3-jest'), - '^.+\\.jsx?$': require.resolve('../helpers/transformers/javascript'), - // process *.ts files with ts-jest - '^.+\\.tsx?$': [ - require.resolve('ts-jest'), - { - // ts-jest configuration goes here - }, - ], - }, - transformIgnorePatterns: ['/node_modules/'], - // support the same @ -> src alias mapping in source code - moduleNameMapper: { - '^@/(.*)$': '/src/$1', - }, - testMatch: [`**/tests/**/*.(${testMatchTypes.join('|')}).[jt]s?(x)`, '**/__tests__/**/*.[jt]s?(x)'], - // https://github.com/facebook/jest/issues/6766 - testEnvironmentOptions: { - url: 'http://localhost/', - }, - watchPlugins: [require.resolve('jest-watch-typeahead/filename'), require.resolve('jest-watch-typeahead/testname')], - verbose: true, - }; -}; diff --git a/packages/fes-plugin-jest/src/index.js b/packages/fes-plugin-jest/src/index.js deleted file mode 100644 index 70ff1e03..00000000 --- a/packages/fes-plugin-jest/src/index.js +++ /dev/null @@ -1,93 +0,0 @@ -import assert from 'assert'; -import { join } from 'path'; -import { existsSync } from 'fs'; -// jest-cli 不在暴露 options,维护一份本地的 options -import { options as CliOptions } from './jestArgs'; -import createDefaultConfig from './createDefaultConfig'; - -function getCommandOptiton() { - const opts = []; - Object.keys(CliOptions).forEach((key) => { - const option = CliOptions[key]; - const opt = {}; - if (key !== 'version') { - if (option.alias) { - opt.name = `-${option.alias} --${key}`; - } else { - opt.name = `--${key}`; - } - opt.description = option.description; - opts.push(opt); - } - }); - return opts; -} - -export default function (api) { - const { - utils: { mergeConfig, logger }, - cwd, - } = api; - - api.registerCommand({ - command: 'test', - description: 'run unit tests with jest', - options: getCommandOptiton(), - async fn({ args }) { - process.env.NODE_ENV = 'test'; - - if (args._[0] === 'test') { - args._.shift(); - } - - args.debug && logger.info(`args: ${JSON.stringify(args)}`); - - // Read config from cwd/jest.config.js - const userJestConfigFile = join(cwd, 'jest.config.js'); - const userJestConfig = existsSync(userJestConfigFile) && require(userJestConfigFile); - args.debug && logger.info(`config from jest.config.js: ${JSON.stringify(userJestConfig)}`); - - // Read jest config from package.json - const packageJSONPath = join(cwd, 'package.json'); - const packageJestConfig = existsSync(packageJSONPath) && require(packageJSONPath).jest; - args.debug && logger.info(`jest config from package.json: ${JSON.stringify(packageJestConfig)}`); - - // Merge configs - // user config and args config could have value function for modification - const config = mergeConfig(createDefaultConfig(cwd, args), packageJestConfig, userJestConfig); - args.debug && logger.info(`final config: ${JSON.stringify(config)}`); - - // Generate jest options - const argsConfig = Object.keys(CliOptions).reduce((prev, name) => { - if (args[name]) prev[name] = args[name]; - - // Convert alias args into real one - const { alias } = CliOptions[name]; - if (alias && args[alias]) prev[name] = args[alias]; - return prev; - }, {}); - args.debug && logger.info(`config from args: ${JSON.stringify(argsConfig)}`); - - // 比较大的库建议使用require,使用时才加载,提升fes命令的效率 - const { runCLI } = require('jest'); - // Run jest - const result = await runCLI( - { - // @ts-ignore - _: args._ || [], - // @ts-ignore - $0: args.$0 || '', - // 必须是单独的 config 配置,值为 string,否则不生效 - // @ts-ignore - config: JSON.stringify(config), - ...argsConfig, - }, - [cwd], - ); - args.debug && logger.info(result); - - // Throw error when run failed - assert(result.results.success, 'Test with jest failed'); - }, - }); -} diff --git a/packages/fes-plugin-jest/src/jestArgs.js b/packages/fes-plugin-jest/src/jestArgs.js deleted file mode 100644 index 2c9532a4..00000000 --- a/packages/fes-plugin-jest/src/jestArgs.js +++ /dev/null @@ -1,546 +0,0 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -export const usage = 'Usage: $0 [--config=] [TestPathPattern]'; -export const docs = 'Documentation: https://jestjs.io/'; - -// The default values are all set in jest-config -export const options = { - all: { - description: - 'The opposite of `onlyChanged`. If `onlyChanged` is set by ' + - 'default, running jest with `--all` will force Jest to run all tests ' + - 'instead of running only tests related to changed files.', - type: 'boolean', - }, - automock: { - description: 'Automock all files by default.', - type: 'boolean', - }, - bail: { - alias: 'b', - description: 'Exit the test suite immediately after `n` number of failing tests.', - type: 'boolean', - }, - browser: { - description: - 'Respect the "browser" field in package.json ' + - 'when resolving modules. Some packages export different versions ' + - 'based on whether they are operating in node.js or a browser.', - type: 'boolean', - }, - cache: { - description: 'Whether to use the transform cache. Disable the cache ' + 'using --no-cache.', - type: 'boolean', - }, - cacheDirectory: { - description: 'The directory where Jest should store its cached ' + ' dependency information.', - type: 'string', - }, - changedFilesWithAncestor: { - description: 'Runs tests related to the current changes and the changes made in the ' + 'last commit. Behaves similarly to `--onlyChanged`.', - type: 'boolean', - }, - changedSince: { - description: - 'Runs tests related to the changes since the provided branch. If the ' + - 'current branch has diverged from the given branch, then only changes ' + - 'made locally will be tested. Behaves similarly to `--onlyChanged`.', - nargs: 1, - type: 'string', - }, - ci: { - description: - 'Whether to run Jest in continuous integration (CI) mode. ' + - 'This option is on by default in most popular CI environments. It will ' + - 'prevent snapshots from being written unless explicitly requested.', - type: 'boolean', - }, - clearCache: { - description: 'Clears the configured Jest cache directory and then exits. ' + 'Default directory can be found by calling jest --showConfig', - type: 'boolean', - }, - clearMocks: { - description: 'Automatically clear mock calls and instances between every ' + 'test. Equivalent to calling jest.clearAllMocks() between each test.', - type: 'boolean', - }, - collectCoverage: { - description: 'Alias for --coverage.', - type: 'boolean', - }, - collectCoverageFrom: { - description: 'A glob pattern relative to matching the files that coverage ' + 'info needs to be collected from.', - type: 'string', - }, - collectCoverageOnlyFrom: { - description: 'Explicit list of paths coverage will be restricted to.', - string: true, - type: 'array', - }, - color: { - description: 'Forces test results output color highlighting (even if ' + 'stdout is not a TTY). Set to false if you would like to have no colors.', - type: 'boolean', - }, - colors: { - description: 'Alias for `--color`.', - type: 'boolean', - }, - config: { - alias: 'c', - description: - 'The path to a jest config file specifying how to find ' + - 'and execute tests. If no rootDir is set in the config, the directory ' + - 'containing the config file is assumed to be the rootDir for the project.' + - 'This can also be a JSON encoded value which Jest will use as configuration.', - type: 'string', - }, - coverage: { - description: 'Indicates that test coverage information should be ' + 'collected and reported in the output.', - type: 'boolean', - }, - coverageDirectory: { - description: 'The directory where Jest should output its coverage files.', - type: 'string', - }, - coveragePathIgnorePatterns: { - description: - 'An array of regexp pattern strings that are matched ' + - 'against all file paths before executing the test. If the file path' + - 'matches any of the patterns, coverage information will be skipped.', - string: true, - type: 'array', - }, - coverageProvider: { - choices: ['babel', 'v8'], - description: 'Select between Babel and V8 to collect coverage', - }, - coverageReporters: { - description: 'A list of reporter names that Jest uses when writing ' + 'coverage reports. Any istanbul reporter can be used.', - string: true, - type: 'array', - }, - coverageThreshold: { - description: 'A JSON string with which will be used to configure ' + 'minimum threshold enforcement for coverage results', - type: 'string', - }, - debug: { - description: 'Print debugging info about your jest config.', - type: 'boolean', - }, - detectLeaks: { - description: - '**EXPERIMENTAL**: Detect memory leaks in tests. After executing a ' + - 'test, it will try to garbage collect the global object used, and fail ' + - 'if it was leaked', - type: 'boolean', - }, - detectOpenHandles: { - description: 'Print out remaining open handles preventing Jest from exiting at the ' + 'end of a test run. Implies `runInBand`.', - type: 'boolean', - }, - env: { - description: - 'The test environment used for all tests. This can point to ' + - 'any file or node module. Examples: `jsdom`, `node` or ' + - '`path/to/my-environment.js`', - type: 'string', - }, - errorOnDeprecated: { - description: 'Make calling deprecated APIs throw helpful error messages.', - type: 'boolean', - }, - expand: { - alias: 'e', - description: 'Use this flag to show full diffs instead of a patch.', - type: 'boolean', - }, - filter: { - description: - 'Path to a module exporting a filtering function. This method receives ' + - 'a list of tests which can be manipulated to exclude tests from ' + - 'running. Especially useful when used in conjunction with a testing ' + - 'infrastructure to filter known broken tests.', - type: 'string', - }, - findRelatedTests: { - description: - 'Find related tests for a list of source files that were ' + - 'passed in as arguments. Useful for pre-commit hook integration to run ' + - 'the minimal amount of tests necessary.', - type: 'boolean', - }, - forceExit: { - description: - 'Force Jest to exit after all tests have completed running. ' + - 'This is useful when resources set up by test code cannot be ' + - 'adequately cleaned up.', - type: 'boolean', - }, - globalSetup: { - description: 'The path to a module that runs before All Tests.', - type: 'string', - }, - globalTeardown: { - description: 'The path to a module that runs after All Tests.', - type: 'string', - }, - globals: { - description: 'A JSON string with map of global variables that need ' + 'to be available in all test environments.', - type: 'string', - }, - haste: { - description: 'A JSON string with map of variables for the haste module system', - type: 'string', - }, - init: { - description: 'Generate a basic configuration file', - type: 'boolean', - }, - injectGlobals: { - description: 'Should Jest inject global variables or not', - type: 'boolean', - }, - json: { - description: 'Prints the test results in JSON. This mode will send all ' + 'other test output and user messages to stderr.', - type: 'boolean', - }, - lastCommit: { - description: 'Run all tests affected by file changes in the last commit made. ' + 'Behaves similarly to `--onlyChanged`.', - type: 'boolean', - }, - listTests: { - description: - 'Lists all tests Jest will run given the arguments and ' + - 'exits. Most useful in a CI system together with `--findRelatedTests` ' + - 'to determine the tests Jest will run based on specific files', - type: 'boolean', - }, - logHeapUsage: { - description: 'Logs the heap usage after every test. Useful to debug ' + 'memory leaks. Use together with `--runInBand` and `--expose-gc` in ' + 'node.', - type: 'boolean', - }, - maxConcurrency: { - description: 'Specifies the maximum number of tests that are allowed to run' + 'concurrently. This only affects tests using `test.concurrent`.', - type: 'number', - }, - maxWorkers: { - alias: 'w', - description: - 'Specifies the maximum number of workers the worker-pool ' + - 'will spawn for running tests. This defaults to the number of the ' + - 'cores available on your machine. (its usually best not to override ' + - 'this default)', - type: 'string', - }, - moduleDirectories: { - description: 'An array of directory names to be searched recursively ' + "up from the requiring module's location.", - string: true, - type: 'array', - }, - moduleFileExtensions: { - description: - 'An array of file extensions your modules use. If you ' + - 'require modules without specifying a file extension, these are the ' + - 'extensions Jest will look for. ', - string: true, - type: 'array', - }, - moduleNameMapper: { - description: - 'A JSON string with a map from regular expressions to ' + - 'module names or to arrays of module names that allow to stub ' + - 'out resources, like images or styles with a single module', - type: 'string', - }, - modulePathIgnorePatterns: { - description: - 'An array of regexp pattern strings that are matched ' + - 'against all module paths before those paths are to be considered ' + - '"visible" to the module loader.', - string: true, - type: 'array', - }, - modulePaths: { - description: - 'An alternative API to setting the NODE_PATH env variable, ' + - 'modulePaths is an array of absolute paths to additional locations to ' + - 'search when resolving modules.', - string: true, - type: 'array', - }, - noStackTrace: { - description: 'Disables stack trace in test results output', - type: 'boolean', - }, - notify: { - description: 'Activates notifications for test results.', - type: 'boolean', - }, - notifyMode: { - description: 'Specifies when notifications will appear for test results.', - type: 'string', - }, - onlyChanged: { - alias: 'o', - description: - 'Attempts to identify which tests to run based on which ' + - "files have changed in the current repository. Only works if you're " + - 'running tests in a git or hg repository at the moment.', - type: 'boolean', - }, - onlyFailures: { - alias: 'f', - description: 'Run tests that failed in the previous execution.', - type: 'boolean', - }, - outputFile: { - description: 'Write test results to a file when the --json option is ' + 'also specified.', - type: 'string', - }, - passWithNoTests: { - description: 'Will not fail if no tests are found (for example while using `--testPathPattern`.)', - type: 'boolean', - }, - preset: { - description: "A preset that is used as a base for Jest's configuration.", - type: 'string', - }, - prettierPath: { - description: 'The path to the "prettier" module used for inline snapshots.', - type: 'string', - }, - projects: { - description: 'A list of projects that use Jest to run all tests of all ' + 'projects in a single instance of Jest.', - string: true, - type: 'array', - }, - reporters: { - description: 'A list of custom reporters for the test suite.', - string: true, - type: 'array', - }, - resetMocks: { - description: 'Automatically reset mock state between every test. ' + 'Equivalent to calling jest.resetAllMocks() between each test.', - type: 'boolean', - }, - resetModules: { - description: 'If enabled, the module registry for every test file will ' + 'be reset before running each individual test.', - type: 'boolean', - }, - resolver: { - description: 'A JSON string which allows the use of a custom resolver.', - type: 'string', - }, - restoreMocks: { - description: - 'Automatically restore mock state and implementation between every test. ' + 'Equivalent to calling jest.restoreAllMocks() between each test.', - type: 'boolean', - }, - rootDir: { - description: 'The root directory that Jest should scan for tests and ' + 'modules within.', - type: 'string', - }, - roots: { - description: 'A list of paths to directories that Jest should use to ' + 'search for files in.', - string: true, - type: 'array', - }, - runInBand: { - alias: 'i', - description: - 'Run all tests serially in the current process (rather than ' + - 'creating a worker pool of child processes that run tests). This ' + - 'is sometimes useful for debugging, but such use cases are pretty ' + - 'rare.', - type: 'boolean', - }, - runTestsByPath: { - description: - 'Used when provided patterns are exact file paths. This avoids ' + - 'converting them into a regular expression and matching it against ' + - 'every single file.', - type: 'boolean', - }, - runner: { - description: "Allows to use a custom runner instead of Jest's default test runner.", - type: 'string', - }, - selectProjects: { - description: 'Run only the tests of the specified projects.' + 'Jest uses the attribute `displayName` in the configuration to identify each project.', - string: true, - type: 'array', - }, - setupFiles: { - description: 'A list of paths to modules that run some code to configure or ' + 'set up the testing environment before each test. ', - string: true, - type: 'array', - }, - setupFilesAfterEnv: { - description: 'A list of paths to modules that run some code to configure or ' + 'set up the testing framework before each test ', - string: true, - type: 'array', - }, - showConfig: { - description: 'Print your jest config and then exits.', - type: 'boolean', - }, - silent: { - description: 'Prevent tests from printing messages through the console.', - type: 'boolean', - }, - skipFilter: { - description: 'Disables the filter provided by --filter. Useful for CI jobs, or ' + 'local enforcement when fixing tests.', - type: 'boolean', - }, - snapshotSerializers: { - description: 'A list of paths to snapshot serializer modules Jest should ' + 'use for snapshot testing.', - string: true, - type: 'array', - }, - testEnvironment: { - description: 'Alias for --env', - type: 'string', - }, - testEnvironmentOptions: { - description: 'Test environment options that will be passed to the testEnvironment. ' + 'The relevant options depend on the environment.', - type: 'string', // Object - }, - testFailureExitCode: { - description: 'Exit code of `jest` command if the test run failed', - type: 'string', // number - }, - testLocationInResults: { - description: 'Add `location` information to the test results', - type: 'boolean', - }, - testMatch: { - description: 'The glob patterns Jest uses to detect test files.', - string: true, - type: 'array', - }, - testNamePattern: { - alias: 't', - description: 'Run only tests with a name that matches the regex pattern.', - type: 'string', - }, - testPathIgnorePatterns: { - description: - 'An array of regexp pattern strings that are matched ' + - 'against all test paths before executing the test. If the test path ' + - 'matches any of the patterns, it will be skipped.', - string: true, - type: 'array', - }, - testPathPattern: { - description: 'A regexp pattern string that is matched against all tests ' + 'paths before executing the test.', - string: true, - type: 'array', - }, - testRegex: { - description: 'A string or array of string regexp patterns that Jest uses to detect test files.', - string: true, - type: 'array', - }, - testResultsProcessor: { - description: - 'Allows the use of a custom results processor. ' + - 'This processor must be a node module that exports ' + - 'a function expecting as the first argument the result object.', - type: 'string', - }, - testRunner: { - description: - 'Allows to specify a custom test runner. The default is' + - ' `jest-circus/runner`. A path to a custom test runner can be provided:' + - ' `/path/to/testRunner.js`.', - type: 'string', - }, - testSequencer: { - description: - 'Allows to specify a custom test sequencer. The default is ' + - '`@jest/test-sequencer`. A path to a custom test sequencer can be ' + - 'provided: `/path/to/testSequencer.js`', - type: 'string', - }, - testTimeout: { - description: 'This option sets the default timeouts of test cases.', - type: 'number', - }, - testURL: { - description: 'This option sets the URL for the jsdom environment.', - type: 'string', - }, - timers: { - description: 'Setting this value to fake allows the use of fake timers ' + 'for functions such as setTimeout.', - type: 'string', - }, - transform: { - description: 'A JSON string which maps from regular expressions to paths ' + 'to transformers.', - type: 'string', - }, - transformIgnorePatterns: { - description: 'An array of regexp pattern strings that are matched ' + 'against all source file paths before transformation.', - string: true, - type: 'array', - }, - unmockedModulePathPatterns: { - description: - 'An array of regexp pattern strings that are matched ' + - 'against all modules before the module loader will automatically ' + - 'return a mock for them.', - string: true, - type: 'array', - }, - updateSnapshot: { - alias: 'u', - description: - 'Use this flag to re-record snapshots. ' + - 'Can be used together with a test suite pattern or with ' + - '`--testNamePattern` to re-record snapshot for test matching ' + - 'the pattern', - type: 'boolean', - }, - useStderr: { - description: 'Divert all output to stderr.', - type: 'boolean', - }, - verbose: { - description: 'Display individual test results with the test suite hierarchy.', - type: 'boolean', - }, - version: { - alias: 'v', - description: 'Print the version and exit', - type: 'boolean', - }, - watch: { - description: - 'Watch files for changes and rerun tests related to ' + - 'changed files. If you want to re-run all tests when a file has ' + - 'changed, use the `--watchAll` option.', - type: 'boolean', - }, - watchAll: { - description: - 'Watch files for changes and rerun all tests. If you want ' + - 'to re-run only the tests related to the changed files, use the ' + - '`--watch` option.', - type: 'boolean', - }, - watchPathIgnorePatterns: { - description: - 'An array of regexp pattern strings that are matched ' + - 'against all paths before trigger test re-run in watch mode. ' + - 'If the test path matches any of the patterns, it will be skipped.', - string: true, - type: 'array', - }, - watchman: { - description: 'Whether to use watchman for file crawling. Disable using ' + '--no-watchman.', - type: 'boolean', - }, -}; diff --git a/packages/fes-plugin-layout/README.md b/packages/fes-plugin-layout/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-layout/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-layout/build.config.js b/packages/fes-plugin-layout/build.config.js deleted file mode 100644 index 87b511e5..00000000 --- a/packages/fes-plugin-layout/build.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - copy: ['runtime'], -}; diff --git a/packages/fes-plugin-locale/build.config.js b/packages/fes-plugin-locale/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-locale/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-login/README.md b/packages/fes-plugin-login/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-login/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-login/build.config.js b/packages/fes-plugin-login/build.config.js deleted file mode 100644 index 87b511e5..00000000 --- a/packages/fes-plugin-login/build.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - copy: ['runtime'], -}; diff --git a/packages/fes-plugin-model/README.md b/packages/fes-plugin-model/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-model/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-model/build.config.js b/packages/fes-plugin-model/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-model/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-monaco-editor/README.md b/packages/fes-plugin-monaco-editor/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-monaco-editor/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-monaco-editor/build.config.js b/packages/fes-plugin-monaco-editor/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-monaco-editor/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-pinia/README.md b/packages/fes-plugin-pinia/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-pinia/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-pinia/build.config.js b/packages/fes-plugin-pinia/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-pinia/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-qiankun/README.md b/packages/fes-plugin-qiankun/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-qiankun/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-qiankun/build.config.js b/packages/fes-plugin-qiankun/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-qiankun/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-qiankun/examples/webpack-micro/tsconfig.json b/packages/fes-plugin-qiankun/examples/webpack-micro/tsconfig.json deleted file mode 100644 index ea930c0b..00000000 --- a/packages/fes-plugin-qiankun/examples/webpack-micro/tsconfig.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "compilerOptions": { - "outDir": "build/dist", - "module": "esnext", - "target": "esnext", - "lib": ["esnext", "dom"], - "sourceMap": true, - "baseUrl": ".", - "jsx": "preserve", - "allowSyntheticDefaultImports": true, - "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, - "noImplicitReturns": true, - "suppressImplicitAnyIndexErrors": true, - "noUnusedLocals": true, - "allowJs": true, - "skipLibCheck": true, - "experimentalDecorators": true, - "strict": true, - "paths": { - "@/*": ["./src/*"], - "@@/*": ["./src/.fes/*"] - } - }, - "include": [ - "src/**/*", - "tests/**/*", - "test/**/*", - "__test__/**/*", - "typings/**/*", - "config/**/*", - ".eslintrc.js", - ".stylelintrc.js", - ".prettierrc.js" - ], - "exclude": ["node_modules", "build", "dist", "scripts", "src/.fes/*", "webpack", "jest"] -} diff --git a/packages/fes-plugin-request/README.md b/packages/fes-plugin-request/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-request/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-request/__tests__/request.js b/packages/fes-plugin-request/__tests__/request.js deleted file mode 100644 index a0a204d4..00000000 --- a/packages/fes-plugin-request/__tests__/request.js +++ /dev/null @@ -1,5 +0,0 @@ - - -test('button disabled', async () => { - expect(1).toBe(1); -}); diff --git a/packages/fes-plugin-request/build.config.js b/packages/fes-plugin-request/build.config.js deleted file mode 100644 index 3f24a7e2..00000000 --- a/packages/fes-plugin-request/build.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - copy: ['template'], -}; diff --git a/packages/fes-plugin-sass/.fatherrc.js b/packages/fes-plugin-sass/.fatherrc.js deleted file mode 100644 index 332f1bff..00000000 --- a/packages/fes-plugin-sass/.fatherrc.js +++ /dev/null @@ -1,3 +0,0 @@ -export default { - disableTypeCheck: false, -}; diff --git a/packages/fes-plugin-sass/README.md b/packages/fes-plugin-sass/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-sass/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-sass/package.json b/packages/fes-plugin-sass/package.json deleted file mode 100644 index 2cf48729..00000000 --- a/packages/fes-plugin-sass/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "@fesjs/plugin-sass", - "version": "3.0.0", - "description": "@fesjs/plugin-sass", - "main": "lib/index.js", - "files": [ - "lib", - "types.d.ts" - ], - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-plugin-sass" - }, - "keywords": [ - "fes" - ], - "author": "harrywan", - "license": "MIT", - "bugs": { - "url": "https://github.com/WeBankFinTech/fes.js/issues" - }, - "homepage": "https://github.com/WeBankFinTech/fes.js#readme", - "publishConfig": { - "access": "public" - }, - "dependencies": { - "sass": "^1.32.11", - "sass-loader": "^11.0.1" - }, - "peerDependencies": { - "@fesjs/fes": "^3.0.0" - }, - "typings": "./types.d.ts" -} diff --git a/packages/fes-plugin-vuex/README.md b/packages/fes-plugin-vuex/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-vuex/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-vuex/build.config.js b/packages/fes-plugin-vuex/build.config.js deleted file mode 100644 index 87b511e5..00000000 --- a/packages/fes-plugin-vuex/build.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - copy: ['runtime'], -}; diff --git a/packages/fes-plugin-vuex/package.json b/packages/fes-plugin-vuex/package.json deleted file mode 100644 index d8bcd500..00000000 --- a/packages/fes-plugin-vuex/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "@fesjs/plugin-vuex", - "version": "3.0.3", - "description": "@fesjs/plugin-vuex", - "main": "lib/index.js", - "files": [ - "lib", - "types.d.ts" - ], - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-plugin-vuex" - }, - "keywords": [ - "fes" - ], - "author": "aringlai", - "license": "MIT", - "bugs": { - "url": "https://github.com/WeBankFinTech/fes.js/issues" - }, - "homepage": "https://github.com/WeBankFinTech/fes.js#readme", - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@fesjs/utils": "^3.0.3" - }, - "peerDependencies": { - "@fesjs/fes": "^3.1.12", - "vue": "^3.2.47", - "vuex": "^4.0.0" - }, - "typings": "./types.d.ts" -} diff --git a/packages/fes-plugin-vuex/src/helper.js b/packages/fes-plugin-vuex/src/helper.js deleted file mode 100644 index 6b28e1f4..00000000 --- a/packages/fes-plugin-vuex/src/helper.js +++ /dev/null @@ -1,174 +0,0 @@ -import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'; -import { join } from 'node:path'; -import { parser, winPath } from '@fesjs/utils'; - -/** - * 获取文件夹所有JS文件路径 - * @param {string} dir - */ -function getDirFilePaths(dir) { - if (!existsSync(dir)) { - return []; - } - const dirs = readdirSync(dir); - let pathList = []; - for (const name of dirs) { - const path = winPath(join(dir, name)); - const info = statSync(path); - if (info.isDirectory()) { - pathList = pathList.concat(getDirFilePaths(path)); - } - else if (path.endsWith('.js')) { - pathList.push(path); - } - } - return pathList; -} - -/** - * 路径转驼峰 - * @param {*} path - */ -function pathToHump(path, root) { - return path - .replace(root, '') - .replace('.js', '') - .replace(RegExp('(/|\\.|-|_)\\S', 'g'), text => text[1].toUpperCase()) - .replace(/\S/, text => text.toLowerCase()); -} - -/** - * 获取vuex模块的mutations、actions、getters类型 - * @param {*} ast - * @param {*} name - */ -function getModelTypes(ast, name, namespace = '') { - const types = { - mutations: {}, - actions: {}, - getters: {}, - }; - let namespaced = false; - if (ast.type !== 'ObjectExpression') { return types; } - ast.properties.forEach((node) => { - if (node.key.name === 'namespaced' && node.value.value) { - namespaced = true; - return; - } - if (Object.keys(types).includes(node.key.name)) { - let type = types[node.key.name]; - if (namespaced) { - type = types[node.key.name][name]; - if (!type) { - type = types[node.key.name][name] = {}; - } - } - node.value.properties.forEach((prop) => { - const key = prop.key && prop.key.name; - if (key) { - type[key] = `${namespace}${namespaced ? `${name}/` : ''}${key}`; - } - }); - return; - } - if (node.key.name === 'modules') { - node.value.properties.forEach((prop) => { - const subTypes = getModelTypes(prop.value, prop.key.name, `${namespace}${namespaced ? `${name}/` : ''}`); - Object.keys(types).forEach((key) => { - if (namespaced) { - types[key][name] = { - ...subTypes[key], - ...types[key][name], - }; - } - else { - types[key] = { - ...subTypes[key], - ...types[key], - }; - } - }); - }); - } - }); - return types; -} - -/** - * 解析模块 - * @param {*} paths - * @param {*} root - */ -function parseModel(paths = [], root) { - const modules = []; - const importModules = []; - let MUTATION_TYPES = {}; - let ACTION_TYPES = {}; - let GETTER_TYPES = {}; - paths.forEach((path) => { - const moduleName = pathToHump(path, root); - importModules.push(`import ${moduleName} from '${path}'`); - modules.push(moduleName); - const content = readFileSync(path).toString('utf-8'); - let ast; - try { - ast = parser.parse(content, { - sourceType: 'module', - plugins: ['jsx', 'typescript'], - }); - ast = ast.program.body.filter(body => body.type === 'ExportDefaultDeclaration')[0]; - } - catch (err) { } - if (ast) { - const { mutations, actions, getters } = getModelTypes(ast.declaration, moduleName); - MUTATION_TYPES = { - ...mutations, - ...MUTATION_TYPES, - }; - ACTION_TYPES = { - ...actions, - ...ACTION_TYPES, - }; - GETTER_TYPES = { - ...getters, - ...GETTER_TYPES, - }; - } - }); - return { - modules, - importModules, - MUTATION_TYPES, - ACTION_TYPES, - GETTER_TYPES, - }; -} - -function parsePlugin(paths = [], root) { - const plugins = []; - const importPlugins = []; - paths.forEach((path) => { - const moduleName = pathToHump(path, root); - importPlugins.push(`import ${moduleName} from '${path}'`); - plugins.push(moduleName); - }); - return { plugins, importPlugins }; -} - -export function parseStore(root) { - const paths = getDirFilePaths(root); - const modelPaths = []; - const pluginPaths = []; - paths.forEach((path) => { - if (path.includes('plugin')) { - pluginPaths.push(path); - } - else { - modelPaths.push(path); - } - }); - return { - ...parsePlugin(pluginPaths, root), - ...parseModel(modelPaths, root), - }; -} diff --git a/packages/fes-plugin-vuex/src/index.js b/packages/fes-plugin-vuex/src/index.js deleted file mode 100644 index a9d1363c..00000000 --- a/packages/fes-plugin-vuex/src/index.js +++ /dev/null @@ -1,65 +0,0 @@ -import { readFileSync } from 'fs'; -import { join } from 'path'; -import { winPath } from '@fesjs/utils'; -import { parseStore } from './helper'; -import { name } from '../package.json'; - -const namespace = 'plugin-vuex'; - -export default (api) => { - const { - paths, - utils: { Mustache }, - } = api; - - api.describe({ - key: 'vuex', - config: { - schema(joi) { - return joi.object(); - }, - onChange: api.ConfigChangeType.regenerateTmpFiles, - }, - }); - - const absCoreFilePath = join(namespace, 'core.js'); - const absRuntimeFilePath = join(namespace, 'runtime.js'); - api.onGenerateFiles(() => { - const root = winPath(join(paths.absSrcPath, api.config.singular ? 'store' : 'stores')); - const store = parseStore(root); - const vuexConfig = api.config.vuex || {}; - // 文件写出 - api.writeTmpFile({ - path: absCoreFilePath, - content: Mustache.render(readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'), { - IMPORT_MODULES: store.importModules.join('\n'), - IMPORT_PLUGINS: store.importPlugins.join('\n'), - MODULES: `{ ${store.modules.join(', ')} }`, - PLUGINS: `[${store.plugins.join(', ')}]`, - MUTATION_TYPES: JSON.stringify(store.MUTATION_TYPES), - ACTION_TYPES: JSON.stringify(store.ACTION_TYPES), - GETTER_TYPES: JSON.stringify(store.GETTER_TYPES), - VUEX_CONFIG: JSON.stringify(vuexConfig), - }), - }); - - api.copyTmpFiles({ - namespace, - path: join(__dirname, 'runtime'), - ignore: ['.tpl'], - }); - }); - - api.addPluginExports(() => [ - { - specifiers: ['MUTATION_TYPES', 'ACTION_TYPES', 'GETTER_TYPES', 'store'], - source: absCoreFilePath, - }, - ]); - - api.addRuntimePlugin(() => `@@/${absRuntimeFilePath}`); - - api.addConfigType(() => ({ - source: name, - })); -}; diff --git a/packages/fes-plugin-vuex/src/runtime/core.tpl b/packages/fes-plugin-vuex/src/runtime/core.tpl deleted file mode 100644 index 09a05e7f..00000000 --- a/packages/fes-plugin-vuex/src/runtime/core.tpl +++ /dev/null @@ -1,28 +0,0 @@ -import { createStore } from 'vuex'; -{{{IMPORT_MODULES}}}; -{{{IMPORT_PLUGINS}}}; - -const modules = {{{MODULES}}}; -const MUTATION_TYPES = {{{MUTATION_TYPES}}}; -const ACTION_TYPES = {{{ACTION_TYPES}}}; -const GETTER_TYPES = {{{GETTER_TYPES}}}; -const conifg = {{{VUEX_CONFIG}}}; - -const store = createStore({ - modules: modules, - plugins: {{{PLUGINS}}}, - strict: conifg.strict, - devtools: conifg.devtools -}) - -const install = function (app) { - app.use(store); -} - -export { - install, - store, - MUTATION_TYPES, - ACTION_TYPES, - GETTER_TYPES -}; diff --git a/packages/fes-plugin-vuex/src/runtime/runtime.js b/packages/fes-plugin-vuex/src/runtime/runtime.js deleted file mode 100644 index d775ceb9..00000000 --- a/packages/fes-plugin-vuex/src/runtime/runtime.js +++ /dev/null @@ -1,6 +0,0 @@ -// eslint-disable-next-line import/extensions -import { install } from './core'; - -export function onAppCreated({ app }) { - install(app); -} diff --git a/packages/fes-plugin-vuex/types.d.ts b/packages/fes-plugin-vuex/types.d.ts deleted file mode 100644 index 7fa2663f..00000000 --- a/packages/fes-plugin-vuex/types.d.ts +++ /dev/null @@ -1,19 +0,0 @@ - -export const MUTATION_TYPES: object; - -export const ACTION_TYPES: object; - -export const GETTER_TYPES: object; - -export const store: object; -declare module '@fesjs/fes' { - interface PluginBuildConfig { - vuex?: - | { - strict: boolean; - devtools: boolean; - } - | false; - } - -} \ No newline at end of file diff --git a/packages/fes-plugin-watermark/README.md b/packages/fes-plugin-watermark/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-watermark/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-watermark/build.config.js b/packages/fes-plugin-watermark/build.config.js deleted file mode 100644 index 828db044..00000000 --- a/packages/fes-plugin-watermark/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - copy: ['runtime'] -}; diff --git a/packages/fes-plugin-windicss/README.md b/packages/fes-plugin-windicss/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-plugin-windicss/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-plugin-windicss/package.json b/packages/fes-plugin-windicss/package.json deleted file mode 100644 index 5b431226..00000000 --- a/packages/fes-plugin-windicss/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@fesjs/plugin-windicss", - "version": "3.0.1", - "description": "@fesjs/plugin-windicss", - "main": "lib/index.js", - "files": [ - "lib", - "types.d.ts" - ], - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-plugin-windicss" - }, - "keywords": [ - "fes" - ], - "author": "qlin", - "license": "MIT", - "bugs": { - "url": "https://github.com/WeBankFinTech/fes.js/issues" - }, - "homepage": "https://github.com/WeBankFinTech/fes.js#readme", - "publishConfig": { - "access": "public" - }, - "peerDependencies": { - "@fesjs/fes": "^3.1.5", - "vue": "^3.2.47" - }, - "dependencies": { - "vite-plugin-windicss": "^1.9.1", - "windicss": "^3.5.1", - "windicss-webpack-plugin": "^1.6.0" - }, - "typings": "./types.d.ts" -} diff --git a/packages/fes-plugin-windicss/src/index.js b/packages/fes-plugin-windicss/src/index.js deleted file mode 100644 index a1e3ef66..00000000 --- a/packages/fes-plugin-windicss/src/index.js +++ /dev/null @@ -1,73 +0,0 @@ -import WindiCSS from 'vite-plugin-windicss'; -import { name } from '../package.json'; - -function getWindicssConfig(api) { - const { config, ...otherOption } = api.config.windicss; - return { - config: { - extract: { - // A common use case is scanning files from the root directory - include: ['**/*.{vue,jsx,js,ts,tsx}'], - // if you are excluding files, make sure you always include node_modules and .git - exclude: ['node_modules', '.git', 'dist', '.fes'], - }, - ...config, - }, - ...otherOption, - }; -} - -function buildWindicssWithWebpack(api) { - api.chainWebpack((memo, { createCSSRule }) => { - memo.plugin('windicss').use(require('windicss-webpack-plugin'), [getWindicssConfig(api)]); - if (api.env === 'development') { - memo.module.rule('css').test((path) => { - if (path.endsWith('windi-utilities.css')) { - return false; - } - return /\.css$/.test(path); - }); - createCSSRule({ - lang: 'windicss', - test: /windi-utilities.css$/, - styleLoaderOption: { - insert: 'body', - }, - }); - } - - return memo; - }); -} - -function buildWindicssWithVite(api) { - api.modifyBundleConfig((memo) => { - memo.plugins.push(WindiCSS(getWindicssConfig(api).config)); - - return memo; - }); -} - -export default (api) => { - api.describe({ - key: 'windicss', - config: { - schema(joi) { - return joi.object(); - }, - default: {}, - }, - }); - - api.addEntryImportsAhead(() => [{ source: 'windi-base.css' }, { source: 'windi-components.css' }, { source: 'windi-utilities.css' }]); - - if (api.builder.name === 'vite') { - buildWindicssWithVite(api); - } else { - buildWindicssWithWebpack(api); - } - - api.addConfigType(() => ({ - source: name, - })); -}; diff --git a/packages/fes-plugin-windicss/types.d.ts b/packages/fes-plugin-windicss/types.d.ts deleted file mode 100644 index 39a5560a..00000000 --- a/packages/fes-plugin-windicss/types.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Config } from 'windicss/types/interfaces'; - -declare module '@fesjs/fes' { - interface PluginBuildConfig { - windicss?: - | { - config: Config; - } - | false; - } -} diff --git a/packages/fes-preset-built-in/README.md b/packages/fes-preset-built-in/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-preset-built-in/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-preset-built-in/src/index.js b/packages/fes-preset-built-in/src/index.js deleted file mode 100644 index dd45e28b..00000000 --- a/packages/fes-preset-built-in/src/index.js +++ /dev/null @@ -1,40 +0,0 @@ -export default function () { - return { - plugins: [ - // register methods - require.resolve('./plugins/registerMethods'), - require.resolve('./plugins/registerType'), - - // generate files - require.resolve('./plugins/core/plugin'), - require.resolve('./plugins/core/exports/coreExports'), - require.resolve('./plugins/core/exports/pluginExports'), - require.resolve('./plugins/core/entry'), - require.resolve('./plugins/core/route'), - - // bundle configs - require.resolve('./plugins/features/alias'), - require.resolve('./plugins/features/autoprefixer'), - require.resolve('./plugins/features/define'), - require.resolve('./plugins/features/console'), - require.resolve('./plugins/features/dynamicImport'), - require.resolve('./plugins/features/globalCSS'), - require.resolve('./plugins/features/inlineLimit'), - require.resolve('./plugins/features/mountElementId'), - require.resolve('./plugins/features/mock'), - require.resolve('./plugins/features/outputPath'), - require.resolve('./plugins/features/plugins'), - require.resolve('./plugins/features/presets'), - require.resolve('./plugins/features/proxy'), - require.resolve('./plugins/features/publicPath'), - require.resolve('./plugins/features/singular'), - require.resolve('./plugins/features/targets'), - require.resolve('./plugins/features/terserOptions'), - require.resolve('./plugins/features/title'), - - // commands - require.resolve('./plugins/commands/help'), - require.resolve('./plugins/commands/info'), - ], - }; -} diff --git a/packages/fes-preset-built-in/src/plugins/commands/info/index.js b/packages/fes-preset-built-in/src/plugins/commands/info/index.js deleted file mode 100644 index 5c696ed3..00000000 --- a/packages/fes-preset-built-in/src/plugins/commands/info/index.js +++ /dev/null @@ -1,24 +0,0 @@ -export default function (api) { - api.registerCommand({ - command: 'info', - description: 'print debugging information about your environment', - async fn() { - return require('envinfo') - .run( - { - System: ['OS', 'CPU'], - Binaries: ['Node', 'Pnpm', 'npm'], - Browsers: ['Chrome', 'Edge', 'Firefox', 'Safari'], - npmPackages: ['@fesjs/fes', 'vue', 'vue-router'], - npmGlobalPackages: ['@fesjs/fes'], - }, - { - showNotFound: true, - duplicates: true, - fullTree: true, - }, - ) - .then(console.log); - }, - }); -} diff --git a/packages/fes-preset-built-in/src/utils/constants.js b/packages/fes-preset-built-in/src/utils/constants.js deleted file mode 100644 index 3fe1af42..00000000 --- a/packages/fes-preset-built-in/src/utils/constants.js +++ /dev/null @@ -1,4 +0,0 @@ -import { dirname } from 'path'; -import { winPath } from '@fesjs/utils'; - -export const runtimePath = winPath(dirname(require.resolve('@fesjs/runtime/package.json'))); diff --git a/packages/fes-runtime/LICENSE b/packages/fes-runtime/LICENSE deleted file mode 100644 index 0978fbf7..00000000 --- a/packages/fes-runtime/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020-present webank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/fes-runtime/README.md b/packages/fes-runtime/README.md deleted file mode 100644 index 8bf21091..00000000 --- a/packages/fes-runtime/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# 痛点 - -在开发一个前端项目之前,我们可能需要做如下准备工作: - -- 搭建开发环境 -- 约定代码规范 -- 封装 API 请求 -- 配置路由 -- 实现布局、菜单、导航 -- 实现登录 -- 权限管理 -- ... - -除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。 - -## Fes.js 是什么? - -Fes.js 是一个好用的前端应用解决方案。提供覆盖编译构建到代码运行的每个生命周期的插件体系,支持各种功能扩展和业务需求。以 路由为基础,同时支持配置式路由和约定式路由,保证路由的功能完备。整体上以约定、配置化、组件化的设计思想,让用户仅仅关心用组件搭建页面内容。基于 Vue.js3.0,充分利用 Vue 丰富的生态。技术曲线平缓,上手也简单。在经过多个项目中打磨后趋于稳定。 - -它主要具备以下功能: - -- 🚀 **快速** ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。 -- 🧨 **简单** ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。 - -- 💪 **健壮** ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。 - -- 📦 **可扩展** ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。 - -- 📡 **面向未来** ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。 - -## 插件 - -| 插件 | 介绍 | -| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| [@fesjs/plugin-access](http://fesjs.mumblefe.cn/reference/plugin/plugins/access.html) | 提供对页面资源的权限控制能力 | -| [@fesjs/plugin-enums](http://fesjs.mumblefe.cn/reference/plugin/plugins/enums.html#%E4%BB%8B%E7%BB%8D) | 提供统一的枚举存取及丰富的函数来处理枚举 | -| [@fesjs/plugin-icon](http://fesjs.mumblefe.cn/reference/plugin/plugins/icon.html#%E4%BB%8B%E7%BB%8D) | svg 文件自动注册为组件 | -| [@fesjs/plugin-jest](http://fesjs.mumblefe.cn/reference/plugin/plugins/jest.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Jest`,提供单元测试、覆盖测试能力 | -| [ @fesjs/plugin-layout](http://fesjs.mumblefe.cn/reference/plugin/plugins/layout.html) | 简单的配置即可拥有布局,包括导航以及侧边栏 | -| [@fesjs/plugin-locale](http://fesjs.mumblefe.cn/reference/plugin/plugins/locale.html#%E4%BB%8B%E7%BB%8D) | 基于 `Vue I18n`,提供国际化能力 | -| [@fesjs/plugin-model](http://fesjs.mumblefe.cn/reference/plugin/plugins/model.html#%E4%BB%8B%E7%BB%8D) | 简易的数据管理方案 | -| [@fesjs/plugin-request](http://fesjs.mumblefe.cn/reference/plugin/plugins/request.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Axios` 封装的 request,内置防止重复请求、请求节流、错误处理等功能 | -| [@fesjs/plugin-vuex](http://fesjs.mumblefe.cn/reference/plugin/plugins/vuex.html#%E5%90%AF%E7%94%A8%E6%96%B9%E5%BC%8F) | 基于 `Vuex`, 提供状态管理能力 | -| [@fesjs/plugin-qiankun](http://fesjs.mumblefe.cn/reference/plugin/plugins/qiankun.html#%E4%BB%8B%E7%BB%8D) | 基于 `qiankun`,提供微服务能力 | -| [@fesjs/plugin-sass](http://fesjs.mumblefe.cn/reference/plugin/plugins/sass.html#%E4%BB%8B%E7%BB%8D) | 样式支持 sass | -| [@fesjs/plugin-monaco-editor](http://fesjs.mumblefe.cn/reference/plugin/plugins/editor.html#%E4%BB%8B%E7%BB%8D) | 提供代码编辑器能力, 基于`monaco-editor`(VS Code 使用的代码编辑器) | -| [@fesjs/plugin-windicss](http://fesjs.mumblefe.cn/reference/plugin/plugins/windicss.html) | 基于 `windicss`,提供原子化 CSS 能力 | -| [@fesjs/plugin-pinia](http://fesjs.mumblefe.cn/reference/plugin/plugins/pinia.html) | pinia,状态处理 | -| [@fesjs/plugin-watermark](http://fesjs.mumblefe.cn/reference/plugin/plugins/watermark.html) | 水印 | - -## 像数 1, 2, 3 一样容易 - -使用 `pnpm`: - -```bash -# 创建模板 -pnpm create @fesjs/fes-app myapp - -# 安装依赖 -pnpm i - -# 运行 -pnpm dev -``` - -使用 `npm`: - -```bash -# 创建模板 -npx @fesjs/create-fes-app myapp - -# 安装依赖 -npm install - -# 运行 -npm run dev -``` - -## 反馈 - -| Github Issue | 微信群 | Fes.js 开源运营小助手 | -| ------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- | -| [@fesjs/fes.js/issues](../../issues) | | | - -## 参与共建 - -我们非常欢迎社区同学能提交 PR: - -1. fork 项目! -2. 创建你的功能分支: `git checkout -b my-new-feature` -3. 本地提交新代码: `git commit -am 'Add some feature'` -4. 推送本地到服务器分支: `git push origin my-new-feature` -5. 创建一个 PR - -如果是发现 Bug 或者期望添加新功能,请提交[issue](../../issues)。 - -## 社区活动 - -### Fesjs 社区有奖征文活动 - -为了 Fes.js 开源项目更好的运转,同时回馈开源社区,社区推出有奖征文活动!欢迎大家投递实践经验,给社区用户,更广泛的开发者提供借鉴。 - -经验输出也可以帮助到你系统沉淀自有项目,梳理工作思路,也能够帮助你的技术博客做宣传。优秀的实践案例将有机会邀请参与项目社区技术会议分享,赶快来参与吧。 -请戳:https://mp.weixin.qq.com/s/nV4NG_OUUrdgtft8g_IW4g diff --git a/packages/fes-runtime/build.config.js b/packages/fes-runtime/build.config.js deleted file mode 100644 index af5c8a2a..00000000 --- a/packages/fes-runtime/build.config.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = { - target: 'browser' -}; diff --git a/packages/fes-runtime/src/utils/assert.js b/packages/fes-runtime/src/utils/assert.js deleted file mode 100644 index 5e8cf41b..00000000 --- a/packages/fes-runtime/src/utils/assert.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function assert(value, message) { - if (!value) throw new Error(message); -} diff --git a/packages/fes-runtime/types.d.ts b/packages/fes-runtime/types.d.ts deleted file mode 100644 index 4c0fbd0a..00000000 --- a/packages/fes-runtime/types.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -export { Plugin } from './es/index'; - -export { - useRoute, - useRouter, - onBeforeRouteUpdate, - onBeforeRouteLeave, - RouterLink, - RouterView, - useLink, - createWebHashHistory, - createWebHistory, - createMemoryHistory, - createRouter, -} from 'vue-router'; - -export interface ApplyPluginsType { - compose: 'compose'; - event: 'event'; - modify: 'modify'; -}; diff --git a/packages/fes-template-h5/.fes.js b/packages/fes-template-h5/.fes.js index c7c569fb..f9229cda 100644 --- a/packages/fes-template-h5/.fes.js +++ b/packages/fes-template-h5/.fes.js @@ -1,6 +1,6 @@ +import { defineBuildConfig } from '@fesjs/fes'; // fes.config.js 只负责管理 cli 相关的配置 import pxtoviewport from 'postcss-px-to-viewport-8-plugin'; -import { defineBuildConfig } from '@fesjs/fes'; export default defineBuildConfig({ proxy: { @@ -10,7 +10,7 @@ export default defineBuildConfig({ }, }, publicPath: '/', - viteOption: { + vite: { css: { postcss: { plugins: [ diff --git a/packages/fes-template-h5/index.html b/packages/fes-template-h5/index.html index 0584633e..5e87dfe2 100644 --- a/packages/fes-template-h5/index.html +++ b/packages/fes-template-h5/index.html @@ -4,7 +4,7 @@ - + diff --git a/packages/fes-template-h5/package.json b/packages/fes-template-h5/package.json index c8b55e1d..bbe005f3 100644 --- a/packages/fes-template-h5/package.json +++ b/packages/fes-template-h5/package.json @@ -1,52 +1,22 @@ { "name": "@fesjs/template-h5", + "type": "module", "version": "2.0.0", "private": true, "description": "fes 移动端项目模版", "author": "qlin", "license": "MIT", - "homepage": "https://github.com/WeBankFinTech/fes.js#readme", - "repository": { - "type": "git", - "url": "git+https://github.com/WeBankFinTech/fes.js.git", - "directory": "packages/fes-template-h5" - }, - "bugs": { - "url": "https://github.com/WeBankFinTech/fes.js/issues" - }, - "keywords": [ - "管理端", - "fes", - "fast", - "easy", - "strong" - ], - "files": [ - ".eslintrc.js", - ".fes.js", - ".fes.prod.js", - ".gitignore", - "/config", - "/src", - "README.md", - "mock.js", - "package.json", - "tsconfig.json" - ], "scripts": { - "prod": "FES_ENV=prod fes build", + "build": "FES_ENV=prod fes build", "dev": "fes dev" }, - "publishConfig": { - "access": "public" - }, "dependencies": { "@fesjs/builder-vite": "workspace:*", "@fesjs/fes": "workspace:*", "@fesjs/plugin-icon": "workspace:*", "@fesjs/plugin-request": "workspace:*", - "core-js": "^3.29.1", + "core-js": "^3.45.1", "postcss-px-to-viewport-8-plugin": "^1.2.3", - "vue": "^3.2.47" + "vue": "^3.5.21" } } diff --git a/packages/fes-template-vite/.fes.js b/packages/fes-template-vite/.fes.js index 79a8e7d3..c6d16259 100644 --- a/packages/fes-template-vite/.fes.js +++ b/packages/fes-template-vite/.fes.js @@ -1,4 +1,5 @@ import { defineBuildConfig } from '@fesjs/fes'; +import tailwindcss from '@tailwindcss/vite'; export default defineBuildConfig({ builder: 'vite', @@ -66,14 +67,19 @@ export default defineBuildConfig({ }, ], }, - enums: { - status: [ - ['0', '无效的'], - ['1', '有效的'], + vite: { + plugins: [ + tailwindcss(), ], }, + // enums: { + // status: [ + // ['0', '无效的'], + // ['1', '有效的'], + // ], + // }, dynamicImport: true, - monacoEditor: { - languages: ['javascript', 'typescript', 'html', 'json'], - }, + // monacoEditor: { + // languages: ['javascript', 'typescript', 'html', 'json'], + // }, }); diff --git a/packages/fes-template-vite/package.json b/packages/fes-template-vite/package.json index 9368834f..537d0794 100644 --- a/packages/fes-template-vite/package.json +++ b/packages/fes-template-vite/package.json @@ -1,5 +1,6 @@ { "name": "@fesjs/template-vite", + "type": "module", "version": "2.0.0", "private": true, "description": "fes项目模版", @@ -21,18 +22,17 @@ "@fesjs/fes": "workspace:*", "@fesjs/fes-design": "^0.8.0", "@fesjs/plugin-access": "workspace:*", - "@fesjs/plugin-enums": "workspace:*", "@fesjs/plugin-icon": "workspace:*", - "@fesjs/plugin-jest": "workspace:*", "@fesjs/plugin-layout": "workspace:*", "@fesjs/plugin-locale": "workspace:*", "@fesjs/plugin-model": "workspace:*", "@fesjs/plugin-monaco-editor": "workspace:*", "@fesjs/plugin-pinia": "workspace:*", "@fesjs/plugin-request": "workspace:*", - "@fesjs/plugin-sass": "workspace:*", - "core-js": "^3.29.1", - "pinia": "^2.0.11", - "vue": "^3.2.47" + "@tailwindcss/vite": "^4.1.12", + "core-js": "^3.45.1", + "pinia": "^3.0.3", + "tailwindcss": "^4.1.12", + "vue": "^3.5.21" } } diff --git a/packages/fes-template-vite/postcss.config.mjs b/packages/fes-template-vite/postcss.config.mjs new file mode 100644 index 00000000..93e50d74 --- /dev/null +++ b/packages/fes-template-vite/postcss.config.mjs @@ -0,0 +1,7 @@ +import autoprefixer from 'autoprefixer'; + +export default { + plugins: [ + autoprefixer(), + ], +}; diff --git a/packages/fes-template-vite/src/global.css b/packages/fes-template-vite/src/global.css index bc98913d..fe8eb6f1 100644 --- a/packages/fes-template-vite/src/global.css +++ b/packages/fes-template-vite/src/global.css @@ -1,6 +1,4 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; body { diff --git a/packages/fes-template-vite/src/global.scss b/packages/fes-template-vite/src/global.scss deleted file mode 100644 index 73e3c5e7..00000000 --- a/packages/fes-template-vite/src/global.scss +++ /dev/null @@ -1,10 +0,0 @@ -html { - body { - margin: 0px; - font-size: 16px; - } -} - -html, body { - margin: 0; -} diff --git a/packages/fes-template-vite/src/pages/index.vue b/packages/fes-template-vite/src/pages/index.vue index 32659463..a1eea4fe 100644 --- a/packages/fes-template-vite/src/pages/index.vue +++ b/packages/fes-template-vite/src/pages/index.vue @@ -1,18 +1,20 @@