@bleedingdev/modern-js-create 3.4.0-ultramodern.12 → 3.4.0-ultramodern.14

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 (108) hide show
  1. package/README.md +13 -11
  2. package/dist/cjs/index.cjs +36 -3
  3. package/dist/cjs/locale/en.cjs +10 -0
  4. package/dist/cjs/locale/zh.cjs +10 -0
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +185 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +248 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +64 -25
  8. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  9. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  10. package/dist/cjs/ultramodern-workspace/contracts.cjs +119 -653
  11. package/dist/cjs/ultramodern-workspace/descriptors.cjs +4 -0
  12. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  13. package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
  14. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  15. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +572 -0
  16. package/dist/cjs/ultramodern-workspace/module-federation.cjs +14 -0
  17. package/dist/cjs/ultramodern-workspace/package-json.cjs +26 -12
  18. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  19. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +74 -44
  20. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +55 -15
  21. package/dist/esm/index.js +36 -3
  22. package/dist/esm/locale/en.js +10 -0
  23. package/dist/esm/locale/zh.js +10 -0
  24. package/dist/esm/ultramodern-tooling/commands.js +132 -0
  25. package/dist/esm/ultramodern-tooling/config.js +196 -0
  26. package/dist/esm/ultramodern-workspace/add-vertical.js +65 -29
  27. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  28. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  29. package/dist/esm/ultramodern-workspace/contracts.js +122 -608
  30. package/dist/esm/ultramodern-workspace/descriptors.js +2 -1
  31. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  32. package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
  33. package/dist/esm/ultramodern-workspace/index.js +1 -0
  34. package/dist/esm/ultramodern-workspace/mf-validation.js +517 -0
  35. package/dist/esm/ultramodern-workspace/module-federation.js +14 -0
  36. package/dist/esm/ultramodern-workspace/package-json.js +26 -12
  37. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  38. package/dist/esm/ultramodern-workspace/workspace-scripts.js +75 -27
  39. package/dist/esm/ultramodern-workspace/write-workspace.js +56 -19
  40. package/dist/esm-node/index.js +36 -3
  41. package/dist/esm-node/locale/en.js +10 -0
  42. package/dist/esm-node/locale/zh.js +10 -0
  43. package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
  44. package/dist/esm-node/ultramodern-tooling/config.js +197 -0
  45. package/dist/esm-node/ultramodern-workspace/add-vertical.js +65 -29
  46. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  47. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  48. package/dist/esm-node/ultramodern-workspace/contracts.js +122 -608
  49. package/dist/esm-node/ultramodern-workspace/descriptors.js +2 -1
  50. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  51. package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
  52. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  53. package/dist/esm-node/ultramodern-workspace/mf-validation.js +518 -0
  54. package/dist/esm-node/ultramodern-workspace/module-federation.js +14 -0
  55. package/dist/esm-node/ultramodern-workspace/package-json.js +26 -12
  56. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  57. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +75 -27
  58. package/dist/esm-node/ultramodern-workspace/write-workspace.js +56 -19
  59. package/dist/types/locale/en.d.ts +10 -0
  60. package/dist/types/locale/index.d.ts +20 -0
  61. package/dist/types/locale/zh.d.ts +10 -0
  62. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  63. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  64. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  65. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  66. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  67. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  68. package/dist/types/ultramodern-workspace/descriptors.d.ts +1 -0
  69. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  70. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  71. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  72. package/dist/types/ultramodern-workspace/package-json.d.ts +4 -3
  73. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  74. package/dist/types/ultramodern-workspace/types.d.ts +2 -0
  75. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +1 -7
  76. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  77. package/package.json +5 -3
  78. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  79. package/template-workspace/.gitignore.handlebars +3 -0
  80. package/template-workspace/AGENTS.md.handlebars +11 -5
  81. package/template-workspace/README.md.handlebars +15 -12
  82. package/template-workspace/oxfmt.config.ts +1 -0
  83. package/template-workspace/oxlint.config.ts +1 -0
  84. package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
  85. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +56 -3
  86. package/templates/workspace-scripts/generate-public-surface-assets.mjs +239 -4
  87. package/templates/workspace-scripts/proof-cloudflare-version.mjs +282 -4
  88. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +172 -1
  89. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  90. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +783 -26
  91. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  92. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  93. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  94. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  95. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  96. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  97. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  98. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  99. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  100. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  101. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  102. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  103. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  104. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  105. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  106. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  107. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  108. /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
@@ -42,6 +42,7 @@ __webpack_require__.d(__webpack_exports__, {
42
42
  addUltramodernVertical: ()=>addUltramodernVertical,
43
43
  assertCanCreate: ()=>assertCanCreate,
44
44
  assertValidVerticalName: ()=>assertValidVerticalName,
45
+ existingBridgeConfig: ()=>existingBridgeConfig,
45
46
  existingPackageSource: ()=>existingPackageSource,
46
47
  existingTailwindEnabled: ()=>existingTailwindEnabled,
47
48
  nextAvailablePort: ()=>nextAvailablePort,
@@ -60,8 +61,8 @@ var external_node_os_default = /*#__PURE__*/ __webpack_require__.n(external_node
60
61
  const external_node_path_namespaceObject = require("node:path");
61
62
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
62
63
  const external_ultramodern_package_source_cjs_namespaceObject = require("../ultramodern-package-source.cjs");
64
+ const config_cjs_namespaceObject = require("../ultramodern-tooling/config.cjs");
63
65
  const external_app_files_cjs_namespaceObject = require("./app-files.cjs");
64
- const external_contracts_cjs_namespaceObject = require("./contracts.cjs");
65
66
  const external_demo_components_cjs_namespaceObject = require("./demo-components.cjs");
66
67
  const external_descriptors_cjs_namespaceObject = require("./descriptors.cjs");
67
68
  const external_effect_api_cjs_namespaceObject = require("./effect-api.cjs");
@@ -90,7 +91,12 @@ function existingPackageSource(workspaceRoot, modernVersion, packageSource) {
90
91
  modernVersion,
91
92
  packageSource
92
93
  });
93
- const metadataPath = external_node_path_default().join(workspaceRoot, '.modernjs/ultramodern-package-source.json');
94
+ const compactPath = external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH);
95
+ if (external_node_fs_default().existsSync(compactPath)) {
96
+ const compactConfig = (0, config_cjs_namespaceObject.readUltramodernConfig)(workspaceRoot);
97
+ if (compactConfig.packageSource) return compactConfig.packageSource;
98
+ }
99
+ const metadataPath = external_node_path_default().join(workspaceRoot, PACKAGE_SOURCE_METADATA_PATH);
94
100
  if (!external_node_fs_default().existsSync(metadataPath)) return (0, external_package_source_cjs_namespaceObject.resolvePackageSource)({
95
101
  targetDir: workspaceRoot,
96
102
  packageName: external_node_path_default().basename(workspaceRoot),
@@ -113,6 +119,8 @@ function existingPackageSource(workspaceRoot, modernVersion, packageSource) {
113
119
  };
114
120
  }
115
121
  function existingTailwindEnabled(workspaceRoot) {
122
+ const compactPath = external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH);
123
+ if (external_node_fs_default().existsSync(compactPath)) return (0, config_cjs_namespaceObject.readUltramodernConfig)(workspaceRoot).features.tailwind;
116
124
  const contractPath = external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH);
117
125
  if (!external_node_fs_default().existsSync(contractPath)) return true;
118
126
  const contract = (0, external_fs_io_cjs_namespaceObject.readJsonFile)(contractPath);
@@ -120,6 +128,10 @@ function existingTailwindEnabled(workspaceRoot) {
120
128
  const shell = apps.find((app)=>(0, external_types_cjs_namespaceObject.isRecord)(app) && app.id === external_descriptors_cjs_namespaceObject.shellApp.id);
121
129
  return shell?.styling && (0, external_types_cjs_namespaceObject.isRecord)(shell.styling) ? false !== shell.styling.tailwind : true;
122
130
  }
131
+ function existingBridgeConfig(workspaceRoot) {
132
+ const compactPath = external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH);
133
+ return external_node_fs_default().existsSync(compactPath) ? (0, config_cjs_namespaceObject.readUltramodernConfig)(workspaceRoot).bridge : void 0;
134
+ }
123
135
  function assertValidVerticalName(name) {
124
136
  const normalized = (0, external_naming_cjs_namespaceObject.toKebabCase)(name);
125
137
  if (!normalized || normalized !== name) throw new Error(`Invalid Vertical name "${name}". Use lowercase kebab-case.`);
@@ -132,17 +144,17 @@ function nextAvailablePort(ports) {
132
144
  function assertCanCreate(workspaceRoot, relativePath) {
133
145
  if (external_node_fs_default().existsSync(external_node_path_default().join(workspaceRoot, relativePath))) throw new Error(`Refusing to overwrite existing path: ${relativePath}`);
134
146
  }
135
- function updateRootWorkspaceScripts(workspaceRoot, scope, packageSource, remotes) {
147
+ function updateRootWorkspaceScripts(workspaceRoot, scope, packageSource, remotes, bridge) {
136
148
  const packagePath = external_node_path_default().join(workspaceRoot, 'package.json');
137
149
  const rootPackage = (0, external_fs_io_cjs_namespaceObject.readJsonFile)(packagePath);
138
- const generatedRootPackage = (0, external_package_json_cjs_namespaceObject.createRootPackageJson)(scope, packageSource, remotes);
150
+ const generatedRootPackage = (0, external_package_json_cjs_namespaceObject.createRootPackageJson)(scope, packageSource, remotes, bridge);
139
151
  rootPackage.scripts = generatedRootPackage.scripts;
140
152
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(packagePath, rootPackage);
141
153
  }
142
- function rewriteShellAppFiles(workspaceRoot, scope, packageSource, enableTailwind, remotes) {
154
+ function rewriteShellAppFiles(workspaceRoot, scope, packageSource, enableTailwind, remotes, bridge) {
143
155
  const shellHost = (0, external_descriptors_cjs_namespaceObject.createShellHost)(remotes);
144
156
  const publicWeb = (0, external_public_surface_cjs_namespaceObject.createPublicWebAppArtifacts)(shellHost);
145
- (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(workspaceRoot, `${external_descriptors_cjs_namespaceObject.shellApp.directory}/package.json`), (0, external_package_json_cjs_namespaceObject.createAppPackage)(scope, shellHost, packageSource, enableTailwind, remotes));
157
+ (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(workspaceRoot, `${external_descriptors_cjs_namespaceObject.shellApp.directory}/package.json`), (0, external_package_json_cjs_namespaceObject.createAppPackage)(scope, shellHost, packageSource, enableTailwind, remotes, bridge));
146
158
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(workspaceRoot, `${external_descriptors_cjs_namespaceObject.shellApp.directory}/tsconfig.json`), (0, external_package_json_cjs_namespaceObject.createAppTsConfig)(shellHost, remotes));
147
159
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(workspaceRoot, `${external_descriptors_cjs_namespaceObject.shellApp.directory}/tsconfig.mf-types.json`), (0, external_package_json_cjs_namespaceObject.createAppMfTypesTsConfig)(shellHost));
148
160
  (0, external_fs_io_cjs_namespaceObject.writeFileReplacing)(workspaceRoot, `${external_descriptors_cjs_namespaceObject.shellApp.directory}/src/modern-app-env.d.ts`, (0, external_app_files_cjs_namespaceObject.createAppEnvDts)(shellHost, remotes));
@@ -261,8 +273,7 @@ function prepareAddUltramodernVertical(options) {
261
273
  const topology = readRequiredJsonObject(topologyPath);
262
274
  const ownership = readRequiredJsonObject(ownershipPath);
263
275
  const overlay = readRequiredJsonObject(overlayPath);
264
- readRequiredJsonObject(external_node_path_default().join(options.workspaceRoot, external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH));
265
- readRequiredJsonObject(external_node_path_default().join(options.workspaceRoot, PACKAGE_SOURCE_METADATA_PATH));
276
+ readRequiredWorkspaceConfig(options.workspaceRoot);
266
277
  assertOptionalJsonObject(topology.shell, 'topology.shell', topologyPath);
267
278
  assertOptionalJsonArray(topology.verticals, 'topology.verticals', topologyPath);
268
279
  assertOptionalJsonArray(ownership.owners, 'ownership.owners', ownershipPath);
@@ -273,6 +284,7 @@ function prepareAddUltramodernVertical(options) {
273
284
  const scope = (0, external_naming_cjs_namespaceObject.toPackageScope)(String(rootPackage.name ?? external_node_path_default().basename(options.workspaceRoot)));
274
285
  const packageSource = existingPackageSource(options.workspaceRoot, options.modernVersion, options.packageSource);
275
286
  const enableTailwind = options.enableTailwind ?? existingTailwindEnabled(options.workspaceRoot);
287
+ const bridge = existingBridgeConfig(options.workspaceRoot);
276
288
  const existingVerticals = verticalsFromTopology(topology, overlay.ports);
277
289
  const port = nextAvailablePort(overlay.ports);
278
290
  const vertical = (0, external_descriptors_cjs_namespaceObject.createVerticalDescriptor)(name, port);
@@ -300,6 +312,7 @@ function prepareAddUltramodernVertical(options) {
300
312
  overlay,
301
313
  packageSource,
302
314
  enableTailwind,
315
+ bridge,
303
316
  vertical,
304
317
  updatedVerticals
305
318
  };
@@ -310,6 +323,12 @@ function readRequiredJsonObject(filePath) {
310
323
  if (!(0, external_types_cjs_namespaceObject.isRecord)(value)) throw new Error(`UltraModern workspace file must contain a JSON object: ${filePath}`);
311
324
  return value;
312
325
  }
326
+ function readRequiredWorkspaceConfig(workspaceRoot) {
327
+ const compactPath = external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH);
328
+ if (external_node_fs_default().existsSync(compactPath)) return void readRequiredJsonObject(compactPath);
329
+ readRequiredJsonObject(external_node_path_default().join(workspaceRoot, external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH));
330
+ readRequiredJsonObject(external_node_path_default().join(workspaceRoot, PACKAGE_SOURCE_METADATA_PATH));
331
+ }
313
332
  function assertOptionalJsonObject(value, label, filePath) {
314
333
  if (void 0 !== value && !(0, external_types_cjs_namespaceObject.isRecord)(value)) throw new Error(`${label} in ${filePath} must be a JSON object`);
315
334
  }
@@ -414,7 +433,7 @@ function createVerticalPlan(preflight, result) {
414
433
  shellDependencyChanges: createShellDependencyChanges(scope, vertical),
415
434
  generatedContractChanges: [
416
435
  {
417
- path: external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH,
436
+ path: external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH,
418
437
  addedAppIds: [
419
438
  vertical.id
420
439
  ],
@@ -501,9 +520,9 @@ function createDryRunJsonMutations(preflight, manifestUrl) {
501
520
  description: 'Keep shell Module Federation DTS compilation scoped'
502
521
  },
503
522
  {
504
- path: external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH,
505
- pointer: '/apps',
506
- description: `Regenerate contract with ${vertical.id}`
523
+ path: external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH,
524
+ pointer: '/topology/apps',
525
+ description: `Regenerate compact config with ${vertical.id}`
507
526
  }
508
527
  ];
509
528
  }
@@ -527,8 +546,8 @@ function createShellDependencyChanges(scope, vertical) {
527
546
  }
528
547
  function addUltramodernVertical(options) {
529
548
  const beforeFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
530
- const { scope, topologyPath, ownershipPath, overlayPath, topology, ownership, overlay, packageSource, enableTailwind, vertical, updatedVerticals } = prepareAddUltramodernVertical(options);
531
- (0, external_write_workspace_cjs_namespaceObject.writeApp)(options.workspaceRoot, scope, vertical, packageSource, enableTailwind);
549
+ const { scope, topologyPath, ownershipPath, overlayPath, topology, ownership, overlay, packageSource, enableTailwind, bridge, vertical, updatedVerticals } = prepareAddUltramodernVertical(options);
550
+ (0, external_write_workspace_cjs_namespaceObject.writeApp)(options.workspaceRoot, scope, vertical, packageSource, enableTailwind, updatedVerticals, bridge);
532
551
  topology.shell ??= {};
533
552
  topology.shell.verticalRefs ??= [];
534
553
  topology.shell.verticalRefs.push(vertical.id);
@@ -551,18 +570,18 @@ function addUltramodernVertical(options) {
551
570
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(topologyPath, topology);
552
571
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(ownershipPath, ownership);
553
572
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(overlayPath, overlay);
554
- (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(options.workspaceRoot, external_descriptors_cjs_namespaceObject.GENERATED_CONTRACT_PATH), (0, external_contracts_cjs_namespaceObject.createGeneratedContract)(scope, [
573
+ (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(options.workspaceRoot, external_descriptors_cjs_namespaceObject.ULTRAMODERN_CONFIG_PATH), (0, external_write_workspace_cjs_namespaceObject.createCompactUltramodernConfig)(scope, options.modernVersion, packageSource, [
555
574
  {
556
575
  ...external_descriptors_cjs_namespaceObject.shellApp,
557
576
  verticalRefs: updatedVerticals.map((vertical)=>vertical.id)
558
577
  },
559
578
  ...updatedVerticals
560
- ], enableTailwind));
561
- rewriteShellAppFiles(options.workspaceRoot, scope, packageSource, enableTailwind, updatedVerticals);
579
+ ], enableTailwind, bridge));
580
+ rewriteShellAppFiles(options.workspaceRoot, scope, packageSource, enableTailwind, updatedVerticals, bridge);
562
581
  (0, external_workspace_scripts_cjs_namespaceObject.writeGeneratedWorkspaceScripts)(options.workspaceRoot, scope, enableTailwind, updatedVerticals);
563
582
  addShellZephyrDependency(options.workspaceRoot, scope, vertical);
564
583
  addShellWorkspaceDependency(options.workspaceRoot, scope, vertical);
565
- updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, updatedVerticals);
584
+ updateRootWorkspaceScripts(options.workspaceRoot, scope, packageSource, updatedVerticals, bridge);
566
585
  (0, external_fs_io_cjs_namespaceObject.writeJsonFile)(external_node_path_default().join(options.workspaceRoot, 'tsconfig.json'), (0, external_package_json_cjs_namespaceObject.createRootTsConfig)([
567
586
  {
568
587
  ...external_descriptors_cjs_namespaceObject.shellApp,
@@ -570,9 +589,9 @@ function addUltramodernVertical(options) {
570
589
  },
571
590
  ...updatedVerticals
572
591
  ]));
573
- const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
574
- const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
575
- const result = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
592
+ const preliminaryAfterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
593
+ const preliminaryDiff = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, preliminaryAfterFiles);
594
+ const preliminaryResult = (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
576
595
  operation: 'vertical',
577
596
  workspaceRoot: options.workspaceRoot,
578
597
  packageScope: scope,
@@ -580,21 +599,40 @@ function addUltramodernVertical(options) {
580
599
  createdApps: [
581
600
  vertical
582
601
  ],
583
- createdPaths,
584
- rewrittenPaths
602
+ createdPaths: preliminaryDiff.createdPaths,
603
+ rewrittenPaths: preliminaryDiff.rewrittenPaths
585
604
  });
586
605
  (0, external_overlays_cjs_namespaceObject.runCodeSmithOverlays)({
587
606
  workspaceRoot: options.workspaceRoot,
588
607
  overlays: options.overlays,
589
- result
608
+ result: preliminaryResult
609
+ });
610
+ const afterOverlaysFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
611
+ const changedPaths = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterOverlaysFiles);
612
+ (0, external_fs_io_cjs_namespaceObject.formatGeneratedWorkspaceFiles)(options.workspaceRoot, [
613
+ ...changedPaths.createdPaths,
614
+ ...changedPaths.rewrittenPaths
615
+ ]);
616
+ const afterFiles = (0, external_generation_result_cjs_namespaceObject.createFileSnapshot)(options.workspaceRoot);
617
+ const { createdPaths, rewrittenPaths } = (0, external_generation_result_cjs_namespaceObject.diffFileSnapshots)(beforeFiles, afterFiles);
618
+ return (0, external_generation_result_cjs_namespaceObject.createGenerationResult)({
619
+ operation: 'vertical',
620
+ workspaceRoot: options.workspaceRoot,
621
+ packageScope: scope,
622
+ packageSource,
623
+ createdApps: [
624
+ vertical
625
+ ],
626
+ createdPaths,
627
+ rewrittenPaths
590
628
  });
591
- return result;
592
629
  }
593
630
  exports.addShellWorkspaceDependency = __webpack_exports__.addShellWorkspaceDependency;
594
631
  exports.addShellZephyrDependency = __webpack_exports__.addShellZephyrDependency;
595
632
  exports.addUltramodernVertical = __webpack_exports__.addUltramodernVertical;
596
633
  exports.assertCanCreate = __webpack_exports__.assertCanCreate;
597
634
  exports.assertValidVerticalName = __webpack_exports__.assertValidVerticalName;
635
+ exports.existingBridgeConfig = __webpack_exports__.existingBridgeConfig;
598
636
  exports.existingPackageSource = __webpack_exports__.existingPackageSource;
599
637
  exports.existingTailwindEnabled = __webpack_exports__.existingTailwindEnabled;
600
638
  exports.nextAvailablePort = __webpack_exports__.nextAvailablePort;
@@ -611,6 +649,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
611
649
  "addUltramodernVertical",
612
650
  "assertCanCreate",
613
651
  "assertValidVerticalName",
652
+ "existingBridgeConfig",
614
653
  "existingPackageSource",
615
654
  "existingTailwindEnabled",
616
655
  "nextAvailablePort",
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ const ultramodernBridgeCliFlags = {
31
+ enabled: '--bridge',
32
+ parentRoot: '--bridge-parent-root',
33
+ workspacePackage: '--bridge-workspace-package',
34
+ workspacePackageName: '--bridge-workspace-package-name',
35
+ testAlias: '--bridge-test-alias',
36
+ dependency: '--bridge-dependency',
37
+ lockfilePolicy: '--bridge-lockfile-policy',
38
+ gate: '--bridge-gate',
39
+ gateCwd: '--bridge-gate-cwd',
40
+ reactSingleton: '--bridge-react-singleton'
41
+ };
42
+ const ultramodernBridgeCliValueFlags = [
43
+ ultramodernBridgeCliFlags.parentRoot,
44
+ ultramodernBridgeCliFlags.workspacePackage,
45
+ ultramodernBridgeCliFlags.workspacePackageName,
46
+ ultramodernBridgeCliFlags.testAlias,
47
+ ultramodernBridgeCliFlags.dependency,
48
+ ultramodernBridgeCliFlags.lockfilePolicy,
49
+ ultramodernBridgeCliFlags.gate,
50
+ ultramodernBridgeCliFlags.gateCwd,
51
+ ultramodernBridgeCliFlags.reactSingleton
52
+ ];
53
+ const ultramodernBridgeCliBooleanFlags = [
54
+ ultramodernBridgeCliFlags.enabled
55
+ ];
56
+ const ultramodernBridgeLockfilePolicies = [
57
+ 'nested',
58
+ 'parent'
59
+ ];
60
+ const defaultReactSingletons = [
61
+ 'react',
62
+ 'react-dom'
63
+ ];
64
+ function hasUltramodernBridgeCliOptions(args) {
65
+ return args.some((arg)=>[
66
+ ...ultramodernBridgeCliBooleanFlags,
67
+ ...ultramodernBridgeCliValueFlags
68
+ ].some((flag)=>arg === flag || arg.startsWith(`${flag}=`)));
69
+ }
70
+ function parseUltramodernBridgeCliOptions(args) {
71
+ rejectBooleanFlagValues(args);
72
+ if (!hasUltramodernBridgeCliOptions(args)) return;
73
+ const parentRoot = readSingleValue(args, ultramodernBridgeCliFlags.parentRoot);
74
+ const lockfilePolicy = readSingleValue(args, ultramodernBridgeCliFlags.lockfilePolicy) ?? 'nested';
75
+ const workspacePackages = readWorkspacePackages(args);
76
+ const gates = readBridgeGates(args);
77
+ const reactSingletons = readCsvOptionValues(args, ultramodernBridgeCliFlags.reactSingleton);
78
+ return normalizeUltramodernBridgeConfig({
79
+ enabled: true,
80
+ parentRoot: requireNonEmptyValue(parentRoot, ultramodernBridgeCliFlags.parentRoot),
81
+ workspacePackages,
82
+ dependencies: readCsvOptionValues(args, ultramodernBridgeCliFlags.dependency),
83
+ lockfilePolicy: parseLockfilePolicy(lockfilePolicy),
84
+ gates,
85
+ reactSingletons: reactSingletons.length > 0 ? reactSingletons : void 0
86
+ });
87
+ }
88
+ function normalizeUltramodernBridgeConfig(bridge) {
89
+ if (!bridge || false === bridge.enabled) return;
90
+ const parentRoot = requireNonEmptyValue(bridge.parentRoot, 'bridge.parentRoot');
91
+ const workspacePackages = normalizeWorkspacePackages(bridge.workspacePackages);
92
+ const dependencies = uniqueNonEmptyValues(bridge.dependencies, 'bridge.dependencies');
93
+ const gates = normalizeBridgeGates(bridge.gates);
94
+ const reactSingletons = bridge.reactSingletons && bridge.reactSingletons.length > 0 ? uniqueNonEmptyValues(bridge.reactSingletons, 'bridge.reactSingletons') : [
95
+ ...defaultReactSingletons
96
+ ];
97
+ if (0 === workspacePackages.length) throw new Error('Bridge mode requires at least one bridge.workspacePackages entry.');
98
+ if (0 === dependencies.length) throw new Error('Bridge mode requires at least one explicit bridge.dependencies package name.');
99
+ if (0 === gates.length) throw new Error('Bridge mode requires at least one bridge.gates delegated parent command.');
100
+ validateParentPackageCoverage(workspacePackages, dependencies);
101
+ validateReactSingletons(reactSingletons);
102
+ return {
103
+ enabled: true,
104
+ parentRoot,
105
+ workspacePackages,
106
+ dependencies,
107
+ lockfilePolicy: parseLockfilePolicy(bridge.lockfilePolicy ?? 'nested'),
108
+ gates,
109
+ reactSingletons
110
+ };
111
+ }
112
+ function rejectBooleanFlagValues(args) {
113
+ for (const flag of ultramodernBridgeCliBooleanFlags)if (args.some((arg)=>arg.startsWith(`${flag}=`))) throw new Error(`${flag} does not accept a value.`);
114
+ }
115
+ function readRepeatedOptionValues(args, flag) {
116
+ const values = [];
117
+ for(let index = 0; index < args.length; index++){
118
+ const arg = args[index];
119
+ if (arg === flag) {
120
+ const value = args[index + 1];
121
+ if (!value || value.startsWith('-')) throw new Error(`${flag} requires a value.`);
122
+ values.push(value);
123
+ index += 1;
124
+ continue;
125
+ }
126
+ if (arg.startsWith(`${flag}=`)) values.push(arg.slice(flag.length + 1));
127
+ }
128
+ return values;
129
+ }
130
+ function readSingleValue(args, flag) {
131
+ const values = readRepeatedOptionValues(args, flag);
132
+ if (values.length > 1) throw new Error(`${flag} can be provided only once.`);
133
+ return values[0];
134
+ }
135
+ function readCsvOptionValues(args, flag) {
136
+ return readRepeatedOptionValues(args, flag).flatMap((value)=>value.split(',').map((entry)=>entry.trim()).filter(Boolean));
137
+ }
138
+ function requireNonEmptyValue(value, label) {
139
+ if ('string' != typeof value || 0 === value.trim().length) throw new Error(`${label} must be a non-empty string.`);
140
+ return value.trim();
141
+ }
142
+ function parseLockfilePolicy(value) {
143
+ if (!ultramodernBridgeLockfilePolicies.includes(value)) throw new Error(`${ultramodernBridgeCliFlags.lockfilePolicy} must be "nested" or "parent".`);
144
+ return value;
145
+ }
146
+ function readWorkspacePackages(args) {
147
+ const drafts = new Map();
148
+ const getDraft = (pattern)=>{
149
+ const normalizedPattern = requireNonEmptyValue(pattern, ultramodernBridgeCliFlags.workspacePackage);
150
+ const existing = drafts.get(normalizedPattern);
151
+ if (existing) return existing;
152
+ const draft = {
153
+ pattern: normalizedPattern,
154
+ packageNames: [],
155
+ testAliases: []
156
+ };
157
+ drafts.set(normalizedPattern, draft);
158
+ return draft;
159
+ };
160
+ for (const pattern of readRepeatedOptionValues(args, ultramodernBridgeCliFlags.workspacePackage))getDraft(pattern);
161
+ for (const value of readRepeatedOptionValues(args, ultramodernBridgeCliFlags.workspacePackageName)){
162
+ const { left: pattern, right: packageNames } = splitAssignment(value, ultramodernBridgeCliFlags.workspacePackageName, '<pattern>=<package-name>[,<package-name>]');
163
+ getDraft(pattern).packageNames.push(...packageNames.split(',').map((packageName)=>packageName.trim()).filter(Boolean));
164
+ }
165
+ for (const value of readRepeatedOptionValues(args, ultramodernBridgeCliFlags.testAlias)){
166
+ const separator = value.indexOf(':');
167
+ if (-1 === separator) throw new Error(`${ultramodernBridgeCliFlags.testAlias} must use <pattern>:<alias>=<target>.`);
168
+ const pattern = value.slice(0, separator);
169
+ const aliasDefinition = value.slice(separator + 1);
170
+ const { left: alias, right: target } = splitAssignment(aliasDefinition, ultramodernBridgeCliFlags.testAlias, '<pattern>:<alias>=<target>');
171
+ getDraft(pattern).testAliases.push({
172
+ alias: requireNonEmptyValue(alias, `${ultramodernBridgeCliFlags.testAlias} alias`),
173
+ target: requireNonEmptyValue(target, `${ultramodernBridgeCliFlags.testAlias} target`)
174
+ });
175
+ }
176
+ return normalizeWorkspacePackages([
177
+ ...drafts.values()
178
+ ]);
179
+ }
180
+ function readBridgeGates(args) {
181
+ const gates = new Map();
182
+ const getGate = (name)=>{
183
+ const normalizedName = requireNonEmptyValue(name, `${ultramodernBridgeCliFlags.gate} name`);
184
+ const existing = gates.get(normalizedName);
185
+ if (existing) return existing;
186
+ const draft = {
187
+ name: normalizedName
188
+ };
189
+ gates.set(normalizedName, draft);
190
+ return draft;
191
+ };
192
+ for (const value of readRepeatedOptionValues(args, ultramodernBridgeCliFlags.gate)){
193
+ const { left: name, right: command } = splitAssignment(value, ultramodernBridgeCliFlags.gate, '<name>=<command>');
194
+ getGate(name).command = requireNonEmptyValue(command, `${ultramodernBridgeCliFlags.gate} command`);
195
+ }
196
+ for (const value of readRepeatedOptionValues(args, ultramodernBridgeCliFlags.gateCwd)){
197
+ const { left: name, right: cwd } = splitAssignment(value, ultramodernBridgeCliFlags.gateCwd, '<name>=<cwd>');
198
+ getGate(name).cwd = requireNonEmptyValue(cwd, `${ultramodernBridgeCliFlags.gateCwd} cwd`);
199
+ }
200
+ const missingCommand = [
201
+ ...gates.values()
202
+ ].find((gate)=>!gate.command);
203
+ if (missingCommand) throw new Error(`${ultramodernBridgeCliFlags.gateCwd} references "${missingCommand.name}" without a matching ${ultramodernBridgeCliFlags.gate}.`);
204
+ return normalizeBridgeGates([
205
+ ...gates.values()
206
+ ].map((gate)=>({
207
+ name: gate.name,
208
+ command: gate.command,
209
+ cwd: gate.cwd
210
+ })));
211
+ }
212
+ function splitAssignment(value, flag, usage) {
213
+ const separator = value.indexOf('=');
214
+ if (-1 === separator) throw new Error(`${flag} must use ${usage}.`);
215
+ return {
216
+ left: value.slice(0, separator),
217
+ right: value.slice(separator + 1)
218
+ };
219
+ }
220
+ function normalizeWorkspacePackages(workspacePackages) {
221
+ return workspacePackages.map((entry, index)=>{
222
+ const label = `bridge.workspacePackages[${index}]`;
223
+ const packageNames = entry.packageNames && entry.packageNames.length > 0 ? uniqueNonEmptyValues(entry.packageNames, `${label}.packageNames`) : void 0;
224
+ const testAliases = entry.testAliases && entry.testAliases.length > 0 ? normalizeTestAliases(entry.testAliases, label) : void 0;
225
+ return {
226
+ pattern: requireNonEmptyValue(entry.pattern, `${label}.pattern`),
227
+ ...packageNames ? {
228
+ packageNames
229
+ } : {},
230
+ ...testAliases ? {
231
+ testAliases
232
+ } : {}
233
+ };
234
+ });
235
+ }
236
+ function validateParentPackageCoverage(workspacePackages, dependencies) {
237
+ const declaredPackages = new Set();
238
+ for (const [index, entry] of workspacePackages.entries()){
239
+ const label = `bridge.workspacePackages[${index}]`;
240
+ const packageNames = entry.packageNames ?? [];
241
+ if (0 === packageNames.length && (entry.testAliases ?? []).length > 0) throw new Error(`${label}.packageNames must declare the parent package names covered by "${entry.pattern}" before testAliases can be checked.`);
242
+ for (const packageName of packageNames)declaredPackages.add(packageName);
243
+ for (const alias of entry.testAliases ?? []){
244
+ if (!packageNames.some((packageName)=>aliasMatchesPackage(alias.alias, packageName))) throw new Error(`${label}.testAliases entry "${alias.alias}" must match one of ${label}.packageNames.`);
245
+ if (pointsAtBuildOutput(alias.target)) throw new Error(`${label}.testAliases target "${alias.target}" must point at source files, not dist output.`);
246
+ }
247
+ }
248
+ const missingDependencies = dependencies.filter((dependency)=>!declaredPackages.has(dependency));
249
+ if (declaredPackages.size > 0 && missingDependencies.length > 0) throw new Error(`Bridge mode dependencies must be declared by bridge.workspacePackages[].packageNames: ${missingDependencies.join(', ')}.`);
250
+ }
251
+ function aliasMatchesPackage(alias, packageName) {
252
+ return alias === packageName || alias.startsWith(`${packageName}/`);
253
+ }
254
+ function pointsAtBuildOutput(target) {
255
+ return target.split(/[\\/]/u).includes('dist');
256
+ }
257
+ function validateReactSingletons(reactSingletons) {
258
+ const missing = defaultReactSingletons.filter((packageName)=>!reactSingletons.includes(packageName));
259
+ if (missing.length > 0) throw new Error(`Bridge mode React singleton/dedupe declarations must include ${defaultReactSingletons.join(' and ')}. Missing: ${missing.join(', ')}.`);
260
+ }
261
+ function normalizeTestAliases(testAliases, parentLabel) {
262
+ const aliases = new Map();
263
+ for (const [index, alias] of testAliases.entries()){
264
+ const label = `${parentLabel}.testAliases[${index}]`;
265
+ const normalizedAlias = requireNonEmptyValue(alias.alias, `${label}.alias`);
266
+ aliases.set(normalizedAlias, {
267
+ alias: normalizedAlias,
268
+ target: requireNonEmptyValue(alias.target, `${label}.target`)
269
+ });
270
+ }
271
+ return [
272
+ ...aliases.values()
273
+ ];
274
+ }
275
+ function normalizeBridgeGates(gates) {
276
+ const normalized = new Map();
277
+ for (const [index, gate] of gates.entries()){
278
+ const label = `bridge.gates[${index}]`;
279
+ const name = requireNonEmptyValue(gate.name, `${label}.name`);
280
+ normalized.set(name, {
281
+ name,
282
+ command: requireNonEmptyValue(gate.command, `${label}.command`),
283
+ ...gate.cwd ? {
284
+ cwd: requireNonEmptyValue(gate.cwd, `${label}.cwd`)
285
+ } : {}
286
+ });
287
+ }
288
+ return [
289
+ ...normalized.values()
290
+ ];
291
+ }
292
+ function uniqueNonEmptyValues(values, label) {
293
+ const unique = new Set();
294
+ for (const [index, value] of values.entries())unique.add(requireNonEmptyValue(value, `${label}[${index}]`));
295
+ return [
296
+ ...unique
297
+ ];
298
+ }
299
+ __webpack_require__.d(__webpack_exports__, {
300
+ hasUltramodernBridgeCliOptions: ()=>hasUltramodernBridgeCliOptions,
301
+ normalizeUltramodernBridgeConfig: ()=>normalizeUltramodernBridgeConfig,
302
+ parseUltramodernBridgeCliOptions: ()=>parseUltramodernBridgeCliOptions
303
+ }, {
304
+ ultramodernBridgeCliBooleanFlags: ultramodernBridgeCliBooleanFlags,
305
+ ultramodernBridgeCliFlags: ultramodernBridgeCliFlags,
306
+ ultramodernBridgeCliValueFlags: ultramodernBridgeCliValueFlags,
307
+ ultramodernBridgeLockfilePolicies: ultramodernBridgeLockfilePolicies
308
+ });
309
+ exports.hasUltramodernBridgeCliOptions = __webpack_exports__.hasUltramodernBridgeCliOptions;
310
+ exports.normalizeUltramodernBridgeConfig = __webpack_exports__.normalizeUltramodernBridgeConfig;
311
+ exports.parseUltramodernBridgeCliOptions = __webpack_exports__.parseUltramodernBridgeCliOptions;
312
+ exports.ultramodernBridgeCliBooleanFlags = __webpack_exports__.ultramodernBridgeCliBooleanFlags;
313
+ exports.ultramodernBridgeCliFlags = __webpack_exports__.ultramodernBridgeCliFlags;
314
+ exports.ultramodernBridgeCliValueFlags = __webpack_exports__.ultramodernBridgeCliValueFlags;
315
+ exports.ultramodernBridgeLockfilePolicies = __webpack_exports__.ultramodernBridgeLockfilePolicies;
316
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
317
+ "hasUltramodernBridgeCliOptions",
318
+ "normalizeUltramodernBridgeConfig",
319
+ "parseUltramodernBridgeCliOptions",
320
+ "ultramodernBridgeCliBooleanFlags",
321
+ "ultramodernBridgeCliFlags",
322
+ "ultramodernBridgeCliValueFlags",
323
+ "ultramodernBridgeLockfilePolicies"
324
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
325
+ Object.defineProperty(exports, '__esModule', {
326
+ value: true
327
+ });
@@ -56,6 +56,7 @@ async function ultramodernCodeSmithAdapter(context, runtime) {
56
56
  packageName: name,
57
57
  modernVersion,
58
58
  enableTailwind,
59
+ bridge: config.bridge,
59
60
  overlays: config.overlays,
60
61
  packageSource
61
62
  }) : runVerticalMode({