@bleedingdev/modern-js-app-tools 3.2.0-ultramodern.10 → 3.2.0-ultramodern.100

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 (44) hide show
  1. package/bin/modern.js +0 -0
  2. package/dist/cjs/baseline.js +43 -1
  3. package/dist/cjs/builder/generator/getBuilderEnvironments.js +191 -8
  4. package/dist/cjs/builder/shared/builderPlugins/adapterBasic.js +41 -5
  5. package/dist/cjs/builder/shared/builderPlugins/adapterSSR.js +3 -1
  6. package/dist/cjs/plugins/deploy/index.js +17 -6
  7. package/dist/cjs/plugins/deploy/platforms/cloudflare.js +222 -0
  8. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.mjs +438 -0
  9. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  10. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  11. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  12. package/dist/cjs/rsbuild.js +3 -0
  13. package/dist/esm/baseline.mjs +33 -1
  14. package/dist/esm/builder/generator/getBuilderEnvironments.mjs +180 -8
  15. package/dist/esm/builder/shared/builderPlugins/adapterBasic.mjs +41 -5
  16. package/dist/esm/builder/shared/builderPlugins/adapterSSR.mjs +3 -1
  17. package/dist/esm/plugins/deploy/index.mjs +10 -4
  18. package/dist/esm/plugins/deploy/platforms/cloudflare.mjs +178 -0
  19. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.mjs +438 -0
  20. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  21. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  22. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  23. package/dist/esm/rsbuild.mjs +5 -2
  24. package/dist/esm-node/baseline.mjs +33 -1
  25. package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +185 -9
  26. package/dist/esm-node/builder/shared/builderPlugins/adapterBasic.mjs +41 -5
  27. package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.mjs +3 -1
  28. package/dist/esm-node/plugins/deploy/index.mjs +10 -4
  29. package/dist/esm-node/plugins/deploy/platforms/cloudflare.mjs +179 -0
  30. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.mjs +438 -0
  31. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.mjs +7 -0
  32. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.mjs +185 -0
  33. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-path.mjs +59 -0
  34. package/dist/esm-node/rsbuild.mjs +5 -2
  35. package/dist/types/locale/en.d.ts +1 -1
  36. package/dist/types/locale/zh.d.ts +1 -1
  37. package/dist/types/plugins/deploy/index.d.ts +4 -1
  38. package/dist/types/plugins/deploy/platforms/cloudflare.d.ts +2 -0
  39. package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.d.mts +4 -0
  40. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-fs-promises.d.mts +5 -0
  41. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-loadable-server.d.mts +48 -0
  42. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-path.d.mts +21 -0
  43. package/dist/types/types/config/deploy.d.ts +8 -0
  44. package/package.json +18 -17
package/bin/modern.js CHANGED
File without changes
@@ -1,5 +1,14 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
3
12
  (()=>{
4
13
  __webpack_require__.d = (exports1, definition)=>{
5
14
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
@@ -27,7 +36,37 @@ __webpack_require__.d(__webpack_exports__, {
27
36
  createAppBaselineConfig: ()=>createAppBaselineConfig,
28
37
  withAppBaseline: ()=>withAppBaseline
29
38
  });
39
+ const external_node_module_namespaceObject = require("node:module");
40
+ const external_node_path_namespaceObject = require("node:path");
41
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
30
42
  const cli_namespaceObject = require("@modern-js/plugin/cli");
43
+ const resolveReactRouterPackageDir = ()=>{
44
+ const localRequire = (0, external_node_module_namespaceObject.createRequire)(external_node_path_default().join(process.cwd(), 'package.json'));
45
+ try {
46
+ const reactRouterDomPackageJson = localRequire.resolve('react-router-dom/package.json', {
47
+ paths: [
48
+ process.cwd()
49
+ ]
50
+ });
51
+ const reactRouterPackageJson = localRequire.resolve('react-router/package.json', {
52
+ paths: [
53
+ external_node_path_default().dirname(reactRouterDomPackageJson)
54
+ ]
55
+ });
56
+ return external_node_path_default().dirname(reactRouterPackageJson);
57
+ } catch {
58
+ return;
59
+ }
60
+ };
61
+ const setReactRouterBridgeSafeAliases = (chain)=>{
62
+ const reactRouterPackageDir = resolveReactRouterPackageDir();
63
+ if (!reactRouterPackageDir) return;
64
+ const productionEntry = external_node_path_default().join(reactRouterPackageDir, 'dist/production/index.mjs');
65
+ const developmentEntry = external_node_path_default().join(reactRouterPackageDir, 'dist/development/index.mjs');
66
+ chain.resolve.alias.set('react-router$', productionEntry);
67
+ chain.resolve.alias.set('react-router/dist/production/index.js', productionEntry);
68
+ chain.resolve.alias.set('react-router/dist/development/index.js', developmentEntry);
69
+ };
31
70
  const createAppBaselineConfig = (options = {})=>{
32
71
  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;
33
72
  const server = {};
@@ -61,7 +100,10 @@ const createAppBaselineConfig = (options = {})=>{
61
100
  disableClientServer: true
62
101
  }
63
102
  },
64
- server
103
+ server,
104
+ tools: {
105
+ bundlerChain: setReactRouterBridgeSafeAliases
106
+ }
65
107
  };
66
108
  if (enableBffRequestId) baselineConfig.bff = {
67
109
  requestId: appId
@@ -1,5 +1,14 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
3
12
  (()=>{
4
13
  __webpack_require__.d = (exports1, definition)=>{
5
14
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
@@ -26,8 +35,74 @@ __webpack_require__.r(__webpack_exports__);
26
35
  __webpack_require__.d(__webpack_exports__, {
27
36
  getBuilderEnvironments: ()=>getBuilderEnvironments
28
37
  });
38
+ const external_node_fs_namespaceObject = require("node:fs");
39
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
40
+ const external_node_path_namespaceObject = require("node:path");
41
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
29
42
  const builder_namespaceObject = require("@modern-js/builder");
30
43
  const utils_namespaceObject = require("@modern-js/utils");
44
+ const BFF_EFFECT_WORKER_ENTRY_NAME = '__modern_bff_effect';
45
+ const BFF_EFFECT_WORKER_RUNTIME_QUERY = 'modern-bff-runtime';
46
+ const JS_OR_TS_EXTS = [
47
+ '.ts',
48
+ '.tsx',
49
+ '.js',
50
+ '.jsx',
51
+ '.mjs',
52
+ '.cjs'
53
+ ];
54
+ const CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR = external_node_path_default().resolve(__dirname, '../../plugins/deploy/platforms/templates');
55
+ function findExistingFile(candidates) {
56
+ return candidates.find((candidate)=>external_node_fs_default().existsSync(candidate));
57
+ }
58
+ function resolvePackageEntry(packageName, paths) {
59
+ try {
60
+ return external_node_fs_default().realpathSync(require.resolve(packageName, {
61
+ paths
62
+ }));
63
+ } catch {
64
+ return;
65
+ }
66
+ }
67
+ function resolvePackageFile(packageName, filePath, paths) {
68
+ try {
69
+ return external_node_fs_default().realpathSync(require.resolve(`${packageName}/${filePath}`, {
70
+ paths
71
+ }));
72
+ } catch {
73
+ const packageEntry = resolvePackageEntry(packageName, paths);
74
+ if (!packageEntry) return;
75
+ const packageRoot = findPackageRoot(packageEntry, packageName);
76
+ const packageFile = packageRoot ? external_node_path_default().join(packageRoot, filePath) : void 0;
77
+ return packageFile && external_node_fs_default().existsSync(packageFile) ? external_node_fs_default().realpathSync(packageFile) : void 0;
78
+ }
79
+ }
80
+ function findPackageRoot(entryFile, packageName) {
81
+ let directory = external_node_path_default().dirname(entryFile);
82
+ while(directory !== external_node_path_default().dirname(directory)){
83
+ const packageJsonPath = external_node_path_default().join(directory, 'package.json');
84
+ try {
85
+ const packageJson = JSON.parse(external_node_fs_default().readFileSync(packageJsonPath, 'utf-8'));
86
+ if (packageJson.name === packageName) return directory;
87
+ } catch {}
88
+ directory = external_node_path_default().dirname(directory);
89
+ }
90
+ }
91
+ function setAliasIfPresent(alias, name, value) {
92
+ if (value) alias.set(name, value);
93
+ }
94
+ function getCloudflareWorkerCompatFile(file) {
95
+ return external_node_path_default().join(CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR, file);
96
+ }
97
+ function getEffectBffEntry(normalizedConfig, appContext) {
98
+ if (!normalizedConfig.bff || 'hono' === normalizedConfig.bff.runtimeFramework) return;
99
+ const configuredEntry = normalizedConfig.bff.effect?.entry;
100
+ const entryWithoutExtension = configuredEntry ? external_node_path_default().isAbsolute(configuredEntry) ? configuredEntry : external_node_path_default().resolve(appContext.appDirectory, configuredEntry) : external_node_path_default().resolve(appContext.apiDirectory, 'effect', 'index');
101
+ return findExistingFile(JS_OR_TS_EXTS.map((extension)=>`${entryWithoutExtension}${extension}`));
102
+ }
103
+ function isCloudflareWorkerDeploy(normalizedConfig) {
104
+ return normalizedConfig.deploy?.target === 'cloudflare' || 'cloudflare' === process.env.MODERNJS_DEPLOY;
105
+ }
31
106
  function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig) {
32
107
  const entries = {};
33
108
  const { entrypoints = [], checkedEntries } = appContext;
@@ -44,6 +119,11 @@ function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig)
44
119
  const v = entries[entry];
45
120
  serverEntries[entry] = v.map((entry)=>entry.replace('index.jsx', 'index.server.jsx')).map((entry)=>entry.replace('bootstrap.jsx', 'bootstrap.server.jsx'));
46
121
  }
122
+ const cloudflareWorkerServerEntries = {};
123
+ for(const entry in entries){
124
+ const v = entries[entry];
125
+ cloudflareWorkerServerEntries[entry] = v.map((entry)=>entry.replace('index.jsx', 'index.server.jsx')).map((entry)=>entry.replace('bootstrap.jsx', 'index.server.jsx'));
126
+ }
47
127
  const environments = {
48
128
  client: {
49
129
  output: {
@@ -68,14 +148,117 @@ function getBuilderEnvironments(normalizedConfig, appContext, tempBuilderConfig)
68
148
  }
69
149
  };
70
150
  const useWorkerTarget = (0, utils_namespaceObject.isServiceWorker)(normalizedConfig);
71
- if (useWorkerTarget) environments[builder_namespaceObject.SERVICE_WORKER_ENVIRONMENT_NAME] = {
72
- output: {
73
- target: 'web-worker'
74
- },
75
- source: {
76
- entry: serverEntries
77
- }
78
- };
151
+ if (useWorkerTarget) {
152
+ const useCloudflareModuleWorker = isCloudflareWorkerDeploy(normalizedConfig);
153
+ const effectBffEntry = useCloudflareModuleWorker ? getEffectBffEntry(normalizedConfig, appContext) : void 0;
154
+ const tanstackRouterSsrServerFile = useCloudflareModuleWorker ? resolvePackageFile('@tanstack/router-core', 'dist/esm/ssr/ssr-server.js', [
155
+ appContext.appDirectory,
156
+ process.cwd()
157
+ ]) : void 0;
158
+ const runtimeRscWorkerFile = useCloudflareModuleWorker ? resolvePackageFile('@modern-js/runtime', 'dist/esm/rsc/server.worker.mjs', [
159
+ appContext.appDirectory,
160
+ process.cwd()
161
+ ]) : void 0;
162
+ const renderRscWorkerFile = useCloudflareModuleWorker ? resolvePackageFile('@modern-js/render', 'dist/esm/rscWorker.mjs', [
163
+ appContext.appDirectory,
164
+ process.cwd()
165
+ ]) : void 0;
166
+ const reactFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'index.js', [
167
+ appContext.appDirectory,
168
+ process.cwd()
169
+ ]) : void 0;
170
+ const reactJsxRuntimeFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'jsx-runtime.js', [
171
+ appContext.appDirectory,
172
+ process.cwd()
173
+ ]) : void 0;
174
+ const reactJsxDevRuntimeFile = useCloudflareModuleWorker ? resolvePackageFile('react', 'jsx-dev-runtime.js', [
175
+ appContext.appDirectory,
176
+ process.cwd()
177
+ ]) : void 0;
178
+ const reactDomFile = useCloudflareModuleWorker ? resolvePackageFile('react-dom', 'index.js', [
179
+ appContext.appDirectory,
180
+ process.cwd()
181
+ ]) : void 0;
182
+ const reactDomServerEdgeFile = useCloudflareModuleWorker ? resolvePackageFile('react-dom', 'server.edge.js', [
183
+ appContext.appDirectory,
184
+ process.cwd()
185
+ ]) : void 0;
186
+ const loadableComponentFile = useCloudflareModuleWorker ? resolvePackageFile('@loadable/component', 'dist/esm/loadable.esm.mjs', [
187
+ appContext.appDirectory,
188
+ process.cwd(),
189
+ CLOUDFLARE_WORKER_COMPAT_TEMPLATE_DIR
190
+ ]) : void 0;
191
+ const loadableServerWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-loadable-server.mjs') : void 0;
192
+ const fsPromisesWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-fs-promises.mjs') : void 0;
193
+ const pathWorkerFile = useCloudflareModuleWorker ? getCloudflareWorkerCompatFile('cloudflare-worker-path.mjs') : void 0;
194
+ const baseWorkerEntries = useCloudflareModuleWorker ? cloudflareWorkerServerEntries : serverEntries;
195
+ const workerEntries = effectBffEntry ? {
196
+ ...baseWorkerEntries,
197
+ [BFF_EFFECT_WORKER_ENTRY_NAME]: [
198
+ `${effectBffEntry}?${BFF_EFFECT_WORKER_RUNTIME_QUERY}`
199
+ ]
200
+ } : baseWorkerEntries;
201
+ environments[builder_namespaceObject.SERVICE_WORKER_ENVIRONMENT_NAME] = {
202
+ output: {
203
+ target: useCloudflareModuleWorker ? 'web' : 'web-worker',
204
+ ...useCloudflareModuleWorker ? {
205
+ module: true
206
+ } : {}
207
+ },
208
+ source: {
209
+ entry: workerEntries
210
+ },
211
+ tools: {
212
+ htmlPlugin: false,
213
+ ...useCloudflareModuleWorker ? {
214
+ bundlerChain: (chain)=>{
215
+ chain.merge({
216
+ experiments: {
217
+ outputModule: true
218
+ }
219
+ });
220
+ chain.output.module(true).library({
221
+ type: 'module'
222
+ }).chunkFormat('module').chunkLoading('import').workerChunkLoading('import');
223
+ chain.target('webworker');
224
+ chain.plugins.delete('plugin-module-federation');
225
+ if (tanstackRouterSsrServerFile) {
226
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server$', tanstackRouterSsrServerFile);
227
+ chain.resolve.alias.set('@tanstack/router-core/ssr/server', tanstackRouterSsrServerFile);
228
+ }
229
+ if (runtimeRscWorkerFile) {
230
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server$', runtimeRscWorkerFile);
231
+ chain.resolve.alias.set('@modern-js/runtime/rsc/server', runtimeRscWorkerFile);
232
+ }
233
+ if (renderRscWorkerFile) {
234
+ chain.resolve.alias.set('@modern-js/render/rsc$', renderRscWorkerFile);
235
+ chain.resolve.alias.set('@modern-js/render/rsc', renderRscWorkerFile);
236
+ chain.resolve.alias.set('@modern-js/render/rsc-worker$', renderRscWorkerFile);
237
+ }
238
+ setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
239
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
240
+ setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
241
+ setAliasIfPresent(chain.resolve.alias, 'react-dom$', reactDomFile);
242
+ setAliasIfPresent(chain.resolve.alias, 'react-dom/server.edge$', reactDomServerEdgeFile);
243
+ setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
244
+ setAliasIfPresent(chain.resolve.alias, '@loadable/server$', loadableServerWorkerFile);
245
+ setAliasIfPresent(chain.resolve.alias, 'fs/promises$', fsPromisesWorkerFile);
246
+ setAliasIfPresent(chain.resolve.alias, 'node:fs/promises$', fsPromisesWorkerFile);
247
+ setAliasIfPresent(chain.resolve.alias, 'path$', pathWorkerFile);
248
+ setAliasIfPresent(chain.resolve.alias, 'node:path$', pathWorkerFile);
249
+ chain.resolve.alias.set('react-server-dom-rspack/server.node$', 'react-server-dom-rspack/server.edge');
250
+ chain.resolve.alias.set('react-server-dom-rspack/server.node', 'react-server-dom-rspack/server.edge');
251
+ chain.resolve.alias.set('react-server-dom-rspack/client.node$', 'react-server-dom-rspack/client.edge');
252
+ chain.resolve.alias.set('react-server-dom-rspack/client.node', 'react-server-dom-rspack/client.edge');
253
+ chain.resolve.fallback.set('async_hooks', false);
254
+ chain.resolve.fallback.set('node:async_hooks', false);
255
+ chain.resolve.fallback.set('fs', false);
256
+ chain.resolve.fallback.set('node:fs', false);
257
+ }
258
+ } : {}
259
+ }
260
+ };
261
+ }
79
262
  return {
80
263
  environments,
81
264
  builderConfig: tempBuilderConfig
@@ -43,8 +43,11 @@ const builderPluginAdapterBasic = (options)=>({
43
43
  setup (api) {
44
44
  api.modifyBundlerChain((chain, { target, CHAIN_ID, environment })=>{
45
45
  const isServiceWorker = environment.name === builder_namespaceObject.SERVICE_WORKER_ENVIRONMENT_NAME;
46
- if ('node' === target || isServiceWorker) applyNodeCompat(isServiceWorker, chain);
47
- if ('web' === target) {
46
+ const isWebTargetServiceWorker = isServiceWorker && 'web' === target;
47
+ if ('node' === target || isServiceWorker) applyNodeCompat(isServiceWorker, chain, {
48
+ includeNodeExtensions: !isWebTargetServiceWorker
49
+ });
50
+ if ('web' === target && !isServiceWorker) {
48
51
  const bareServerModuleReg = /\.(server|node)\.[tj]sx?$/;
49
52
  const depExt = 'js';
50
53
  chain.module.rule(CHAIN_ID.RULE.JS).exclude.add(bareServerModuleReg);
@@ -60,8 +63,40 @@ const builderPluginAdapterBasic = (options)=>({
60
63
  });
61
64
  api.modifyRspackConfig((config, { target, environment })=>{
62
65
  const isServiceWorker = environment.name === builder_namespaceObject.SERVICE_WORKER_ENVIRONMENT_NAME;
66
+ const isWebTargetServiceWorker = isServiceWorker && 'web' === target;
63
67
  if ('node' === target || isServiceWorker) {
64
- const extensionAlias = {
68
+ const extensionAlias = isWebTargetServiceWorker ? {
69
+ '.js': [
70
+ '.worker.js',
71
+ '.server.js',
72
+ '.js'
73
+ ],
74
+ '.jsx': [
75
+ '.worker.jsx',
76
+ '.server.jsx',
77
+ '.jsx'
78
+ ],
79
+ '.ts': [
80
+ '.worker.ts',
81
+ '.server.ts',
82
+ '.ts'
83
+ ],
84
+ '.tsx': [
85
+ '.worker.tsx',
86
+ '.server.tsx',
87
+ '.tsx'
88
+ ],
89
+ '.mjs': [
90
+ '.worker.mjs',
91
+ '.server.mjs',
92
+ '.mjs'
93
+ ],
94
+ '.json': [
95
+ '.worker.json',
96
+ '.server.json',
97
+ '.json'
98
+ ]
99
+ } : {
65
100
  '.js': [
66
101
  '.node.js',
67
102
  '.server.js',
@@ -102,7 +137,8 @@ const builderPluginAdapterBasic = (options)=>({
102
137
  });
103
138
  }
104
139
  });
105
- function applyNodeCompat(isServiceWorker, chain) {
140
+ function applyNodeCompat(isServiceWorker, chain, options = {}) {
141
+ const { includeNodeExtensions = true } = options;
106
142
  const nodeExts = [
107
143
  '.node.js',
108
144
  '.node.jsx',
@@ -121,7 +157,7 @@ function applyNodeCompat(isServiceWorker, chain) {
121
157
  '.worker.ts',
122
158
  '.worker.tsx'
123
159
  ];
124
- for (const ext of nodeExts)chain.resolve.extensions.prepend(ext);
160
+ if (includeNodeExtensions) for (const ext of nodeExts)chain.resolve.extensions.prepend(ext);
125
161
  if (isServiceWorker) for (const ext of webWorkerExts)chain.resolve.extensions.prepend(ext);
126
162
  }
127
163
  exports.builderPluginAdapterBasic = __webpack_exports__.builderPluginAdapterBasic;
@@ -122,9 +122,10 @@ function applyFilterEntriesBySSRConfig({ isProd, chain, appNormalizedConfig }) {
122
122
  });
123
123
  }
124
124
  async function applySSRLoaderEntry(chain, optinos, isServer) {
125
- const { appContext } = optinos;
125
+ const { appContext, normalizedConfig } = optinos;
126
126
  const { internalDirectory } = appContext;
127
127
  const { entrypoints } = appContext;
128
+ const isRsc = (0, utils_namespaceObject.isUseRsc)(normalizedConfig);
128
129
  await Promise.all(entrypoints.map(async (entrypoint)=>{
129
130
  const { entryName } = entrypoint;
130
131
  const serverLoadersFile = (0, utils_js_namespaceObject.getServerCombinedModuleFile)(internalDirectory, entryName);
@@ -132,6 +133,7 @@ async function applySSRLoaderEntry(chain, optinos, isServer) {
132
133
  await utils_namespaceObject.fs.access(serverLoadersFile, utils_namespaceObject.fs.constants.F_OK);
133
134
  chain.entry(`${entryName}-server-loaders`).add(serverLoadersFile);
134
135
  } catch (err) {}
136
+ else if (isRsc) chain.entry(`${entryName}-server-loaders`).add("data:text/javascript,export%20{};");
135
137
  }));
136
138
  }
137
139
  function applySSRDataLoader(chain, options) {
@@ -24,9 +24,12 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- default: ()=>deploy
27
+ default: ()=>deploy,
28
+ getSupportedDeployTargets: ()=>getSupportedDeployTargets,
29
+ resolveDeployTarget: ()=>resolveDeployTarget
28
30
  });
29
31
  const external_std_env_namespaceObject = require("std-env");
32
+ const cloudflare_js_namespaceObject = require("./platforms/cloudflare.js");
30
33
  const gh_pages_js_namespaceObject = require("./platforms/gh-pages.js");
31
34
  const netlify_js_namespaceObject = require("./platforms/netlify.js");
32
35
  const node_js_namespaceObject = require("./platforms/node.js");
@@ -36,14 +39,18 @@ const deployPresets = {
36
39
  node: node_js_namespaceObject.createNodePreset,
37
40
  vercel: vercel_js_namespaceObject.createVercelPreset,
38
41
  netlify: netlify_js_namespaceObject.createNetlifyPreset,
39
- ghPages: gh_pages_js_namespaceObject.createGhPagesPreset
42
+ ghPages: gh_pages_js_namespaceObject.createGhPagesPreset,
43
+ cloudflare: cloudflare_js_namespaceObject.createCloudflarePreset
40
44
  };
45
+ const getSupportedDeployTargets = ()=>Object.keys(deployPresets);
46
+ const isDeployTarget = (target)=>Object.prototype.hasOwnProperty.call(deployPresets, target);
47
+ const resolveDeployTarget = (modernConfig, envDeployTarget = process.env.MODERNJS_DEPLOY, detectedProvider = external_std_env_namespaceObject.provider)=>modernConfig.deploy?.target || envDeployTarget || detectedProvider || 'node';
41
48
  async function getDeployPreset(appContext, modernConfig, deployTarget, api) {
42
49
  const { appDirectory, distDirectory, metaName } = appContext;
43
50
  const { useSSR, useAPI, useWebServer } = (0, index_js_namespaceObject.getProjectUsage)(appDirectory, distDirectory, metaName);
44
51
  const needModernServer = useSSR || useAPI || useWebServer;
52
+ if (!isDeployTarget(deployTarget)) throw new Error(`Unknown deploy target: '${deployTarget}'. deploy.target or MODERNJS_DEPLOY should be one of: ${getSupportedDeployTargets().join(', ')}.`);
45
53
  const createPreset = deployPresets[deployTarget];
46
- if (!createPreset) throw new Error(`Unknown deploy target: '${deployTarget}'. MODERNJS_DEPLOY should be 'node', 'vercel', or 'netlify'.`);
47
54
  return createPreset({
48
55
  appContext,
49
56
  modernConfig,
@@ -54,12 +61,12 @@ async function getDeployPreset(appContext, modernConfig, deployTarget, api) {
54
61
  const deploy = ()=>({
55
62
  name: '@modern-js/plugin-deploy',
56
63
  setup: (api)=>{
57
- const deployTarget = process.env.MODERNJS_DEPLOY || external_std_env_namespaceObject.provider || 'node';
58
64
  api.deploy(async ()=>{
59
65
  const appContext = api.getAppContext();
60
66
  const { metaName } = appContext;
61
- if ('modern-js' !== metaName && !process.env.MODERNJS_DEPLOY) return;
62
67
  const modernConfig = api.getNormalizedConfig();
68
+ const deployTarget = resolveDeployTarget(modernConfig);
69
+ if ('modern-js' !== metaName && !modernConfig.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
63
70
  const deployPreset = await getDeployPreset(appContext, modernConfig, deployTarget, api);
64
71
  deployPreset?.prepare && await deployPreset?.prepare();
65
72
  deployPreset?.writeOutput && await deployPreset?.writeOutput();
@@ -69,8 +76,12 @@ const deploy = ()=>({
69
76
  }
70
77
  });
71
78
  exports["default"] = __webpack_exports__["default"];
79
+ exports.getSupportedDeployTargets = __webpack_exports__.getSupportedDeployTargets;
80
+ exports.resolveDeployTarget = __webpack_exports__.resolveDeployTarget;
72
81
  for(var __rspack_i in __webpack_exports__)if (-1 === [
73
- "default"
82
+ "default",
83
+ "getSupportedDeployTargets",
84
+ "resolveDeployTarget"
74
85
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
75
86
  Object.defineProperty(exports, '__esModule', {
76
87
  value: true