@bleedingdev/modern-js-create 3.5.0-ultramodern.27 → 3.5.0-ultramodern.29

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 (79) hide show
  1. package/dist/cjs/ultramodern-tooling/commands.cjs +497 -155
  2. package/dist/cjs/ultramodern-tooling/config.cjs +149 -8
  3. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +25 -0
  4. package/dist/cjs/ultramodern-workspace/api.cjs +44 -0
  5. package/dist/cjs/ultramodern-workspace/backend-federation.cjs +282 -0
  6. package/dist/cjs/ultramodern-workspace/contracts.cjs +24 -8
  7. package/dist/cjs/ultramodern-workspace/delivery-unit-sync.cjs +157 -0
  8. package/dist/cjs/ultramodern-workspace/delivery-unit.cjs +88 -0
  9. package/dist/cjs/ultramodern-workspace/descriptors.cjs +24 -0
  10. package/dist/cjs/ultramodern-workspace/module-federation.cjs +122 -44
  11. package/dist/cjs/ultramodern-workspace/package-json.cjs +11 -34
  12. package/dist/cjs/ultramodern-workspace/pnpm-workspace-policy-plan.cjs +166 -0
  13. package/dist/cjs/ultramodern-workspace/tooling-command-catalog.cjs +153 -0
  14. package/dist/cjs/ultramodern-workspace/workspace-script-plan.cjs +175 -0
  15. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +43 -62
  16. package/dist/cjs/ultramodern-workspace/workspace-validation-contract.cjs +97 -0
  17. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +9 -3
  18. package/dist/cjs/ultramodern-workspace/zerops.cjs +100 -0
  19. package/dist/esm/ultramodern-tooling/commands.js +500 -158
  20. package/dist/esm/ultramodern-tooling/config.js +144 -9
  21. package/dist/esm/ultramodern-workspace/add-vertical.js +26 -1
  22. package/dist/esm/ultramodern-workspace/api.js +43 -2
  23. package/dist/esm/ultramodern-workspace/backend-federation.js +217 -0
  24. package/dist/esm/ultramodern-workspace/contracts.js +24 -8
  25. package/dist/esm/ultramodern-workspace/delivery-unit-sync.js +108 -0
  26. package/dist/esm/ultramodern-workspace/delivery-unit.js +31 -0
  27. package/dist/esm/ultramodern-workspace/descriptors.js +13 -1
  28. package/dist/esm/ultramodern-workspace/module-federation.js +121 -36
  29. package/dist/esm/ultramodern-workspace/package-json.js +11 -31
  30. package/dist/esm/ultramodern-workspace/pnpm-workspace-policy-plan.js +113 -0
  31. package/dist/esm/ultramodern-workspace/tooling-command-catalog.js +100 -0
  32. package/dist/esm/ultramodern-workspace/workspace-script-plan.js +110 -0
  33. package/dist/esm/ultramodern-workspace/workspace-scripts.js +35 -63
  34. package/dist/esm/ultramodern-workspace/workspace-validation-contract.js +59 -0
  35. package/dist/esm/ultramodern-workspace/write-workspace.js +11 -5
  36. package/dist/esm/ultramodern-workspace/zerops.js +62 -0
  37. package/dist/esm-node/ultramodern-tooling/commands.js +500 -158
  38. package/dist/esm-node/ultramodern-tooling/config.js +144 -9
  39. package/dist/esm-node/ultramodern-workspace/add-vertical.js +26 -1
  40. package/dist/esm-node/ultramodern-workspace/api.js +43 -2
  41. package/dist/esm-node/ultramodern-workspace/backend-federation.js +218 -0
  42. package/dist/esm-node/ultramodern-workspace/contracts.js +24 -8
  43. package/dist/esm-node/ultramodern-workspace/delivery-unit-sync.js +109 -0
  44. package/dist/esm-node/ultramodern-workspace/delivery-unit.js +32 -0
  45. package/dist/esm-node/ultramodern-workspace/descriptors.js +13 -1
  46. package/dist/esm-node/ultramodern-workspace/module-federation.js +121 -36
  47. package/dist/esm-node/ultramodern-workspace/package-json.js +11 -31
  48. package/dist/esm-node/ultramodern-workspace/pnpm-workspace-policy-plan.js +114 -0
  49. package/dist/esm-node/ultramodern-workspace/tooling-command-catalog.js +101 -0
  50. package/dist/esm-node/ultramodern-workspace/workspace-script-plan.js +111 -0
  51. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +35 -63
  52. package/dist/esm-node/ultramodern-workspace/workspace-validation-contract.js +60 -0
  53. package/dist/esm-node/ultramodern-workspace/write-workspace.js +11 -5
  54. package/dist/esm-node/ultramodern-workspace/zerops.js +63 -0
  55. package/dist/types/ultramodern-tooling/config.d.ts +6 -0
  56. package/dist/types/ultramodern-workspace/api.d.ts +1 -0
  57. package/dist/types/ultramodern-workspace/backend-federation.d.ts +11 -0
  58. package/dist/types/ultramodern-workspace/contracts.d.ts +1 -1
  59. package/dist/types/ultramodern-workspace/delivery-unit-sync.d.ts +6 -0
  60. package/dist/types/ultramodern-workspace/delivery-unit.d.ts +27 -0
  61. package/dist/types/ultramodern-workspace/descriptors.d.ts +4 -0
  62. package/dist/types/ultramodern-workspace/module-federation.d.ts +4 -9
  63. package/dist/types/ultramodern-workspace/package-json.d.ts +0 -1
  64. package/dist/types/ultramodern-workspace/pnpm-workspace-policy-plan.d.ts +39 -0
  65. package/dist/types/ultramodern-workspace/tooling-command-catalog.d.ts +18 -0
  66. package/dist/types/ultramodern-workspace/workspace-script-plan.d.ts +72 -0
  67. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +3 -0
  68. package/dist/types/ultramodern-workspace/workspace-validation-contract.d.ts +42 -0
  69. package/dist/types/ultramodern-workspace/zerops.d.ts +2 -0
  70. package/package.json +3 -3
  71. package/template-workspace/.gitignore.handlebars +1 -0
  72. package/template-workspace/scripts/bootstrap-agent-skills.mjs +11 -3
  73. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +40 -2
  74. package/templates/workspace-scripts/generate-node-backend-federation.mjs +270 -0
  75. package/templates/workspace-scripts/materialize-zerops-runtime.mjs +448 -0
  76. package/templates/workspace-scripts/proof-cloudflare-version.mjs +234 -8
  77. package/templates/workspace-scripts/proof-node-backend-federation.mjs +729 -0
  78. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +188 -2
  79. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +322 -8
@@ -34,9 +34,12 @@ __webpack_require__.d(__webpack_exports__, {
34
34
  createUltramodernConfig: ()=>createUltramodernConfig
35
35
  });
36
36
  const external_api_cjs_namespaceObject = require("./api.cjs");
37
+ const external_backend_federation_cjs_namespaceObject = require("./backend-federation.cjs");
38
+ const external_delivery_unit_cjs_namespaceObject = require("./delivery-unit.cjs");
37
39
  const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
38
40
  const external_naming_cjs_namespaceObject = require("./naming.cjs");
39
41
  const external_policy_cjs_namespaceObject = require("./policy.cjs");
42
+ const external_tooling_command_catalog_cjs_namespaceObject = require("./tooling-command-catalog.cjs");
40
43
  const external_versions_cjs_namespaceObject = require("./versions.cjs");
41
44
  function createTopology(scope, remotes = []) {
42
45
  const shellHost = (0, external_descriptors_cjs_namespaceObject.createShellHost)(remotes);
@@ -79,6 +82,12 @@ function createTopology(scope, remotes = []) {
79
82
  fallbackTelemetryEvent: 'modernjs:mv-runtime-parity',
80
83
  sharedContractVersion: 'mf-ssr-contract-v1'
81
84
  },
85
+ ...(0, external_backend_federation_cjs_namespaceObject.createBackendFederationContract)(scope, vertical) ? {
86
+ backendFederation: (0, external_backend_federation_cjs_namespaceObject.createBackendFederationContract)(scope, vertical)
87
+ } : {},
88
+ ...vertical.api ? {
89
+ deliveryUnit: (0, external_delivery_unit_cjs_namespaceObject.deliveryUnitContractBlock)((0, external_delivery_unit_cjs_namespaceObject.createDeliveryUnitRecord)(scope, vertical))
90
+ } : {},
82
91
  ...(0, external_api_cjs_namespaceObject.apiTopologyMetadata)(vertical) ? {
83
92
  api: (0, external_api_cjs_namespaceObject.apiTopologyMetadata)(vertical)
84
93
  } : {},
@@ -134,7 +143,7 @@ function createOwnership(scope, remotes = []) {
134
143
  }))
135
144
  };
136
145
  }
137
- function createDevelopmentOverlay(remotes = []) {
146
+ function createDevelopmentOverlay(scope, remotes = []) {
138
147
  return {
139
148
  schemaVersion: 1,
140
149
  environment: 'development',
@@ -150,6 +159,10 @@ function createDevelopmentOverlay(remotes = []) {
150
159
  remote.id,
151
160
  `http://localhost:${remote.port}/mf-manifest.json`
152
161
  ])),
162
+ serverExecution: Object.fromEntries((0, external_descriptors_cjs_namespaceObject.verticalApiApps)(remotes).map((app)=>[
163
+ app.id,
164
+ (0, external_backend_federation_cjs_namespaceObject.createServerExecutionOverlay)(scope, app)
165
+ ])),
153
166
  apis: Object.fromEntries((0, external_descriptors_cjs_namespaceObject.verticalApiApps)(remotes).map((app)=>[
154
167
  app.id,
155
168
  `http://localhost:${app.port}${(0, external_descriptors_cjs_namespaceObject.resolveApiPrefix)(app)}`
@@ -226,6 +239,12 @@ function createUltramodernConfig(scope, modernVersion, packageSource, apps = [
226
239
  tsConfigPath: './tsconfig.mf-types.json'
227
240
  }
228
241
  },
242
+ ...(0, external_backend_federation_cjs_namespaceObject.createBackendFederationContract)(scope, app) ? {
243
+ backendFederation: (0, external_backend_federation_cjs_namespaceObject.createBackendFederationContract)(scope, app)
244
+ } : {},
245
+ ...app.api ? {
246
+ deliveryUnit: (0, external_delivery_unit_cjs_namespaceObject.deliveryUnitContractBlock)((0, external_delivery_unit_cjs_namespaceObject.createDeliveryUnitRecord)(scope, app))
247
+ } : {},
229
248
  ...app.api ? {
230
249
  api: {
231
250
  stem: app.api.stem,
@@ -269,6 +288,9 @@ function createUltramodernConfig(scope, modernVersion, packageSource, apps = [
269
288
  hostOnly: 'shell' === app.kind && 0 === Object.keys(app.exposes ?? {}).length
270
289
  }))
271
290
  },
291
+ backendFederation: {
292
+ apps: (0, external_descriptors_cjs_namespaceObject.verticalApiApps)(remotes).map((app)=>(0, external_backend_federation_cjs_namespaceObject.createBackendFederationSummary)(scope, app))
293
+ },
272
294
  agentSkills: {
273
295
  target: 'codex',
274
296
  lockfile: './.codex/skills-lock.json',
@@ -283,13 +305,7 @@ function createUltramodernConfig(scope, modernVersion, packageSource, apps = [
283
305
  tooling: {
284
306
  command: 'modern-js-create ultramodern',
285
307
  wrappers: {
286
- validate: "scripts/validate-ultramodern-workspace.mts",
287
- typecheck: "scripts/ultramodern-typecheck.mts",
288
- mfTypes: "scripts/assert-mf-types.mts",
289
- publicSurface: "scripts/generate-public-surface-assets.mts",
290
- cloudflareProof: "scripts/proof-cloudflare-version.mts",
291
- performanceReadiness: "scripts/ultramodern-performance-readiness.mts",
292
- migrateStrictEffect: "scripts/migrate-strict-effect.mts",
308
+ ...(0, external_tooling_command_catalog_cjs_namespaceObject.createGeneratedToolingWrapperMap)(),
293
309
  apiBoundaries: "scripts/check-ultramodern-api-boundaries.mts",
294
310
  skills: "scripts/bootstrap-agent-skills.mts"
295
311
  }
@@ -0,0 +1,157 @@
1
+ "use strict";
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
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ runSyncDeliveryUnit: ()=>runSyncDeliveryUnit
41
+ });
42
+ const external_node_fs_namespaceObject = require("node:fs");
43
+ var external_node_fs_default = /*#__PURE__*/ __webpack_require__.n(external_node_fs_namespaceObject);
44
+ const external_node_path_namespaceObject = require("node:path");
45
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
46
+ const config_cjs_namespaceObject = require("../ultramodern-tooling/config.cjs");
47
+ const external_backend_federation_cjs_namespaceObject = require("./backend-federation.cjs");
48
+ const external_delivery_unit_cjs_namespaceObject = require("./delivery-unit.cjs");
49
+ const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
50
+ const external_module_federation_cjs_namespaceObject = require("./module-federation.cjs");
51
+ const REFERENCE_TOPOLOGY_PATH = 'topology/reference-topology.json';
52
+ function readOption(args, name) {
53
+ const prefix = `${name}=`;
54
+ const inline = args.find((arg)=>arg.startsWith(prefix));
55
+ if (inline) {
56
+ const value = inline.slice(prefix.length);
57
+ if (!value) throw new Error(`${name} needs a value.`);
58
+ return value;
59
+ }
60
+ const index = args.indexOf(name);
61
+ if (-1 === index) return;
62
+ const value = args[index + 1];
63
+ if (!value || value.startsWith('--')) throw new Error(`${name} needs a value.`);
64
+ return value;
65
+ }
66
+ function isPlainObject(value) {
67
+ return 'object' == typeof value && null !== value && !Array.isArray(value);
68
+ }
69
+ function writeTextIfChanged(absolutePath, content) {
70
+ if (external_node_fs_default().existsSync(absolutePath) && external_node_fs_default().readFileSync(absolutePath, 'utf-8') === content) return false;
71
+ external_node_fs_default().mkdirSync(external_node_path_default().dirname(absolutePath), {
72
+ recursive: true
73
+ });
74
+ external_node_fs_default().writeFileSync(absolutePath, content, 'utf-8');
75
+ return true;
76
+ }
77
+ function writeJsonIfChanged(absolutePath, value) {
78
+ return writeTextIfChanged(absolutePath, `${JSON.stringify(value, null, 2)}\n`);
79
+ }
80
+ function stampDeliveryUnitIdentity(entry, scope, app) {
81
+ const block = (0, external_delivery_unit_cjs_namespaceObject.deliveryUnitContractBlock)((0, external_delivery_unit_cjs_namespaceObject.createDeliveryUnitRecord)(scope, app));
82
+ entry.deliveryUnit = block;
83
+ if (isPlainObject(entry.backendFederation)) {
84
+ entry.backendFederation.deliveryUnit = block;
85
+ if (!isPlainObject(entry.backendFederation.versionBoundary)) entry.backendFederation.versionBoundary = {};
86
+ entry.backendFederation.versionBoundary.identityRoot = 'deliveryUnit';
87
+ } else entry.backendFederation = (0, external_backend_federation_cjs_namespaceObject.createBackendFederationContract)(scope, app);
88
+ }
89
+ function runSyncDeliveryUnit(args, context) {
90
+ if (args.includes('--help') || args.includes('-h')) {
91
+ process.stdout.write(`Usage:
92
+ modern-js-create ultramodern sync-delivery-unit [--workspace <dir>]
93
+
94
+ Backfills the per-vertical delivery-unit identity blocks required by
95
+ \`ultramodern validate\` onto an existing generated workspace, in place and
96
+ through framework tooling only. For each full-stack vertical it writes the
97
+ delivery-unit block into .modernjs/ultramodern.json topology.apps[] and
98
+ topology/reference-topology.json verticals[] (plus backendFederation.deliveryUnit
99
+ and backendFederation.versionBoundary.identityRoot) and regenerates
100
+ verticals/<id>/shared/ultramodern-build.ts. Idempotent: a second run writes
101
+ nothing.
102
+ `);
103
+ return 0;
104
+ }
105
+ const workspaceOverride = readOption(args, '--workspace');
106
+ const workspaceRoot = workspaceOverride ? external_node_path_default().resolve(context.invocationCwd, workspaceOverride) : context.workspaceRoot;
107
+ const compactPath = external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH);
108
+ if (!external_node_fs_default().existsSync(compactPath)) throw new Error(`Missing ${external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH}. sync-delivery-unit needs the compact UltraModern config; run \`modern-js-create ultramodern migrate-strict-effect\` first.`);
109
+ const config = (0, config_cjs_namespaceObject.readUltramodernConfig)(workspaceRoot);
110
+ const scope = config.workspace.packageScope;
111
+ const apiApps = (0, config_cjs_namespaceObject.workspaceAppsFromToolingConfig)(config).filter((app)=>Boolean(app.api));
112
+ const written = [];
113
+ const unchanged = [];
114
+ const track = (relativePath, changed)=>{
115
+ (changed ? written : unchanged).push(relativePath);
116
+ };
117
+ const appById = new Map(apiApps.map((app)=>[
118
+ app.id,
119
+ app
120
+ ]));
121
+ const compact = JSON.parse(external_node_fs_default().readFileSync(compactPath, 'utf-8'));
122
+ if (isPlainObject(compact) && Array.isArray(compact.topology?.apps)) for (const entry of compact.topology.apps){
123
+ if (!isPlainObject(entry)) continue;
124
+ const app = appById.get(String(entry.id));
125
+ if (app) stampDeliveryUnitIdentity(entry, scope, app);
126
+ }
127
+ track(external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH, writeJsonIfChanged(compactPath, compact));
128
+ const topologyPath = external_node_path_default().join(workspaceRoot, REFERENCE_TOPOLOGY_PATH);
129
+ if (external_node_fs_default().existsSync(topologyPath)) {
130
+ const topology = JSON.parse(external_node_fs_default().readFileSync(topologyPath, 'utf-8'));
131
+ if (isPlainObject(topology) && Array.isArray(topology.verticals)) for (const entry of topology.verticals){
132
+ if (!isPlainObject(entry)) continue;
133
+ const app = appById.get(String(entry.id));
134
+ if (app) stampDeliveryUnitIdentity(entry, scope, app);
135
+ }
136
+ track(REFERENCE_TOPOLOGY_PATH, writeJsonIfChanged(topologyPath, topology));
137
+ }
138
+ for (const app of apiApps){
139
+ const relativePath = external_node_path_default().join(app.directory, 'shared/ultramodern-build.ts');
140
+ const changed = writeTextIfChanged(external_node_path_default().join(workspaceRoot, relativePath), (0, external_module_federation_cjs_namespaceObject.createUltramodernBuildModule)(scope, app));
141
+ track(relativePath, changed);
142
+ }
143
+ if (0 === written.length) process.stdout.write('[ultramodern] sync-delivery-unit: already in sync; no files written.\n');
144
+ else {
145
+ process.stdout.write(`[ultramodern] sync-delivery-unit: wrote ${written.length} file(s):\n`);
146
+ for (const relativePath of written)process.stdout.write(` wrote ${relativePath}\n`);
147
+ for (const relativePath of unchanged)process.stdout.write(` in-sync ${relativePath}\n`);
148
+ }
149
+ return 0;
150
+ }
151
+ exports.runSyncDeliveryUnit = __webpack_exports__.runSyncDeliveryUnit;
152
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
153
+ "runSyncDeliveryUnit"
154
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
155
+ Object.defineProperty(exports, '__esModule', {
156
+ value: true
157
+ });
@@ -0,0 +1,88 @@
1
+ "use strict";
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
+ (()=>{
13
+ __webpack_require__.d = (exports1, getters, values)=>{
14
+ var define = (defs, kind)=>{
15
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
16
+ enumerable: true,
17
+ [kind]: defs[key]
18
+ });
19
+ };
20
+ define(getters, "get");
21
+ define(values, "value");
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
26
+ })();
27
+ (()=>{
28
+ __webpack_require__.r = (exports1)=>{
29
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
30
+ value: 'Module'
31
+ });
32
+ Object.defineProperty(exports1, '__esModule', {
33
+ value: true
34
+ });
35
+ };
36
+ })();
37
+ var __webpack_exports__ = {};
38
+ __webpack_require__.r(__webpack_exports__);
39
+ __webpack_require__.d(__webpack_exports__, {
40
+ DELIVERY_UNIT_SCHEMA_VERSION: ()=>DELIVERY_UNIT_SCHEMA_VERSION,
41
+ createBuildMarker: ()=>createBuildMarker,
42
+ createDeliveryUnitRecord: ()=>createDeliveryUnitRecord,
43
+ deliveryUnitContractBlock: ()=>deliveryUnitContractBlock
44
+ });
45
+ const external_node_crypto_namespaceObject = require("node:crypto");
46
+ var external_node_crypto_default = /*#__PURE__*/ __webpack_require__.n(external_node_crypto_namespaceObject);
47
+ const external_naming_cjs_namespaceObject = require("./naming.cjs");
48
+ const DELIVERY_UNIT_SCHEMA_VERSION = 1;
49
+ function createBuildMarker(scope, app) {
50
+ return external_node_crypto_default().createHash('sha256').update(`${scope}:${app.packageSuffix}:${app.id}:0.1.0`).digest('hex').slice(0, 16);
51
+ }
52
+ function deliveryUnitContractBlock(record) {
53
+ return {
54
+ schemaVersion: record.schemaVersion,
55
+ kind: record.kind,
56
+ unitId: record.unitId,
57
+ packageName: record.packageName,
58
+ version: record.version,
59
+ buildMarker: record.buildMarker,
60
+ sourceRevision: record.sourceRevision
61
+ };
62
+ }
63
+ function createDeliveryUnitRecord(scope, app) {
64
+ return {
65
+ schemaVersion: DELIVERY_UNIT_SCHEMA_VERSION,
66
+ kind: 'microvertical-delivery-unit',
67
+ unitId: `${scope}/${app.domain ?? app.id}`,
68
+ appId: app.id,
69
+ packageName: (0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix),
70
+ version: '0.1.0',
71
+ sourceRevision: 'workspace',
72
+ buildMarker: createBuildMarker(scope, app),
73
+ deployProfile: 'cloudflare-ssr-mf-effect-v1'
74
+ };
75
+ }
76
+ exports.DELIVERY_UNIT_SCHEMA_VERSION = __webpack_exports__.DELIVERY_UNIT_SCHEMA_VERSION;
77
+ exports.createBuildMarker = __webpack_exports__.createBuildMarker;
78
+ exports.createDeliveryUnitRecord = __webpack_exports__.createDeliveryUnitRecord;
79
+ exports.deliveryUnitContractBlock = __webpack_exports__.deliveryUnitContractBlock;
80
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
81
+ "DELIVERY_UNIT_SCHEMA_VERSION",
82
+ "createBuildMarker",
83
+ "createDeliveryUnitRecord",
84
+ "deliveryUnitContractBlock"
85
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
86
+ Object.defineProperty(exports, '__esModule', {
87
+ value: true
88
+ });
@@ -31,6 +31,10 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  ULTRAMODERN_CONFIG_PATH: ()=>ULTRAMODERN_CONFIG_PATH,
32
32
  appHasApi: ()=>appHasApi,
33
33
  appI18nNamespace: ()=>appI18nNamespace,
34
+ createBackendFederationContainerEntry: ()=>createBackendFederationContainerEntry,
35
+ createBackendFederationManifestEnv: ()=>createBackendFederationManifestEnv,
36
+ createBackendFederationManifestUrl: ()=>createBackendFederationManifestUrl,
37
+ createBackendFederationName: ()=>createBackendFederationName,
34
38
  createCloudflarePublicUrlEnv: ()=>createCloudflarePublicUrlEnv,
35
39
  createCloudflareWorkerName: ()=>createCloudflareWorkerName,
36
40
  createModuleFederationRemoteContracts: ()=>createModuleFederationRemoteContracts,
@@ -161,6 +165,18 @@ function resolveRemoteRefs(app, remotes = []) {
161
165
  function createRemoteManifestEnv(remote) {
162
166
  return `VERTICAL_${(0, external_naming_cjs_namespaceObject.toEnvSegment)(remote.domain ?? remote.id)}_MF_MANIFEST`;
163
167
  }
168
+ function createBackendFederationManifestEnv(remote) {
169
+ return `VERTICAL_${(0, external_naming_cjs_namespaceObject.toEnvSegment)(remote.domain ?? remote.id)}_BACKEND_MF_MANIFEST`;
170
+ }
171
+ function createBackendFederationName(app) {
172
+ return `${app.mfName}Backend`;
173
+ }
174
+ function createBackendFederationManifestUrl(app) {
175
+ return `http://localhost:${app.port}/backend-mf-manifest.json`;
176
+ }
177
+ function createBackendFederationContainerEntry(app) {
178
+ return `http://localhost:${app.port}/backendRemoteEntry.mjs`;
179
+ }
164
180
  function createModuleFederationRemoteContracts(app, remotes = []) {
165
181
  return resolveRemoteRefs(app, remotes).map((remote)=>({
166
182
  id: remote.id,
@@ -182,6 +198,10 @@ function appI18nNamespace(app) {
182
198
  exports.ULTRAMODERN_CONFIG_PATH = __webpack_exports__.ULTRAMODERN_CONFIG_PATH;
183
199
  exports.appHasApi = __webpack_exports__.appHasApi;
184
200
  exports.appI18nNamespace = __webpack_exports__.appI18nNamespace;
201
+ exports.createBackendFederationContainerEntry = __webpack_exports__.createBackendFederationContainerEntry;
202
+ exports.createBackendFederationManifestEnv = __webpack_exports__.createBackendFederationManifestEnv;
203
+ exports.createBackendFederationManifestUrl = __webpack_exports__.createBackendFederationManifestUrl;
204
+ exports.createBackendFederationName = __webpack_exports__.createBackendFederationName;
185
205
  exports.createCloudflarePublicUrlEnv = __webpack_exports__.createCloudflarePublicUrlEnv;
186
206
  exports.createCloudflareWorkerName = __webpack_exports__.createCloudflareWorkerName;
187
207
  exports.createModuleFederationRemoteContracts = __webpack_exports__.createModuleFederationRemoteContracts;
@@ -201,6 +221,10 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
201
221
  "ULTRAMODERN_CONFIG_PATH",
202
222
  "appHasApi",
203
223
  "appI18nNamespace",
224
+ "createBackendFederationContainerEntry",
225
+ "createBackendFederationManifestEnv",
226
+ "createBackendFederationManifestUrl",
227
+ "createBackendFederationName",
204
228
  "createCloudflarePublicUrlEnv",
205
229
  "createCloudflareWorkerName",
206
230
  "createModuleFederationRemoteContracts",
@@ -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,6 +62,19 @@ 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 ||
@@ -99,6 +104,13 @@ const zephyrEnabled = process.env['ULTRAMODERN_ZEPHYR'] !== 'false';
99
104
  const cloudflareDeployEnabled =
100
105
  process.env['MODERNJS_DEPLOY'] === 'cloudflare';
101
106
 
107
+ const zephyrWarn = (error: unknown) => {
108
+ const message = error instanceof Error ? error.message : String(error);
109
+ console.warn(
110
+ \`[ultramodern] zephyr-rspack-plugin failed; continuing without Zephyr (set ULTRAMODERN_ZEPHYR=false to disable it): \${message}\`,
111
+ );
112
+ };
113
+
102
114
  const zephyrRspackPlugin = () => ({
103
115
  name: 'ultramodern-zephyr-rspack-plugin',
104
116
  pre: ['@modern-js/plugin-module-federation-config'],
@@ -112,7 +124,17 @@ const zephyrRspackPlugin = () => ({
112
124
  if (!zephyrEnabled) {
113
125
  return;
114
126
  }
115
- api.modifyRspackConfig(config => withZephyrRspack()(config));
127
+ api.modifyRspackConfig(config => {
128
+ try {
129
+ return Promise.resolve(withZephyrRspack()(config)).catch(error => {
130
+ zephyrWarn(error);
131
+ return config;
132
+ });
133
+ } catch (error) {
134
+ zephyrWarn(error);
135
+ return config;
136
+ }
137
+ });
116
138
  },
117
139
  });
118
140
 
@@ -173,12 +195,12 @@ ${bffConfig} ...(cloudflareDeployEnabled
173
195
  ? {
174
196
  deploy: {
175
197
  worker: {
176
- compatibilityDate: '${external_versions_cjs_namespaceObject.CLOUDFLARE_COMPATIBILITY_DATE}',
177
- name: cloudflareWorkerName,
178
- security: ${(0, external_policy_cjs_namespaceObject.formatTsJsonValue)((0, external_types_cjs_namespaceObject.sortJsonValue)((0, external_policy_cjs_namespaceObject.createCloudflareSecurityContract)()), 16)},
179
- ssr: true,
180
- },
198
+ compatibilityDate: '${external_versions_cjs_namespaceObject.CLOUDFLARE_COMPATIBILITY_DATE}',
199
+ name: cloudflareWorkerName,
200
+ security: ${(0, external_policy_cjs_namespaceObject.formatTsJsonValue)((0, external_types_cjs_namespaceObject.sortJsonValue)((0, external_policy_cjs_namespaceObject.createCloudflareSecurityContract)()), 16)},
201
+ ${serviceBindingsConfig} ssr: true,
181
202
  },
203
+ },
182
204
  }
183
205
  : {}),
184
206
  dev: {
@@ -397,6 +419,19 @@ ${remoteEntries}
397
419
  },
398
420
  `;
399
421
  }
422
+ function createModuleFederationDtsConfig(hasExposes) {
423
+ return hasExposes ? ` dts: {
424
+ displayErrorInTerminal: true,
425
+ generateTypes: {
426
+ compilerInstance: 'tsgo',
427
+ },
428
+ tsConfigPath: './tsconfig.mf-types.json',
429
+ },` : ` dts: {
430
+ consumeTypes: true,
431
+ generateTypes: false,
432
+ tsConfigPath: './tsconfig.mf-types.json',
433
+ },`;
434
+ }
400
435
  function createShellModuleFederationConfig(scope, remotes = []) {
401
436
  const shellHost = {
402
437
  ...external_descriptors_cjs_namespaceObject.shellApp,
@@ -425,13 +460,7 @@ const moduleFederationConfig: Parameters<
425
460
  dev: {
426
461
  disableDynamicRemoteTypeHints: true,
427
462
  },
428
- dts: {
429
- displayErrorInTerminal: true,
430
- generateTypes: {
431
- compilerInstance: 'tsgo',
432
- },
433
- tsConfigPath: './tsconfig.mf-types.json',
434
- },
463
+ ${createModuleFederationDtsConfig(false)}
435
464
  filename: 'remoteEntry.js',
436
465
  name: '${external_descriptors_cjs_namespaceObject.shellApp.mfName}',
437
466
  ${createModuleFederationRemotesConfig(scope, shellHost, remotes)}${createSharedModuleFederationConfig()},
@@ -441,25 +470,75 @@ ${createModuleFederationRemotesConfig(scope, shellHost, remotes)}${createSharedM
441
470
  export default moduleFederationConfig;
442
471
  `;
443
472
  }
444
- function createBuildMarker(scope, app) {
445
- return external_node_crypto_default().createHash('sha256').update(`${scope}:${app.packageSuffix}:${app.id}:0.1.0`).digest('hex').slice(0, 16);
473
+ function createBackendModuleFederationConfig(app) {
474
+ return `// @effect-diagnostics nodeBuiltinImport:off
475
+ import { createRequire } from 'node:module';
476
+ import { createModuleFederationConfig } from '@module-federation/modern-js-v3';
477
+ import { dependencies } from './package.json';
478
+
479
+ const require = createRequire(import.meta.url);
480
+ const bffVersion = (
481
+ require('@modern-js/plugin-bff/package.json') as { version: string }
482
+ ).version;
483
+ const effectVersion = (
484
+ require('effect/package.json') as { version: string }
485
+ ).version;
486
+
487
+ const moduleFederationConfig: Parameters<
488
+ typeof createModuleFederationConfig
489
+ >[0] = createModuleFederationConfig({
490
+ dts: false,
491
+ exposes: {
492
+ './effect-api': './api/effect-api.ts',
493
+ },
494
+ filename: 'backendRemoteEntry.mjs',
495
+ name: '${(0, external_descriptors_cjs_namespaceObject.createBackendFederationName)(app)}',
496
+ shared: {
497
+ '@modern-js/plugin-bff': {
498
+ requiredVersion: bffVersion,
499
+ singleton: true,
500
+ treeShaking: false,
501
+ },
502
+ '@module-federation/runtime': {
503
+ requiredVersion: dependencies['@module-federation/runtime'],
504
+ singleton: true,
505
+ treeShaking: false,
506
+ },
507
+ effect: {
508
+ requiredVersion: effectVersion,
509
+ singleton: true,
510
+ treeShaking: false,
511
+ },
512
+ },
513
+ treeShakingSharedExcludePlugins: ['RspackModuleFederationPlugin'],
514
+ });
515
+
516
+ export default moduleFederationConfig;
517
+ `;
446
518
  }
447
519
  function createUltramodernBuildModule(scope, app) {
448
- return `export const ultramodernVerticalIdentity = {
449
- appId: '${app.id}',
450
- build: '${createBuildMarker(scope, app)}',
451
- deployProfile: 'cloudflare-ssr-mf-effect-v1',
452
- packageName: '${(0, external_naming_cjs_namespaceObject.packageName)(scope, app.packageSuffix)}',
453
- version: '0.1.0',
520
+ const record = (0, external_delivery_unit_cjs_namespaceObject.createDeliveryUnitRecord)(scope, app);
521
+ return `export const ultramodernDeliveryUnit = {
522
+ appId: '${record.appId}',
523
+ build: '${record.buildMarker}',
524
+ deployProfile: '${record.deployProfile}',
525
+ kind: '${record.kind}',
526
+ packageName: '${record.packageName}',
527
+ schemaVersion: ${record.schemaVersion},
528
+ sourceRevision: '${record.sourceRevision}',
529
+ unitId: '${record.unitId}',
530
+ version: '${record.version}',
454
531
  } as const;
455
532
 
533
+ export const ultramodernVerticalIdentity = ultramodernDeliveryUnit;
534
+
456
535
  export const ultramodernUiMarker = {
457
- ...ultramodernVerticalIdentity,
536
+ ...ultramodernDeliveryUnit,
458
537
  surface: 'ui',
459
538
  } as const;
460
539
 
461
540
  export const ultramodernApiMarker = {
462
- ...ultramodernVerticalIdentity,
541
+ ...ultramodernDeliveryUnit,
463
542
  surface: 'api',
464
543
  } as const;
465
544
  `;
@@ -467,6 +546,7 @@ export const ultramodernApiMarker = {
467
546
  function createUltramodernBuildReexportModule() {
468
547
  return `export {
469
548
  ultramodernApiMarker,
549
+ ultramodernDeliveryUnit,
470
550
  ultramodernUiMarker,
471
551
  ultramodernVerticalIdentity,
472
552
  } from '../shared/ultramodern-build';
@@ -474,7 +554,9 @@ function createUltramodernBuildReexportModule() {
474
554
  }
475
555
  function createRemoteModuleFederationConfig(scope, app, remotes = []) {
476
556
  const exposes = formatTsObjectLiteral(app.exposes ?? {});
477
- return `// @effect-diagnostics nodeBuiltinImport:off
557
+ const hasExposes = Object.keys(app.exposes ?? {}).length > 0;
558
+ const hostOnlyMarker = hasExposes ? '' : '\n// ultramodern-mf: no-exposes';
559
+ return `// @effect-diagnostics nodeBuiltinImport:off${hostOnlyMarker}
478
560
  import { createRequire } from 'node:module';
479
561
  import { createModuleFederationConfig } from '@module-federation/modern-js-v3';
480
562
  import { dependencies } from './package.json';
@@ -496,13 +578,7 @@ const moduleFederationConfig: Parameters<
496
578
  dev: {
497
579
  disableDynamicRemoteTypeHints: true,
498
580
  },
499
- dts: {
500
- displayErrorInTerminal: true,
501
- generateTypes: {
502
- compilerInstance: 'tsgo',
503
- },
504
- tsConfigPath: './tsconfig.mf-types.json',
505
- },
581
+ ${createModuleFederationDtsConfig(hasExposes)}
506
582
  exposes: ${exposes},
507
583
  filename: 'remoteEntry.js',
508
584
  name: '${app.mfName}',
@@ -514,6 +590,7 @@ export default moduleFederationConfig;
514
590
  `;
515
591
  }
516
592
  exports.createAppModernConfig = __webpack_exports__.createAppModernConfig;
593
+ exports.createBackendModuleFederationConfig = __webpack_exports__.createBackendModuleFederationConfig;
517
594
  exports.createBuildMarker = __webpack_exports__.createBuildMarker;
518
595
  exports.createModuleFederationRemoteUrlHelpers = __webpack_exports__.createModuleFederationRemoteUrlHelpers;
519
596
  exports.createModuleFederationRemotesConfig = __webpack_exports__.createModuleFederationRemotesConfig;
@@ -525,6 +602,7 @@ exports.createUltramodernBuildReexportModule = __webpack_exports__.createUltramo
525
602
  exports.formatTsObjectLiteral = __webpack_exports__.formatTsObjectLiteral;
526
603
  for(var __rspack_i in __webpack_exports__)if (-1 === [
527
604
  "createAppModernConfig",
605
+ "createBackendModuleFederationConfig",
528
606
  "createBuildMarker",
529
607
  "createModuleFederationRemoteUrlHelpers",
530
608
  "createModuleFederationRemotesConfig",