@bleedingdev/modern-js-app-tools 3.2.0-ultramodern.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +26 -0
- package/bin/modern.js +36 -0
- package/dist/cjs/baseline.js +83 -0
- package/dist/cjs/builder/builder-rspack/index.js +40 -0
- package/dist/cjs/builder/generator/adapterCopy.js +79 -0
- package/dist/cjs/builder/generator/createBuilderProviderConfig.js +100 -0
- package/dist/cjs/builder/generator/createCopyPattern.js +67 -0
- package/dist/cjs/builder/generator/getBuilderEnvironments.js +90 -0
- package/dist/cjs/builder/generator/index.js +80 -0
- package/dist/cjs/builder/index.js +50 -0
- package/dist/cjs/builder/shared/builderPlugins/adapterBasic.js +133 -0
- package/dist/cjs/builder/shared/builderPlugins/adapterHtml.js +89 -0
- package/dist/cjs/builder/shared/builderPlugins/adapterPrecompress.js +112 -0
- package/dist/cjs/builder/shared/builderPlugins/adapterSSR.js +151 -0
- package/dist/cjs/builder/shared/builderPlugins/builderHooks.js +51 -0
- package/dist/cjs/builder/shared/builderPlugins/index.js +86 -0
- package/dist/cjs/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +71 -0
- package/dist/cjs/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +56 -0
- package/dist/cjs/builder/shared/bundlerPlugins/RouterPlugin.js +191 -0
- package/dist/cjs/builder/shared/bundlerPlugins/index.js +72 -0
- package/dist/cjs/builder/shared/createCopyInfo.js +59 -0
- package/dist/cjs/builder/shared/index.js +72 -0
- package/dist/cjs/builder/shared/loaders/serverModuleLoader.js +39 -0
- package/dist/cjs/builder/shared/types.js +18 -0
- package/dist/cjs/commands/build.js +107 -0
- package/dist/cjs/commands/deploy.js +44 -0
- package/dist/cjs/commands/dev.js +121 -0
- package/dist/cjs/commands/index.js +99 -0
- package/dist/cjs/commands/info.js +110 -0
- package/dist/cjs/commands/inspect.js +49 -0
- package/dist/cjs/commands/runtime.js +159 -0
- package/dist/cjs/commands/serve.js +92 -0
- package/dist/cjs/compat/hooks.js +104 -0
- package/dist/cjs/compat/index.js +62 -0
- package/dist/cjs/compat/utils.js +135 -0
- package/dist/cjs/config/default.js +125 -0
- package/dist/cjs/config/index.js +65 -0
- package/dist/cjs/config/initialize/index.js +41 -0
- package/dist/cjs/config/initialize/inits.js +101 -0
- package/dist/cjs/constants.js +40 -0
- package/dist/cjs/defineConfig.js +36 -0
- package/dist/cjs/esm/register-esm.js +48 -0
- package/dist/cjs/esm/register-esm.mjs +10 -0
- package/dist/cjs/esm/ts-paths-loader.js +73 -0
- package/dist/cjs/esm/ts-paths-loader.mjs +35 -0
- package/dist/cjs/exports/server.js +18 -0
- package/dist/cjs/index.js +358 -0
- package/dist/cjs/locale/en.js +79 -0
- package/dist/cjs/locale/index.js +46 -0
- package/dist/cjs/locale/zh.js +79 -0
- package/dist/cjs/plugins/analyze/constants.js +48 -0
- package/dist/cjs/plugins/analyze/getBundleEntry.js +97 -0
- package/dist/cjs/plugins/analyze/getFileSystemEntry.js +117 -0
- package/dist/cjs/plugins/analyze/getHtmlTemplate.js +144 -0
- package/dist/cjs/plugins/analyze/getServerRoutes.js +177 -0
- package/dist/cjs/plugins/analyze/index.js +237 -0
- package/dist/cjs/plugins/analyze/isDefaultExportFunction.js +86 -0
- package/dist/cjs/plugins/analyze/templates.js +56 -0
- package/dist/cjs/plugins/analyze/utils.js +126 -0
- package/dist/cjs/plugins/deploy/index.js +77 -0
- package/dist/cjs/plugins/deploy/platforms/gh-pages.js +87 -0
- package/dist/cjs/plugins/deploy/platforms/netlify.js +140 -0
- package/dist/cjs/plugins/deploy/platforms/node.js +100 -0
- package/dist/cjs/plugins/deploy/platforms/platform.js +18 -0
- package/dist/cjs/plugins/deploy/platforms/templates/netlify-entry.cjs +57 -0
- package/dist/cjs/plugins/deploy/platforms/templates/netlify-entry.mjs +59 -0
- package/dist/cjs/plugins/deploy/platforms/templates/node-entry.cjs +44 -0
- package/dist/cjs/plugins/deploy/platforms/templates/node-entry.mjs +46 -0
- package/dist/cjs/plugins/deploy/platforms/templates/vercel-entry.cjs +57 -0
- package/dist/cjs/plugins/deploy/platforms/templates/vercel-entry.mjs +58 -0
- package/dist/cjs/plugins/deploy/platforms/vercel.js +159 -0
- package/dist/cjs/plugins/deploy/types.js +18 -0
- package/dist/cjs/plugins/deploy/utils/generator.js +104 -0
- package/dist/cjs/plugins/deploy/utils/index.js +123 -0
- package/dist/cjs/plugins/initialize/index.js +93 -0
- package/dist/cjs/plugins/serverBuild.js +90 -0
- package/dist/cjs/plugins/serverRuntime.js +49 -0
- package/dist/cjs/presetUltramodern.js +41 -0
- package/dist/cjs/rsbuild.js +90 -0
- package/dist/cjs/run/index.js +98 -0
- package/dist/cjs/types/config/deploy.js +18 -0
- package/dist/cjs/types/config/dev.js +18 -0
- package/dist/cjs/types/config/experiments.js +18 -0
- package/dist/cjs/types/config/html.js +18 -0
- package/dist/cjs/types/config/index.js +58 -0
- package/dist/cjs/types/config/output.js +18 -0
- package/dist/cjs/types/config/performance.js +18 -0
- package/dist/cjs/types/config/resolve.js +18 -0
- package/dist/cjs/types/config/security.js +18 -0
- package/dist/cjs/types/config/source.js +18 -0
- package/dist/cjs/types/config/testing.js +18 -0
- package/dist/cjs/types/config/tools.js +18 -0
- package/dist/cjs/types/index.js +58 -0
- package/dist/cjs/types/plugin.js +18 -0
- package/dist/cjs/types/utils.js +18 -0
- package/dist/cjs/ultramodern/designSystem.js +119 -0
- package/dist/cjs/utils/config.js +45 -0
- package/dist/cjs/utils/createServer.js +52 -0
- package/dist/cjs/utils/env.js +46 -0
- package/dist/cjs/utils/generateWatchFiles.js +54 -0
- package/dist/cjs/utils/getConfigFile.js +49 -0
- package/dist/cjs/utils/getSelectedEntries.js +60 -0
- package/dist/cjs/utils/initAppContext.js +71 -0
- package/dist/cjs/utils/loadPlugins.js +85 -0
- package/dist/cjs/utils/printInstructions.js +43 -0
- package/dist/cjs/utils/register.js +128 -0
- package/dist/cjs/utils/restart.js +52 -0
- package/dist/cjs/utils/routes.js +65 -0
- package/dist/cjs/utils/types.js +18 -0
- package/dist/esm/baseline.mjs +46 -0
- package/dist/esm/builder/builder-rspack/index.mjs +6 -0
- package/dist/esm/builder/generator/adapterCopy.mjs +35 -0
- package/dist/esm/builder/generator/createBuilderProviderConfig.mjs +66 -0
- package/dist/esm/builder/generator/createCopyPattern.mjs +30 -0
- package/dist/esm/builder/generator/getBuilderEnvironments.mjs +56 -0
- package/dist/esm/builder/generator/index.mjs +46 -0
- package/dist/esm/builder/index.mjs +7 -0
- package/dist/esm/builder/shared/builderPlugins/adapterBasic.mjs +89 -0
- package/dist/esm/builder/shared/builderPlugins/adapterHtml.mjs +55 -0
- package/dist/esm/builder/shared/builderPlugins/adapterPrecompress.mjs +68 -0
- package/dist/esm/builder/shared/builderPlugins/adapterSSR.mjs +117 -0
- package/dist/esm/builder/shared/builderPlugins/builderHooks.mjs +17 -0
- package/dist/esm/builder/shared/builderPlugins/index.mjs +5 -0
- package/dist/esm/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.mjs +37 -0
- package/dist/esm/builder/shared/bundlerPlugins/HtmlBottomTemplate.mjs +22 -0
- package/dist/esm/builder/shared/bundlerPlugins/RouterPlugin.mjs +157 -0
- package/dist/esm/builder/shared/bundlerPlugins/index.mjs +3 -0
- package/dist/esm/builder/shared/createCopyInfo.mjs +15 -0
- package/dist/esm/builder/shared/index.mjs +3 -0
- package/dist/esm/builder/shared/loaders/serverModuleLoader.mjs +5 -0
- package/dist/esm/builder/shared/types.mjs +0 -0
- package/dist/esm/commands/build.mjs +63 -0
- package/dist/esm/commands/deploy.mjs +10 -0
- package/dist/esm/commands/dev.mjs +77 -0
- package/dist/esm/commands/index.mjs +47 -0
- package/dist/esm/commands/info.mjs +76 -0
- package/dist/esm/commands/inspect.mjs +15 -0
- package/dist/esm/commands/runtime.mjs +116 -0
- package/dist/esm/commands/serve.mjs +48 -0
- package/dist/esm/compat/hooks.mjs +67 -0
- package/dist/esm/compat/index.mjs +28 -0
- package/dist/esm/compat/utils.mjs +95 -0
- package/dist/esm/config/default.mjs +91 -0
- package/dist/esm/config/index.mjs +2 -0
- package/dist/esm/config/initialize/index.mjs +7 -0
- package/dist/esm/config/initialize/inits.mjs +54 -0
- package/dist/esm/constants.mjs +3 -0
- package/dist/esm/defineConfig.mjs +2 -0
- package/dist/esm/esm/register-esm.mjs +11 -0
- package/dist/esm/esm/ts-paths-loader.mjs +36 -0
- package/dist/esm/exports/server.mjs +0 -0
- package/dist/esm/index.mjs +131 -0
- package/dist/esm/locale/en.mjs +45 -0
- package/dist/esm/locale/index.mjs +9 -0
- package/dist/esm/locale/zh.mjs +45 -0
- package/dist/esm/plugins/analyze/constants.mjs +8 -0
- package/dist/esm/plugins/analyze/getBundleEntry.mjs +53 -0
- package/dist/esm/plugins/analyze/getFileSystemEntry.mjs +66 -0
- package/dist/esm/plugins/analyze/getHtmlTemplate.mjs +97 -0
- package/dist/esm/plugins/analyze/getServerRoutes.mjs +130 -0
- package/dist/esm/plugins/analyze/index.mjs +203 -0
- package/dist/esm/plugins/analyze/isDefaultExportFunction.mjs +41 -0
- package/dist/esm/plugins/analyze/templates.mjs +22 -0
- package/dist/esm/plugins/analyze/utils.mjs +63 -0
- package/dist/esm/plugins/deploy/index.mjs +43 -0
- package/dist/esm/plugins/deploy/platforms/gh-pages.mjs +43 -0
- package/dist/esm/plugins/deploy/platforms/netlify.mjs +96 -0
- package/dist/esm/plugins/deploy/platforms/node.mjs +56 -0
- package/dist/esm/plugins/deploy/platforms/platform.mjs +0 -0
- package/dist/esm/plugins/deploy/platforms/templates/netlify-entry.cjs +57 -0
- package/dist/esm/plugins/deploy/platforms/templates/netlify-entry.mjs +59 -0
- package/dist/esm/plugins/deploy/platforms/templates/node-entry.cjs +44 -0
- package/dist/esm/plugins/deploy/platforms/templates/node-entry.mjs +46 -0
- package/dist/esm/plugins/deploy/platforms/templates/vercel-entry.cjs +57 -0
- package/dist/esm/plugins/deploy/platforms/templates/vercel-entry.mjs +58 -0
- package/dist/esm/plugins/deploy/platforms/vercel.mjs +115 -0
- package/dist/esm/plugins/deploy/types.mjs +0 -0
- package/dist/esm/plugins/deploy/utils/generator.mjs +48 -0
- package/dist/esm/plugins/deploy/utils/index.mjs +67 -0
- package/dist/esm/plugins/initialize/index.mjs +59 -0
- package/dist/esm/plugins/serverBuild.mjs +45 -0
- package/dist/esm/plugins/serverRuntime.mjs +15 -0
- package/dist/esm/presetUltramodern.mjs +4 -0
- package/dist/esm/rsbuild.mjs +47 -0
- package/dist/esm/rslib-runtime.mjs +18 -0
- package/dist/esm/run/index.mjs +61 -0
- package/dist/esm/types/config/deploy.mjs +0 -0
- package/dist/esm/types/config/dev.mjs +0 -0
- package/dist/esm/types/config/experiments.mjs +0 -0
- package/dist/esm/types/config/html.mjs +0 -0
- package/dist/esm/types/config/index.mjs +1 -0
- package/dist/esm/types/config/output.mjs +0 -0
- package/dist/esm/types/config/performance.mjs +0 -0
- package/dist/esm/types/config/resolve.mjs +0 -0
- package/dist/esm/types/config/security.mjs +0 -0
- package/dist/esm/types/config/source.mjs +0 -0
- package/dist/esm/types/config/testing.mjs +0 -0
- package/dist/esm/types/config/tools.mjs +0 -0
- package/dist/esm/types/index.mjs +1 -0
- package/dist/esm/types/plugin.mjs +0 -0
- package/dist/esm/types/utils.mjs +0 -0
- package/dist/esm/ultramodern/designSystem.mjs +73 -0
- package/dist/esm/utils/config.mjs +11 -0
- package/dist/esm/utils/createServer.mjs +12 -0
- package/dist/esm/utils/env.mjs +12 -0
- package/dist/esm/utils/generateWatchFiles.mjs +10 -0
- package/dist/esm/utils/getConfigFile.mjs +5 -0
- package/dist/esm/utils/getSelectedEntries.mjs +26 -0
- package/dist/esm/utils/initAppContext.mjs +27 -0
- package/dist/esm/utils/loadPlugins.mjs +45 -0
- package/dist/esm/utils/printInstructions.mjs +9 -0
- package/dist/esm/utils/register.mjs +81 -0
- package/dist/esm/utils/restart.mjs +18 -0
- package/dist/esm/utils/routes.mjs +15 -0
- package/dist/esm/utils/types.mjs +0 -0
- package/dist/esm-node/baseline.mjs +47 -0
- package/dist/esm-node/builder/builder-rspack/index.mjs +7 -0
- package/dist/esm-node/builder/generator/adapterCopy.mjs +36 -0
- package/dist/esm-node/builder/generator/createBuilderProviderConfig.mjs +67 -0
- package/dist/esm-node/builder/generator/createCopyPattern.mjs +31 -0
- package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +57 -0
- package/dist/esm-node/builder/generator/index.mjs +47 -0
- package/dist/esm-node/builder/index.mjs +8 -0
- package/dist/esm-node/builder/shared/builderPlugins/adapterBasic.mjs +93 -0
- package/dist/esm-node/builder/shared/builderPlugins/adapterHtml.mjs +56 -0
- package/dist/esm-node/builder/shared/builderPlugins/adapterPrecompress.mjs +69 -0
- package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.mjs +119 -0
- package/dist/esm-node/builder/shared/builderPlugins/builderHooks.mjs +18 -0
- package/dist/esm-node/builder/shared/builderPlugins/index.mjs +6 -0
- package/dist/esm-node/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.mjs +38 -0
- package/dist/esm-node/builder/shared/bundlerPlugins/HtmlBottomTemplate.mjs +23 -0
- package/dist/esm-node/builder/shared/bundlerPlugins/RouterPlugin.mjs +158 -0
- package/dist/esm-node/builder/shared/bundlerPlugins/index.mjs +4 -0
- package/dist/esm-node/builder/shared/createCopyInfo.mjs +16 -0
- package/dist/esm-node/builder/shared/index.mjs +4 -0
- package/dist/esm-node/builder/shared/loaders/serverModuleLoader.mjs +6 -0
- package/dist/esm-node/builder/shared/types.mjs +1 -0
- package/dist/esm-node/commands/build.mjs +64 -0
- package/dist/esm-node/commands/deploy.mjs +11 -0
- package/dist/esm-node/commands/dev.mjs +78 -0
- package/dist/esm-node/commands/index.mjs +48 -0
- package/dist/esm-node/commands/info.mjs +77 -0
- package/dist/esm-node/commands/inspect.mjs +16 -0
- package/dist/esm-node/commands/runtime.mjs +117 -0
- package/dist/esm-node/commands/serve.mjs +49 -0
- package/dist/esm-node/compat/hooks.mjs +68 -0
- package/dist/esm-node/compat/index.mjs +29 -0
- package/dist/esm-node/compat/utils.mjs +96 -0
- package/dist/esm-node/config/default.mjs +92 -0
- package/dist/esm-node/config/index.mjs +3 -0
- package/dist/esm-node/config/initialize/index.mjs +8 -0
- package/dist/esm-node/config/initialize/inits.mjs +55 -0
- package/dist/esm-node/constants.mjs +4 -0
- package/dist/esm-node/defineConfig.mjs +3 -0
- package/dist/esm-node/esm/register-esm.mjs +12 -0
- package/dist/esm-node/esm/ts-paths-loader.mjs +37 -0
- package/dist/esm-node/exports/server.mjs +1 -0
- package/dist/esm-node/index.mjs +133 -0
- package/dist/esm-node/locale/en.mjs +46 -0
- package/dist/esm-node/locale/index.mjs +10 -0
- package/dist/esm-node/locale/zh.mjs +46 -0
- package/dist/esm-node/plugins/analyze/constants.mjs +9 -0
- package/dist/esm-node/plugins/analyze/getBundleEntry.mjs +54 -0
- package/dist/esm-node/plugins/analyze/getFileSystemEntry.mjs +67 -0
- package/dist/esm-node/plugins/analyze/getHtmlTemplate.mjs +98 -0
- package/dist/esm-node/plugins/analyze/getServerRoutes.mjs +131 -0
- package/dist/esm-node/plugins/analyze/index.mjs +204 -0
- package/dist/esm-node/plugins/analyze/isDefaultExportFunction.mjs +42 -0
- package/dist/esm-node/plugins/analyze/templates.mjs +23 -0
- package/dist/esm-node/plugins/analyze/utils.mjs +64 -0
- package/dist/esm-node/plugins/deploy/index.mjs +44 -0
- package/dist/esm-node/plugins/deploy/platforms/gh-pages.mjs +44 -0
- package/dist/esm-node/plugins/deploy/platforms/netlify.mjs +98 -0
- package/dist/esm-node/plugins/deploy/platforms/node.mjs +58 -0
- package/dist/esm-node/plugins/deploy/platforms/platform.mjs +1 -0
- package/dist/esm-node/plugins/deploy/platforms/templates/netlify-entry.cjs +57 -0
- package/dist/esm-node/plugins/deploy/platforms/templates/netlify-entry.mjs +59 -0
- package/dist/esm-node/plugins/deploy/platforms/templates/node-entry.cjs +44 -0
- package/dist/esm-node/plugins/deploy/platforms/templates/node-entry.mjs +46 -0
- package/dist/esm-node/plugins/deploy/platforms/templates/vercel-entry.cjs +57 -0
- package/dist/esm-node/plugins/deploy/platforms/templates/vercel-entry.mjs +58 -0
- package/dist/esm-node/plugins/deploy/platforms/vercel.mjs +117 -0
- package/dist/esm-node/plugins/deploy/types.mjs +1 -0
- package/dist/esm-node/plugins/deploy/utils/generator.mjs +49 -0
- package/dist/esm-node/plugins/deploy/utils/index.mjs +71 -0
- package/dist/esm-node/plugins/initialize/index.mjs +60 -0
- package/dist/esm-node/plugins/serverBuild.mjs +46 -0
- package/dist/esm-node/plugins/serverRuntime.mjs +16 -0
- package/dist/esm-node/presetUltramodern.mjs +5 -0
- package/dist/esm-node/rsbuild.mjs +48 -0
- package/dist/esm-node/rslib-runtime.mjs +19 -0
- package/dist/esm-node/run/index.mjs +62 -0
- package/dist/esm-node/types/config/deploy.mjs +1 -0
- package/dist/esm-node/types/config/dev.mjs +1 -0
- package/dist/esm-node/types/config/experiments.mjs +1 -0
- package/dist/esm-node/types/config/html.mjs +1 -0
- package/dist/esm-node/types/config/index.mjs +2 -0
- package/dist/esm-node/types/config/output.mjs +1 -0
- package/dist/esm-node/types/config/performance.mjs +1 -0
- package/dist/esm-node/types/config/resolve.mjs +1 -0
- package/dist/esm-node/types/config/security.mjs +1 -0
- package/dist/esm-node/types/config/source.mjs +1 -0
- package/dist/esm-node/types/config/testing.mjs +1 -0
- package/dist/esm-node/types/config/tools.mjs +1 -0
- package/dist/esm-node/types/index.mjs +2 -0
- package/dist/esm-node/types/plugin.mjs +1 -0
- package/dist/esm-node/types/utils.mjs +1 -0
- package/dist/esm-node/ultramodern/designSystem.mjs +74 -0
- package/dist/esm-node/utils/config.mjs +12 -0
- package/dist/esm-node/utils/createServer.mjs +13 -0
- package/dist/esm-node/utils/env.mjs +13 -0
- package/dist/esm-node/utils/generateWatchFiles.mjs +11 -0
- package/dist/esm-node/utils/getConfigFile.mjs +6 -0
- package/dist/esm-node/utils/getSelectedEntries.mjs +27 -0
- package/dist/esm-node/utils/initAppContext.mjs +28 -0
- package/dist/esm-node/utils/loadPlugins.mjs +46 -0
- package/dist/esm-node/utils/printInstructions.mjs +10 -0
- package/dist/esm-node/utils/register.mjs +83 -0
- package/dist/esm-node/utils/restart.mjs +19 -0
- package/dist/esm-node/utils/routes.mjs +16 -0
- package/dist/esm-node/utils/types.mjs +1 -0
- package/dist/types/baseline.d.ts +46 -0
- package/dist/types/builder/builder-rspack/index.d.ts +2 -0
- package/dist/types/builder/generator/adapterCopy.d.ts +3 -0
- package/dist/types/builder/generator/createBuilderProviderConfig.d.ts +3 -0
- package/dist/types/builder/generator/createCopyPattern.d.ts +16 -0
- package/dist/types/builder/generator/getBuilderEnvironments.d.ts +6 -0
- package/dist/types/builder/generator/index.d.ts +8 -0
- package/dist/types/builder/index.d.ts +3 -0
- package/dist/types/builder/shared/builderPlugins/adapterBasic.d.ts +3 -0
- package/dist/types/builder/shared/builderPlugins/adapterHtml.d.ts +3 -0
- package/dist/types/builder/shared/builderPlugins/adapterPrecompress.d.ts +3 -0
- package/dist/types/builder/shared/builderPlugins/adapterSSR.d.ts +3 -0
- package/dist/types/builder/shared/builderPlugins/builderHooks.d.ts +3 -0
- package/dist/types/builder/shared/builderPlugins/index.d.ts +5 -0
- package/dist/types/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.d.ts +7 -0
- package/dist/types/builder/shared/bundlerPlugins/HtmlBottomTemplate.d.ts +9 -0
- package/dist/types/builder/shared/bundlerPlugins/RouterPlugin.d.ts +32 -0
- package/dist/types/builder/shared/bundlerPlugins/index.d.ts +3 -0
- package/dist/types/builder/shared/createCopyInfo.d.ts +8 -0
- package/dist/types/builder/shared/index.d.ts +3 -0
- package/dist/types/builder/shared/loaders/serverModuleLoader.d.ts +3 -0
- package/dist/types/builder/shared/types.d.ts +6 -0
- package/dist/types/commands/build.d.ts +4 -0
- package/dist/types/commands/deploy.d.ts +3 -0
- package/dist/types/commands/dev.d.ts +9 -0
- package/dist/types/commands/index.d.ts +10 -0
- package/dist/types/commands/info.d.ts +18 -0
- package/dist/types/commands/inspect.d.ts +4 -0
- package/dist/types/commands/runtime.d.ts +11 -0
- package/dist/types/commands/serve.d.ts +8 -0
- package/dist/types/compat/hooks.d.ts +7 -0
- package/dist/types/compat/index.d.ts +2 -0
- package/dist/types/compat/utils.d.ts +13 -0
- package/dist/types/config/default.d.ts +3 -0
- package/dist/types/config/index.d.ts +2 -0
- package/dist/types/config/initialize/index.d.ts +3 -0
- package/dist/types/config/initialize/inits.d.ts +4 -0
- package/dist/types/constants.d.ts +2 -0
- package/dist/types/defineConfig.d.ts +11 -0
- package/dist/types/esm/register-esm.d.mts +11 -0
- package/dist/types/esm/ts-node-loader.d.mts +6 -0
- package/dist/types/esm/ts-paths-loader.d.mts +6 -0
- package/dist/types/exports/server.d.ts +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/locale/en.d.ts +44 -0
- package/dist/types/locale/index.d.ts +90 -0
- package/dist/types/locale/zh.d.ts +44 -0
- package/dist/types/plugins/analyze/constants.d.ts +3 -0
- package/dist/types/plugins/analyze/getBundleEntry.d.ts +4 -0
- package/dist/types/plugins/analyze/getFileSystemEntry.d.ts +7 -0
- package/dist/types/plugins/analyze/getHtmlTemplate.d.ts +27 -0
- package/dist/types/plugins/analyze/getServerRoutes.d.ts +8 -0
- package/dist/types/plugins/analyze/index.d.ts +3 -0
- package/dist/types/plugins/analyze/isDefaultExportFunction.d.ts +1 -0
- package/dist/types/plugins/analyze/templates.d.ts +5 -0
- package/dist/types/plugins/analyze/utils.d.ts +10 -0
- package/dist/types/plugins/deploy/index.d.ts +3 -0
- package/dist/types/plugins/deploy/platforms/gh-pages.d.ts +2 -0
- package/dist/types/plugins/deploy/platforms/netlify.d.ts +2 -0
- package/dist/types/plugins/deploy/platforms/node.d.ts +2 -0
- package/dist/types/plugins/deploy/platforms/platform.d.ts +17 -0
- package/dist/types/plugins/deploy/platforms/templates/netlify-entry.d.cts +2 -0
- package/dist/types/plugins/deploy/platforms/templates/netlify-entry.d.mts +2 -0
- package/dist/types/plugins/deploy/platforms/templates/node-entry.d.cts +1 -0
- package/dist/types/plugins/deploy/platforms/templates/node-entry.d.mts +1 -0
- package/dist/types/plugins/deploy/platforms/templates/vercel-entry.d.cts +2 -0
- package/dist/types/plugins/deploy/platforms/templates/vercel-entry.d.mts +2 -0
- package/dist/types/plugins/deploy/platforms/vercel.d.ts +2 -0
- package/dist/types/plugins/deploy/types.d.ts +3 -0
- package/dist/types/plugins/deploy/utils/generator.d.ts +24 -0
- package/dist/types/plugins/deploy/utils/index.d.ts +16 -0
- package/dist/types/plugins/initialize/index.d.ts +3 -0
- package/dist/types/plugins/serverBuild.d.ts +3 -0
- package/dist/types/plugins/serverRuntime.d.ts +3 -0
- package/dist/types/presetUltramodern.d.ts +6 -0
- package/dist/types/rsbuild.d.ts +12 -0
- package/dist/types/run/index.d.ts +20 -0
- package/dist/types/types/config/deploy.d.ts +38 -0
- package/dist/types/types/config/dev.d.ts +55 -0
- package/dist/types/types/config/experiments.d.ts +3 -0
- package/dist/types/types/config/html.d.ts +3 -0
- package/dist/types/types/config/index.d.ts +48 -0
- package/dist/types/types/config/output.d.ts +61 -0
- package/dist/types/types/config/performance.d.ts +3 -0
- package/dist/types/types/config/resolve.d.ts +2 -0
- package/dist/types/types/config/security.d.ts +2 -0
- package/dist/types/types/config/source.d.ts +61 -0
- package/dist/types/types/config/testing.d.ts +8 -0
- package/dist/types/types/config/tools.d.ts +21 -0
- package/dist/types/types/index.d.ts +10 -0
- package/dist/types/types/plugin.d.ts +114 -0
- package/dist/types/types/utils.d.ts +1 -0
- package/dist/types/ultramodern/designSystem.d.ts +54 -0
- package/dist/types/utils/config.d.ts +2 -0
- package/dist/types/utils/createServer.d.ts +5 -0
- package/dist/types/utils/env.d.ts +2 -0
- package/dist/types/utils/generateWatchFiles.d.ts +2 -0
- package/dist/types/utils/getConfigFile.d.ts +1 -0
- package/dist/types/utils/getSelectedEntries.d.ts +5 -0
- package/dist/types/utils/initAppContext.d.ts +31 -0
- package/dist/types/utils/loadPlugins.d.ts +13 -0
- package/dist/types/utils/printInstructions.d.ts +3 -0
- package/dist/types/utils/register.d.ts +19 -0
- package/dist/types/utils/restart.d.ts +2 -0
- package/dist/types/utils/routes.d.ts +4 -0
- package/dist/types/utils/types.d.ts +49 -0
- package/lib/types.d.ts +252 -0
- package/package.json +138 -0
- package/rslib.config.mts +39 -0
- package/rstest.config.mts +20 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
class BottomTemplatePlugin {
|
|
3
|
+
apply(compiler) {
|
|
4
|
+
compiler.hooks.compilation.tap(this.name, (compilation)=>{
|
|
5
|
+
this.htmlPlugin.getCompilationHooks(compilation).beforeEmit.tap(this.name, (data)=>{
|
|
6
|
+
if (!data.plugin.options?.__internal__) return data;
|
|
7
|
+
if (this.bottomTemplateReg.test(data.html)) {
|
|
8
|
+
data.html = data.html.replace(this.bottomTemplateReg, '');
|
|
9
|
+
const { bottomTemplate } = data.plugin.options;
|
|
10
|
+
if (bottomTemplate) data.html = data.html.replace(this.bodyRegExp, (match)=>`\n${bottomTemplate}\n${match}`);
|
|
11
|
+
}
|
|
12
|
+
return data;
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
constructor(htmlPlugin){
|
|
17
|
+
this.bottomTemplateReg = /<!--<\?-\s*bottomTemplate\s*\?>-->/;
|
|
18
|
+
this.bodyRegExp = /(<\/\s*body\s*>)/i;
|
|
19
|
+
this.htmlPlugin = htmlPlugin;
|
|
20
|
+
this.name = 'bottom-template';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export { BottomTemplatePlugin };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { ROUTE_MANIFEST_FILE } from "@modern-js/utils";
|
|
3
|
+
import { merge, mergeWith } from "@modern-js/utils/lodash";
|
|
4
|
+
import { ROUTE_MANIFEST } from "@modern-js/utils/universal/constants";
|
|
5
|
+
import { createHash } from "crypto";
|
|
6
|
+
const PLUGIN_NAME = 'ModernjsRoutePlugin';
|
|
7
|
+
const generateContentHash = (content)=>createHash('md5').update(content).digest('hex').slice(0, 8);
|
|
8
|
+
class RouterPlugin {
|
|
9
|
+
isTargetNodeOrWebWorker(target) {
|
|
10
|
+
if ('node' === target || Array.isArray(target) && target.includes('node')) return true;
|
|
11
|
+
if ('webworker' === target || Array.isArray(target) && target.includes('webworker')) return true;
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
getEntryChunks(compilation, chunks) {
|
|
15
|
+
const entrypointsArray = Array.from(compilation.entrypoints.entries());
|
|
16
|
+
const entryChunkIds = entrypointsArray.map((entrypoint)=>entrypoint[0]);
|
|
17
|
+
const entryChunks = [
|
|
18
|
+
...chunks
|
|
19
|
+
].filter((chunk)=>chunk.names?.some((name)=>entryChunkIds.includes(name)));
|
|
20
|
+
return entryChunks;
|
|
21
|
+
}
|
|
22
|
+
getEntryChunkFiles(entryChunks) {
|
|
23
|
+
return entryChunks.map((chunk)=>[
|
|
24
|
+
...chunk.files || []
|
|
25
|
+
].find((fname)=>fname.includes('.js')));
|
|
26
|
+
}
|
|
27
|
+
apply(compiler) {
|
|
28
|
+
const { target } = compiler.options;
|
|
29
|
+
if (this.isTargetNodeOrWebWorker(target)) return;
|
|
30
|
+
const { rspack } = compiler;
|
|
31
|
+
const { Compilation, sources } = rspack;
|
|
32
|
+
const { RawSource } = sources;
|
|
33
|
+
const normalizePath = (path)=>{
|
|
34
|
+
if (!path.endsWith('/')) return `${path}/`;
|
|
35
|
+
return path;
|
|
36
|
+
};
|
|
37
|
+
const chunksToHtmlName = new Map();
|
|
38
|
+
const ROUTE_MANIFEST_HOLDER = "route-manifest";
|
|
39
|
+
const placeholder = `<!--<?- ${ROUTE_MANIFEST_HOLDER} ?>-->`;
|
|
40
|
+
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation)=>{
|
|
41
|
+
this.HtmlBundlerPlugin.getCompilationHooks(compilation).beforeEmit.tapAsync('RouterManifestPlugin', (data, callback)=>{
|
|
42
|
+
const { outputName } = data;
|
|
43
|
+
const { chunks } = data.plugin.options;
|
|
44
|
+
chunksToHtmlName.set(chunks, outputName);
|
|
45
|
+
data.html = data.html.replace("<\/script>", `</script>${placeholder}`);
|
|
46
|
+
callback(null, data);
|
|
47
|
+
});
|
|
48
|
+
compilation.hooks.processAssets.tapPromise({
|
|
49
|
+
name: PLUGIN_NAME,
|
|
50
|
+
stage: Compilation.PROCESS_ASSETS_STAGE_REPORT
|
|
51
|
+
}, async ()=>{
|
|
52
|
+
const stats = compilation.getStats().toJson({
|
|
53
|
+
all: false,
|
|
54
|
+
publicPath: true,
|
|
55
|
+
assets: true,
|
|
56
|
+
chunkGroups: true,
|
|
57
|
+
chunks: true,
|
|
58
|
+
ids: true
|
|
59
|
+
});
|
|
60
|
+
const { publicPath, chunks = [], namedChunkGroups } = stats;
|
|
61
|
+
const routeAssets = {};
|
|
62
|
+
if (!namedChunkGroups) return;
|
|
63
|
+
const prevManifestAsset = compilation.getAsset(ROUTE_MANIFEST_FILE);
|
|
64
|
+
const prevManifestStr = prevManifestAsset ? prevManifestAsset.source.source().toString() : JSON.stringify({
|
|
65
|
+
routeAssets: {}
|
|
66
|
+
});
|
|
67
|
+
const prevManifest = JSON.parse(prevManifestStr);
|
|
68
|
+
const asyncEntryNames = [];
|
|
69
|
+
for (const [name, chunkGroup] of Object.entries(namedChunkGroups)){
|
|
70
|
+
if (name.startsWith('async-')) asyncEntryNames.push(name);
|
|
71
|
+
const assets = chunkGroup.assets.map((asset)=>{
|
|
72
|
+
const filename = asset.name;
|
|
73
|
+
return publicPath ? normalizePath(publicPath) + filename : filename;
|
|
74
|
+
});
|
|
75
|
+
const referenceCssAssets = assets.filter((asset)=>/\.css$/.test(asset));
|
|
76
|
+
routeAssets[name] = {
|
|
77
|
+
chunkIds: chunkGroup.chunks,
|
|
78
|
+
assets,
|
|
79
|
+
referenceCssAssets
|
|
80
|
+
};
|
|
81
|
+
if (prevManifest.routeAssets[name]) mergeWith(routeAssets[name], prevManifest.routeAssets[name], (obj, source)=>{
|
|
82
|
+
if (Array.isArray(obj)) return obj.concat(source);
|
|
83
|
+
return Object.assign(source, obj);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (asyncEntryNames.length > 0) for (const asyncEntryName of asyncEntryNames){
|
|
87
|
+
const syncEntryName = asyncEntryName.replace('async-', '');
|
|
88
|
+
const syncEntry = routeAssets[syncEntryName];
|
|
89
|
+
const asyncEntry = routeAssets[asyncEntryName];
|
|
90
|
+
merge(syncEntry, asyncEntry);
|
|
91
|
+
}
|
|
92
|
+
const manifest = {
|
|
93
|
+
routeAssets
|
|
94
|
+
};
|
|
95
|
+
const entryNames = Array.from(compilation.entrypoints.keys());
|
|
96
|
+
let entryChunks = [];
|
|
97
|
+
entryChunks = this.getEntryChunks(compilation, chunks);
|
|
98
|
+
const entryChunkFiles = this.getEntryChunkFiles(entryChunks);
|
|
99
|
+
const entryChunkFileIds = entryChunks.map((chunk)=>chunk.id);
|
|
100
|
+
for(let i = 0; i < entryChunkFiles.length; i++){
|
|
101
|
+
const entryName = entryNames[i];
|
|
102
|
+
const file = entryChunkFiles[i];
|
|
103
|
+
const chunkNames = entryChunks[i].names;
|
|
104
|
+
const chunkId = entryChunkFileIds[i];
|
|
105
|
+
const asset = compilation.assets[file];
|
|
106
|
+
if (!asset || !chunkId) continue;
|
|
107
|
+
let relatedAssets = {};
|
|
108
|
+
if (entryChunkFiles.length > 1) Object.keys(routeAssets).forEach((routeId)=>{
|
|
109
|
+
const segments = routeId.split('_');
|
|
110
|
+
const chunkName = segments[0];
|
|
111
|
+
if (chunkNames?.includes(chunkName)) relatedAssets[routeId] = routeAssets[routeId];
|
|
112
|
+
});
|
|
113
|
+
else relatedAssets = routeAssets;
|
|
114
|
+
const manifest = {
|
|
115
|
+
routeAssets: relatedAssets
|
|
116
|
+
};
|
|
117
|
+
const injectedContent = `
|
|
118
|
+
;(function(){
|
|
119
|
+
window.${ROUTE_MANIFEST} = ${JSON.stringify(manifest, (k, v)=>{
|
|
120
|
+
if (('assets' === k || 'referenceCssAssets' === k) && Array.isArray(v)) return v.map((item)=>item.replace(publicPath, ''));
|
|
121
|
+
return v;
|
|
122
|
+
})};
|
|
123
|
+
})();
|
|
124
|
+
`;
|
|
125
|
+
let htmlName;
|
|
126
|
+
for (const [chunks, name] of chunksToHtmlName.entries())if (Array.isArray(chunkNames) && Array.isArray(chunks) && chunkNames.every((value, index)=>value === chunks[index])) {
|
|
127
|
+
htmlName = name;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
const oldHtml = compilation.assets[htmlName];
|
|
131
|
+
const { enableInlineRouteManifests, disableFilenameHash, staticJsDir, scriptLoading, nonce } = this;
|
|
132
|
+
const nonceAttr = nonce ? `nonce="${nonce}"` : '';
|
|
133
|
+
if (oldHtml) if (enableInlineRouteManifests) compilation.updateAsset(htmlName, new RawSource(oldHtml.source().toString().replace(placeholder, `<script ${nonceAttr}>${injectedContent}</script>`)), void 0);
|
|
134
|
+
else {
|
|
135
|
+
const scriptPath = `${staticJsDir}/${ROUTE_MANIFEST_HOLDER}-${entryName}${disableFilenameHash ? '.js' : `.${generateContentHash(injectedContent)}.js`}`;
|
|
136
|
+
const scriptUrl = `${publicPath}${scriptPath}`;
|
|
137
|
+
const scriptLoadingAttr = 'defer' === scriptLoading ? scriptLoading : 'module' === scriptLoading ? 'type="module"' : '';
|
|
138
|
+
const script = `<script ${scriptLoadingAttr} ${nonceAttr} src="${scriptUrl}"></script>`;
|
|
139
|
+
compilation.updateAsset(htmlName, new RawSource(oldHtml.source().toString().replace(placeholder, script)), void 0);
|
|
140
|
+
compilation.emitAsset(scriptPath, new RawSource(injectedContent));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (prevManifestAsset) compilation.updateAsset(ROUTE_MANIFEST_FILE, new RawSource(JSON.stringify(manifest, null, 2)), void 0);
|
|
144
|
+
else compilation.emitAsset(ROUTE_MANIFEST_FILE, new RawSource(JSON.stringify(manifest, null, 2)));
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
constructor({ staticJsDir = 'static/js', HtmlBundlerPlugin, enableInlineRouteManifests, disableFilenameHash = false, scriptLoading = 'defer', nonce }){
|
|
149
|
+
this.name = 'RouterPlugin';
|
|
150
|
+
this.HtmlBundlerPlugin = HtmlBundlerPlugin;
|
|
151
|
+
this.enableInlineRouteManifests = enableInlineRouteManifests;
|
|
152
|
+
this.staticJsDir = staticJsDir;
|
|
153
|
+
this.disableFilenameHash = disableFilenameHash;
|
|
154
|
+
this.scriptLoading = scriptLoading;
|
|
155
|
+
this.nonce = nonce;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export { RouterPlugin };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { resolvePublicDirPaths } from "@modern-js/server-core";
|
|
3
|
+
import path from "path";
|
|
4
|
+
function createCopyInfo(appContext, config) {
|
|
5
|
+
const configDir = path.resolve(appContext.appDirectory, config.source.configDir || './config');
|
|
6
|
+
const uploadDir = path.posix.join(configDir.replace(/\\/g, '/'), 'upload');
|
|
7
|
+
const publicDir = path.posix.join(configDir.replace(/\\/g, '/'), 'public');
|
|
8
|
+
const customPublicDirPaths = resolvePublicDirPaths(config.server?.publicDir, appContext.appDirectory);
|
|
9
|
+
return {
|
|
10
|
+
configDir,
|
|
11
|
+
uploadDir,
|
|
12
|
+
publicDir,
|
|
13
|
+
customPublicDirs: customPublicDirPaths
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export { createCopyInfo };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "node:module";
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import { fs, logger } from "@modern-js/utils";
|
|
4
|
+
import { loadServerPlugins } from "../utils/loadPlugins.mjs";
|
|
5
|
+
import { setupTsRuntime } from "../utils/register.mjs";
|
|
6
|
+
import { generateRoutes } from "../utils/routes.mjs";
|
|
7
|
+
async function copyEnvFiles(appDirectory, distDirectory) {
|
|
8
|
+
try {
|
|
9
|
+
const files = await fs.readdir(appDirectory);
|
|
10
|
+
const envFileRegex = /^\.env(\.[a-zA-Z0-9_-]+)*$/;
|
|
11
|
+
const envFiles = files.filter((file)=>envFileRegex.test(file));
|
|
12
|
+
if (0 === envFiles.length) return void logger.debug('No .env files found to copy');
|
|
13
|
+
const copyPromises = envFiles.map(async (envFile)=>{
|
|
14
|
+
const sourcePath = node_path.resolve(appDirectory, envFile);
|
|
15
|
+
const targetPath = node_path.resolve(distDirectory, envFile);
|
|
16
|
+
try {
|
|
17
|
+
const stat = await fs.stat(sourcePath);
|
|
18
|
+
if (stat.isDirectory()) return;
|
|
19
|
+
await fs.copy(sourcePath, targetPath);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
logger.warn(`Failed to copy ${envFile}:`, error);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
await Promise.all(copyPromises);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
logger.warn('Failed to copy .env files:', error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const build = async (api, options)=>{
|
|
30
|
+
if (options?.analyze) process.env.BUNDLE_ANALYZE = 'true';
|
|
31
|
+
const resolvedConfig = api.getNormalizedConfig();
|
|
32
|
+
const appContext = api.getAppContext();
|
|
33
|
+
const hooks = api.getHooks();
|
|
34
|
+
const combinedAlias = [].concat(resolvedConfig?.resolve?.alias ?? []).concat(resolvedConfig?.source?.alias ?? []);
|
|
35
|
+
await loadServerPlugins(api, appContext.appDirectory, appContext.metaName);
|
|
36
|
+
await setupTsRuntime(appContext.appDirectory, appContext.distDirectory, combinedAlias, {
|
|
37
|
+
moduleType: appContext.moduleType,
|
|
38
|
+
tsconfigPath: resolvedConfig?.server?.tsconfigPath
|
|
39
|
+
});
|
|
40
|
+
const { apiOnly } = appContext;
|
|
41
|
+
if (apiOnly) {
|
|
42
|
+
await hooks.onBeforeBuild.call({
|
|
43
|
+
environments: {},
|
|
44
|
+
bundlerConfigs: void 0,
|
|
45
|
+
isFirstCompile: false,
|
|
46
|
+
isWatch: false
|
|
47
|
+
});
|
|
48
|
+
await generateRoutes(appContext);
|
|
49
|
+
await hooks.onAfterBuild.call({
|
|
50
|
+
environments: {},
|
|
51
|
+
stats: void 0,
|
|
52
|
+
isFirstCompile: false,
|
|
53
|
+
isWatch: false
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
logger.info('Starting production build...');
|
|
58
|
+
if (!appContext.builder) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
|
|
59
|
+
await appContext.builder.onAfterBuild(async ()=>copyEnvFiles(appContext.appDirectory, appContext.distDirectory));
|
|
60
|
+
await appContext.builder.build({
|
|
61
|
+
watch: options?.watch
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
export { build };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { getServerPlugins } from "../utils/loadPlugins.mjs";
|
|
3
|
+
const deploy = async (api, options)=>{
|
|
4
|
+
const hooks = api.getHooks();
|
|
5
|
+
const { metaName } = api.getAppContext();
|
|
6
|
+
await getServerPlugins(api, metaName);
|
|
7
|
+
await hooks.onBeforeDeploy.call(options);
|
|
8
|
+
await hooks.deploy.call();
|
|
9
|
+
await hooks.onAfterDeploy.call(options);
|
|
10
|
+
};
|
|
11
|
+
export { deploy };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import node_path from "node:path";
|
|
3
|
+
import { applyPlugins } from "@modern-js/prod-server";
|
|
4
|
+
import { createDevServer } from "@modern-js/server";
|
|
5
|
+
import { DEFAULT_DEV_HOST, SERVER_DIR, getMeta, logger } from "@modern-js/utils";
|
|
6
|
+
import { setServer } from "../utils/createServer.mjs";
|
|
7
|
+
import { loadServerPlugins } from "../utils/loadPlugins.mjs";
|
|
8
|
+
import { printInstructions } from "../utils/printInstructions.mjs";
|
|
9
|
+
import { setupTsRuntime } from "../utils/register.mjs";
|
|
10
|
+
import { generateRoutes } from "../utils/routes.mjs";
|
|
11
|
+
const dev = async (api, options, devServerOptions)=>{
|
|
12
|
+
if (options.analyze) process.env.BUNDLE_ANALYZE = 'true';
|
|
13
|
+
const normalizedConfig = api.getNormalizedConfig();
|
|
14
|
+
const appContext = api.getAppContext();
|
|
15
|
+
const hooks = api.getHooks();
|
|
16
|
+
const combinedAlias = [].concat(normalizedConfig?.resolve?.alias ?? []).concat(normalizedConfig?.source?.alias ?? []);
|
|
17
|
+
await setupTsRuntime(appContext.appDirectory, appContext.distDirectory, combinedAlias, {
|
|
18
|
+
moduleType: appContext.moduleType,
|
|
19
|
+
tsconfigPath: normalizedConfig?.server?.tsconfigPath
|
|
20
|
+
});
|
|
21
|
+
const { appDirectory, port, apiOnly, metaName, serverRoutes } = appContext;
|
|
22
|
+
const meta = getMeta(metaName);
|
|
23
|
+
const serverConfigPath = node_path.resolve(appDirectory, SERVER_DIR, `${meta}.server`);
|
|
24
|
+
await hooks.onBeforeDev.call();
|
|
25
|
+
if (!appContext.builder && !apiOnly) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
|
|
26
|
+
await generateRoutes(appContext);
|
|
27
|
+
const pluginInstances = await loadServerPlugins(api, appDirectory, metaName);
|
|
28
|
+
const serverOptions = {
|
|
29
|
+
metaName,
|
|
30
|
+
dev: {
|
|
31
|
+
https: normalizedConfig.dev.https,
|
|
32
|
+
setupMiddlewares: normalizedConfig.dev.setupMiddlewares
|
|
33
|
+
},
|
|
34
|
+
appContext: {
|
|
35
|
+
appDirectory,
|
|
36
|
+
internalDirectory: appContext.internalDirectory,
|
|
37
|
+
apiDirectory: appContext.apiDirectory,
|
|
38
|
+
lambdaDirectory: appContext.lambdaDirectory,
|
|
39
|
+
sharedDirectory: appContext.sharedDirectory,
|
|
40
|
+
bffRuntimeFramework: appContext.bffRuntimeFramework
|
|
41
|
+
},
|
|
42
|
+
serverConfigPath,
|
|
43
|
+
routes: serverRoutes,
|
|
44
|
+
pwd: appDirectory,
|
|
45
|
+
config: normalizedConfig,
|
|
46
|
+
plugins: pluginInstances,
|
|
47
|
+
...devServerOptions
|
|
48
|
+
};
|
|
49
|
+
const host = normalizedConfig.dev?.host || DEFAULT_DEV_HOST;
|
|
50
|
+
if (apiOnly) {
|
|
51
|
+
const { server } = await createDevServer({
|
|
52
|
+
...serverOptions,
|
|
53
|
+
runCompile: false
|
|
54
|
+
}, devServerOptions?.applyPlugins || applyPlugins);
|
|
55
|
+
server.listen({
|
|
56
|
+
port,
|
|
57
|
+
host
|
|
58
|
+
}, ()=>{
|
|
59
|
+
printInstructions(hooks, appContext, normalizedConfig);
|
|
60
|
+
});
|
|
61
|
+
setServer(server);
|
|
62
|
+
} else {
|
|
63
|
+
const { server, afterListen } = await createDevServer({
|
|
64
|
+
...serverOptions,
|
|
65
|
+
builder: appContext.builder
|
|
66
|
+
}, devServerOptions?.applyPlugins || applyPlugins);
|
|
67
|
+
server.listen({
|
|
68
|
+
port,
|
|
69
|
+
host
|
|
70
|
+
}, async (err)=>{
|
|
71
|
+
if (err) logger.error('Occur error %s, when start dev server', err);
|
|
72
|
+
logger.debug('listen dev server done');
|
|
73
|
+
await afterListen();
|
|
74
|
+
});
|
|
75
|
+
setServer(server);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
export { dev };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { i18n, localeKeys } from "../locale/index.mjs";
|
|
3
|
+
import { runtimeCommand } from "./runtime.mjs";
|
|
4
|
+
const devCommand = async (program, api)=>{
|
|
5
|
+
program.command('dev').alias('start').usage('[options]').description(i18n.t(localeKeys.command.dev.describe)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('-e --entry [entry...]', i18n.t(localeKeys.command.dev.entry)).option('--analyze', i18n.t(localeKeys.command.shared.analyze)).option('--api-only', i18n.t(localeKeys.command.dev.apiOnly)).option('--web-only', i18n.t(localeKeys.command.dev.webOnly)).action(async (options)=>{
|
|
6
|
+
const { dev } = await import("./dev.mjs");
|
|
7
|
+
await dev(api, options);
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
const buildCommand = async (program, api)=>{
|
|
11
|
+
program.command('build').usage('[options]').description(i18n.t(localeKeys.command.build.describe)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('--analyze', i18n.t(localeKeys.command.shared.analyze)).option('-w --watch', i18n.t(localeKeys.command.build.watch)).action(async (options)=>{
|
|
12
|
+
const { build } = await import("./build.mjs");
|
|
13
|
+
await build(api, options);
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const serverCommand = (program, api)=>{
|
|
17
|
+
program.command('serve').usage('[options]').description(i18n.t(localeKeys.command.serve.describe)).option('--api-only', i18n.t(localeKeys.command.dev.apiOnly)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).action(async ()=>{
|
|
18
|
+
const { serve } = await import("./serve.mjs");
|
|
19
|
+
await serve(api);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const deployCommand = (program, api)=>{
|
|
23
|
+
program.command('deploy').usage('[options]').option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('-s --skip-build', i18n.t(localeKeys.command.shared.skipBuild)).description(i18n.t(localeKeys.command.deploy.describe)).action(async (options)=>{
|
|
24
|
+
if (!options.skipBuild) {
|
|
25
|
+
const { build } = await import("./build.mjs");
|
|
26
|
+
await build(api);
|
|
27
|
+
}
|
|
28
|
+
const { deploy } = await import("./deploy.mjs");
|
|
29
|
+
await deploy(api, options);
|
|
30
|
+
process.exit(0);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
const inspectCommand = (program, api)=>{
|
|
34
|
+
program.command('inspect').description('inspect the internal configs').option("--env <env>", i18n.t(localeKeys.command.inspect.env), 'development').option('--output <output>', i18n.t(localeKeys.command.inspect.output), './').option('--verbose', i18n.t(localeKeys.command.inspect.verbose)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).action(async (options)=>{
|
|
35
|
+
const { inspect } = await import("./inspect.mjs");
|
|
36
|
+
inspect(api, options);
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const infoCommand = (program, api)=>{
|
|
40
|
+
program.command('info').usage('[options]').description(i18n.t(localeKeys.command.info.describe)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('--json', 'output as JSON format for machine reading').action(async (options)=>{
|
|
41
|
+
const { info } = await import("./info.mjs");
|
|
42
|
+
await info(api, options);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const runtimeOperationsCommand = async (program, api)=>{
|
|
46
|
+
await runtimeCommand(program, api);
|
|
47
|
+
};
|
|
48
|
+
export { buildCommand, deployCommand, devCommand, infoCommand, inspectCommand, runtimeOperationsCommand, serverCommand };
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { getEntryOptions, isApiOnly } from "@modern-js/utils";
|
|
3
|
+
import { isMainEntry } from "../utils/routes.mjs";
|
|
4
|
+
const info = async (api, options = {})=>{
|
|
5
|
+
const normalizedConfig = api.getNormalizedConfig();
|
|
6
|
+
const appContext = api.getAppContext();
|
|
7
|
+
const hooks = api.getHooks();
|
|
8
|
+
const apiOnly = await isApiOnly(appContext.appDirectory, normalizedConfig.source?.entriesDir, appContext.apiDirectory);
|
|
9
|
+
if (apiOnly) {
|
|
10
|
+
const projectInfo = {
|
|
11
|
+
entries: [],
|
|
12
|
+
apiOnly: true
|
|
13
|
+
};
|
|
14
|
+
printProjectInfo(projectInfo, options.json);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const [{ getBundleEntry }] = await Promise.all([
|
|
18
|
+
import("../plugins/analyze/getBundleEntry.mjs")
|
|
19
|
+
]);
|
|
20
|
+
const { entrypoints } = await hooks.modifyEntrypoints.call({
|
|
21
|
+
entrypoints: await getBundleEntry(hooks, appContext, normalizedConfig)
|
|
22
|
+
});
|
|
23
|
+
const { source: { mainEntryName }, server: { ssr, ssrByEntries }, output: { ssg, ssgByEntries } } = normalizedConfig;
|
|
24
|
+
const { packageName } = appContext;
|
|
25
|
+
const entries = entrypoints.map((entrypoint)=>{
|
|
26
|
+
const { entryName, entry, isAutoMount, isCustomSourceEntry, customEntry } = entrypoint;
|
|
27
|
+
const isMain = isMainEntry(entryName, mainEntryName);
|
|
28
|
+
const ssrOptions = getEntryOptions(entryName, isMain, ssr, ssrByEntries, packageName);
|
|
29
|
+
const ssgOptions = getEntryOptions(entryName, isMain, ssg, ssgByEntries, packageName);
|
|
30
|
+
let ssrMode = false;
|
|
31
|
+
if (ssrOptions) {
|
|
32
|
+
if ('boolean' == typeof ssrOptions) ssrMode = 'stream';
|
|
33
|
+
else if ('object' == typeof ssrOptions) ssrMode = 'string' === ssrOptions.mode ? 'string' : 'stream';
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
entryName,
|
|
37
|
+
isMainEntry: isMain,
|
|
38
|
+
entry,
|
|
39
|
+
isAutoMount: isAutoMount ?? true,
|
|
40
|
+
isCustomSourceEntry: isCustomSourceEntry ?? false,
|
|
41
|
+
customEntry: customEntry ?? false,
|
|
42
|
+
ssr: ssrMode,
|
|
43
|
+
ssg: Boolean(ssgOptions)
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
const projectInfo = {
|
|
47
|
+
entries,
|
|
48
|
+
apiOnly: false
|
|
49
|
+
};
|
|
50
|
+
printProjectInfo(projectInfo, options.json);
|
|
51
|
+
};
|
|
52
|
+
function printProjectInfo(projectInfo, jsonOnly) {
|
|
53
|
+
if (jsonOnly) return void console.log(JSON.stringify(projectInfo, null, 2));
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log('===== Modern.js Project Info =====');
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log(JSON.stringify(projectInfo, null, 2));
|
|
58
|
+
console.log('');
|
|
59
|
+
console.log('===== Entry Details =====');
|
|
60
|
+
console.log('');
|
|
61
|
+
if (projectInfo.apiOnly) return void console.log('This is an API-only project (no page entries).');
|
|
62
|
+
if (0 === projectInfo.entries.length) return void console.log('No entries found.');
|
|
63
|
+
for (const entry of projectInfo.entries){
|
|
64
|
+
console.log(`Entry: ${entry.entryName}`);
|
|
65
|
+
console.log(` - Path: ${entry.entry}`);
|
|
66
|
+
console.log(` - Main Entry: ${entry.isMainEntry}`);
|
|
67
|
+
console.log(` - Auto Mount: ${entry.isAutoMount}`);
|
|
68
|
+
console.log(` - Custom Entry: ${entry.customEntry}`);
|
|
69
|
+
console.log(` - Custom Source Entry: ${entry.isCustomSourceEntry}`);
|
|
70
|
+
console.log(" - Rendering Mode:");
|
|
71
|
+
if (entry.ssg) console.log(" - SSG: enabled");
|
|
72
|
+
else if (entry.ssr) console.log(` - SSR: ${entry.ssr} mode`);
|
|
73
|
+
else console.log(" - CSR: enabled (default)");
|
|
74
|
+
console.log('');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export { info };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
const inspect = async (api, options)=>{
|
|
3
|
+
const appContext = api.getAppContext();
|
|
4
|
+
if (!appContext.builder) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
|
|
5
|
+
const metaName = 'modern-js' === appContext.metaName ? 'modern.js' : appContext.metaName;
|
|
6
|
+
return appContext.builder.inspectConfig({
|
|
7
|
+
mode: options.env,
|
|
8
|
+
verbose: options.verbose,
|
|
9
|
+
outputPath: options.output,
|
|
10
|
+
writeToDisk: true,
|
|
11
|
+
extraConfigs: {
|
|
12
|
+
[metaName]: api.getNormalizedConfig()
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
export { inspect };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
const DEFAULT_RUNTIME_HOST = 'http://127.0.0.1:8080';
|
|
3
|
+
const DEFAULT_RUNTIME_STATUS_PATH = '/_modern/runtime/status';
|
|
4
|
+
const DEFAULT_RUNTIME_FALLBACK_SIGNAL_PATH = '/_modern/contract-gates/runtime-fallback';
|
|
5
|
+
const DEFAULT_RUNTIME_TOKEN_HEADER = 'x-modernjs-runtime-signal-token';
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
7
|
+
const resolveRuntimeEndpoint = (input, defaultPath)=>{
|
|
8
|
+
const rawInput = input?.trim();
|
|
9
|
+
if (!rawInput) return `${DEFAULT_RUNTIME_HOST}${defaultPath}`;
|
|
10
|
+
if (rawInput.startsWith('http://') || rawInput.startsWith('https://')) return rawInput;
|
|
11
|
+
const normalized = rawInput.startsWith('/') ? rawInput : `/${rawInput}`;
|
|
12
|
+
return `${DEFAULT_RUNTIME_HOST}${normalized}`;
|
|
13
|
+
};
|
|
14
|
+
const resolveToken = ({ token, tokenEnv })=>{
|
|
15
|
+
if ('string' == typeof token && token.trim().length > 0) return token.trim();
|
|
16
|
+
if ('string' == typeof tokenEnv && tokenEnv.trim().length > 0) {
|
|
17
|
+
const value = process.env[tokenEnv.trim()];
|
|
18
|
+
if ('string' == typeof value && value.trim().length > 0) return value.trim();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const parseTimeoutMs = (value)=>{
|
|
22
|
+
if ('string' != typeof value || 0 === value.trim().length) return DEFAULT_TIMEOUT_MS;
|
|
23
|
+
const parsed = Number.parseInt(value, 10);
|
|
24
|
+
if (!Number.isFinite(parsed) || parsed <= 0) return DEFAULT_TIMEOUT_MS;
|
|
25
|
+
return parsed;
|
|
26
|
+
};
|
|
27
|
+
const parseMetadata = (metadata)=>{
|
|
28
|
+
if ('string' != typeof metadata || 0 === metadata.trim().length) return;
|
|
29
|
+
const parsed = JSON.parse(metadata);
|
|
30
|
+
if (!parsed || 'object' != typeof parsed || Array.isArray(parsed)) throw new Error('metadata must be a JSON object');
|
|
31
|
+
return parsed;
|
|
32
|
+
};
|
|
33
|
+
const fetchWithTimeout = async (url, init, timeoutMs)=>{
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const timeout = setTimeout(()=>{
|
|
36
|
+
controller.abort();
|
|
37
|
+
}, timeoutMs);
|
|
38
|
+
try {
|
|
39
|
+
return await fetch(url, {
|
|
40
|
+
...init,
|
|
41
|
+
signal: controller.signal
|
|
42
|
+
});
|
|
43
|
+
} finally{
|
|
44
|
+
clearTimeout(timeout);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const parseResponseBody = async (response)=>{
|
|
48
|
+
const text = await response.text();
|
|
49
|
+
if (!text) return {};
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(text);
|
|
52
|
+
} catch (_error) {
|
|
53
|
+
return {
|
|
54
|
+
raw: text
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const printOutput = (payload, jsonOnly)=>{
|
|
59
|
+
if (jsonOnly) return void console.log(JSON.stringify(payload, null, 2));
|
|
60
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
61
|
+
};
|
|
62
|
+
const createRuntimeFallbackSignalPayload = (options)=>{
|
|
63
|
+
const payload = {
|
|
64
|
+
appName: options.app,
|
|
65
|
+
reason: options.reason || 'runtime_fallback',
|
|
66
|
+
phase: options.phase || 'load'
|
|
67
|
+
};
|
|
68
|
+
if (options.entry) payload.entry = options.entry;
|
|
69
|
+
if (options.runtimeDigest) payload.runtimeDigest = options.runtimeDigest;
|
|
70
|
+
const metadata = parseMetadata(options.metadata);
|
|
71
|
+
if (metadata) payload.metadata = metadata;
|
|
72
|
+
return payload;
|
|
73
|
+
};
|
|
74
|
+
const runtimeCommand = async (program, _api)=>{
|
|
75
|
+
const runtime = program.command('runtime').description('runtime operations');
|
|
76
|
+
runtime.command('status').description('read runtime status snapshot').option('--endpoint <endpoint>', 'runtime status endpoint URL or path').option('--token <token>', 'runtime status auth token').option('--token-env <name>', 'environment variable name that stores runtime status auth token', 'MODERN_RUNTIME_SIGNAL_TOKEN').option('--header-name <name>', 'auth header name', DEFAULT_RUNTIME_TOKEN_HEADER).option('--timeout <ms>', 'request timeout in milliseconds', '5000').option('--json', 'output as JSON format for machine reading').action(async (options)=>{
|
|
77
|
+
const endpoint = resolveRuntimeEndpoint(options.endpoint, DEFAULT_RUNTIME_STATUS_PATH);
|
|
78
|
+
const timeoutMs = parseTimeoutMs(options.timeout);
|
|
79
|
+
const token = resolveToken({
|
|
80
|
+
token: options.token,
|
|
81
|
+
tokenEnv: options.tokenEnv
|
|
82
|
+
});
|
|
83
|
+
const headerName = options.headerName?.trim() || DEFAULT_RUNTIME_TOKEN_HEADER;
|
|
84
|
+
const headers = new Headers();
|
|
85
|
+
if (token) headers.set(headerName, token);
|
|
86
|
+
const response = await fetchWithTimeout(endpoint, {
|
|
87
|
+
method: 'GET',
|
|
88
|
+
headers
|
|
89
|
+
}, timeoutMs);
|
|
90
|
+
const payload = await parseResponseBody(response);
|
|
91
|
+
if (!response.ok) throw new Error(`runtime status request failed with ${response.status}: ${JSON.stringify(payload)}`);
|
|
92
|
+
printOutput(payload, options.json);
|
|
93
|
+
});
|
|
94
|
+
runtime.command('fallback-signal').description('emit runtime fallback signal for canary gate mutation').requiredOption('--app <appName>', 'remote app name').option('--endpoint <endpoint>', 'runtime fallback signal endpoint URL or path').option('--reason <reason>', 'fallback reason', 'runtime_fallback').option('--phase <phase>', 'fallback phase', 'load').option('--entry <entry>', 'remote entry URL').option('--runtime-digest <digest>', 'runtime digest value').option('--metadata <json>', 'metadata JSON object string').option('--token <token>', 'runtime signal auth token').option('--token-env <name>', 'environment variable name that stores runtime signal auth token', 'MODERN_RUNTIME_SIGNAL_TOKEN').option('--header-name <name>', 'auth header name', DEFAULT_RUNTIME_TOKEN_HEADER).option('--timeout <ms>', 'request timeout in milliseconds', '5000').option('--json', 'output as JSON format for machine reading').action(async (options)=>{
|
|
95
|
+
const endpoint = resolveRuntimeEndpoint(options.endpoint, DEFAULT_RUNTIME_FALLBACK_SIGNAL_PATH);
|
|
96
|
+
const timeoutMs = parseTimeoutMs(options.timeout);
|
|
97
|
+
const token = resolveToken({
|
|
98
|
+
token: options.token,
|
|
99
|
+
tokenEnv: options.tokenEnv
|
|
100
|
+
});
|
|
101
|
+
const headerName = options.headerName?.trim() || DEFAULT_RUNTIME_TOKEN_HEADER;
|
|
102
|
+
const payload = createRuntimeFallbackSignalPayload(options);
|
|
103
|
+
const headers = new Headers({
|
|
104
|
+
'content-type': 'application/json'
|
|
105
|
+
});
|
|
106
|
+
if (token) headers.set(headerName, token);
|
|
107
|
+
const response = await fetchWithTimeout(endpoint, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
headers,
|
|
110
|
+
body: JSON.stringify(payload)
|
|
111
|
+
}, timeoutMs);
|
|
112
|
+
const responsePayload = await parseResponseBody(response);
|
|
113
|
+
if (!response.ok) throw new Error(`runtime fallback signal request failed with ${response.status}: ${JSON.stringify(responsePayload)}`);
|
|
114
|
+
printOutput(responsePayload, options.json);
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
export { createRuntimeFallbackSignalPayload, resolveRuntimeEndpoint, resolveToken, runtimeCommand };
|