@bleedingdev/modern-js-app-tools 3.2.0-ultramodern.12 → 3.2.0-ultramodern.121

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.
Files changed (159) hide show
  1. package/bin/modern.js +0 -0
  2. package/dist/cjs/baseline.js +12 -50
  3. package/dist/cjs/builder/builder-rspack/index.js +9 -5
  4. package/dist/cjs/builder/generator/adapterCopy.js +9 -5
  5. package/dist/cjs/builder/generator/createBuilderProviderConfig.js +9 -5
  6. package/dist/cjs/builder/generator/createCopyPattern.js +9 -5
  7. package/dist/cjs/builder/generator/getBuilderEnvironments.js +199 -12
  8. package/dist/cjs/builder/generator/index.js +9 -5
  9. package/dist/cjs/builder/index.js +9 -5
  10. package/dist/cjs/builder/shared/builderPlugins/adapterBasic.js +50 -10
  11. package/dist/cjs/builder/shared/builderPlugins/adapterHtml.js +10 -6
  12. package/dist/cjs/builder/shared/builderPlugins/adapterPrecompress.js +9 -5
  13. package/dist/cjs/builder/shared/builderPlugins/adapterSSR.js +12 -6
  14. package/dist/cjs/builder/shared/builderPlugins/builderHooks.js +12 -8
  15. package/dist/cjs/builder/shared/builderPlugins/index.js +9 -5
  16. package/dist/cjs/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +9 -5
  17. package/dist/cjs/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +12 -8
  18. package/dist/cjs/builder/shared/bundlerPlugins/RouterPlugin.js +9 -5
  19. package/dist/cjs/builder/shared/bundlerPlugins/index.js +9 -5
  20. package/dist/cjs/builder/shared/createCopyInfo.js +9 -5
  21. package/dist/cjs/builder/shared/index.js +9 -5
  22. package/dist/cjs/builder/shared/loaders/serverModuleLoader.js +12 -8
  23. package/dist/cjs/commands/build.js +9 -5
  24. package/dist/cjs/commands/deploy.js +9 -5
  25. package/dist/cjs/commands/dev.js +9 -5
  26. package/dist/cjs/commands/index.js +12 -11
  27. package/dist/cjs/commands/info.js +9 -5
  28. package/dist/cjs/commands/inspect.js +12 -8
  29. package/dist/cjs/commands/runtime.js +50 -13
  30. package/dist/cjs/commands/serve.js +9 -5
  31. package/dist/cjs/compat/hooks.js +9 -5
  32. package/dist/cjs/compat/index.js +9 -5
  33. package/dist/cjs/compat/utils.js +9 -5
  34. package/dist/cjs/config/default.js +9 -5
  35. package/dist/cjs/config/index.js +9 -5
  36. package/dist/cjs/config/initialize/index.js +9 -5
  37. package/dist/cjs/config/initialize/inits.js +9 -5
  38. package/dist/cjs/constants.js +13 -9
  39. package/dist/cjs/defineConfig.js +12 -8
  40. package/dist/cjs/esm/register-esm.js +12 -8
  41. package/dist/cjs/esm/ts-paths-loader.js +9 -5
  42. package/dist/cjs/index.js +22 -17
  43. package/dist/cjs/locale/en.js +12 -8
  44. package/dist/cjs/locale/index.js +9 -5
  45. package/dist/cjs/locale/zh.js +12 -8
  46. package/dist/cjs/plugins/analyze/constants.js +14 -10
  47. package/dist/cjs/plugins/analyze/getBundleEntry.js +9 -5
  48. package/dist/cjs/plugins/analyze/getFileSystemEntry.js +9 -5
  49. package/dist/cjs/plugins/analyze/getHtmlTemplate.js +9 -5
  50. package/dist/cjs/plugins/analyze/getServerRoutes.js +9 -5
  51. package/dist/cjs/plugins/analyze/index.js +9 -5
  52. package/dist/cjs/plugins/analyze/isDefaultExportFunction.js +9 -5
  53. package/dist/cjs/plugins/analyze/templates.js +12 -8
  54. package/dist/cjs/plugins/analyze/utils.js +9 -5
  55. package/dist/cjs/plugins/deploy/index.js +26 -11
  56. package/dist/cjs/plugins/deploy/platforms/cloudflare.js +400 -0
  57. package/dist/cjs/plugins/deploy/platforms/gh-pages.js +9 -5
  58. package/dist/cjs/plugins/deploy/platforms/netlify.js +9 -5
  59. package/dist/cjs/plugins/deploy/platforms/node.js +9 -5
  60. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.mjs +563 -0
  61. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  62. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  63. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  64. package/dist/cjs/plugins/deploy/platforms/vercel.js +9 -5
  65. package/dist/cjs/plugins/deploy/utils/generator.js +9 -5
  66. package/dist/cjs/plugins/deploy/utils/index.js +19 -40
  67. package/dist/cjs/plugins/initialize/index.js +9 -5
  68. package/dist/cjs/plugins/serverBuild.js +9 -5
  69. package/dist/cjs/plugins/serverRuntime.js +12 -8
  70. package/dist/cjs/presetUltramodern.js +95 -7
  71. package/dist/cjs/rsbuild.js +55 -64
  72. package/dist/cjs/run/index.js +9 -5
  73. package/dist/cjs/types/config/cloudflareDeploy.js +18 -0
  74. package/dist/cjs/types/config/index.js +9 -5
  75. package/dist/cjs/types/config/precompress.js +18 -0
  76. package/dist/cjs/types/index.js +9 -5
  77. package/dist/cjs/ultramodern/designSystem.js +16 -12
  78. package/dist/cjs/utils/config.js +9 -5
  79. package/dist/cjs/utils/createServer.js +14 -10
  80. package/dist/cjs/utils/env.js +9 -5
  81. package/dist/cjs/utils/generateWatchFiles.js +9 -5
  82. package/dist/cjs/utils/getConfigFile.js +9 -5
  83. package/dist/cjs/utils/getSelectedEntries.js +9 -5
  84. package/dist/cjs/utils/initAppContext.js +9 -5
  85. package/dist/cjs/utils/loadPlugins.js +9 -5
  86. package/dist/cjs/utils/printInstructions.js +9 -5
  87. package/dist/cjs/utils/register.js +9 -5
  88. package/dist/cjs/utils/restart.js +9 -5
  89. package/dist/cjs/utils/routes.js +9 -5
  90. package/dist/esm/baseline.mjs +3 -45
  91. package/dist/esm/builder/generator/getBuilderEnvironments.mjs +180 -8
  92. package/dist/esm/builder/shared/builderPlugins/adapterBasic.mjs +41 -5
  93. package/dist/esm/builder/shared/builderPlugins/adapterHtml.mjs +1 -1
  94. package/dist/esm/builder/shared/builderPlugins/adapterSSR.mjs +3 -1
  95. package/dist/esm/commands/index.mjs +2 -5
  96. package/dist/esm/commands/runtime.mjs +33 -3
  97. package/dist/esm/index.mjs +2 -2
  98. package/dist/esm/plugins/deploy/index.mjs +10 -4
  99. package/dist/esm/plugins/deploy/platforms/cloudflare.mjs +352 -0
  100. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.mjs +563 -0
  101. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  102. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  103. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  104. package/dist/esm/plugins/deploy/utils/index.mjs +11 -36
  105. package/dist/esm/presetUltramodern.mjs +77 -3
  106. package/dist/esm/rsbuild.mjs +4 -8
  107. package/dist/esm/types/config/cloudflareDeploy.mjs +0 -0
  108. package/dist/esm/types/config/precompress.mjs +0 -0
  109. package/dist/esm-node/baseline.mjs +3 -45
  110. package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +185 -9
  111. package/dist/esm-node/builder/shared/builderPlugins/adapterBasic.mjs +41 -5
  112. package/dist/esm-node/builder/shared/builderPlugins/adapterHtml.mjs +1 -1
  113. package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.mjs +3 -1
  114. package/dist/esm-node/commands/index.mjs +2 -5
  115. package/dist/esm-node/commands/runtime.mjs +33 -3
  116. package/dist/esm-node/index.mjs +2 -2
  117. package/dist/esm-node/plugins/deploy/index.mjs +10 -4
  118. package/dist/esm-node/plugins/deploy/platforms/cloudflare.mjs +353 -0
  119. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.mjs +563 -0
  120. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  121. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  122. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  123. package/dist/esm-node/plugins/deploy/utils/index.mjs +12 -36
  124. package/dist/esm-node/presetUltramodern.mjs +77 -3
  125. package/dist/esm-node/rsbuild.mjs +4 -8
  126. package/dist/esm-node/types/config/cloudflareDeploy.mjs +1 -0
  127. package/dist/esm-node/types/config/precompress.mjs +1 -0
  128. package/dist/types/baseline.d.ts +16 -46
  129. package/dist/types/builder/builder-rspack/index.d.ts +1 -1
  130. package/dist/types/builder/generator/index.d.ts +1 -1
  131. package/dist/types/builder/shared/createCopyInfo.d.ts +1 -1
  132. package/dist/types/commands/index.d.ts +1 -1
  133. package/dist/types/commands/inspect.d.ts +1 -1
  134. package/dist/types/commands/runtime.d.ts +1 -0
  135. package/dist/types/locale/en.d.ts +1 -1
  136. package/dist/types/locale/index.d.ts +89 -2
  137. package/dist/types/locale/zh.d.ts +1 -1
  138. package/dist/types/plugins/analyze/getFileSystemEntry.d.ts +2 -2
  139. package/dist/types/plugins/analyze/utils.d.ts +1 -1
  140. package/dist/types/plugins/deploy/index.d.ts +4 -1
  141. package/dist/types/plugins/deploy/platforms/cloudflare.d.ts +2 -0
  142. package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.d.mts +4 -0
  143. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.d.mts +5 -0
  144. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.d.mts +48 -0
  145. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-path.d.mts +21 -0
  146. package/dist/types/plugins/deploy/utils/generator.d.ts +2 -2
  147. package/dist/types/plugins/deploy/utils/index.d.ts +1 -1
  148. package/dist/types/presetUltramodern.d.ts +52 -2
  149. package/dist/types/rsbuild.d.ts +1 -1
  150. package/dist/types/run/index.d.ts +1 -1
  151. package/dist/types/types/config/cloudflareDeploy.d.ts +79 -0
  152. package/dist/types/types/config/deploy.d.ts +16 -14
  153. package/dist/types/types/config/output.d.ts +4 -20
  154. package/dist/types/types/config/precompress.d.ts +20 -0
  155. package/dist/types/utils/getConfigFile.d.ts +1 -1
  156. package/dist/types/utils/loadPlugins.d.ts +2 -2
  157. package/package.json +21 -22
  158. package/dist/esm/rslib-runtime.mjs +0 -18
  159. package/dist/esm-node/rslib-runtime.mjs +0 -19
@@ -1,6 +1,74 @@
1
- import "node:module";
1
+ import __rslib_shim_module__ from "node:module";
2
+ const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/ (()=>import.meta.url)());
3
+ import node_fs from "node:fs";
4
+ import node_path from "node:path";
2
5
  import { SERVICE_WORKER_ENVIRONMENT_NAME } from "@modern-js/builder";
3
6
  import { isProd, isSSR, isServiceWorker, isUseRsc, isUseSSRBundle } from "@modern-js/utils";
7
+ import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
8
+ import { dirname as __rspack_dirname } from "node:path";
9
+ var getBuilderEnvironments_dirname = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
10
+ const BFF_EFFECT_WORKER_ENTRY_NAME = '__modern_bff_effect';
11
+ const BFF_EFFECT_WORKER_RUNTIME_QUERY = 'modern-bff-runtime';
12
+ const JS_OR_TS_EXTS = [
13
+ '.ts',
14
+ '.tsx',
15
+ '.js',
16
+ '.jsx',
17
+ '.mjs',
18
+ '.cjs'
19
+ ];
20
+ const CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR = node_path.resolve(getBuilderEnvironments_dirname, '../../plugins/deploy/platforms/templates');
21
+ function findExistingFile(candidates) {
22
+ return candidates.find((candidate)=>node_fs.existsSync(candidate));
23
+ }
24
+ function resolvePackageEntry(packageName, paths) {
25
+ try {
26
+ return node_fs.realpathSync(require.resolve(packageName, {
27
+ paths
28
+ }));
29
+ } catch {
30
+ return;
31
+ }
32
+ }
33
+ function resolvePackageFile(packageName, filePath, paths) {
34
+ try {
35
+ return node_fs.realpathSync(require.resolve(`${packageName}/${filePath}`, {
36
+ paths
37
+ }));
38
+ } catch {
39
+ const packageEntry = resolvePackageEntry(packageName, paths);
40
+ if (!packageEntry) return;
41
+ const packageRoot = findPackageRoot(packageEntry, packageName);
42
+ const packageFile = packageRoot ? node_path.join(packageRoot, filePath) : void 0;
43
+ return packageFile && node_fs.existsSync(packageFile) ? node_fs.realpathSync(packageFile) : void 0;
44
+ }
45
+ }
46
+ function findPackageRoot(entryFile, packageName) {
47
+ let directory = node_path.dirname(entryFile);
48
+ while(directory !== node_path.dirname(directory)){
49
+ const packageJsonPath = node_path.join(directory, 'package.json');
50
+ try {
51
+ const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
52
+ if (packageJson.name === packageName) return directory;
53
+ } catch {}
54
+ directory = node_path.dirname(directory);
55
+ }
56
+ }
57
+ function setAliasIfPresent(alias, name, value) {
58
+ if (value) alias.set(name, value);
59
+ }
60
+ function getCloudflareWorkerCompatFile(file) {
61
+ return node_path.join(CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR, file);
62
+ }
63
+ function getEffectBffEntry(normalizedConfig, appContext) {
64
+ if (!normalizedConfig.bff || 'hono' === normalizedConfig.bff.runtimeFramework) return;
65
+ const configuredEntry = normalizedConfig.bff.effect?.entry;
66
+ const entryWithoutExtension = configuredEntry ? node_path.isAbsolute(configuredEntry) ? configuredEntry : node_path.resolve(appContext.appDirectory, configuredEntry) : node_path.resolve(appContext.apiDirectory, 'effect', 'index');
67
+ return findExistingFile(JS_OR_TS_EXTS.map((extension)=>`${entryWithoutExtension}${extension}`));
68
+ }
69
+ function isCloudflareWorkerDeploy(normalizedConfig) {
70
+ return normalizedConfig.deploy?.target === 'cloudflare' || 'cloudflare' === process.env.MODERNJS_DEPLOY;
71
+ }
4
72
  function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig) {
5
73
  const entries = {};
6
74
  const { entrypoints = [], checkedEntries } = appContext;
@@ -17,6 +85,11 @@ function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig)
17
85
  const v = entries[entry];
18
86
  serverEntries[entry] = v.map((entry)=>entry.replace('index.jsx', 'index.server.jsx')).map((entry)=>entry.replace('bootstrap.jsx', 'bootstrap.server.jsx'));
19
87
  }
88
+ const cloudflareWorkerServerEntries = {};
89
+ for(const entry in entries){
90
+ const v = entries[entry];
91
+ cloudflareWorkerServerEntries[entry] = v.map((entry)=>entry.replace('index.jsx', 'index.server.jsx')).map((entry)=>entry.replace('bootstrap.jsx', 'index.server.jsx'));
92
+ }
20
93
  const environments = {
21
94
  client: {
22
95
  output: {
@@ -41,14 +114,117 @@ function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig)
41
114
  }
42
115
  };
43
116
  const useWorkerTarget = isServiceWorker(normalizedConfig);
44
- if (useWorkerTarget) environments[SERVICE_WORKER_ENVIRONMENT_NAME] = {
45
- output: {
46
- target: 'web-worker'
47
- },
48
- source: {
49
- entry: serverEntries
50
- }
51
- };
117
+ if (useWorkerTarget) {
118
+ const useCloudflareModuleWorker = isCloudflareWorkerDeploy(normalizedConfig);
119
+ const effectBffEntry = useCloudflareModuleWorker ? getEffectBffEntry(normalizedConfig, appContext) : void 0;
120
+ const tanstackRouterSsrServerFile = useCloudflareModuleWorker ? resolvePackageFile('@tanstack/router-core', 'dist/esm/ssr/ssr-server.js', [
121
+ appContext.appDirectory,
122
+ process.cwd()
123
+ ]) : void 0;
124
+ const runtimeRscWorkerFile = useCloudflareModuleWorker ? resolvePackageFile('@modern-js/runtime', 'dist/esm/rsc/server.worker.mjs', [
125
+ appContext.appDirectory,
126
+ process.cwd()
127
+ ]) : void 0;
128
+ const renderRscWorkerFile = useCloudflareModuleWorker ? resolvePackageFile('@modern-js/render', 'dist/esm/rscWorker.mjs', [
129
+ appContext.appDirectory,
130
+ process.cwd()
131
+ ]) : void 0;
132
+ const reactFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'index.js', [
133
+ appContext.appDirectory,
134
+ process.cwd()
135
+ ]) : void 0;
136
+ const reactJsxRuntimeFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'jsx-runtime.js', [
137
+ appContext.appDirectory,
138
+ process.cwd()
139
+ ]) : void 0;
140
+ const reactJsxDevRuntimeFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'jsx-dev-runtime.js', [
141
+ appContext.appDirectory,
142
+ process.cwd()
143
+ ]) : void 0;
144
+ const reactDomFile = useCloudflareModuleWorker ? resolvePackageFile('react-dom', 'index.js', [
145
+ appContext.appDirectory,
146
+ process.cwd()
147
+ ]) : void 0;
148
+ const reactDomServerEdgeFile = useCloudflareModuleWorker ? resolvePackageFile('react-dom', 'server.edge.js', [
149
+ appContext.appDirectory,
150
+ process.cwd()
151
+ ]) : void 0;
152
+ const loadableComponentFile = useCloudflareModuleWorker ? resolvePackageFile('@loadable/component', 'dist/esm/loadable.esm.mjs', [
153
+ appContext.appDirectory,
154
+ process.cwd(),
155
+ CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR
156
+ ]) : void 0;
157
+ const loadableServerWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-loadable-server.mjs') : void 0;
158
+ const fsPromisesWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-fs-promises.mjs') : void 0;
159
+ const pathWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-path.mjs') : void 0;
160
+ const baseWorkerEntries = useCloudflareModuleWorker ? cloudflareWorkerServerEntries : serverEntries;
161
+ const workerEntries = effectBffEntry ? {
162
+ ...baseWorkerEntries,
163
+ [BFF_EFFECT_WORKER_ENTRY_NAME]: [
164
+ `${effectBffEntry}?${BFF_EFFECT_WORKER_RUNTIME_QUERY}`
165
+ ]
166
+ } : baseWorkerEntries;
167
+ environments[SERVICE_WORKER_ENVIRONMENT_NAME] = {
168
+ output: {
169
+ target: useCloudflareModuleWorker ? 'web' : 'web-worker',
170
+ ...useCloudflareModuleWorker ? {
171
+ module: true
172
+ } : {}
173
+ },
174
+ source: {
175
+ entry: workerEntries
176
+ },
177
+ tools: {
178
+ htmlPlugin: false,
179
+ ...useCloudflareModuleWorker ? {
180
+ bundlerChain: (chain)=>{
181
+ chain.merge({
182
+ experiments: {
183
+ outputModule: true
184
+ }
185
+ });
186
+ chain.output.module(true).library({
187
+ type: 'module'
188
+ }).chunkFormat('module').chunkLoading('import').workerChunkLoading('import');
189
+ chain.target('webworker');
190
+ chain.plugins.delete('plugin-module-federation');
191
+ if (tanstackRouterSsrServerFile) {
192
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server$', tanstackRouterSsrServerFile);
193
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server', tanstackRouterSsrServerFile);
194
+ }
195
+ if (runtimeRscWorkerFile) {
196
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server$', runtimeRscWorkerFile);
197
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server', runtimeRscWorkerFile);
198
+ }
199
+ if (renderRscWorkerFile) {
200
+ chain.resolve.alias.set('@modern-js/render/rsc$', renderRscWorkerFile);
201
+ chain.resolve.alias.set('@modern-js/render/rsc', renderRscWorkerFile);
202
+ chain.resolve.alias.set('@modern-js/render/rsc-worker$', renderRscWorkerFile);
203
+ }
204
+ setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
205
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
206
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
207
+ setAliasIfPresent(chain.resolve.alias, 'react-dom$', reactDomFile);
208
+ setAliasIfPresent(chain.resolve.alias, 'react-dom/server.edge$', reactDomServerEdgeFile);
209
+ setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
210
+ setAliasIfPresent(chain.resolve.alias, '@loadable/server$', loadableServerWorkerFile);
211
+ setAliasIfPresent(chain.resolve.alias, 'fs/promises$', fsPromisesWorkerFile);
212
+ setAliasIfPresent(chain.resolve.alias, 'node:fs/promises$', fsPromisesWorkerFile);
213
+ setAliasIfPresent(chain.resolve.alias, 'path$', pathWorkerFile);
214
+ setAliasIfPresent(chain.resolve.alias, 'node:path$', pathWorkerFile);
215
+ chain.resolve.alias.set('react-server-dom-rspack/server.node$', 'react-server-dom-rspack/server.edge');
216
+ chain.resolve.alias.set('react-server-dom-rspack/server.node', 'react-server-dom-rspack/server.edge');
217
+ chain.resolve.alias.set('react-server-dom-rspack/client.node$', 'react-server-dom-rspack/client.edge');
218
+ chain.resolve.alias.set('react-server-dom-rspack/client.node', 'react-server-dom-rspack/client.edge');
219
+ chain.resolve.fallback.set('async_hooks', false);
220
+ chain.resolve.fallback.set('node:async_hooks', false);
221
+ chain.resolve.fallback.set('fs', false);
222
+ chain.resolve.fallback.set('node:fs', false);
223
+ }
224
+ } : {}
225
+ }
226
+ };
227
+ }
52
228
  return {
53
229
  environments,
54
230
  builderConfig: tempBuilderConfig
@@ -9,8 +9,11 @@ const builderPluginAdapterBasic = (options)=>({
9
9
  setup (api) {
10
10
  api.modifyBundlerChain((chain, { target, CHAIN_ID, environment })=>{
11
11
  const isServiceWorker = environment.name === SERVICE_WORKER_ENVIRONMENT_NAME;
12
- if ('node' === target || isServiceWorker) applyNodeCompat(isServiceWorker, chain);
13
- if ('web' === target) {
12
+ const isWebTargetServiceWorker = isServiceWorker && 'web' === target;
13
+ if ('node' === target || isServiceWorker) applyNodeCompat(isServiceWorker, chain, {
14
+ includeNodeExtensions: !isWebTargetServiceWorker
15
+ });
16
+ if ('web' === target && !isServiceWorker) {
14
17
  const bareServerModuleReg = /\.(server|node)\.[tj]sx?$/;
15
18
  const depExt = 'mjs';
16
19
  chain.module.rule(CHAIN_ID.RULE.JS).exclude.add(bareServerModuleReg);
@@ -26,8 +29,40 @@ const builderPluginAdapterBasic = (options)=>({
26
29
  });
27
30
  api.modifyRspackConfig((config, { target, environment })=>{
28
31
  const isServiceWorker = environment.name === SERVICE_WORKER_ENVIRONMENT_NAME;
32
+ const isWebTargetServiceWorker = isServiceWorker && 'web' === target;
29
33
  if ('node' === target || isServiceWorker) {
30
- const extensionAlias = {
34
+ const extensionAlias = isWebTargetServiceWorker ? {
35
+ '.js': [
36
+ '.worker.js',
37
+ '.server.js',
38
+ '.js'
39
+ ],
40
+ '.jsx': [
41
+ '.worker.jsx',
42
+ '.server.jsx',
43
+ '.jsx'
44
+ ],
45
+ '.ts': [
46
+ '.worker.ts',
47
+ '.server.ts',
48
+ '.ts'
49
+ ],
50
+ '.tsx': [
51
+ '.worker.tsx',
52
+ '.server.tsx',
53
+ '.tsx'
54
+ ],
55
+ '.mjs': [
56
+ '.worker.mjs',
57
+ '.server.mjs',
58
+ '.mjs'
59
+ ],
60
+ '.json': [
61
+ '.worker.json',
62
+ '.server.json',
63
+ '.json'
64
+ ]
65
+ } : {
31
66
  '.js': [
32
67
  '.node.js',
33
68
  '.server.js',
@@ -68,7 +103,8 @@ const builderPluginAdapterBasic = (options)=>({
68
103
  });
69
104
  }
70
105
  });
71
- function applyNodeCompat(isServiceWorker, chain) {
106
+ function applyNodeCompat(isServiceWorker, chain, options = {}) {
107
+ const { includeNodeExtensions = true } = options;
72
108
  const nodeExts = [
73
109
  '.node.js',
74
110
  '.node.jsx',
@@ -87,7 +123,7 @@ function applyNodeCompat(isServiceWorker, chain) {
87
123
  '.worker.ts',
88
124
  '.worker.tsx'
89
125
  ];
90
- for (const ext of nodeExts)chain.resolve.extensions.prepend(ext);
126
+ if (includeNodeExtensions) for (const ext of nodeExts)chain.resolve.extensions.prepend(ext);
91
127
  if (isServiceWorker) for (const ext of webWorkerExts)chain.resolve.extensions.prepend(ext);
92
128
  }
93
129
  export { builderPluginAdapterBasic };
@@ -39,7 +39,7 @@ function applyBottomHtmlPlugin({ chain, options, CHAIN_ID, HtmlBundlerPlugin, ht
39
39
  const baseTemplateParams = {
40
40
  entryName,
41
41
  title: modernConfig.html.title,
42
- mountId: modernConfig.html.templateParameters
42
+ mountId: modernConfig.html.mountId
43
43
  };
44
44
  chain.plugin(`${CHAIN_ID.PLUGIN.HTML}-${entryName}`).tap((args)=>[
45
45
  {
@@ -96,9 +96,10 @@ function applyFilterEntriesBySSRConfig({ isProd, chain, appNormalizedConfig }) {
96
96
  });
97
97
  }
98
98
  async function applySSRLoaderEntry(chain, optinos, isServer) {
99
- const { appContext } = optinos;
99
+ const { appContext, normalizedConfig } = optinos;
100
100
  const { internalDirectory } = appContext;
101
101
  const { entrypoints } = appContext;
102
+ const isRsc = isUseRsc(normalizedConfig);
102
103
  await Promise.all(entrypoints.map(async (entrypoint)=>{
103
104
  const { entryName } = entrypoint;
104
105
  const serverLoadersFile = getServerCombinedModuleFile(internalDirectory, entryName);
@@ -106,6 +107,7 @@ async function applySSRLoaderEntry(chain, optinos, isServer) {
106
107
  await fs.access(serverLoadersFile, fs.constants.F_OK);
107
108
  chain.entry(`${entryName}-server-loaders`).add(serverLoadersFile);
108
109
  } catch (err) {}
110
+ else if (isRsc) chain.entry(`${entryName}-server-loaders`).add("data:text/javascript,export%20{};");
109
111
  }));
110
112
  }
111
113
  function applySSRDataLoader(chain, options) {
@@ -1,6 +1,5 @@
1
1
  import "node:module";
2
2
  import { i18n, localeKeys } from "../locale/index.mjs";
3
- import { runtimeCommand } from "./runtime.mjs";
4
3
  const devCommand = async (program, api)=>{
5
4
  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
5
  const { dev } = await import("./dev.mjs");
@@ -42,7 +41,5 @@ const infoCommand = (program, api)=>{
42
41
  await info(api, options);
43
42
  });
44
43
  };
45
- const runtimeOperationsCommand = async (program, api)=>{
46
- await runtimeCommand(program, api);
47
- };
48
- export { buildCommand, deployCommand, devCommand, infoCommand, inspectCommand, runtimeOperationsCommand, serverCommand };
44
+ export { runtimeCommand } from "./runtime.mjs";
45
+ export { buildCommand, deployCommand, devCommand, infoCommand, inspectCommand, serverCommand };
@@ -55,9 +55,39 @@ const parseResponseBody = async (response)=>{
55
55
  };
56
56
  }
57
57
  };
58
+ const INDENT_STEP = ' ';
59
+ const formatScalar = (value)=>'string' == typeof value ? value : JSON.stringify(value) ?? 'undefined';
60
+ const formatHumanReadableLines = (value, indent)=>{
61
+ if (Array.isArray(value)) {
62
+ if (0 === value.length) return [
63
+ `${indent}(empty)`
64
+ ];
65
+ return value.flatMap((entry)=>null !== entry && 'object' == typeof entry ? [
66
+ `${indent}-`,
67
+ ...formatHumanReadableLines(entry, indent + INDENT_STEP)
68
+ ] : [
69
+ `${indent}- ${formatScalar(entry)}`
70
+ ]);
71
+ }
72
+ if (null !== value && 'object' == typeof value) {
73
+ const entries = Object.entries(value);
74
+ if (0 === entries.length) return [
75
+ `${indent}(empty)`
76
+ ];
77
+ return entries.flatMap(([key, entry])=>null !== entry && 'object' == typeof entry ? [
78
+ `${indent}${key}:`,
79
+ ...formatHumanReadableLines(entry, indent + INDENT_STEP)
80
+ ] : [
81
+ `${indent}${key}: ${formatScalar(entry)}`
82
+ ]);
83
+ }
84
+ return [
85
+ `${indent}${formatScalar(value)}`
86
+ ];
87
+ };
88
+ const formatRuntimeOutput = (payload, jsonOnly)=>jsonOnly ? JSON.stringify(payload, null, 2) : formatHumanReadableLines(payload, '').join('\n');
58
89
  const printOutput = (payload, jsonOnly)=>{
59
- if (jsonOnly) return void console.log(JSON.stringify(payload, null, 2));
60
- console.log(JSON.stringify(payload, null, 2));
90
+ console.log(formatRuntimeOutput(payload, jsonOnly));
61
91
  };
62
92
  const createRuntimeFallbackSignalPayload = (options)=>{
63
93
  const payload = {
@@ -114,4 +144,4 @@ const runtimeCommand = async (program, _api)=>{
114
144
  printOutput(responsePayload, options.json);
115
145
  });
116
146
  };
117
- export { createRuntimeFallbackSignalPayload, resolveRuntimeEndpoint, resolveToken, runtimeCommand };
147
+ export { createRuntimeFallbackSignalPayload, formatRuntimeOutput, resolveRuntimeEndpoint, resolveToken, runtimeCommand };
@@ -5,7 +5,7 @@ import { getLocaleLanguage } from "@modern-js/i18n-utils/language-detector";
5
5
  import { createAsyncHook } from "@modern-js/plugin";
6
6
  import { cleanRequireCache, deprecatedCommands, emptyDir, getArgv, getCommand } from "@modern-js/utils";
7
7
  import path from "path";
8
- import { buildCommand, deployCommand, devCommand, infoCommand, inspectCommand, runtimeOperationsCommand, serverCommand } from "./commands/index.mjs";
8
+ import { buildCommand, deployCommand, devCommand, infoCommand, inspectCommand, runtimeCommand, serverCommand } from "./commands/index.mjs";
9
9
  import { compatPlugin } from "./compat/index.mjs";
10
10
  import { DEFAULT_RUNTIME_CONFIG_FILE } from "./constants.mjs";
11
11
  import { i18n } from "./locale/index.mjs";
@@ -73,7 +73,7 @@ const appTools = ()=>({
73
73
  deployCommand(program, api);
74
74
  inspectCommand(program, api);
75
75
  infoCommand(program, api);
76
- await runtimeOperationsCommand(program, api);
76
+ await runtimeCommand(program, api);
77
77
  deprecatedCommands(program);
78
78
  });
79
79
  api.onPrepare(async ()=>{
@@ -1,5 +1,6 @@
1
1
  import "node:module";
2
2
  import { provider } from "std-env";
3
+ import { createCloudflarePreset } from "./platforms/cloudflare.mjs";
3
4
  import { createGhPagesPreset } from "./platforms/gh-pages.mjs";
4
5
  import { createNetlifyPreset } from "./platforms/netlify.mjs";
5
6
  import { createNodePreset } from "./platforms/node.mjs";
@@ -9,14 +10,18 @@ const deployPresets = {
9
10
  node: createNodePreset,
10
11
  vercel: createVercelPreset,
11
12
  netlify: createNetlifyPreset,
12
- ghPages: createGhPagesPreset
13
+ ghPages: createGhPagesPreset,
14
+ cloudflare: createCloudflarePreset
13
15
  };
16
+ const getSupportedDeployTargets = ()=>Object.keys(deployPresets);
17
+ const isDeployTarget = (target)=>Object.prototype.hasOwnProperty.call(deployPresets, target);
18
+ const resolveDeployTarget = (modernConfig, envDeployTarget = process.env.MODERNJS_DEPLOY, detectedProvider = provider)=>modernConfig.deploy?.target || envDeployTarget || detectedProvider || 'node';
14
19
  async function getDeployPreset(appContext, modernConfig, deployTarget, api) {
15
20
  const { appDirectory, distDirectory, metaName } = appContext;
16
21
  const { useSSR, useAPI, useWebServer } = getProjectUsage(appDirectory, distDirectory, metaName);
17
22
  const needModernServer = useSSR || useAPI || useWebServer;
23
+ if (!isDeployTarget(deployTarget)) throw new Error(`Unknown deploy target: '${deployTarget}'. deploy.target or MODERNJS_DEPLOY should be one of: ${getSupportedDeployTargets().join(', ')}.`);
18
24
  const createPreset = deployPresets[deployTarget];
19
- if (!createPreset) throw new Error(`Unknown deploy target: '${deployTarget}'. MODERNJS_DEPLOY should be 'node', 'vercel', or 'netlify'.`);
20
25
  return createPreset({
21
26
  appContext,
22
27
  modernConfig,
@@ -27,12 +32,12 @@ async function getDeployPreset(appContext, modernConfig, deployTarget, api) {
27
32
  const deploy = ()=>({
28
33
  name: '@modern-js/plugin-deploy',
29
34
  setup: (api)=>{
30
- const deployTarget = process.env.MODERNJS_DEPLOY || provider || 'node';
31
35
  api.deploy(async ()=>{
32
36
  const appContext = api.getAppContext();
33
37
  const { metaName } = appContext;
34
- if ('modern-js' !== metaName && !process.env.MODERNJS_DEPLOY) return;
35
38
  const modernConfig = api.getNormalizedConfig();
39
+ const deployTarget = resolveDeployTarget(modernConfig);
40
+ if ('modern-js' !== metaName && !modernConfig.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
36
41
  const deployPreset = await getDeployPreset(appContext, modernConfig, deployTarget, api);
37
42
  deployPreset?.prepare && await deployPreset?.prepare();
38
43
  deployPreset?.writeOutput && await deployPreset?.writeOutput();
@@ -42,3 +47,4 @@ const deploy = ()=>({
42
47
  }
43
48
  });
44
49
  export default deploy;
50
+ export { getSupportedDeployTargets, resolveDeployTarget };