@bleedingdev/modern-js-app-tools-extensions 3.9.0-ultramodern.19 → 3.9.0-ultramodern.20

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 (35) hide show
  1. package/dist/cjs/build-config/remote-address.js +12 -10
  2. package/dist/cjs/cloudflare-builder.js +5 -30
  3. package/dist/cjs/config.js +4 -0
  4. package/dist/cjs/deploy-output/plugin.js +8 -7
  5. package/dist/cjs/deploy-output/target.js +57 -1
  6. package/dist/cjs/release-envelope/plugin.js +5 -10
  7. package/dist/esm/build-config/remote-address.mjs +12 -10
  8. package/dist/esm/cloudflare-builder.mjs +6 -28
  9. package/dist/esm/config.mjs +1 -0
  10. package/dist/esm/deploy-output/plugin.mjs +9 -8
  11. package/dist/esm/deploy-output/target.mjs +50 -3
  12. package/dist/esm/release-envelope/plugin.mjs +5 -10
  13. package/dist/esm-node/build-config/remote-address.mjs +12 -10
  14. package/dist/esm-node/cloudflare-builder.mjs +6 -28
  15. package/dist/esm-node/config.mjs +1 -0
  16. package/dist/esm-node/deploy-output/plugin.mjs +9 -8
  17. package/dist/esm-node/deploy-output/target.mjs +50 -3
  18. package/dist/esm-node/release-envelope/plugin.mjs +5 -10
  19. package/dist/types/cloudflare-builder.d.ts +4 -8
  20. package/dist/types/config.d.ts +2 -1
  21. package/dist/types/deploy-output/plugin.d.ts +12 -18
  22. package/dist/types/deploy-output/target.d.ts +28 -5
  23. package/dist/types/release-envelope/plugin.d.ts +3 -7
  24. package/package.json +17 -16
  25. package/src/build-config/remote-address.ts +11 -9
  26. package/src/cloudflare-builder.ts +11 -55
  27. package/src/config.ts +2 -7
  28. package/src/deploy-output/plugin.ts +20 -37
  29. package/src/deploy-output/target.ts +97 -14
  30. package/src/release-envelope/plugin.ts +10 -40
  31. package/dist/cjs/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  32. package/dist/esm/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  33. package/dist/esm-node/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
  34. package/dist/types/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +0 -13
  35. package/src/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +0 -14
@@ -31,18 +31,20 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  createRemoteManifestUrl: ()=>createRemoteManifestUrl
32
32
  });
33
33
  const surface_resolution_namespaceObject = require("@modern-js/surface-resolution");
34
+ const target_js_namespaceObject = require("../deploy-output/target.js");
34
35
  const external_build_environment_js_namespaceObject = require("./build-environment.js");
35
36
  function createRemoteManifestUrl(options) {
36
- const env = Object.fromEntries([
37
- options.manifestEnv,
38
- options.publicUrlEnv,
39
- 'MODERNJS_DEPLOY',
40
- 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN',
41
- 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS'
42
- ].map((name)=>[
43
- name,
44
- (0, external_build_environment_js_namespaceObject.getBuildConfigEnvironment)(name)
45
- ]));
37
+ const env = {
38
+ ...Object.fromEntries([
39
+ options.manifestEnv,
40
+ options.publicUrlEnv,
41
+ 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN'
42
+ ].map((name)=>[
43
+ name,
44
+ (0, external_build_environment_js_namespaceObject.getBuildConfigEnvironment)(name)
45
+ ])),
46
+ MODERNJS_DEPLOY: (0, target_js_namespaceObject.resolveDeployTarget)().target
47
+ };
46
48
  const address = (0, surface_resolution_namespaceObject.resolveBrowserManifestAddress)(env, options, (0, external_build_environment_js_namespaceObject.getBuildConfigEnvironment)('NODE_ENV') ?? 'production');
47
49
  if (!address.ok) throw new Error(`Remote ${options.mfName}: ${address.reason}`);
48
50
  return env[options.manifestEnv]?.trim() || `${options.mfName}@${address.manifestUrl}`;
@@ -41,7 +41,6 @@ var __webpack_exports__ = {};
41
41
  __webpack_require__.r(__webpack_exports__);
42
42
  __webpack_require__.d(__webpack_exports__, {
43
43
  applyCloudflareBuilderEnvironments: ()=>applyCloudflareBuilderEnvironments,
44
- applyCloudflareWorkerMfRuntimeBoundary: ()=>applyCloudflareWorkerMfRuntimeBoundary,
45
44
  applyCloudflareWorkerRspackConfig: ()=>applyCloudflareWorkerRspackConfig,
46
45
  claimsByFunctionExternal: ()=>claimsByFunctionExternal,
47
46
  createAbsentOptionalDependencyFilter: ()=>createAbsentOptionalDependencyFilter,
@@ -57,7 +56,6 @@ const external_node_path_namespaceObject = require("node:path");
57
56
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
58
57
  const builder_namespaceObject = require("@modern-js/builder");
59
58
  const utils_namespaceObject = require("@modern-js/utils");
60
- const external_std_env_namespaceObject = require("std-env");
61
59
  const external_cloudflare_output_contract_js_namespaceObject = require("./cloudflare-output-contract.js");
62
60
  const external_read_template_js_namespaceObject = require("./read-template.js");
63
61
  const moduleRequire = (0, external_node_module_namespaceObject.createRequire)(__rslib_import_meta_url__);
@@ -68,8 +66,6 @@ const ROUTE_SERVER_LOADERS_FILE = 'route-server-loaders.js';
68
66
  const WORKER_ROUTE_DATA_FILE = 'cloudflare-worker-route-data.js';
69
67
  const WORKER_ROUTE_DATA_TEMPLATE = 'cloudflare-worker-route-data.mjs';
70
68
  const DATA_LOADER_CLIENT_TRANSFORM = /plugin-data-loader[\\/](?:.+[\\/])?loader\.[cm]?js$/u;
71
- const MF_SSR_DATA_FETCH_RUNTIME_PLUGIN = '@module-federation/modern-js-v3/ssr-inject-data-fetch-function-plugin';
72
- const MF_SSR_DEV_RUNTIME_PLUGIN = '@module-federation/modern-js-v3/ssr-dev-plugin';
73
69
  const WORKER_DEPENDENCY_CONDITIONS = [
74
70
  [
75
71
  'esm',
@@ -363,12 +359,6 @@ function applyCloudflareWorkerRspackConfig(chain, workerEntryNames) {
363
359
  function removeCloudflareWorkerDataLoaderClientTransform(chain) {
364
360
  for (const [name, rule] of Object.entries(chain.module.rules.entries() ?? {}))if (rule.uses.values().some((use)=>DATA_LOADER_CLIENT_TRANSFORM.test(String(use.get('loader'))))) chain.module.rules.delete(name);
365
361
  }
366
- function applyCloudflareWorkerMfRuntimeBoundary(chain) {
367
- const runtimePlugin = (0, external_read_template_js_namespaceObject.getTemplatePath)('cloudflare-worker-mf-ssr-runtime-plugin.mjs');
368
- chain.plugins.delete('plugin-module-federation');
369
- chain.resolve.alias.set(`${MF_SSR_DATA_FETCH_RUNTIME_PLUGIN}$`, runtimePlugin);
370
- chain.resolve.alias.set(`${MF_SSR_DEV_RUNTIME_PLUGIN}$`, runtimePlugin);
371
- }
372
362
  const getEffectBffEntry = (normalizedConfig, appContext)=>{
373
363
  if (!normalizedConfig.bff || 'hono' === normalizedConfig.bff.runtimeFramework) return;
374
364
  const configuredEntry = normalizedConfig.bff.effect?.entry;
@@ -378,18 +368,6 @@ const getEffectBffEntry = (normalizedConfig, appContext)=>{
378
368
  }
379
369
  return resolveJsOrTsEntry(external_node_path_default().resolve(appContext.apiDirectory, 'index'));
380
370
  };
381
- const CLOUDFLARE_DEPLOY_PROVIDERS = new Set([
382
- 'cloudflare',
383
- 'cloudflare_pages',
384
- 'cloudflare_workers'
385
- ]);
386
- const resolveStdEnvDeployProvider = ()=>external_std_env_namespaceObject.provider;
387
- const isCloudflareWorkerDeploy = (normalizedConfig, resolveDeployProvider)=>{
388
- const explicitTarget = normalizedConfig.deploy?.target || process.env.MODERNJS_DEPLOY;
389
- if (explicitTarget) return 'cloudflare' === explicitTarget;
390
- const detectedProvider = resolveDeployProvider();
391
- return detectedProvider ? CLOUDFLARE_DEPLOY_PROVIDERS.has(detectedProvider) : false;
392
- };
393
371
  const rewriteWorkerEntryPath = (entry)=>entry.replace('index.jsx', 'index.server.jsx').replace('bootstrap.server.jsx', 'index.server.jsx').replace('bootstrap.jsx', 'index.server.jsx');
394
372
  const rewriteWorkerEntryDescription = (description)=>{
395
373
  const entryImport = description.import;
@@ -512,7 +490,7 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
512
490
  ]
513
491
  });
514
492
  chain.plugin('cloudflare-worker-absent-optional-dependencies').use(AbsentOptionalDependencyPlugin);
515
- applyCloudflareWorkerMfRuntimeBoundary(chain);
493
+ chain.plugins.delete('plugin-module-federation');
516
494
  setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
517
495
  setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
518
496
  setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
@@ -521,8 +499,8 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
521
499
  setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
522
500
  };
523
501
  };
524
- function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig, resolveDeployProvider = resolveStdEnvDeployProvider }) {
525
- if (!isCloudflareWorkerDeploy(normalizedConfig, resolveDeployProvider)) return environments;
502
+ function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig }) {
503
+ if (appContext.deployTarget?.target !== 'cloudflare') return environments;
526
504
  const workerEnvironment = environments[builder_namespaceObject.SERVICE_WORKER_ENVIRONMENT_NAME] ?? (appContext.apiOnly ? {
527
505
  output: {
528
506
  target: 'web-worker'
@@ -559,19 +537,17 @@ function applyCloudflareBuilderEnvironments(options) {
559
537
  environments: getCloudflareBuilderEnvironments(options)
560
538
  };
561
539
  }
562
- const createCloudflareBuilderPlugin = (resolveDeployProvider = resolveStdEnvDeployProvider)=>({
540
+ const createCloudflareBuilderPlugin = ()=>({
563
541
  name: '@modern-js/cloudflare-builder',
564
542
  setup (api) {
565
543
  api.modifyBuilderEnvironments(({ environments })=>applyCloudflareBuilderEnvironments({
566
544
  appContext: api.getAppContext(),
567
545
  environments,
568
- normalizedConfig: api.getNormalizedConfig(),
569
- resolveDeployProvider
546
+ normalizedConfig: api.getNormalizedConfig()
570
547
  }));
571
548
  }
572
549
  });
573
550
  exports.applyCloudflareBuilderEnvironments = __webpack_exports__.applyCloudflareBuilderEnvironments;
574
- exports.applyCloudflareWorkerMfRuntimeBoundary = __webpack_exports__.applyCloudflareWorkerMfRuntimeBoundary;
575
551
  exports.applyCloudflareWorkerRspackConfig = __webpack_exports__.applyCloudflareWorkerRspackConfig;
576
552
  exports.claimsByFunctionExternal = __webpack_exports__.claimsByFunctionExternal;
577
553
  exports.createAbsentOptionalDependencyFilter = __webpack_exports__.createAbsentOptionalDependencyFilter;
@@ -581,7 +557,6 @@ exports.getCloudflareBuilderEnvironments = __webpack_exports__.getCloudflareBuil
581
557
  exports.getCloudflareWorkerRspackConfig = __webpack_exports__.getCloudflareWorkerRspackConfig;
582
558
  for(var __rspack_i in __webpack_exports__)if (-1 === [
583
559
  "applyCloudflareBuilderEnvironments",
584
- "applyCloudflareWorkerMfRuntimeBoundary",
585
560
  "applyCloudflareWorkerRspackConfig",
586
561
  "claimsByFunctionExternal",
587
562
  "createAbsentOptionalDependencyFilter",
@@ -30,16 +30,20 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  createRemoteManifestUrl: ()=>remote_address_js_namespaceObject.createRemoteManifestUrl,
32
32
  getBuildConfigEnvironment: ()=>public_js_namespaceObject.getBuildConfigEnvironment,
33
+ resolveDeployTarget: ()=>target_js_namespaceObject.resolveDeployTarget,
33
34
  resolveEffectTsgoCompiler: ()=>public_js_namespaceObject.resolveEffectTsgoCompiler
34
35
  });
35
36
  const public_js_namespaceObject = require("./build-config/public.js");
36
37
  const remote_address_js_namespaceObject = require("./build-config/remote-address.js");
38
+ const target_js_namespaceObject = require("./deploy-output/target.js");
37
39
  exports.createRemoteManifestUrl = __webpack_exports__.createRemoteManifestUrl;
38
40
  exports.getBuildConfigEnvironment = __webpack_exports__.getBuildConfigEnvironment;
41
+ exports.resolveDeployTarget = __webpack_exports__.resolveDeployTarget;
39
42
  exports.resolveEffectTsgoCompiler = __webpack_exports__.resolveEffectTsgoCompiler;
40
43
  for(var __rspack_i in __webpack_exports__)if (-1 === [
41
44
  "createRemoteManifestUrl",
42
45
  "getBuildConfigEnvironment",
46
+ "resolveDeployTarget",
43
47
  "resolveEffectTsgoCompiler"
44
48
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
45
49
  Object.defineProperty(exports, '__esModule', {
@@ -46,13 +46,13 @@ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_no
46
46
  const external_npmAliases_js_namespaceObject = require("./npmAliases.js");
47
47
  const external_public_assets_js_namespaceObject = require("./public-assets.js");
48
48
  const external_target_js_namespaceObject = require("./target.js");
49
- const createDeployOutputAliasesPlugin = ({ resolveDeployTarget = external_target_js_namespaceObject.resolveDeployTarget } = {})=>({
49
+ const createDeployOutputAliasesPlugin = ()=>({
50
50
  name: '@modern-js/deploy-output-aliases',
51
51
  setup (api) {
52
52
  api.onAfterDeploy(async ()=>{
53
- const { appDirectory, metaName } = api.getAppContext();
54
- const config = api.getNormalizedConfig();
55
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY || 'node' !== resolveDeployTarget(config)) return;
53
+ const appContext = api.getAppContext();
54
+ if ('node' !== (0, external_target_js_namespaceObject.getDeployingTarget)(appContext)) return;
55
+ const { appDirectory } = appContext;
56
56
  const entry = (0, external_node_module_namespaceObject.createRequire)(__filename).resolve('@modern-js/prod-server');
57
57
  const identity = await (0, external_npmAliases_js_namespaceObject.readPackageIdentity)(entry);
58
58
  await (0, external_npmAliases_js_namespaceObject.preserveNpmAliases)({
@@ -69,13 +69,14 @@ const createDeployOutputAliasesPlugin = ({ resolveDeployTarget = external_target
69
69
  });
70
70
  }
71
71
  });
72
- const createDeployOutputPublicAssetsPlugin = ({ resolveDeployTarget = external_target_js_namespaceObject.resolveDeployTarget } = {})=>({
72
+ const createDeployOutputPublicAssetsPlugin = ()=>({
73
73
  name: '@modern-js/deploy-output-public-assets',
74
74
  setup (api) {
75
75
  api.onAfterDeploy(async ()=>{
76
- const { appDirectory, metaName } = api.getAppContext();
76
+ const appContext = api.getAppContext();
77
+ if ('node' !== (0, external_target_js_namespaceObject.getDeployingTarget)(appContext)) return;
78
+ const { appDirectory } = appContext;
77
79
  const config = api.getNormalizedConfig();
78
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY || 'node' !== resolveDeployTarget(config)) return;
79
80
  await (0, external_public_assets_js_namespaceObject.stageDeclaredPublicAssets)({
80
81
  appDirectory,
81
82
  outputDirectory: external_node_path_default().join(appDirectory, '.output'),
@@ -28,9 +28,21 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
+ DEPLOY_TARGETS: ()=>DEPLOY_TARGETS,
32
+ DEPLOY_TARGET_FLAG: ()=>DEPLOY_TARGET_FLAG,
33
+ getDeployingTarget: ()=>getDeployingTarget,
31
34
  resolveDeployTarget: ()=>resolveDeployTarget
32
35
  });
36
+ const utils_namespaceObject = require("@modern-js/utils");
33
37
  const external_std_env_namespaceObject = require("std-env");
38
+ const DEPLOY_TARGETS = [
39
+ 'node',
40
+ 'vercel',
41
+ 'netlify',
42
+ 'ghPages',
43
+ 'cloudflare'
44
+ ];
45
+ const DEPLOY_TARGET_FLAG = '--deploy-target';
34
46
  const providerDeployTargets = {
35
47
  vercel: 'vercel',
36
48
  netlify: 'netlify',
@@ -38,9 +50,53 @@ const providerDeployTargets = {
38
50
  cloudflare_pages: 'cloudflare',
39
51
  cloudflare_workers: 'cloudflare'
40
52
  };
41
- const resolveDeployTarget = (config, envDeployTarget = process.env.MODERNJS_DEPLOY, detectedProvider = external_std_env_namespaceObject.provider)=>config.deploy?.target || envDeployTarget || (detectedProvider ? providerDeployTargets[detectedProvider] : void 0) || 'node';
53
+ const readDeployTargetFlag = (argv)=>{
54
+ for (const [index, arg] of argv.entries()){
55
+ if (arg === DEPLOY_TARGET_FLAG) {
56
+ const value = argv[index + 1];
57
+ if (void 0 === value || value.startsWith('-')) throw new Error(`${DEPLOY_TARGET_FLAG} needs a value.`);
58
+ return value;
59
+ }
60
+ if (arg.startsWith(`${DEPLOY_TARGET_FLAG}=`)) return arg.slice(DEPLOY_TARGET_FLAG.length + 1);
61
+ }
62
+ };
63
+ const assertDeployTarget = (target, source)=>{
64
+ if (!DEPLOY_TARGETS.includes(target)) throw new Error(`Unknown deploy target '${target}' from ${source}. Use one of: ${DEPLOY_TARGETS.join(', ')}.`);
65
+ return target;
66
+ };
67
+ const resolveDeployTarget = ({ argv = (0, utils_namespaceObject.getArgv)(), configTarget, env = process.env.MODERNJS_DEPLOY, provider = external_std_env_namespaceObject.provider } = {})=>{
68
+ const explicit = [
69
+ [
70
+ readDeployTargetFlag(argv),
71
+ DEPLOY_TARGET_FLAG
72
+ ],
73
+ [
74
+ configTarget,
75
+ 'deploy.target'
76
+ ],
77
+ [
78
+ env,
79
+ 'MODERNJS_DEPLOY'
80
+ ]
81
+ ].find(([target])=>target);
82
+ if (explicit?.[0]) return {
83
+ target: assertDeployTarget(explicit[0], explicit[1]),
84
+ explicit: true
85
+ };
86
+ return {
87
+ target: provider && providerDeployTargets[provider] || 'node',
88
+ explicit: false
89
+ };
90
+ };
91
+ const getDeployingTarget = ({ deployTarget, metaName })=>deployTarget && ('modern-js' === metaName || deployTarget.explicit) ? deployTarget.target : void 0;
92
+ exports.DEPLOY_TARGETS = __webpack_exports__.DEPLOY_TARGETS;
93
+ exports.DEPLOY_TARGET_FLAG = __webpack_exports__.DEPLOY_TARGET_FLAG;
94
+ exports.getDeployingTarget = __webpack_exports__.getDeployingTarget;
42
95
  exports.resolveDeployTarget = __webpack_exports__.resolveDeployTarget;
43
96
  for(var __rspack_i in __webpack_exports__)if (-1 === [
97
+ "DEPLOY_TARGETS",
98
+ "DEPLOY_TARGET_FLAG",
99
+ "getDeployingTarget",
44
100
  "resolveDeployTarget"
45
101
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
46
102
  Object.defineProperty(exports, '__esModule', {
@@ -42,14 +42,9 @@ __webpack_require__.d(__webpack_exports__, {
42
42
  const external_node_path_namespaceObject = require("node:path");
43
43
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
44
44
  const public_assets_js_namespaceObject = require("../deploy-output/public-assets.js");
45
+ const target_js_namespaceObject = require("../deploy-output/target.js");
45
46
  const external_framework_output_js_namespaceObject = require("./framework-output.js");
46
- const resolveActiveDeployTarget = (api, resolveDeployTarget)=>{
47
- const { metaName } = api.getAppContext();
48
- const config = api.getNormalizedConfig();
49
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
50
- return resolveDeployTarget(config);
51
- };
52
- const createUltramodernReleaseEnvelopePlugin = ({ resolveDeployTarget })=>({
47
+ const createUltramodernReleaseEnvelopePlugin = ()=>({
53
48
  name: '@modern-js/ultramodern-release-envelope',
54
49
  pre: [
55
50
  '@modern-js/backend-federation-build',
@@ -71,19 +66,19 @@ const createUltramodernReleaseEnvelopePlugin = ({ resolveDeployTarget })=>({
71
66
  });
72
67
  };
73
68
  api.onAfterBuild(async ()=>{
74
- const configuredTarget = resolveDeployTarget(api.getNormalizedConfig());
69
+ const configuredTarget = api.getAppContext().deployTarget?.target;
75
70
  if ('node' !== configuredTarget && 'cloudflare' !== configuredTarget) return;
76
71
  await emitBuildEnvelope(configuredTarget, false);
77
72
  });
78
73
  api.onBeforeDeploy(async ()=>{
79
- const configuredTarget = resolveActiveDeployTarget(api, resolveDeployTarget);
74
+ const configuredTarget = (0, target_js_namespaceObject.getDeployingTarget)(api.getAppContext());
80
75
  if ('node' !== configuredTarget) return;
81
76
  await emitBuildEnvelope(configuredTarget);
82
77
  const { distDirectory } = api.getAppContext();
83
78
  await (0, external_framework_output_js_namespaceObject.verifyBuildOutputReleaseEnvelope)(distDirectory, configuredTarget);
84
79
  });
85
80
  api.onAfterDeploy(async ()=>{
86
- const configuredTarget = resolveActiveDeployTarget(api, resolveDeployTarget);
81
+ const configuredTarget = (0, target_js_namespaceObject.getDeployingTarget)(api.getAppContext());
87
82
  if ('node' !== configuredTarget) return;
88
83
  const { appDirectory, distDirectory } = api.getAppContext();
89
84
  const outputDirectory = external_node_path_default().join(appDirectory, '.output');
@@ -1,16 +1,18 @@
1
1
  import { resolveBrowserManifestAddress } from "@modern-js/surface-resolution";
2
+ import { resolveDeployTarget } from "../deploy-output/target.mjs";
2
3
  import { getBuildConfigEnvironment } from "./build-environment.mjs";
3
4
  function createRemoteManifestUrl(options) {
4
- const env = Object.fromEntries([
5
- options.manifestEnv,
6
- options.publicUrlEnv,
7
- 'MODERNJS_DEPLOY',
8
- 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN',
9
- 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS'
10
- ].map((name)=>[
11
- name,
12
- getBuildConfigEnvironment(name)
13
- ]));
5
+ const env = {
6
+ ...Object.fromEntries([
7
+ options.manifestEnv,
8
+ options.publicUrlEnv,
9
+ 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN'
10
+ ].map((name)=>[
11
+ name,
12
+ getBuildConfigEnvironment(name)
13
+ ])),
14
+ MODERNJS_DEPLOY: resolveDeployTarget().target
15
+ };
14
16
  const address = resolveBrowserManifestAddress(env, options, getBuildConfigEnvironment('NODE_ENV') ?? 'production');
15
17
  if (!address.ok) throw new Error(`Remote ${options.mfName}: ${address.reason}`);
16
18
  return env[options.manifestEnv]?.trim() || `${options.mfName}@${address.manifestUrl}`;
@@ -3,7 +3,6 @@ import { createRequire, isBuiltin } from "node:module";
3
3
  import node_path from "node:path";
4
4
  import { SERVICE_WORKER_ENVIRONMENT_NAME } from "@modern-js/builder";
5
5
  import { isProd } from "@modern-js/utils";
6
- import { provider } from "std-env";
7
6
  import { CLOUDFLARE_ROUTE_DATA_HANDLER_EXPORT, CLOUDFLARE_WORKER_NODE_BUILTINS, CLOUDFLARE_WORKER_PLATFORM_MODULES, getCloudflareWorkerRouteDataEntryName } from "./cloudflare-output-contract.mjs";
8
7
  import { getTemplatePath } from "./read-template.mjs";
9
8
  const moduleRequire = createRequire(import.meta.url);
@@ -14,8 +13,6 @@ const ROUTE_SERVER_LOADERS_FILE = 'route-server-loaders.js';
14
13
  const WORKER_ROUTE_DATA_FILE = 'cloudflare-worker-route-data.js';
15
14
  const WORKER_ROUTE_DATA_TEMPLATE = 'cloudflare-worker-route-data.mjs';
16
15
  const DATA_LOADER_CLIENT_TRANSFORM = /plugin-data-loader[\\/](?:.+[\\/])?loader\.[cm]?js$/u;
17
- const MF_SSR_DATA_FETCH_RUNTIME_PLUGIN = '@module-federation/modern-js-v3/ssr-inject-data-fetch-function-plugin';
18
- const MF_SSR_DEV_RUNTIME_PLUGIN = '@module-federation/modern-js-v3/ssr-dev-plugin';
19
16
  const WORKER_DEPENDENCY_CONDITIONS = [
20
17
  [
21
18
  'esm',
@@ -309,12 +306,6 @@ function applyCloudflareWorkerRspackConfig(chain, workerEntryNames) {
309
306
  function removeCloudflareWorkerDataLoaderClientTransform(chain) {
310
307
  for (const [name, rule] of Object.entries(chain.module.rules.entries() ?? {}))if (rule.uses.values().some((use)=>DATA_LOADER_CLIENT_TRANSFORM.test(String(use.get('loader'))))) chain.module.rules.delete(name);
311
308
  }
312
- function applyCloudflareWorkerMfRuntimeBoundary(chain) {
313
- const runtimePlugin = getTemplatePath('cloudflare-worker-mf-ssr-runtime-plugin.mjs');
314
- chain.plugins.delete('plugin-module-federation');
315
- chain.resolve.alias.set(`${MF_SSR_DATA_FETCH_RUNTIME_PLUGIN}$`, runtimePlugin);
316
- chain.resolve.alias.set(`${MF_SSR_DEV_RUNTIME_PLUGIN}$`, runtimePlugin);
317
- }
318
309
  const getEffectBffEntry = (normalizedConfig, appContext)=>{
319
310
  if (!normalizedConfig.bff || 'hono' === normalizedConfig.bff.runtimeFramework) return;
320
311
  const configuredEntry = normalizedConfig.bff.effect?.entry;
@@ -324,18 +315,6 @@ const getEffectBffEntry = (normalizedConfig, appContext)=>{
324
315
  }
325
316
  return resolveJsOrTsEntry(node_path.resolve(appContext.apiDirectory, 'index'));
326
317
  };
327
- const CLOUDFLARE_DEPLOY_PROVIDERS = new Set([
328
- 'cloudflare',
329
- 'cloudflare_pages',
330
- 'cloudflare_workers'
331
- ]);
332
- const resolveStdEnvDeployProvider = ()=>provider;
333
- const isCloudflareWorkerDeploy = (normalizedConfig, resolveDeployProvider)=>{
334
- const explicitTarget = normalizedConfig.deploy?.target || process.env.MODERNJS_DEPLOY;
335
- if (explicitTarget) return 'cloudflare' === explicitTarget;
336
- const detectedProvider = resolveDeployProvider();
337
- return detectedProvider ? CLOUDFLARE_DEPLOY_PROVIDERS.has(detectedProvider) : false;
338
- };
339
318
  const rewriteWorkerEntryPath = (entry)=>entry.replace('index.jsx', 'index.server.jsx').replace('bootstrap.server.jsx', 'index.server.jsx').replace('bootstrap.jsx', 'index.server.jsx');
340
319
  const rewriteWorkerEntryDescription = (description)=>{
341
320
  const entryImport = description.import;
@@ -458,7 +437,7 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
458
437
  ]
459
438
  });
460
439
  chain.plugin('cloudflare-worker-absent-optional-dependencies').use(AbsentOptionalDependencyPlugin);
461
- applyCloudflareWorkerMfRuntimeBoundary(chain);
440
+ chain.plugins.delete('plugin-module-federation');
462
441
  setAliasIfPresent(chain.resolve.alias, 'react$', reactFile);
463
442
  setAliasIfPresent(chain.resolve.alias, 'react/jsx-runtime$', reactJsxRuntimeFile);
464
443
  setAliasIfPresent(chain.resolve.alias, 'react/jsx-dev-runtime$', reactJsxDevRuntimeFile);
@@ -467,8 +446,8 @@ const createCloudflareBundlerChain = (appContext, workerEntryNames)=>{
467
446
  setAliasIfPresent(chain.resolve.alias, '@loadable/component$', loadableComponentFile);
468
447
  };
469
448
  };
470
- function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig, resolveDeployProvider = resolveStdEnvDeployProvider }) {
471
- if (!isCloudflareWorkerDeploy(normalizedConfig, resolveDeployProvider)) return environments;
449
+ function getCloudflareBuilderEnvironments({ appContext, environments, normalizedConfig }) {
450
+ if (appContext.deployTarget?.target !== 'cloudflare') return environments;
472
451
  const workerEnvironment = environments[SERVICE_WORKER_ENVIRONMENT_NAME] ?? (appContext.apiOnly ? {
473
452
  output: {
474
453
  target: 'web-worker'
@@ -505,15 +484,14 @@ function applyCloudflareBuilderEnvironments(options) {
505
484
  environments: getCloudflareBuilderEnvironments(options)
506
485
  };
507
486
  }
508
- const createCloudflareBuilderPlugin = (resolveDeployProvider = resolveStdEnvDeployProvider)=>({
487
+ const createCloudflareBuilderPlugin = ()=>({
509
488
  name: '@modern-js/cloudflare-builder',
510
489
  setup (api) {
511
490
  api.modifyBuilderEnvironments(({ environments })=>applyCloudflareBuilderEnvironments({
512
491
  appContext: api.getAppContext(),
513
492
  environments,
514
- normalizedConfig: api.getNormalizedConfig(),
515
- resolveDeployProvider
493
+ normalizedConfig: api.getNormalizedConfig()
516
494
  }));
517
495
  }
518
496
  });
519
- export { applyCloudflareBuilderEnvironments, applyCloudflareWorkerMfRuntimeBoundary, applyCloudflareWorkerRspackConfig, claimsByFunctionExternal, createAbsentOptionalDependencyFilter, createCloudflareBuilderPlugin, createRequestRedirectMatcher, getCloudflareBuilderEnvironments, getCloudflareWorkerRspackConfig };
497
+ export { applyCloudflareBuilderEnvironments, applyCloudflareWorkerRspackConfig, claimsByFunctionExternal, createAbsentOptionalDependencyFilter, createCloudflareBuilderPlugin, createRequestRedirectMatcher, getCloudflareBuilderEnvironments, getCloudflareWorkerRspackConfig };
@@ -1,2 +1,3 @@
1
1
  export { getBuildConfigEnvironment, resolveEffectTsgoCompiler } from "./build-config/public.mjs";
2
2
  export { createRemoteManifestUrl } from "./build-config/remote-address.mjs";
3
+ export { resolveDeployTarget } from "./deploy-output/target.mjs";
@@ -2,14 +2,14 @@ import { createRequire } from "node:module";
2
2
  import node_path from "node:path";
3
3
  import { preserveNpmAliases, readPackageIdentity } from "./npmAliases.mjs";
4
4
  import { NODE_PUBLIC_ASSET_SCOPE, normalizeDeclaredPublicAssets, stageDeclaredPublicAssets } from "./public-assets.mjs";
5
- import { resolveDeployTarget as external_target_mjs_resolveDeployTarget } from "./target.mjs";
6
- const createDeployOutputAliasesPlugin = ({ resolveDeployTarget = external_target_mjs_resolveDeployTarget } = {})=>({
5
+ import { getDeployingTarget } from "./target.mjs";
6
+ const createDeployOutputAliasesPlugin = ()=>({
7
7
  name: '@modern-js/deploy-output-aliases',
8
8
  setup (api) {
9
9
  api.onAfterDeploy(async ()=>{
10
- const { appDirectory, metaName } = api.getAppContext();
11
- const config = api.getNormalizedConfig();
12
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY || 'node' !== resolveDeployTarget(config)) return;
10
+ const appContext = api.getAppContext();
11
+ if ('node' !== getDeployingTarget(appContext)) return;
12
+ const { appDirectory } = appContext;
13
13
  const entry = createRequire(__filename).resolve('@modern-js/prod-server');
14
14
  const identity = await readPackageIdentity(entry);
15
15
  await preserveNpmAliases({
@@ -26,13 +26,14 @@ const createDeployOutputAliasesPlugin = ({ resolveDeployTarget = external_target
26
26
  });
27
27
  }
28
28
  });
29
- const createDeployOutputPublicAssetsPlugin = ({ resolveDeployTarget = external_target_mjs_resolveDeployTarget } = {})=>({
29
+ const createDeployOutputPublicAssetsPlugin = ()=>({
30
30
  name: '@modern-js/deploy-output-public-assets',
31
31
  setup (api) {
32
32
  api.onAfterDeploy(async ()=>{
33
- const { appDirectory, metaName } = api.getAppContext();
33
+ const appContext = api.getAppContext();
34
+ if ('node' !== getDeployingTarget(appContext)) return;
35
+ const { appDirectory } = appContext;
34
36
  const config = api.getNormalizedConfig();
35
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY || 'node' !== resolveDeployTarget(config)) return;
36
37
  await stageDeclaredPublicAssets({
37
38
  appDirectory,
38
39
  outputDirectory: node_path.join(appDirectory, '.output'),
@@ -1,4 +1,13 @@
1
- import { provider } from "std-env";
1
+ import { getArgv } from "@modern-js/utils";
2
+ import { provider as external_std_env_provider } from "std-env";
3
+ const DEPLOY_TARGETS = [
4
+ 'node',
5
+ 'vercel',
6
+ 'netlify',
7
+ 'ghPages',
8
+ 'cloudflare'
9
+ ];
10
+ const DEPLOY_TARGET_FLAG = '--deploy-target';
2
11
  const providerDeployTargets = {
3
12
  vercel: 'vercel',
4
13
  netlify: 'netlify',
@@ -6,5 +15,43 @@ const providerDeployTargets = {
6
15
  cloudflare_pages: 'cloudflare',
7
16
  cloudflare_workers: 'cloudflare'
8
17
  };
9
- const resolveDeployTarget = (config, envDeployTarget = process.env.MODERNJS_DEPLOY, detectedProvider = provider)=>config.deploy?.target || envDeployTarget || (detectedProvider ? providerDeployTargets[detectedProvider] : void 0) || 'node';
10
- export { resolveDeployTarget };
18
+ const readDeployTargetFlag = (argv)=>{
19
+ for (const [index, arg] of argv.entries()){
20
+ if (arg === DEPLOY_TARGET_FLAG) {
21
+ const value = argv[index + 1];
22
+ if (void 0 === value || value.startsWith('-')) throw new Error(`${DEPLOY_TARGET_FLAG} needs a value.`);
23
+ return value;
24
+ }
25
+ if (arg.startsWith(`${DEPLOY_TARGET_FLAG}=`)) return arg.slice(DEPLOY_TARGET_FLAG.length + 1);
26
+ }
27
+ };
28
+ const assertDeployTarget = (target, source)=>{
29
+ if (!DEPLOY_TARGETS.includes(target)) throw new Error(`Unknown deploy target '${target}' from ${source}. Use one of: ${DEPLOY_TARGETS.join(', ')}.`);
30
+ return target;
31
+ };
32
+ const resolveDeployTarget = ({ argv = getArgv(), configTarget, env = process.env.MODERNJS_DEPLOY, provider = external_std_env_provider } = {})=>{
33
+ const explicit = [
34
+ [
35
+ readDeployTargetFlag(argv),
36
+ DEPLOY_TARGET_FLAG
37
+ ],
38
+ [
39
+ configTarget,
40
+ 'deploy.target'
41
+ ],
42
+ [
43
+ env,
44
+ 'MODERNJS_DEPLOY'
45
+ ]
46
+ ].find(([target])=>target);
47
+ if (explicit?.[0]) return {
48
+ target: assertDeployTarget(explicit[0], explicit[1]),
49
+ explicit: true
50
+ };
51
+ return {
52
+ target: provider && providerDeployTargets[provider] || 'node',
53
+ explicit: false
54
+ };
55
+ };
56
+ const getDeployingTarget = ({ deployTarget, metaName })=>deployTarget && ('modern-js' === metaName || deployTarget.explicit) ? deployTarget.target : void 0;
57
+ export { DEPLOY_TARGETS, DEPLOY_TARGET_FLAG, getDeployingTarget, resolveDeployTarget };
@@ -1,13 +1,8 @@
1
1
  import node_path from "node:path";
2
2
  import { NODE_PUBLIC_ASSET_SCOPE, normalizeDeclaredPublicAssets, resolveAddedDeclaredPublicAssetPaths } from "../deploy-output/public-assets.mjs";
3
+ import { getDeployingTarget } from "../deploy-output/target.mjs";
3
4
  import { emitFrameworkMicroVerticalReleaseEnvelope, emitNodeStagedReleaseEnvelope, verifyBuildOutputReleaseEnvelope, verifyNodeReleaseEnvelopeStaging } from "./framework-output.mjs";
4
- const resolveActiveDeployTarget = (api, resolveDeployTarget)=>{
5
- const { metaName } = api.getAppContext();
6
- const config = api.getNormalizedConfig();
7
- if ('modern-js' !== metaName && !config.deploy?.target && !process.env.MODERNJS_DEPLOY) return;
8
- return resolveDeployTarget(config);
9
- };
10
- const createUltramodernReleaseEnvelopePlugin = ({ resolveDeployTarget })=>({
5
+ const createUltramodernReleaseEnvelopePlugin = ()=>({
11
6
  name: '@modern-js/ultramodern-release-envelope',
12
7
  pre: [
13
8
  '@modern-js/backend-federation-build',
@@ -29,19 +24,19 @@ const createUltramodernReleaseEnvelopePlugin = ({ resolveDeployTarget })=>({
29
24
  });
30
25
  };
31
26
  api.onAfterBuild(async ()=>{
32
- const configuredTarget = resolveDeployTarget(api.getNormalizedConfig());
27
+ const configuredTarget = api.getAppContext().deployTarget?.target;
33
28
  if ('node' !== configuredTarget && 'cloudflare' !== configuredTarget) return;
34
29
  await emitBuildEnvelope(configuredTarget, false);
35
30
  });
36
31
  api.onBeforeDeploy(async ()=>{
37
- const configuredTarget = resolveActiveDeployTarget(api, resolveDeployTarget);
32
+ const configuredTarget = getDeployingTarget(api.getAppContext());
38
33
  if ('node' !== configuredTarget) return;
39
34
  await emitBuildEnvelope(configuredTarget);
40
35
  const { distDirectory } = api.getAppContext();
41
36
  await verifyBuildOutputReleaseEnvelope(distDirectory, configuredTarget);
42
37
  });
43
38
  api.onAfterDeploy(async ()=>{
44
- const configuredTarget = resolveActiveDeployTarget(api, resolveDeployTarget);
39
+ const configuredTarget = getDeployingTarget(api.getAppContext());
45
40
  if ('node' !== configuredTarget) return;
46
41
  const { appDirectory, distDirectory } = api.getAppContext();
47
42
  const outputDirectory = node_path.join(appDirectory, '.output');
@@ -1,17 +1,19 @@
1
1
  import "node:module";
2
2
  import { resolveBrowserManifestAddress } from "@modern-js/surface-resolution";
3
+ import { resolveDeployTarget } from "../deploy-output/target.mjs";
3
4
  import { getBuildConfigEnvironment } from "./build-environment.mjs";
4
5
  function createRemoteManifestUrl(options) {
5
- const env = Object.fromEntries([
6
- options.manifestEnv,
7
- options.publicUrlEnv,
8
- 'MODERNJS_DEPLOY',
9
- 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN',
10
- 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS'
11
- ].map((name)=>[
12
- name,
13
- getBuildConfigEnvironment(name)
14
- ]));
6
+ const env = {
7
+ ...Object.fromEntries([
8
+ options.manifestEnv,
9
+ options.publicUrlEnv,
10
+ 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN'
11
+ ].map((name)=>[
12
+ name,
13
+ getBuildConfigEnvironment(name)
14
+ ])),
15
+ MODERNJS_DEPLOY: resolveDeployTarget().target
16
+ };
15
17
  const address = resolveBrowserManifestAddress(env, options, getBuildConfigEnvironment('NODE_ENV') ?? 'production');
16
18
  if (!address.ok) throw new Error(`Remote ${options.mfName}: ${address.reason}`);
17
19
  return env[options.manifestEnv]?.trim() || `${options.mfName}@${address.manifestUrl}`;