@bleedingdev/modern-js-create 3.5.0-ultramodern.3 → 3.5.0-ultramodern.30

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 (93) hide show
  1. package/README.md +21 -17
  2. package/dist/cjs/ultramodern-tooling/commands.cjs +772 -75
  3. package/dist/cjs/ultramodern-tooling/config.cjs +149 -8
  4. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +25 -0
  5. package/dist/cjs/ultramodern-workspace/api.cjs +44 -0
  6. package/dist/cjs/ultramodern-workspace/app-files.cjs +8 -11
  7. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +282 -0
  8. package/dist/cjs/ultramodern-workspace/contracts.cjs +24 -8
  9. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +157 -0
  10. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +88 -0
  11. package/dist/cjs/ultramodern-workspace/descriptors.cjs +24 -0
  12. package/dist/cjs/ultramodern-workspace/module-federation.cjs +161 -50
  13. package/dist/cjs/ultramodern-workspace/package-json.cjs +26 -43
  14. package/dist/cjs/ultramodern-workspace/pnpm-workspace-policy-plan.cjs +166 -0
  15. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +153 -0
  16. package/dist/cjs/ultramodern-workspace/versions.cjs +8 -3
  17. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +175 -0
  18. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +104 -63
  19. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +97 -0
  20. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +11 -3
  21. package/dist/cjs/ultramodern-workspace/zerops.cjs +100 -0
  22. package/dist/esm/ultramodern-tooling/commands.js +775 -78
  23. package/dist/esm/ultramodern-tooling/config.js +144 -9
  24. package/dist/esm/ultramodern-workspace/add-vertical.js +26 -1
  25. package/dist/esm/ultramodern-workspace/api.js +43 -2
  26. package/dist/esm/ultramodern-workspace/app-files.js +8 -11
  27. package/dist/esm/ultramodern-workspace/backend-federation.js +217 -0
  28. package/dist/esm/ultramodern-workspace/contracts.js +24 -8
  29. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +108 -0
  30. package/dist/esm/ultramodern-workspace/delivery-unit.js +31 -0
  31. package/dist/esm/ultramodern-workspace/descriptors.js +13 -1
  32. package/dist/esm/ultramodern-workspace/module-federation.js +160 -42
  33. package/dist/esm/ultramodern-workspace/package-json.js +16 -40
  34. package/dist/esm/ultramodern-workspace/pnpm-workspace-policy-plan.js +113 -0
  35. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +100 -0
  36. package/dist/esm/ultramodern-workspace/versions.js +6 -4
  37. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +110 -0
  38. package/dist/esm/ultramodern-workspace/workspace-scripts.js +88 -65
  39. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +59 -0
  40. package/dist/esm/ultramodern-workspace/write-workspace.js +14 -6
  41. package/dist/esm/ultramodern-workspace/zerops.js +62 -0
  42. package/dist/esm-node/ultramodern-tooling/commands.js +775 -78
  43. package/dist/esm-node/ultramodern-tooling/config.js +144 -9
  44. package/dist/esm-node/ultramodern-workspace/add-vertical.js +26 -1
  45. package/dist/esm-node/ultramodern-workspace/api.js +43 -2
  46. package/dist/esm-node/ultramodern-workspace/app-files.js +8 -11
  47. package/dist/esm-node/ultramodern-workspace/backend-federation.js +218 -0
  48. package/dist/esm-node/ultramodern-workspace/contracts.js +24 -8
  49. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +109 -0
  50. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +32 -0
  51. package/dist/esm-node/ultramodern-workspace/descriptors.js +13 -1
  52. package/dist/esm-node/ultramodern-workspace/module-federation.js +160 -42
  53. package/dist/esm-node/ultramodern-workspace/package-json.js +16 -40
  54. package/dist/esm-node/ultramodern-workspace/pnpm-workspace-policy-plan.js +114 -0
  55. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +101 -0
  56. package/dist/esm-node/ultramodern-workspace/versions.js +6 -4
  57. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +111 -0
  58. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +88 -65
  59. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +60 -0
  60. package/dist/esm-node/ultramodern-workspace/write-workspace.js +14 -6
  61. package/dist/esm-node/ultramodern-workspace/zerops.js +63 -0
  62. package/dist/types/ultramodern-tooling/config.d.ts +6 -0
  63. package/dist/types/ultramodern-workspace/api.d.ts +1 -0
  64. package/dist/types/ultramodern-workspace/backend-federation.d.ts +11 -0
  65. package/dist/types/ultramodern-workspace/contracts.d.ts +1 -1
  66. package/dist/types/ultramodern-workspace/delivery-unit-sync.d.ts +6 -0
  67. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +27 -0
  68. package/dist/types/ultramodern-workspace/descriptors.d.ts +4 -0
  69. package/dist/types/ultramodern-workspace/module-federation.d.ts +4 -9
  70. package/dist/types/ultramodern-workspace/package-json.d.ts +0 -1
  71. package/dist/types/ultramodern-workspace/pnpm-workspace-policy-plan.d.ts +39 -0
  72. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +18 -0
  73. package/dist/types/ultramodern-workspace/versions.d.ts +5 -3
  74. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +72 -0
  75. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +13 -0
  76. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +42 -0
  77. package/dist/types/ultramodern-workspace/zerops.d.ts +2 -0
  78. package/package.json +3 -3
  79. package/template-workspace/.gitignore.handlebars +4 -0
  80. package/template-workspace/README.md.handlebars +18 -15
  81. package/template-workspace/patches/@module-federation__bridge-react@2.6.0.patch +140 -0
  82. package/template-workspace/patches/@module-federation__modern-js-v3@2.6.0.patch +57 -0
  83. package/template-workspace/patches/drizzle-orm-ts7-strict-declarations.patch +452 -0
  84. package/template-workspace/patches/effect-schema-error-type-id.patch +18 -0
  85. package/template-workspace/pnpm-workspace.yaml.handlebars +8 -0
  86. package/template-workspace/scripts/bootstrap-agent-skills.mjs +11 -3
  87. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +40 -2
  88. package/templates/workspace-scripts/generate-node-backend-federation.mjs +270 -0
  89. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +448 -0
  90. package/templates/workspace-scripts/proof-cloudflare-version.mjs +237 -9
  91. package/templates/workspace-scripts/proof-node-backend-federation.mjs +729 -0
  92. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +188 -2
  93. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +434 -18
@@ -1,14 +1,5 @@
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
- })();
12
3
  (()=>{
13
4
  __webpack_require__.d = (exports1, getters, values)=>{
14
5
  var define = (defs, kind)=>{
@@ -38,7 +29,8 @@ var __webpack_exports__ = {};
38
29
  __webpack_require__.r(__webpack_exports__);
39
30
  __webpack_require__.d(__webpack_exports__, {
40
31
  createAppModernConfig: ()=>createAppModernConfig,
41
- createBuildMarker: ()=>createBuildMarker,
32
+ createBackendModuleFederationConfig: ()=>createBackendModuleFederationConfig,
33
+ createBuildMarker: ()=>external_delivery_unit_cjs_namespaceObject.createBuildMarker,
42
34
  createModuleFederationRemoteUrlHelpers: ()=>createModuleFederationRemoteUrlHelpers,
43
35
  createModuleFederationRemotesConfig: ()=>createModuleFederationRemotesConfig,
44
36
  createRemoteModuleFederationConfig: ()=>createRemoteModuleFederationConfig,
@@ -48,14 +40,14 @@ __webpack_require__.d(__webpack_exports__, {
48
40
  createUltramodernBuildReexportModule: ()=>createUltramodernBuildReexportModule,
49
41
  formatTsObjectLiteral: ()=>formatTsObjectLiteral
50
42
  });
51
- const external_node_crypto_namespaceObject = require("node:crypto");
52
- var external_node_crypto_default = /*#__PURE__*/ __webpack_require__.n(external_node_crypto_namespaceObject);
43
+ const external_backend_federation_cjs_namespaceObject = require("./backend-federation.cjs");
44
+ const external_delivery_unit_cjs_namespaceObject = require("./delivery-unit.cjs");
53
45
  const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
54
46
  const external_naming_cjs_namespaceObject = require("./naming.cjs");
55
47
  const external_policy_cjs_namespaceObject = require("./policy.cjs");
56
48
  const external_types_cjs_namespaceObject = require("./types.cjs");
57
49
  const external_versions_cjs_namespaceObject = require("./versions.cjs");
58
- function createAppModernConfig(scope, app) {
50
+ function createAppModernConfig(scope, app, remotes = []) {
59
51
  const bffImport = (0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? "import { bffPlugin } from '@modern-js/plugin-bff';\n" : '';
60
52
  const bffConfig = (0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? ` bff: {
61
53
  effect: {
@@ -70,12 +62,30 @@ function createAppModernConfig(scope, app) {
70
62
  },
71
63
  ` : '';
72
64
  const bffPluginEntry = (0, external_descriptors_cjs_namespaceObject.appHasApi)(app) ? ' bffPlugin(),\n' : '';
65
+ const serviceBindings = 'shell' === app.kind ? remotes.filter(external_descriptors_cjs_namespaceObject.appHasApi) : [];
66
+ const serviceBindingsConfig = serviceBindings.length > 0 ? ` services: [
67
+ ${serviceBindings.map((service)=>` {
68
+ binding:
69
+ envValue('${(0, external_backend_federation_cjs_namespaceObject.createWorkerBindingEnv)(service)}') ??
70
+ '${(0, external_backend_federation_cjs_namespaceObject.createWorkerBindingName)(service)}',
71
+ prefix: '${(0, external_descriptors_cjs_namespaceObject.resolveApiPrefix)(service)}',
72
+ service:
73
+ envValue('${(0, external_backend_federation_cjs_namespaceObject.createDispatchWorkerNameEnv)(service)}') ??
74
+ '${(0, external_descriptors_cjs_namespaceObject.createCloudflareWorkerName)(scope, service)}',
75
+ },`).join('\n')}
76
+ ],
77
+ ` : '';
73
78
  const defaultAssetPrefixSource = 'shell' === app.kind ? "const defaultAssetPrefix = '/';" : `const remoteAssetOrigin =
74
79
  configuredCloudflareUrl ||
75
80
  inferredCloudflareUrl ||
76
81
  (cloudflareDeployEnabled ? '/' : \`http://localhost:\${port}\`);
77
82
  const defaultRemoteAssetPrefix = \`\${remoteAssetOrigin.replace(/\\/+$/u, '')}/\`;
78
83
  const defaultAssetPrefix = defaultRemoteAssetPrefix;`;
84
+ const devAssetPrefixSource = 'shell' === app.kind ? ` // Keep shell dev assets origin-relative so the shell works through
85
+ // tunnels and local previews without rewriting its own chunks.
86
+ assetPrefix: '/',` : ` // Remote dev manifests must publish an absolute publicPath so host
87
+ // shells load remoteEntry.js and exposed chunks from this dev server.
88
+ assetPrefix,`;
79
89
  return `// @effect-diagnostics processEnv:off
80
90
  import {
81
91
  appTools,
@@ -94,6 +104,22 @@ const zephyrEnabled = process.env['ULTRAMODERN_ZEPHYR'] !== 'false';
94
104
  const cloudflareDeployEnabled =
95
105
  process.env['MODERNJS_DEPLOY'] === 'cloudflare';
96
106
 
107
+ const parsedZephyrTimeoutMs = Number.parseInt(
108
+ process.env['ULTRAMODERN_ZEPHYR_TIMEOUT_MS'] ?? '',
109
+ 10,
110
+ );
111
+ const zephyrTimeoutMs =
112
+ Number.isFinite(parsedZephyrTimeoutMs) && parsedZephyrTimeoutMs > 0
113
+ ? parsedZephyrTimeoutMs
114
+ : 45000;
115
+
116
+ const zephyrWarn = (error: unknown) => {
117
+ const message = error instanceof Error ? error.message : String(error);
118
+ console.warn(
119
+ \`[ultramodern] zephyr-rspack-plugin failed; continuing without Zephyr (set ULTRAMODERN_ZEPHYR=false to disable it): \${message}\`,
120
+ );
121
+ };
122
+
97
123
  const zephyrRspackPlugin = () => ({
98
124
  name: 'ultramodern-zephyr-rspack-plugin',
99
125
  pre: ['@modern-js/plugin-module-federation-config'],
@@ -107,7 +133,34 @@ const zephyrRspackPlugin = () => ({
107
133
  if (!zephyrEnabled) {
108
134
  return;
109
135
  }
110
- api.modifyRspackConfig(config => withZephyrRspack()(config));
136
+ api.modifyRspackConfig(config => {
137
+ try {
138
+ // Zephyr can not only throw/reject but also hang on a stalled network
139
+ // call, wedging the whole build. Race it against a watchdog so a hang
140
+ // degrades to an unmodified config instead of blocking indefinitely.
141
+ const zephyrConfig = Promise.resolve(withZephyrRspack()(config)).catch(
142
+ error => {
143
+ zephyrWarn(error);
144
+ return config;
145
+ },
146
+ );
147
+ const watchdog = new Promise<ZephyrRspackConfig>(resolve => {
148
+ const timer = setTimeout(() => {
149
+ zephyrWarn(
150
+ \`timed out after \${zephyrTimeoutMs}ms (override with ULTRAMODERN_ZEPHYR_TIMEOUT_MS)\`,
151
+ );
152
+ resolve(config);
153
+ }, zephyrTimeoutMs);
154
+ if (typeof timer.unref === 'function') {
155
+ timer.unref();
156
+ }
157
+ });
158
+ return Promise.race([zephyrConfig, watchdog]);
159
+ } catch (error) {
160
+ zephyrWarn(error);
161
+ return config;
162
+ }
163
+ });
111
164
  },
112
165
  });
113
166
 
@@ -144,8 +197,10 @@ ${defaultAssetPrefixSource}
144
197
  // load remoteEntry.js and exposed chunks from the remote origin, not the host.
145
198
  const assetPrefix =
146
199
  configuredModernAssetPrefix || configuredUltramodernAssetPrefix || defaultAssetPrefix;
147
- const buildCacheTarget = cloudflareDeployEnabled ? 'cloudflare' : 'web';
148
- const buildCacheDirectory = \`node_modules/.cache/rspack-\${appId}-\${buildCacheTarget}\`;
200
+ const buildTarget = cloudflareDeployEnabled ? 'cloudflare' : 'web';
201
+ const buildOutputRoot = cloudflareDeployEnabled ? 'dist-cloudflare' : 'dist';
202
+ const buildTempDirectory = \`node_modules/.modern-js-\${appId}-\${buildTarget}\`;
203
+ const buildCacheDirectory = \`node_modules/.cache/rspack-\${appId}-\${buildTarget}\`;
149
204
 
150
205
  if (
151
206
  cloudflareDeployEnabled &&
@@ -166,18 +221,16 @@ ${bffConfig} ...(cloudflareDeployEnabled
166
221
  ? {
167
222
  deploy: {
168
223
  worker: {
169
- compatibilityDate: '${external_versions_cjs_namespaceObject.CLOUDFLARE_COMPATIBILITY_DATE}',
170
- name: cloudflareWorkerName,
171
- security: ${(0, external_policy_cjs_namespaceObject.formatTsJsonValue)((0, external_types_cjs_namespaceObject.sortJsonValue)((0, external_policy_cjs_namespaceObject.createCloudflareSecurityContract)()), 16)},
172
- ssr: true,
173
- },
224
+ compatibilityDate: '${external_versions_cjs_namespaceObject.CLOUDFLARE_COMPATIBILITY_DATE}',
225
+ name: cloudflareWorkerName,
226
+ security: ${(0, external_policy_cjs_namespaceObject.formatTsJsonValue)((0, external_types_cjs_namespaceObject.sortJsonValue)((0, external_policy_cjs_namespaceObject.createCloudflareSecurityContract)()), 16)},
227
+ ${serviceBindingsConfig} ssr: true,
174
228
  },
229
+ },
175
230
  }
176
231
  : {}),
177
232
  dev: {
178
- // Keep dev assets origin-relative too; the default absolute
179
- // http://localhost:<port> prefix breaks pages served through tunnels.
180
- assetPrefix: '/',
233
+ ${devAssetPrefixSource}
181
234
  },
182
235
  html: {
183
236
  outputStructure: 'flat',
@@ -187,13 +240,15 @@ ${bffConfig} ...(cloudflareDeployEnabled
187
240
  disableTsChecker: false,
188
241
  distPath: {
189
242
  html: './',
243
+ root: buildOutputRoot,
190
244
  },
191
245
  polyfill: 'off',
192
246
  splitRouteChunks: true,
247
+ tempDir: buildTempDirectory,
193
248
  },
194
249
  performance: {
195
250
  buildCache: {
196
- cacheDigest: [appId, buildCacheTarget],
251
+ cacheDigest: [appId, buildTarget],
197
252
  cacheDirectory: buildCacheDirectory,
198
253
  },
199
254
  rsdoctor: {
@@ -390,6 +445,19 @@ ${remoteEntries}
390
445
  },
391
446
  `;
392
447
  }
448
+ function createModuleFederationDtsConfig(hasExposes) {
449
+ return hasExposes ? ` dts: {
450
+ displayErrorInTerminal: true,
451
+ generateTypes: {
452
+ compilerInstance: 'tsgo',
453
+ },
454
+ tsConfigPath: './tsconfig.mf-types.json',
455
+ },` : ` dts: {
456
+ consumeTypes: true,
457
+ generateTypes: false,
458
+ tsConfigPath: './tsconfig.mf-types.json',
459
+ },`;
460
+ }
393
461
  function createShellModuleFederationConfig(scope, remotes = []) {
394
462
  const shellHost = {
395
463
  ...external_descriptors_cjs_namespaceObject.shellApp,
@@ -418,13 +486,7 @@ const moduleFederationConfig: Parameters<
418
486
  dev: {
419
487
  disableDynamicRemoteTypeHints: true,
420
488
  },
421
- dts: {
422
- displayErrorInTerminal: true,
423
- generateTypes: {
424
- compilerInstance: 'tsgo',
425
- },
426
- tsConfigPath: './tsconfig.mf-types.json',
427
- },
489
+ ${createModuleFederationDtsConfig(false)}
428
490
  filename: 'remoteEntry.js',
429
491
  name: '${external_descriptors_cjs_namespaceObject.shellApp.mfName}',
430
492
  ${createModuleFederationRemotesConfig(scope, shellHost, remotes)}${createSharedModuleFederationConfig()},
@@ -434,25 +496,75 @@ ${createModuleFederationRemotesConfig(scope, shellHost, remotes)}${createSharedM
434
496
  export default moduleFederationConfig;
435
497
  `;
436
498
  }
437
- function createBuildMarker(scope, app) {
438
- return external_node_crypto_default().createHash('sha256').update(`${scope}:${app.packageSuffix}:${app.id}:0.1.0`).digest('hex').slice(0, 16);
499
+ function createBackendModuleFederationConfig(app) {
500
+ return `// @effect-diagnostics nodeBuiltinImport:off
501
+ import { createRequire } from 'node:module';
502
+ import { createModuleFederationConfig } from '@module-federation/modern-js-v3';
503
+ import { dependencies } from './package.json';
504
+
505
+ const require = createRequire(import.meta.url);
506
+ const bffVersion = (
507
+ require('@modern-js/plugin-bff/package.json') as { version: string }
508
+ ).version;
509
+ const effectVersion = (
510
+ require('effect/package.json') as { version: string }
511
+ ).version;
512
+
513
+ const moduleFederationConfig: Parameters<
514
+ typeof createModuleFederationConfig
515
+ >[0] = createModuleFederationConfig({
516
+ dts: false,
517
+ exposes: {
518
+ './effect-api': './api/effect-api.ts',
519
+ },
520
+ filename: 'backendRemoteEntry.mjs',
521
+ name: '${(0, external_descriptors_cjs_namespaceObject.createBackendFederationName)(app)}',
522
+ shared: {
523
+ '@modern-js/plugin-bff': {
524
+ requiredVersion: bffVersion,
525
+ singleton: true,
526
+ treeShaking: false,
527
+ },
528
+ '@module-federation/runtime': {
529
+ requiredVersion: dependencies['@module-federation/runtime'],
530
+ singleton: true,
531
+ treeShaking: false,
532
+ },
533
+ effect: {
534
+ requiredVersion: effectVersion,
535
+ singleton: true,
536
+ treeShaking: false,
537
+ },
538
+ },
539
+ treeShakingSharedExcludePlugins: ['RspackModuleFederationPlugin'],
540
+ });
541
+
542
+ export default moduleFederationConfig;
543
+ `;
439
544
  }
440
545
  function createUltramodernBuildModule(scope, app) {
441
- return `export const ultramodernVerticalIdentity = {
442
- appId: '${app.id}',
443
- build: '${createBuildMarker(scope, app)}',
444
- deployProfile: 'cloudflare-ssr-mf-effect-v1',
445
- packageName: '${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}',
446
- version: '0.1.0',
546
+ const record = (0, external_delivery_unit_cjs_namespaceObject.createDeliveryUnitRecord)(scope, app);
547
+ return `export const ultramodernDeliveryUnit = {
548
+ appId: '${record.appId}',
549
+ build: '${record.buildMarker}',
550
+ deployProfile: '${record.deployProfile}',
551
+ kind: '${record.kind}',
552
+ packageName: '${record.packageName}',
553
+ schemaVersion: ${record.schemaVersion},
554
+ sourceRevision: '${record.sourceRevision}',
555
+ unitId: '${record.unitId}',
556
+ version: '${record.version}',
447
557
  } as const;
448
558
 
559
+ export const ultramodernVerticalIdentity = ultramodernDeliveryUnit;
560
+
449
561
  export const ultramodernUiMarker = {
450
- ...ultramodernVerticalIdentity,
562
+ ...ultramodernDeliveryUnit,
451
563
  surface: 'ui',
452
564
  } as const;
453
565
 
454
566
  export const ultramodernApiMarker = {
455
- ...ultramodernVerticalIdentity,
567
+ ...ultramodernDeliveryUnit,
456
568
  surface: 'api',
457
569
  } as const;
458
570
  `;
@@ -460,6 +572,7 @@ export const ultramodernApiMarker = {
460
572
  function createUltramodernBuildReexportModule() {
461
573
  return `export {
462
574
  ultramodernApiMarker,
575
+ ultramodernDeliveryUnit,
463
576
  ultramodernUiMarker,
464
577
  ultramodernVerticalIdentity,
465
578
  } from '../shared/ultramodern-build';
@@ -467,7 +580,9 @@ function createUltramodernBuildReexportModule() {
467
580
  }
468
581
  function createRemoteModuleFederationConfig(scope, app, remotes = []) {
469
582
  const exposes = formatTsObjectLiteral(app.exposes ?? {});
470
- return `// @effect-diagnostics nodeBuiltinImport:off
583
+ const hasExposes = Object.keys(app.exposes ?? {}).length > 0;
584
+ const hostOnlyMarker = hasExposes ? '' : '\n// ultramodern-mf: no-exposes';
585
+ return `// @effect-diagnostics nodeBuiltinImport:off${hostOnlyMarker}
471
586
  import { createRequire } from 'node:module';
472
587
  import { createModuleFederationConfig } from '@module-federation/modern-js-v3';
473
588
  import { dependencies } from './package.json';
@@ -489,13 +604,7 @@ const moduleFederationConfig: Parameters<
489
604
  dev: {
490
605
  disableDynamicRemoteTypeHints: true,
491
606
  },
492
- dts: {
493
- displayErrorInTerminal: true,
494
- generateTypes: {
495
- compilerInstance: 'tsgo',
496
- },
497
- tsConfigPath: './tsconfig.mf-types.json',
498
- },
607
+ ${createModuleFederationDtsConfig(hasExposes)}
499
608
  exposes: ${exposes},
500
609
  filename: 'remoteEntry.js',
501
610
  name: '${app.mfName}',
@@ -507,6 +616,7 @@ export default moduleFederationConfig;
507
616
  `;
508
617
  }
509
618
  exports.createAppModernConfig = __webpack_exports__.createAppModernConfig;
619
+ exports.createBackendModuleFederationConfig = __webpack_exports__.createBackendModuleFederationConfig;
510
620
  exports.createBuildMarker = __webpack_exports__.createBuildMarker;
511
621
  exports.createModuleFederationRemoteUrlHelpers = __webpack_exports__.createModuleFederationRemoteUrlHelpers;
512
622
  exports.createModuleFederationRemotesConfig = __webpack_exports__.createModuleFederationRemotesConfig;
@@ -518,6 +628,7 @@ exports.createUltramodernBuildReexportModule = __webpack_exports__.createUltramo
518
628
  exports.formatTsObjectLiteral = __webpack_exports__.formatTsObjectLiteral;
519
629
  for(var __rspack_i in __webpack_exports__)if (-1 === [
520
630
  "createAppModernConfig",
631
+ "createBackendModuleFederationConfig",
521
632
  "createBuildMarker",
522
633
  "createModuleFederationRemoteUrlHelpers",
523
634
  "createModuleFederationRemotesConfig",
@@ -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, getters, values)=>{
5
14
  var define = (defs, kind)=>{
@@ -39,18 +48,18 @@ __webpack_require__.d(__webpack_exports__, {
39
48
  createSharedContractsIndex: ()=>createSharedContractsIndex,
40
49
  createSharedPackage: ()=>createSharedPackage,
41
50
  createSharedPackageTsConfig: ()=>createSharedPackageTsConfig,
42
- createStrictTsgoTypecheckCommand: ()=>createStrictTsgoTypecheckCommand,
43
51
  createTsConfigBase: ()=>createTsConfigBase,
44
52
  createZephyrDependencies: ()=>createZephyrDependencies,
45
53
  effectDiagnostics: ()=>effectDiagnostics
46
54
  });
55
+ const external_node_path_namespaceObject = require("node:path");
56
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
47
57
  const external_ultramodern_package_source_cjs_namespaceObject = require("../ultramodern-package-source.cjs");
48
58
  const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
49
59
  const external_fs_io_cjs_namespaceObject = require("./fs-io.cjs");
50
60
  const external_naming_cjs_namespaceObject = require("./naming.cjs");
51
- const external_public_surface_cjs_namespaceObject = require("./public-surface.cjs");
52
61
  const external_versions_cjs_namespaceObject = require("./versions.cjs");
53
- const createStrictTsgoTypecheckCommand = (packageDir)=>`node ${(0, external_naming_cjs_namespaceObject.relativeRootFor)(packageDir)}/scripts/ultramodern-typecheck.mts --project tsconfig.json`;
62
+ const external_workspace_script_plan_cjs_namespaceObject = require("./workspace-script-plan.cjs");
54
63
  const effectDiagnostics = [
55
64
  'anyUnknownInErrorContext',
56
65
  'classSelfMismatch',
@@ -141,8 +150,7 @@ function appDependencies(scope, packageSource, app, remotes = [], bridge) {
141
150
  [(0, external_naming_cjs_namespaceObject.packageName)(scope, 'shared-design-tokens')]: external_ultramodern_package_source_cjs_namespaceObject.WORKSPACE_PACKAGE_VERSION,
142
151
  react: external_versions_cjs_namespaceObject.REACT_VERSION,
143
152
  'react-dom': external_versions_cjs_namespaceObject.REACT_DOM_VERSION,
144
- 'react-router': external_versions_cjs_namespaceObject.REACT_ROUTER_VERSION,
145
- 'react-router-dom': external_versions_cjs_namespaceObject.REACT_ROUTER_VERSION
153
+ 'react-router': external_versions_cjs_namespaceObject.REACT_ROUTER_VERSION
146
154
  };
147
155
  for (const dependency of bridge?.dependencies ?? [])dependencies[dependency] = external_ultramodern_package_source_cjs_namespaceObject.WORKSPACE_PACKAGE_VERSION;
148
156
  if ('shell' === app.kind) {
@@ -174,11 +182,6 @@ function appDevDependencies(packageSource, enableTailwind) {
174
182
  function createRootPackageJson(scope, packageSource, remotes = [], bridge) {
175
183
  const shellFilter = `--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, external_descriptors_cjs_namespaceObject.shellApp.packageSuffix)}`;
176
184
  const remoteFilters = remotes.map((remote)=>`--filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix)}`);
177
- const remoteBuildPrefix = remotes.length > 0 ? 'ULTRAMODERN_ZEPHYR=false pnpm -r --filter "./verticals/*" run build && ' : '';
178
- const remoteCloudflareBuildPrefix = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:build && ' : '';
179
- const remoteCloudflareDeployPrefix = remotes.length > 0 ? 'pnpm -r --filter "./verticals/*" run cloudflare:deploy && ' : '';
180
- const generatedPackageTypecheck = 'pnpm -r --filter "./apps/*" --filter "./verticals/*" --filter "./packages/*" run typecheck';
181
- const typecheck = bridge ? generatedPackageTypecheck : "node ./scripts/ultramodern-typecheck.mts --build tsconfig.json";
182
185
  const bridgeScripts = bridge ? {
183
186
  ...Object.fromEntries(bridge.gates.map((gate)=>[
184
187
  `bridge:${gate.name}`,
@@ -187,6 +190,11 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge) {
187
190
  'bridge:check': bridge.gates.map((gate)=>`pnpm run bridge:${gate.name}`).join(' && ')
188
191
  } : {};
189
192
  const bridgeCheck = bridge ? ' && pnpm bridge:check' : '';
193
+ const bridgeTypecheck = bridge ? 'pnpm -r --filter "./apps/*" --filter "./verticals/*" --filter "./packages/*" run typecheck' : void 0;
194
+ const rootPackageScripts = (0, external_workspace_script_plan_cjs_namespaceObject.createWorkspaceRootPackageScripts)(remotes, {
195
+ bridgeCheck,
196
+ typecheck: bridgeTypecheck
197
+ });
190
198
  const workspacePackages = [
191
199
  'apps/*',
192
200
  'verticals/*',
@@ -209,28 +217,19 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge) {
209
217
  `dev:${remote.packageSuffix}`,
210
218
  `pnpm --filter ${(0, external_naming_cjs_namespaceObject.packageName)(scope, remote.packageSuffix)} dev`
211
219
  ])),
212
- build: `${remoteBuildPrefix}ULTRAMODERN_ZEPHYR=false pnpm --filter "./apps/shell-super-app" run build && pnpm mf:types && pnpm performance:readiness`,
220
+ ...rootPackageScripts,
213
221
  format: "oxfmt . '!repos/**'",
214
222
  'format:check': "oxfmt --check . '!repos/**'",
215
223
  lint: 'oxlint apps verticals packages',
216
224
  'lint:fix': 'oxlint apps verticals packages --fix',
217
- typecheck,
218
- 'cloudflare:build': `${remoteCloudflareBuildPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:build && pnpm mf:types`,
219
- 'cloudflare:deploy': `${remoteCloudflareDeployPrefix}pnpm --filter "./apps/shell-super-app" run cloudflare:deploy`,
220
- 'cloudflare:proof': "node ./scripts/proof-cloudflare-version.mts --out .codex/reports/cloudflare-version-proof/public-url-proof.json",
221
225
  'skills:install': "node ./scripts/bootstrap-agent-skills.mts",
222
226
  'skills:check': "node ./scripts/bootstrap-agent-skills.mts --check",
223
227
  'agents:refs:install': "node ./scripts/setup-agent-reference-repos.mts",
224
228
  'agents:refs:check': "node ./scripts/setup-agent-reference-repos.mts --check",
225
- 'mf:types': "node ./scripts/assert-mf-types.mts",
226
- 'performance:readiness': "node ./scripts/ultramodern-performance-readiness.mts",
227
- 'migrate:strict-effect': "node ./scripts/migrate-strict-effect.mts",
228
- 'contract:check': "node ./scripts/validate-ultramodern-workspace.mts",
229
229
  'api:check': "node ./scripts/check-ultramodern-api-boundaries.mts",
230
230
  'i18n:boundaries': "node ./scripts/check-ultramodern-i18n-boundaries.mts",
231
231
  ...bridgeScripts,
232
- postinstall: "oxfmt . '!repos/**' && node ./scripts/bootstrap-agent-skills.mts --postinstall",
233
- check: `pnpm format:check && pnpm lint && pnpm typecheck && pnpm skills:check && pnpm i18n:boundaries && pnpm api:check && pnpm contract:check && pnpm performance:readiness${bridgeCheck}`
232
+ postinstall: "oxfmt . '!repos/**' && node ./scripts/bootstrap-agent-skills.mts --postinstall"
234
233
  },
235
234
  engines: {
236
235
  node: '>=26',
@@ -251,6 +250,7 @@ function createRootPackageJson(scope, packageSource, remotes = [], bridge) {
251
250
  '@effect/tsgo': external_versions_cjs_namespaceObject.EFFECT_TSGO_VERSION,
252
251
  '@modern-js/code-tools': (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/code-tools', packageSource),
253
252
  '@modern-js/create': (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/create', packageSource),
253
+ '@modern-js/plugin-bff': (0, external_ultramodern_package_source_cjs_namespaceObject.modernPackageSpecifier)('@modern-js/plugin-bff', packageSource),
254
254
  "@typescript/native-preview": external_versions_cjs_namespaceObject.TYPESCRIPT_NATIVE_PREVIEW_VERSION,
255
255
  lefthook: external_versions_cjs_namespaceObject.LEFTHOOK_VERSION,
256
256
  oxlint: external_versions_cjs_namespaceObject.OXLINT_VERSION,
@@ -294,7 +294,6 @@ function createTsConfigBase() {
294
294
  noFallthroughCasesInSwitch: true,
295
295
  noPropertyAccessFromIndexSignature: true,
296
296
  noImplicitReturns: true,
297
- skipLibCheck: true,
298
297
  resolveJsonModule: true,
299
298
  plugins: [
300
299
  {
@@ -326,7 +325,7 @@ function createReferences(packageDir, references) {
326
325
  return [
327
326
  ...new Set(references)
328
327
  ].filter((reference)=>reference !== packageDir).map((reference)=>({
329
- path: `${(0, external_naming_cjs_namespaceObject.relativeRootFor)(packageDir)}/${reference}`
328
+ path: external_node_path_default().relative(packageDir, reference).split(external_node_path_default().sep).join('/')
330
329
  }));
331
330
  }
332
331
  function createPackageTsConfig(packageDir, options = {}) {
@@ -336,8 +335,6 @@ function createPackageTsConfig(packageDir, options = {}) {
336
335
  const include = resolvedOptions.include ?? [
337
336
  'src',
338
337
  'locales/**/*.json',
339
- 'modern.config.ts',
340
- 'module-federation.config.ts',
341
338
  'package.json',
342
339
  'shared'
343
340
  ];
@@ -371,9 +368,9 @@ function createAppTsConfig(app, remotes = []) {
371
368
  });
372
369
  }
373
370
  function createAppMfTypesTsConfig(app) {
374
- const exposedFiles = Object.values(app.exposes ?? {}).map((exposePath)=>exposePath.replace(/^\.\//u, ''));
371
+ const exposedFiles = Object.entries(app.exposes ?? {}).sort(([left], [right])=>'./Route' === left ? -1 : './Route' === right ? 1 : 0).map(([, exposePath])=>exposePath.replace(/^\.\//u, ''));
375
372
  return {
376
- extends: './tsconfig.json',
373
+ extends: `${(0, external_naming_cjs_namespaceObject.relativeRootFor)(app.directory)}/tsconfig.base.json`,
377
374
  include: [
378
375
  ...new Set([
379
376
  ...exposedFiles,
@@ -403,9 +400,6 @@ function createRootTsConfig(apps = []) {
403
400
  };
404
401
  }
405
402
  function createAppPackage(scope, app, packageSource, enableTailwind, remotes = [], bridge) {
406
- const publicSurfaceBuildCommand = (0, external_public_surface_cjs_namespaceObject.createPublicSurfaceGenerationCommand)(app, 'dist');
407
- const publicSurfaceCloudflareBuildCommand = (0, external_public_surface_cjs_namespaceObject.createPublicSurfaceGenerationCommand)(app, 'dist');
408
- const publicSurfaceCloudflareOutputCommand = (0, external_public_surface_cjs_namespaceObject.createPublicSurfaceGenerationCommand)(app, 'cloudflare');
409
403
  const packageExports = Object.fromEntries(Object.entries(app.exposes ?? {}).map(([expose, source])=>[
410
404
  expose,
411
405
  source
@@ -414,16 +408,7 @@ function createAppPackage(scope, app, packageSource, enableTailwind, remotes = [
414
408
  private: true,
415
409
  name: (0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix),
416
410
  version: '0.1.0',
417
- scripts: {
418
- dev: 'modern dev',
419
- build: app.exposes ? `ULTRAMODERN_ZEPHYR=false modern build && ${publicSurfaceBuildCommand} && node ${(0, external_naming_cjs_namespaceObject.relativeRootFor)(app.directory)}/scripts/assert-mf-types.mts` : `ULTRAMODERN_ZEPHYR=false modern build && ${publicSurfaceBuildCommand}`,
420
- 'cloudflare:build': `ULTRAMODERN_ZEPHYR=false MODERNJS_DEPLOY=cloudflare modern build && ${publicSurfaceCloudflareBuildCommand} && ULTRAMODERN_ZEPHYR=false MODERNJS_DEPLOY=cloudflare modern deploy && ${publicSurfaceCloudflareOutputCommand}`,
421
- 'cloudflare:deploy': 'ULTRAMODERN_CLOUDFLARE_REQUIRE_PUBLIC_URLS=true pnpm run cloudflare:build && wrangler deploy --config .output/wrangler.json',
422
- 'cloudflare:preview': 'pnpm run cloudflare:build && wrangler dev --config .output/wrangler.json',
423
- 'cloudflare:proof': `node ${(0, external_naming_cjs_namespaceObject.relativeRootFor)(app.directory)}/scripts/proof-cloudflare-version.mts --app ${app.id}`,
424
- serve: 'modern serve',
425
- typecheck: createStrictTsgoTypecheckCommand(app.directory)
426
- },
411
+ scripts: (0, external_workspace_script_plan_cjs_namespaceObject.createWorkspaceAppPackageScripts)(app),
427
412
  modernjs: {
428
413
  preset: 'presetUltramodern',
429
414
  role: 'shell' === app.kind ? 'shell' : 'module-federation-remote',
@@ -458,7 +443,7 @@ function createSharedPackage(scope, id, description) {
458
443
  '.': './src/index.ts'
459
444
  },
460
445
  scripts: {
461
- typecheck: createStrictTsgoTypecheckCommand(`packages/${id}`)
446
+ typecheck: (0, external_workspace_script_plan_cjs_namespaceObject.createStrictTsgoTypecheckCommand)(`packages/${id}`)
462
447
  },
463
448
  devDependencies: {
464
449
  '@effect/tsgo': external_versions_cjs_namespaceObject.EFFECT_TSGO_VERSION,
@@ -485,7 +470,6 @@ exports.createRootTsConfig = __webpack_exports__.createRootTsConfig;
485
470
  exports.createSharedContractsIndex = __webpack_exports__.createSharedContractsIndex;
486
471
  exports.createSharedPackage = __webpack_exports__.createSharedPackage;
487
472
  exports.createSharedPackageTsConfig = __webpack_exports__.createSharedPackageTsConfig;
488
- exports.createStrictTsgoTypecheckCommand = __webpack_exports__.createStrictTsgoTypecheckCommand;
489
473
  exports.createTsConfigBase = __webpack_exports__.createTsConfigBase;
490
474
  exports.createZephyrDependencies = __webpack_exports__.createZephyrDependencies;
491
475
  exports.effectDiagnostics = __webpack_exports__.effectDiagnostics;
@@ -501,7 +485,6 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
501
485
  "createSharedContractsIndex",
502
486
  "createSharedPackage",
503
487
  "createSharedPackageTsConfig",
504
- "createStrictTsgoTypecheckCommand",
505
488
  "createTsConfigBase",
506
489
  "createZephyrDependencies",
507
490
  "effectDiagnostics"