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

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 (134) hide show
  1. package/bin/modern.js +0 -0
  2. package/dist/cjs/baseline.js +51 -5
  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 +9 -5
  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 +15 -11
  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 +21 -16
  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 +384 -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 +502 -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 +9 -5
  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 +9 -5
  71. package/dist/cjs/rsbuild.js +12 -5
  72. package/dist/cjs/run/index.js +9 -5
  73. package/dist/cjs/types/config/index.js +9 -5
  74. package/dist/cjs/types/index.js +9 -5
  75. package/dist/cjs/ultramodern/designSystem.js +16 -12
  76. package/dist/cjs/utils/config.js +9 -5
  77. package/dist/cjs/utils/createServer.js +14 -10
  78. package/dist/cjs/utils/env.js +9 -5
  79. package/dist/cjs/utils/generateWatchFiles.js +9 -5
  80. package/dist/cjs/utils/getConfigFile.js +9 -5
  81. package/dist/cjs/utils/getSelectedEntries.js +9 -5
  82. package/dist/cjs/utils/initAppContext.js +9 -5
  83. package/dist/cjs/utils/loadPlugins.js +9 -5
  84. package/dist/cjs/utils/printInstructions.js +9 -5
  85. package/dist/cjs/utils/register.js +9 -5
  86. package/dist/cjs/utils/restart.js +9 -5
  87. package/dist/cjs/utils/routes.js +9 -5
  88. package/dist/esm/baseline.mjs +33 -1
  89. package/dist/esm/builder/generator/getBuilderEnvironments.mjs +180 -8
  90. package/dist/esm/builder/shared/builderPlugins/adapterBasic.mjs +41 -5
  91. package/dist/esm/builder/shared/builderPlugins/adapterHtml.mjs +1 -1
  92. package/dist/esm/builder/shared/builderPlugins/adapterSSR.mjs +3 -1
  93. package/dist/esm/plugins/deploy/index.mjs +10 -4
  94. package/dist/esm/plugins/deploy/platforms/cloudflare.mjs +336 -0
  95. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.mjs +502 -0
  96. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  97. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  98. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  99. package/dist/esm/rsbuild.mjs +5 -2
  100. package/dist/esm-node/baseline.mjs +33 -1
  101. package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +185 -9
  102. package/dist/esm-node/builder/shared/builderPlugins/adapterBasic.mjs +41 -5
  103. package/dist/esm-node/builder/shared/builderPlugins/adapterHtml.mjs +1 -1
  104. package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.mjs +3 -1
  105. package/dist/esm-node/plugins/deploy/index.mjs +10 -4
  106. package/dist/esm-node/plugins/deploy/platforms/cloudflare.mjs +337 -0
  107. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.mjs +502 -0
  108. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  109. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  110. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  111. package/dist/esm-node/rsbuild.mjs +5 -2
  112. package/dist/types/builder/builder-rspack/index.d.ts +1 -1
  113. package/dist/types/builder/generator/index.d.ts +1 -1
  114. package/dist/types/builder/shared/createCopyInfo.d.ts +1 -1
  115. package/dist/types/commands/inspect.d.ts +1 -1
  116. package/dist/types/locale/en.d.ts +1 -1
  117. package/dist/types/locale/index.d.ts +89 -2
  118. package/dist/types/locale/zh.d.ts +1 -1
  119. package/dist/types/plugins/analyze/getFileSystemEntry.d.ts +2 -2
  120. package/dist/types/plugins/analyze/utils.d.ts +1 -1
  121. package/dist/types/plugins/deploy/index.d.ts +4 -1
  122. package/dist/types/plugins/deploy/platforms/cloudflare.d.ts +2 -0
  123. package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.d.mts +4 -0
  124. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.d.mts +5 -0
  125. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.d.mts +48 -0
  126. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-path.d.mts +21 -0
  127. package/dist/types/plugins/deploy/utils/generator.d.ts +2 -2
  128. package/dist/types/plugins/deploy/utils/index.d.ts +1 -1
  129. package/dist/types/rsbuild.d.ts +1 -1
  130. package/dist/types/run/index.d.ts +1 -1
  131. package/dist/types/types/config/deploy.d.ts +56 -0
  132. package/dist/types/utils/getConfigFile.d.ts +1 -1
  133. package/dist/types/utils/loadPlugins.d.ts +2 -2
  134. package/package.json +22 -21
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
10
10
  };
11
11
  })();
12
12
  (()=>{
13
- __webpack_require__.d = (exports1, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
17
- });
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
18
22
  };
19
23
  })();
20
24
  (()=>{
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
10
10
  };
11
11
  })();
12
12
  (()=>{
13
- __webpack_require__.d = (exports1, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
17
- });
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
18
22
  };
19
23
  })();
20
24
  (()=>{
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
9
13
  };
10
14
  })();
11
15
  (()=>{
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
10
10
  };
11
11
  })();
12
12
  (()=>{
13
- __webpack_require__.d = (exports1, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
17
- });
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
18
22
  };
19
23
  })();
20
24
  (()=>{
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
9
13
  };
10
14
  })();
11
15
  (()=>{
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
9
13
  };
10
14
  })();
11
15
  (()=>{
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
10
10
  };
11
11
  })();
12
12
  (()=>{
13
- __webpack_require__.d = (exports1, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
17
- });
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
18
22
  };
19
23
  })();
20
24
  (()=>{
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
3
  (()=>{
4
- __webpack_require__.d = (exports1, definition)=>{
5
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
- enumerable: true,
7
- get: definition[key]
8
- });
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
9
13
  };
10
14
  })();
11
15
  (()=>{
@@ -10,11 +10,15 @@ var __webpack_require__ = {};
10
10
  };
11
11
  })();
12
12
  (()=>{
13
- __webpack_require__.d = (exports1, definition)=>{
14
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
- enumerable: true,
16
- get: definition[key]
17
- });
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
18
22
  };
19
23
  })();
20
24
  (()=>{
@@ -1,4 +1,33 @@
1
+ import { createRequire } from "node:module";
2
+ import node_path from "node:path";
1
3
  import { mergeConfig } from "@modern-js/plugin/cli";
4
+ const resolveReactRouterPackageDir = ()=>{
5
+ const localRequire = createRequire(node_path.join(process.cwd(), 'package.json'));
6
+ try {
7
+ const reactRouterDomPackageJson = localRequire.resolve('react-router-dom/package.json', {
8
+ paths: [
9
+ process.cwd()
10
+ ]
11
+ });
12
+ const reactRouterPackageJson = localRequire.resolve('react-router/package.json', {
13
+ paths: [
14
+ node_path.dirname(reactRouterDomPackageJson)
15
+ ]
16
+ });
17
+ return node_path.dirname(reactRouterPackageJson);
18
+ } catch {
19
+ return;
20
+ }
21
+ };
22
+ const setReactRouterBridgeSafeAliases = (chain)=>{
23
+ const reactRouterPackageDir = resolveReactRouterPackageDir();
24
+ if (!reactRouterPackageDir) return;
25
+ const productionEntry = node_path.join(reactRouterPackageDir, 'dist/production/index.mjs');
26
+ const developmentEntry = node_path.join(reactRouterPackageDir, 'dist/development/index.mjs');
27
+ chain.resolve.alias.set('react-router$', productionEntry);
28
+ chain.resolve.alias.set('react-router/dist/production/index.js', productionEntry);
29
+ chain.resolve.alias.set('react-router/dist/development/index.js', developmentEntry);
30
+ };
2
31
  const createAppBaselineConfig = (options = {})=>{
3
32
  const { appId = 'app', enableBffRequestId = true, enableTelemetry = true, enableTelemetryExporters = true, otlpEndpoint = process.env.MODERN_TELEMETRY_OTLP_ENDPOINT || 'http://127.0.0.1:4318/v1/logs', victoriaMetricsEndpoint = process.env.MODERN_TELEMETRY_VICTORIA_ENDPOINT || 'http://127.0.0.1:8428/api/v1/import/prometheus', telemetryFailLoudStartup = true, enableModuleFederationSSR = true } = options;
4
33
  const server = {};
@@ -32,7 +61,10 @@ const createAppBaselineConfig = (options = {})=>{
32
61
  disableClientServer: true
33
62
  }
34
63
  },
35
- server
64
+ server,
65
+ tools: {
66
+ bundlerChain: setReactRouterBridgeSafeAliases
67
+ }
36
68
  };
37
69
  if (enableBffRequestId) baselineConfig.bff = {
38
70
  requestId: appId
@@ -1,5 +1,69 @@
1
+ import node_fs from "node:fs";
2
+ import node_path from "node:path";
1
3
  import { SERVICE_WORKER_ENVIRONMENT_NAME } from "@modern-js/builder";
2
4
  import { isProd, isSSR, isServiceWorker, isUseRsc, isUseSSRBundle } from "@modern-js/utils";
5
+ const BFF_EFFECT_WORKER_ENTRY_NAME = '__modern_bff_effect';
6
+ const BFF_EFFECT_WORKER_RUNTIME_QUERY = 'modern-bff-runtime';
7
+ const JS_OR_TS_EXTS = [
8
+ '.ts',
9
+ '.tsx',
10
+ '.js',
11
+ '.jsx',
12
+ '.mjs',
13
+ '.cjs'
14
+ ];
15
+ const CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR = node_path.resolve(__dirname, '../../plugins/deploy/platforms/templates');
16
+ function findExistingFile(candidates) {
17
+ return candidates.find((candidate)=>node_fs.existsSync(candidate));
18
+ }
19
+ function resolvePackageEntry(packageName, paths) {
20
+ try {
21
+ return node_fs.realpathSync(require.resolve(packageName, {
22
+ paths
23
+ }));
24
+ } catch {
25
+ return;
26
+ }
27
+ }
28
+ function resolvePackageFile(packageName, filePath, paths) {
29
+ try {
30
+ return node_fs.realpathSync(require.resolve(`${packageName}/${filePath}`, {
31
+ paths
32
+ }));
33
+ } catch {
34
+ const packageEntry = resolvePackageEntry(packageName, paths);
35
+ if (!packageEntry) return;
36
+ const packageRoot = findPackageRoot(packageEntry, packageName);
37
+ const packageFile = packageRoot ? node_path.join(packageRoot, filePath) : void 0;
38
+ return packageFile && node_fs.existsSync(packageFile) ? node_fs.realpathSync(packageFile) : void 0;
39
+ }
40
+ }
41
+ function findPackageRoot(entryFile, packageName) {
42
+ let directory = node_path.dirname(entryFile);
43
+ while(directory !== node_path.dirname(directory)){
44
+ const packageJsonPath = node_path.join(directory, 'package.json');
45
+ try {
46
+ const packageJson = JSON.parse(node_fs.readFileSync(packageJsonPath, 'utf-8'));
47
+ if (packageJson.name === packageName) return directory;
48
+ } catch {}
49
+ directory = node_path.dirname(directory);
50
+ }
51
+ }
52
+ function setAliasIfPresent(alias, name, value) {
53
+ if (value) alias.set(name, value);
54
+ }
55
+ function getCloudflareWorkerCompatFile(file) {
56
+ return node_path.join(CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR, file);
57
+ }
58
+ function getEffectBffEntry(normalizedConfig, appContext) {
59
+ if (!normalizedConfig.bff || 'hono' === normalizedConfig.bff.runtimeFramework) return;
60
+ const configuredEntry = normalizedConfig.bff.effect?.entry;
61
+ const entryWithoutExtension = configuredEntry ? node_path.isAbsolute(configuredEntry) ? configuredEntry : node_path.resolve(appContext.appDirectory, configuredEntry) : node_path.resolve(appContext.apiDirectory, 'effect', 'index');
62
+ return findExistingFile(JS_OR_TS_EXTS.map((extension)=>`${entryWithoutExtension}${extension}`));
63
+ }
64
+ function isCloudflareWorkerDeploy(normalizedConfig) {
65
+ return normalizedConfig.deploy?.target === 'cloudflare' || 'cloudflare' === process.env.MODERNJS_DEPLOY;
66
+ }
3
67
  function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig) {
4
68
  const entries = {};
5
69
  const { entrypoints = [], checkedEntries } = appContext;
@@ -16,6 +80,11 @@ function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig)
16
80
  const v = entries[entry];
17
81
  serverEntries[entry] = v.map((entry)=>entry.replace('index.jsx', 'index.server.jsx')).map((entry)=>entry.replace('bootstrap.jsx', 'bootstrap.server.jsx'));
18
82
  }
83
+ const cloudflareWorkerServerEntries = {};
84
+ for(const entry in entries){
85
+ const v = entries[entry];
86
+ cloudflareWorkerServerEntries[entry] = v.map((entry)=>entry.replace('index.jsx', 'index.server.jsx')).map((entry)=>entry.replace('bootstrap.jsx', 'index.server.jsx'));
87
+ }
19
88
  const environments = {
20
89
  client: {
21
90
  output: {
@@ -40,14 +109,117 @@ function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig)
40
109
  }
41
110
  };
42
111
  const useWorkerTarget = isServiceWorker(normalizedConfig);
43
- if (useWorkerTarget) environments[SERVICE_WORKER_ENVIRONMENT_NAME] = {
44
- output: {
45
- target: 'web-worker'
46
- },
47
- source: {
48
- entry: serverEntries
49
- }
50
- };
112
+ if (useWorkerTarget) {
113
+ const useCloudflareModuleWorker = isCloudflareWorkerDeploy(normalizedConfig);
114
+ const effectBffEntry = useCloudflareModuleWorker ? getEffectBffEntry(normalizedConfig, appContext) : void 0;
115
+ const tanstackRouterSsrServerFile = useCloudflareModuleWorker ? resolvePackageFile('@tanstack/router-core', 'dist/esm/ssr/ssr-server.js', [
116
+ appContext.appDirectory,
117
+ process.cwd()
118
+ ]) : void 0;
119
+ const runtimeRscWorkerFile = useCloudflareModuleWorker ? resolvePackageFile('@modern-js/runtime', 'dist/esm/rsc/server.worker.mjs', [
120
+ appContext.appDirectory,
121
+ process.cwd()
122
+ ]) : void 0;
123
+ const renderRscWorkerFile = useCloudflareModuleWorker ? resolvePackageFile('@modern-js/render', 'dist/esm/rscWorker.mjs', [
124
+ appContext.appDirectory,
125
+ process.cwd()
126
+ ]) : void 0;
127
+ const reactFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'index.js', [
128
+ appContext.appDirectory,
129
+ process.cwd()
130
+ ]) : void 0;
131
+ const reactJsxRuntimeFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'jsx-runtime.js', [
132
+ appContext.appDirectory,
133
+ process.cwd()
134
+ ]) : void 0;
135
+ const reactJsxDevRuntimeFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'jsx-dev-runtime.js', [
136
+ appContext.appDirectory,
137
+ process.cwd()
138
+ ]) : void 0;
139
+ const reactDomFile = useCloudflareModuleWorker ? resolvePackageFile('react-dom', 'index.js', [
140
+ appContext.appDirectory,
141
+ process.cwd()
142
+ ]) : void 0;
143
+ const reactDomServerEdgeFile = useCloudflareModuleWorker ? resolvePackageFile('react-dom', 'server.edge.js', [
144
+ appContext.appDirectory,
145
+ process.cwd()
146
+ ]) : void 0;
147
+ const loadableComponentFile = useCloudflareModuleWorker ? resolvePackageFile('@loadable/component', 'dist/esm/loadable.esm.mjs', [
148
+ appContext.appDirectory,
149
+ process.cwd(),
150
+ CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR
151
+ ]) : void 0;
152
+ const loadableServerWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-loadable-server.mjs') : void 0;
153
+ const fsPromisesWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-fs-promises.mjs') : void 0;
154
+ const pathWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-path.mjs') : void 0;
155
+ const baseWorkerEntries = useCloudflareModuleWorker ? cloudflareWorkerServerEntries : serverEntries;
156
+ const workerEntries = effectBffEntry ? {
157
+ ...baseWorkerEntries,
158
+ [BFF_EFFECT_WORKER_ENTRY_NAME]: [
159
+ `${effectBffEntry}?${BFF_EFFECT_WORKER_RUNTIME_QUERY}`
160
+ ]
161
+ } : baseWorkerEntries;
162
+ environments[SERVICE_WORKER_ENVIRONMENT_NAME] = {
163
+ output: {
164
+ target: useCloudflareModuleWorker ? 'web' : 'web-worker',
165
+ ...useCloudflareModuleWorker ? {
166
+ module: true
167
+ } : {}
168
+ },
169
+ source: {
170
+ entry: workerEntries
171
+ },
172
+ tools: {
173
+ htmlPlugin: false,
174
+ ...useCloudflareModuleWorker ? {
175
+ bundlerChain: (chain)=>{
176
+ chain.merge({
177
+ experiments: {
178
+ outputModule: true
179
+ }
180
+ });
181
+ chain.output.module(true).library({
182
+ type: 'module'
183
+ }).chunkFormat('module').chunkLoading('import').workerChunkLoading('import');
184
+ chain.target('webworker');
185
+ chain.plugins.delete('plugin-module-federation');
186
+ if (tanstackRouterSsrServerFile) {
187
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server$', tanstackRouterSsrServerFile);
188
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server', tanstackRouterSsrServerFile);
189
+ }
190
+ if (runtimeRscWorkerFile) {
191
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server$', runtimeRscWorkerFile);
192
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server', runtimeRscWorkerFile);
193
+ }
194
+ if (renderRscWorkerFile) {
195
+ chain.resolve.alias.set('@modern-js/render/rsc$', renderRscWorkerFile);
196
+ chain.resolve.alias.set('@modern-js/render/rsc', renderRscWorkerFile);
197
+ chain.resolve.alias.set('@modern-js/render/rsc-worker$', renderRscWorkerFile);
198
+ }
199
+ setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
200
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
201
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
202
+ setAliasIfPresent(chain.resolve.alias, 'react-dom$', reactDomFile);
203
+ setAliasIfPresent(chain.resolve.alias, 'react-dom/server.edge$', reactDomServerEdgeFile);
204
+ setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
205
+ setAliasIfPresent(chain.resolve.alias, '@loadable/server$', loadableServerWorkerFile);
206
+ setAliasIfPresent(chain.resolve.alias, 'fs/promises$', fsPromisesWorkerFile);
207
+ setAliasIfPresent(chain.resolve.alias, 'node:fs/promises$', fsPromisesWorkerFile);
208
+ setAliasIfPresent(chain.resolve.alias, 'path$', pathWorkerFile);
209
+ setAliasIfPresent(chain.resolve.alias, 'node:path$', pathWorkerFile);
210
+ chain.resolve.alias.set('react-server-dom-rspack/server.node$', 'react-server-dom-rspack/server.edge');
211
+ chain.resolve.alias.set('react-server-dom-rspack/server.node', 'react-server-dom-rspack/server.edge');
212
+ chain.resolve.alias.set('react-server-dom-rspack/client.node$', 'react-server-dom-rspack/client.edge');
213
+ chain.resolve.alias.set('react-server-dom-rspack/client.node', 'react-server-dom-rspack/client.edge');
214
+ chain.resolve.fallback.set('async_hooks', false);
215
+ chain.resolve.fallback.set('node:async_hooks', false);
216
+ chain.resolve.fallback.set('fs', false);
217
+ chain.resolve.fallback.set('node:fs', false);
218
+ }
219
+ } : {}
220
+ }
221
+ };
222
+ }
51
223
  return {
52
224
  environments,
53
225
  builderConfig: tempBuilderConfig
@@ -5,8 +5,11 @@ const builderPluginAdapterBasic = (options)=>({
5
5
  setup (api) {
6
6
  api.modifyBundlerChain((chain, { target, CHAIN_ID, environment })=>{
7
7
  const isServiceWorker = environment.name === SERVICE_WORKER_ENVIRONMENT_NAME;
8
- if ('node' === target || isServiceWorker) applyNodeCompat(isServiceWorker, chain);
9
- if ('web' === target) {
8
+ const isWebTargetServiceWorker = isServiceWorker && 'web' === target;
9
+ if ('node' === target || isServiceWorker) applyNodeCompat(isServiceWorker, chain, {
10
+ includeNodeExtensions: !isWebTargetServiceWorker
11
+ });
12
+ if ('web' === target && !isServiceWorker) {
10
13
  const bareServerModuleReg = /\.(server|node)\.[tj]sx?$/;
11
14
  const depExt = 'mjs';
12
15
  chain.module.rule(CHAIN_ID.RULE.JS).exclude.add(bareServerModuleReg);
@@ -22,8 +25,40 @@ const builderPluginAdapterBasic = (options)=>({
22
25
  });
23
26
  api.modifyRspackConfig((config, { target, environment })=>{
24
27
  const isServiceWorker = environment.name === SERVICE_WORKER_ENVIRONMENT_NAME;
28
+ const isWebTargetServiceWorker = isServiceWorker && 'web' === target;
25
29
  if ('node' === target || isServiceWorker) {
26
- const extensionAlias = {
30
+ const extensionAlias = isWebTargetServiceWorker ? {
31
+ '.js': [
32
+ '.worker.js',
33
+ '.server.js',
34
+ '.js'
35
+ ],
36
+ '.jsx': [
37
+ '.worker.jsx',
38
+ '.server.jsx',
39
+ '.jsx'
40
+ ],
41
+ '.ts': [
42
+ '.worker.ts',
43
+ '.server.ts',
44
+ '.ts'
45
+ ],
46
+ '.tsx': [
47
+ '.worker.tsx',
48
+ '.server.tsx',
49
+ '.tsx'
50
+ ],
51
+ '.mjs': [
52
+ '.worker.mjs',
53
+ '.server.mjs',
54
+ '.mjs'
55
+ ],
56
+ '.json': [
57
+ '.worker.json',
58
+ '.server.json',
59
+ '.json'
60
+ ]
61
+ } : {
27
62
  '.js': [
28
63
  '.node.js',
29
64
  '.server.js',
@@ -64,7 +99,8 @@ const builderPluginAdapterBasic = (options)=>({
64
99
  });
65
100
  }
66
101
  });
67
- function applyNodeCompat(isServiceWorker, chain) {
102
+ function applyNodeCompat(isServiceWorker, chain, options = {}) {
103
+ const { includeNodeExtensions = true } = options;
68
104
  const nodeExts = [
69
105
  '.node.js',
70
106
  '.node.jsx',
@@ -83,7 +119,7 @@ function applyNodeCompat(isServiceWorker, chain) {
83
119
  '.worker.ts',
84
120
  '.worker.tsx'
85
121
  ];
86
- for (const ext of nodeExts)chain.resolve.extensions.prepend(ext);
122
+ if (includeNodeExtensions) for (const ext of nodeExts)chain.resolve.extensions.prepend(ext);
87
123
  if (isServiceWorker) for (const ext of webWorkerExts)chain.resolve.extensions.prepend(ext);
88
124
  }
89
125
  export { builderPluginAdapterBasic };
@@ -38,7 +38,7 @@ function applyBottomHtmlPlugin({ chain, options, CHAIN_ID, HtmlBundlerPlugin, ht
38
38
  const baseTemplateParams = {
39
39
  entryName,
40
40
  title: modernConfig.html.title,
41
- mountId: modernConfig.html.templateParameters
41
+ mountId: modernConfig.html.mountId
42
42
  };
43
43
  chain.plugin(`${CHAIN_ID.PLUGIN.HTML}-${entryName}`).tap((args)=>[
44
44
  {
@@ -94,9 +94,10 @@ function applyFilterEntriesBySSRConfig({ isProd, chain, appNormalizedConfig }) {
94
94
  });
95
95
  }
96
96
  async function applySSRLoaderEntry(chain, optinos, isServer) {
97
- const { appContext } = optinos;
97
+ const { appContext, normalizedConfig } = optinos;
98
98
  const { internalDirectory } = appContext;
99
99
  const { entrypoints } = appContext;
100
+ const isRsc = isUseRsc(normalizedConfig);
100
101
  await Promise.all(entrypoints.map(async (entrypoint)=>{
101
102
  const { entryName } = entrypoint;
102
103
  const serverLoadersFile = getServerCombinedModuleFile(internalDirectory, entryName);
@@ -104,6 +105,7 @@ async function applySSRLoaderEntry(chain, optinos, isServer) {
104
105
  await fs.access(serverLoadersFile, fs.constants.F_OK);
105
106
  chain.entry(`${entryName}-server-loaders`).add(serverLoadersFile);
106
107
  } catch (err) {}
108
+ else if (isRsc) chain.entry(`${entryName}-server-loaders`).add("data:text/javascript,export%20{};");
107
109
  }));
108
110
  }
109
111
  function applySSRDataLoader(chain, options) {
@@ -1,4 +1,5 @@
1
1
  import { provider } from "std-env";
2
+ import { createCloudflarePreset } from "./platforms/cloudflare.mjs";
2
3
  import { createGhPagesPreset } from "./platforms/gh-pages.mjs";
3
4
  import { createNetlifyPreset } from "./platforms/netlify.mjs";
4
5
  import { createNodePreset } from "./platforms/node.mjs";
@@ -8,14 +9,18 @@ const deployPresets = {
8
9
  node: createNodePreset,
9
10
  vercel: createVercelPreset,
10
11
  netlify: createNetlifyPreset,
11
- ghPages: createGhPagesPreset
12
+ ghPages: createGhPagesPreset,
13
+ cloudflare: createCloudflarePreset
12
14
  };
15
+ const getSupportedDeployTargets = ()=>Object.keys(deployPresets);
16
+ const isDeployTarget = (target)=>Object.prototype.hasOwnProperty.call(deployPresets, target);
17
+ const resolveDeployTarget = (modernConfig, envDeployTarget = process.env.MODERNJS_DEPLOY, detectedProvider = provider)=>modernConfig.deploy?.target || envDeployTarget || detectedProvider || 'node';
13
18
  async function getDeployPreset(appContext, modernConfig, deployTarget, api) {
14
19
  const { appDirectory, distDirectory, metaName } = appContext;
15
20
  const { useSSR, useAPI, useWebServer } = getProjectUsage(appDirectory, distDirectory, metaName);
16
21
  const needModernServer = useSSR || useAPI || useWebServer;
22
+ if (!isDeployTarget(deployTarget)) throw new Error(`Unknown deploy target: '${deployTarget}'. deploy.target or MODERNJS_DEPLOY should be one of: ${getSupportedDeployTargets().join(', ')}.`);
17
23
  const createPreset = deployPresets[deployTarget];
18
- if (!createPreset) throw new Error(`Unknown deploy target: '${deployTarget}'. MODERNJS_DEPLOY should be 'node', 'vercel', or 'netlify'.`);
19
24
  return createPreset({
20
25
  appContext,
21
26
  modernConfig,
@@ -26,12 +31,12 @@ async function getDeployPreset(appContext, modernConfig, deployTarget, api) {
26
31
  const deploy = ()=>({
27
32
  name: '@modern-js/plugin-deploy',
28
33
  setup: (api)=>{
29
- const deployTarget = process.env.MODERNJS_DEPLOY || provider || 'node';
30
34
  api.deploy(async ()=>{
31
35
  const appContext = api.getAppContext();
32
36
  const { metaName } = appContext;
33
- if ('modern-js' !== metaName && !process.env.MODERNJS_DEPLOY) return;
34
37
  const modernConfig = api.getNormalizedConfig();
38
+ const deployTarget = resolveDeployTarget(modernConfig);
39
+ if ('modern-js' !== metaName && !modernConfig.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
35
40
  const deployPreset = await getDeployPreset(appContext, modernConfig, deployTarget, api);
36
41
  deployPreset?.prepare && await deployPreset?.prepare();
37
42
  deployPreset?.writeOutput && await deployPreset?.writeOutput();
@@ -41,3 +46,4 @@ const deploy = ()=>({
41
46
  }
42
47
  });
43
48
  export default deploy;
49
+ export { getSupportedDeployTargets, resolveDeployTarget };