@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,7 +1,8 @@
1
1
  import "node:module";
2
2
  import node_fs from "node:fs";
3
- import { createApiClient, createApiServiceEntry, createSharedApi, createShellApiClient } from "./api.js";
3
+ import { createApiClient, createApiServiceEntry, createBackendEffectApiExpose, createSharedApi, createShellApiClient } from "./api.js";
4
4
  import { createAppEnvDts, createAppRuntimeConfig, createAppStyles, createPostcssConfig, createSharedDesignTokensCss, createShellFrameComponent, createTailwindConfig } from "./app-files.js";
5
+ import { createBackendFederationContractFile } from "./backend-federation.js";
5
6
  import { normalizeUltramodernBridgeConfig } from "./bridge-config.js";
6
7
  import { createDevelopmentOverlay, createOwnership, createTopology, createUltramodernConfig } from "./contracts.js";
7
8
  import { createLayout, createRemoteEntry, createRemoteExposeComponent, createRemotePage, createShellPage, createShellRemoteComponents, remoteComponentOutputPath } from "./demo-components.js";
@@ -9,14 +10,15 @@ import { ULTRAMODERN_CONFIG_PATH, appHasApi, appI18nNamespace, createShellHost,
9
10
  import { copyRootTemplate, formatGeneratedWorkspaceFiles, writeFile, writeFileReplacing, writeJson } from "./fs-io.js";
10
11
  import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
11
12
  import { createAppPublicLocaleMessages } from "./locales.js";
12
- import { createAppModernConfig, createRemoteModuleFederationConfig, createShellModuleFederationConfig, createUltramodernBuildModule, createUltramodernBuildReexportModule } from "./module-federation.js";
13
+ import { createAppModernConfig, createBackendModuleFederationConfig, createRemoteModuleFederationConfig, createShellModuleFederationConfig, createUltramodernBuildModule, createUltramodernBuildReexportModule } from "./module-federation.js";
13
14
  import { assertUniqueTailwindPrefixes, toPackageScope } from "./naming.js";
14
15
  import { runCodeSmithOverlays } from "./overlays.js";
15
16
  import { createAppMfTypesTsConfig, createAppPackage, createAppTsConfig, createRootPackageJson, createRootTsConfig, createSharedContractsIndex, createSharedPackage, createSharedPackageTsConfig, createTsConfigBase } from "./package-json.js";
16
17
  import { resolvePackageSource } from "./package-source.js";
17
18
  import { createPublicWebAppArtifacts } from "./public-surface.js";
18
- import { EFFECT_VERSION, EFFECT_VITEST_VERSION, NODE_FETCH_VERSION, NODE_VERSION, PNPM_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_VERSION } from "./versions.js";
19
+ import { DRIZZLE_ORM_VERSION, EFFECT_VERSION, EFFECT_VITEST_VERSION, MODULE_FEDERATION_VERSION, NODE_FETCH_VERSION, NODE_VERSION, PNPM_VERSION, TANSTACK_ROUTER_CORE_VERSION, TANSTACK_ROUTER_VERSION, TYPESCRIPT_VERSION } from "./versions.js";
19
20
  import { writeGeneratedWorkspaceScripts } from "./workspace-scripts.js";
21
+ import { createZeropsYaml } from "./zerops.js";
20
22
  function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = [], bridge) {
21
23
  const resolvedApp = 'shell' === app.kind ? createShellHost(remotes) : app;
22
24
  const publicWeb = createPublicWebAppArtifacts(resolvedApp);
@@ -32,7 +34,7 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes
32
34
  writeFile(targetDir, publicWeb.jsonLdHelperFile.path, publicWeb.jsonLdHelperFile.content);
33
35
  writeFile(targetDir, publicWeb.routeMetadataFile.path, publicWeb.routeMetadataFile.content);
34
36
  writeFile(targetDir, publicWeb.routeHeadFile.path, publicWeb.routeHeadFile.content);
35
- writeFile(targetDir, `${resolvedApp.directory}/modern.config.ts`, createAppModernConfig(scope, resolvedApp));
37
+ writeFile(targetDir, `${resolvedApp.directory}/modern.config.ts`, createAppModernConfig(scope, resolvedApp, remotes));
36
38
  writeFile(targetDir, `${resolvedApp.directory}/src/modern.runtime.ts`, createAppRuntimeConfig(resolvedApp, scope, remotes));
37
39
  writeJson(targetDir, `${resolvedApp.directory}/locales/en/translation.json`, createAppPublicLocaleMessages(resolvedApp, 'en', remotes));
38
40
  writeJson(targetDir, `${resolvedApp.directory}/locales/en/${appI18nNamespace(resolvedApp)}.json`, createAppPublicLocaleMessages(resolvedApp, 'en', remotes));
@@ -44,6 +46,7 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes
44
46
  writeFile(targetDir, `${resolvedApp.directory}/tailwind.config.ts`, createTailwindConfig());
45
47
  }
46
48
  writeFile(targetDir, `${resolvedApp.directory}/module-federation.config.ts`, 'shell' === resolvedApp.kind ? createShellModuleFederationConfig(scope, remotes) : createRemoteModuleFederationConfig(scope, resolvedApp, remotes));
49
+ if (appHasApi(resolvedApp)) writeFile(targetDir, `${resolvedApp.directory}/backend-federation.config.ts`, createBackendModuleFederationConfig(resolvedApp));
47
50
  writeAppFile('src/routes/layout.tsx', createLayout(resolvedApp.id));
48
51
  writeAppFile('src/routes/[lang]/page.tsx', 'shell' === resolvedApp.kind ? createShellPage(remotes) : createRemotePage(resolvedApp));
49
52
  for (const generatedFile of publicWeb.routeMetaFiles)writeFile(targetDir, generatedFile.path, generatedFile.content);
@@ -56,6 +59,8 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes
56
59
  if (appHasApi(resolvedApp)) {
57
60
  writeFile(targetDir, `${resolvedApp.directory}/shared/api.ts`, createSharedApi(resolvedApp));
58
61
  writeFile(targetDir, `${resolvedApp.directory}/api/index.ts`, createApiServiceEntry(resolvedApp, '../shared/api.ts'));
62
+ writeFile(targetDir, `${resolvedApp.directory}/api/backend-federation.ts`, createBackendFederationContractFile(resolvedApp));
63
+ writeFile(targetDir, `${resolvedApp.directory}/api/effect-api.ts`, createBackendEffectApiExpose(scope, resolvedApp));
59
64
  writeFile(targetDir, `${resolvedApp.directory}/src/api/${resolvedApp.api.stem}-client.ts`, createApiClient(resolvedApp, '../../shared/api'));
60
65
  }
61
66
  if ('vertical' === resolvedApp.kind) {
@@ -105,7 +110,7 @@ function writePnpmWorkspacePackages(targetDir, bridge) {
105
110
  ...bridge.workspacePackages.map((entry)=>entry.pattern)
106
111
  ];
107
112
  const renderedPackages = packages.map((pattern)=>` - ${pattern}`).join('\n');
108
- writeFileReplacing(targetDir, 'pnpm-workspace.yaml', pnpmWorkspace.replace(/^packages:\n(?: {2}- .+\n)+/u, `packages:\n${renderedPackages}\n`));
113
+ writeFileReplacing(targetDir, 'pnpm-workspace.yaml', pnpmWorkspace.replace(/^packages:\r?\n(?: {2}- .+\r?\n)+/u, `packages:\n${renderedPackages}\n`));
109
114
  }
110
115
  function generateUltramodernWorkspace(options) {
111
116
  const beforeFiles = createFileSnapshot(options.targetDir);
@@ -131,8 +136,10 @@ function generateUltramodernWorkspace(options) {
131
136
  nodeVersion: NODE_VERSION,
132
137
  pnpmVersion: PNPM_VERSION,
133
138
  nodeFetchVersion: NODE_FETCH_VERSION,
139
+ drizzleOrmVersion: DRIZZLE_ORM_VERSION,
134
140
  effectVersion: EFFECT_VERSION,
135
141
  effectVitestVersion: EFFECT_VITEST_VERSION,
142
+ moduleFederationVersion: MODULE_FEDERATION_VERSION,
136
143
  tanstackRouterCoreVersion: TANSTACK_ROUTER_CORE_VERSION,
137
144
  tanstackRouterVersion: TANSTACK_ROUTER_VERSION,
138
145
  typescriptVersion: TYPESCRIPT_VERSION,
@@ -140,11 +147,12 @@ function generateUltramodernWorkspace(options) {
140
147
  });
141
148
  writePnpmWorkspacePackages(options.targetDir, bridge);
142
149
  writeJson(options.targetDir, 'package.json', createCompactRootPackageJson(scope, packageSource, initialVerticals, bridge));
150
+ writeFile(options.targetDir, 'zerops.yaml', `${createZeropsYaml(scope, createdApps)}\n`);
143
151
  writeJson(options.targetDir, 'tsconfig.base.json', createTsConfigBase());
144
152
  writeJson(options.targetDir, 'tsconfig.json', createRootTsConfig(createdApps));
145
153
  writeJson(options.targetDir, 'topology/reference-topology.json', createTopology(scope, initialVerticals));
146
154
  writeJson(options.targetDir, 'topology/ownership.json', createOwnership(scope, initialVerticals));
147
- writeJson(options.targetDir, 'topology/local-overlays/development.json', createDevelopmentOverlay(initialVerticals));
155
+ writeJson(options.targetDir, 'topology/local-overlays/development.json', createDevelopmentOverlay(scope, initialVerticals));
148
156
  writeJson(options.targetDir, ULTRAMODERN_CONFIG_PATH, createCompactUltramodernConfig(scope, options.modernVersion, packageSource, createdApps, enableTailwind, bridge));
149
157
  writeApp(options.targetDir, scope, shellApp, packageSource, enableTailwind, initialVerticals, bridge);
150
158
  for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals, bridge);
@@ -0,0 +1,63 @@
1
+ import "node:module";
2
+ import { appHasApi, resolveApiPrefix, resolveApiStem } from "./descriptors.js";
3
+ import { packageName } from "./naming.js";
4
+ import { NODE_VERSION } from "./versions.js";
5
+ const zeropsNodeRuntime = `nodejs@${NODE_VERSION.split('.')[0]}`;
6
+ function quoteYamlString(value) {
7
+ return `'${value.replace(/'/gu, "''")}'`;
8
+ }
9
+ function readinessPath(app) {
10
+ if (!appHasApi(app)) return '/';
11
+ return `${resolveApiPrefix(app)}/${resolveApiStem(app)}/readiness`;
12
+ }
13
+ function createZeropsService(scope, app) {
14
+ const runtimeDirectory = `.zerops/runtime/${app.id}`;
15
+ const appPackageName = packageName(scope, app.packageSuffix);
16
+ const commands = [
17
+ 'curl https://mise.run | sh',
18
+ '~/.local/bin/mise install',
19
+ '~/.local/bin/mise exec -- pnpm install --frozen-lockfile',
20
+ `~/.local/bin/mise exec -- pnpm --filter ${appPackageName} run build`,
21
+ `~/.local/bin/mise exec -- pnpm run zerops:materialize -- --app ${app.id} --package ${appPackageName} --package-dir ${app.directory}`,
22
+ `cp topology/reference-topology.json ${runtimeDirectory}/topology.json`,
23
+ `cp topology/local-overlays/development.json ${runtimeDirectory}/local-overlay.json`
24
+ ];
25
+ return [
26
+ ` - setup: ${app.id}`,
27
+ ' build:',
28
+ ` base: ${zeropsNodeRuntime}`,
29
+ ' buildCommands:',
30
+ ' - |',
31
+ ...commands.map((command)=>` ${command}`),
32
+ ' deployFiles:',
33
+ ` - ${runtimeDirectory}`,
34
+ ' deploy:',
35
+ ' temporaryShutdown: false',
36
+ ' readinessCheck:',
37
+ ' httpGet:',
38
+ ` port: ${app.port}`,
39
+ ` path: ${readinessPath(app)}`,
40
+ ' failureTimeout: 120',
41
+ ' retryPeriod: 10',
42
+ ' run:',
43
+ ` base: ${zeropsNodeRuntime}`,
44
+ ' ports:',
45
+ ` - port: ${app.port}`,
46
+ ' protocol: TCP',
47
+ ' httpSupport: true',
48
+ ' envVariables:',
49
+ ' NODE_ENV: production',
50
+ ` ${app.portEnv}: ${quoteYamlString(String(app.port))}`,
51
+ ` ULTRAMODERN_ZEROPS_SERVICE: ${quoteYamlString(app.id)}`,
52
+ ` start: cd ${runtimeDirectory} && npm run serve`
53
+ ].join('\n');
54
+ }
55
+ function createZeropsYaml(scope, apps) {
56
+ return [
57
+ '# Generated by Modern.js UltraModern workspace tooling.',
58
+ '# Zerops runs each full-stack MicroVertical as a package-owned Node service.',
59
+ 'zerops:',
60
+ ...apps.map((app)=>createZeropsService(scope, app))
61
+ ].join('\n\n');
62
+ }
63
+ export { createZeropsYaml };
@@ -39,5 +39,11 @@ export type UltramodernToolingConfig = {
39
39
  apps: UltramodernToolingConfigApp[];
40
40
  };
41
41
  };
42
+ export declare function normalizeCompactUltramodernConfig(workspaceRoot: string, compact: Record<string, any>): UltramodernToolingConfig;
43
+ export declare function synthesizeCompactUltramodernConfig(workspaceRoot: string): {
44
+ compact: Record<string, any>;
45
+ missing: string[];
46
+ sources: string[];
47
+ } | undefined;
42
48
  export declare function readUltramodernConfig(workspaceRoot?: any): UltramodernToolingConfig;
43
49
  export declare function workspaceAppsFromToolingConfig(config: UltramodernToolingConfig): WorkspaceApp[];
@@ -52,6 +52,7 @@ export declare function createApiServiceEntry(service: {
52
52
  id: string;
53
53
  api?: WorkspaceApi;
54
54
  }, contractImportPath: string): string;
55
+ export declare function createBackendEffectApiExpose(scope: string, service: WorkspaceApp): string;
55
56
  export declare function createApiClient(service: {
56
57
  id: string;
57
58
  api?: WorkspaceApi;
@@ -0,0 +1,11 @@
1
+ import type { JsonValue, WorkspaceApp } from './types';
2
+ export declare const BACKEND_FEDERATION_CONTRACT_VERSION = "microvertical-server-effect-v1";
3
+ export declare const BACKEND_FEDERATION_NODE_ADAPTER_VERSION = "backend-mf-effect-v1";
4
+ export declare function createWorkerBindingName(app: WorkspaceApp): string;
5
+ export declare function createWorkerBindingEnv(app: WorkspaceApp): string;
6
+ export declare function createDispatchWorkerNameEnv(app: WorkspaceApp): string;
7
+ export declare function createServerExecutionOverlay(scope: string, app: WorkspaceApp): JsonValue | undefined;
8
+ export declare function createBackendFederationContract(scope: string, app: WorkspaceApp): JsonValue | undefined;
9
+ export declare function createBackendFederationMetadata(scope: string, app: WorkspaceApp): JsonValue | undefined;
10
+ export declare function createBackendFederationContractFile(app: WorkspaceApp): string;
11
+ export declare function createBackendFederationSummary(scope: string, app: WorkspaceApp): JsonValue | undefined;
@@ -2,5 +2,5 @@ import type { UltramodernBridgeConfig } from './bridge-config';
2
2
  import type { JsonValue, ResolvedPackageSource, WorkspaceApp } from './types';
3
3
  export declare function createTopology(scope: string, remotes?: WorkspaceApp[]): JsonValue;
4
4
  export declare function createOwnership(scope: string, remotes?: WorkspaceApp[]): JsonValue;
5
- export declare function createDevelopmentOverlay(remotes?: WorkspaceApp[]): JsonValue;
5
+ export declare function createDevelopmentOverlay(scope: string, remotes?: WorkspaceApp[]): JsonValue;
6
6
  export declare function createUltramodernConfig(scope: string, modernVersion: string, packageSource: ResolvedPackageSource, apps?: WorkspaceApp[], enableTailwind?: boolean, bridge?: UltramodernBridgeConfig): JsonValue;
@@ -0,0 +1,6 @@
1
+ type SyncContext = {
2
+ workspaceRoot: string;
3
+ invocationCwd: string;
4
+ };
5
+ export declare function runSyncDeliveryUnit(args: string[], context: SyncContext): number;
6
+ export {};
@@ -0,0 +1,27 @@
1
+ import type { WorkspaceApp } from './types';
2
+ export declare const DELIVERY_UNIT_SCHEMA_VERSION = 1;
3
+ export type DeliveryUnitRecord = {
4
+ schemaVersion: 1;
5
+ kind: 'microvertical-delivery-unit';
6
+ unitId: string;
7
+ appId: string;
8
+ packageName: string;
9
+ version: string;
10
+ sourceRevision: string;
11
+ buildMarker: string;
12
+ deployProfile: 'cloudflare-ssr-mf-effect-v1';
13
+ };
14
+ export declare function createBuildMarker(scope: string, app: {
15
+ id: string;
16
+ packageSuffix: string;
17
+ }): any;
18
+ export declare function deliveryUnitContractBlock(record: DeliveryUnitRecord): {
19
+ schemaVersion: 1;
20
+ kind: "microvertical-delivery-unit";
21
+ unitId: string;
22
+ packageName: string;
23
+ version: string;
24
+ buildMarker: string;
25
+ sourceRevision: string;
26
+ };
27
+ export declare function createDeliveryUnitRecord(scope: string, app: WorkspaceApp): DeliveryUnitRecord;
@@ -27,6 +27,10 @@ export declare function remoteDependencyAlias(remote: WorkspaceApp): string;
27
27
  export declare function zephyrRemoteDependency(scope: string, remote: WorkspaceApp): string;
28
28
  export declare function resolveRemoteRefs(app: WorkspaceApp, remotes?: WorkspaceApp[]): WorkspaceApp[];
29
29
  export declare function createRemoteManifestEnv(remote: WorkspaceApp): string;
30
+ export declare function createBackendFederationManifestEnv(remote: WorkspaceApp): string;
31
+ export declare function createBackendFederationName(app: WorkspaceApp): string;
32
+ export declare function createBackendFederationManifestUrl(app: WorkspaceApp): string;
33
+ export declare function createBackendFederationContainerEntry(app: WorkspaceApp): string;
30
34
  export declare function createModuleFederationRemoteContracts(app: WorkspaceApp, remotes?: WorkspaceApp[]): {
31
35
  id: string;
32
36
  alias: string;
@@ -1,17 +1,12 @@
1
1
  import type { WorkspaceApp } from './types';
2
- export declare function createAppModernConfig(scope: string, app: WorkspaceApp): string;
2
+ export declare function createAppModernConfig(scope: string, app: WorkspaceApp, remotes?: WorkspaceApp[]): string;
3
3
  export declare function createSharedModuleFederationConfig(): string;
4
4
  export declare function formatTsObjectLiteral(value: Record<string, string>): string;
5
5
  export declare function createModuleFederationRemoteUrlHelpers(app: WorkspaceApp, remotes?: WorkspaceApp[]): string;
6
6
  export declare function createModuleFederationRemotesConfig(scope: string, app: WorkspaceApp, remotes?: WorkspaceApp[]): string;
7
7
  export declare function createShellModuleFederationConfig(scope: string, remotes?: WorkspaceApp[]): string;
8
- export declare function createBuildMarker(scope: string, app: {
9
- id: string;
10
- packageSuffix: string;
11
- }): any;
12
- export declare function createUltramodernBuildModule(scope: string, app: {
13
- id: string;
14
- packageSuffix: string;
15
- }): string;
8
+ export declare function createBackendModuleFederationConfig(app: WorkspaceApp): string;
9
+ export { createBuildMarker } from './delivery-unit';
10
+ export declare function createUltramodernBuildModule(scope: string, app: WorkspaceApp): string;
16
11
  export declare function createUltramodernBuildReexportModule(): string;
17
12
  export declare function createRemoteModuleFederationConfig(scope: string, app: WorkspaceApp, remotes?: WorkspaceApp[]): string;
@@ -1,6 +1,5 @@
1
1
  import type { UltramodernBridgeConfig } from './bridge-config';
2
2
  import type { JsonValue, ResolvedPackageSource, WorkspaceApp } from './types';
3
- export declare const createStrictTsgoTypecheckCommand: (packageDir: string) => string;
4
3
  export declare const effectDiagnostics: string[];
5
4
  export declare function appDependencies(scope: string, packageSource: ResolvedPackageSource, app: WorkspaceApp, remotes?: WorkspaceApp[], bridge?: UltramodernBridgeConfig): Record<string, string>;
6
5
  export declare function appDevDependencies(packageSource: ResolvedPackageSource, enableTailwind: boolean): Record<string, string>;
@@ -0,0 +1,39 @@
1
+ export declare const strictEffectPackageVersionPolicyExclusions: string[];
2
+ export declare const moduleFederationModernJsPatchPath = "patches/@module-federation__modern-js-v3@2.6.0.patch";
3
+ export declare const moduleFederationBridgeReactPatchPath = "patches/@module-federation__bridge-react@2.6.0.patch";
4
+ export declare const effectDeclarationPatchPath = "patches/effect-schema-error-type-id.patch";
5
+ export declare const drizzleOrmDeclarationPatchPath = "patches/drizzle-orm-ts7-strict-declarations.patch";
6
+ export type PnpmWorkspaceYamlAction = {
7
+ kind: 'replace-line';
8
+ pattern: RegExp;
9
+ replacement: string;
10
+ } | {
11
+ kind: 'ensure-scalar-map-entry';
12
+ key: string;
13
+ entryKey: string;
14
+ value: string;
15
+ } | {
16
+ kind: 'ensure-list-item';
17
+ key: string;
18
+ item: string;
19
+ } | {
20
+ kind: 'ensure-map-entry';
21
+ key: string;
22
+ entryKey: string;
23
+ value: string;
24
+ } | {
25
+ kind: 'remove-map-entry';
26
+ entryKey: string;
27
+ };
28
+ export type GeneratedDeclarationPatchAction = {
29
+ kind: 'ensure' | 'remove-if-unchanged';
30
+ relativePatchPath: string;
31
+ };
32
+ export type PnpmWorkspacePolicyPlan = {
33
+ yamlActions: PnpmWorkspaceYamlAction[];
34
+ declarationPatchActions: GeneratedDeclarationPatchAction[];
35
+ requiresInstallOnChange: boolean;
36
+ };
37
+ export declare function createPnpmWorkspacePolicyPlan(options: {
38
+ usesDrizzleOrm: boolean;
39
+ }): PnpmWorkspacePolicyPlan;
@@ -0,0 +1,18 @@
1
+ export type GeneratedToolingCommandId = 'validate' | 'typecheck' | 'mfTypes' | 'publicSurface' | 'backendFederationGenerate' | 'backendFederationProof' | 'cloudflareProof' | 'cloudflareOutputVerify' | 'performanceReadiness' | 'migrateStrictEffect' | 'routesGenerate';
2
+ export type GeneratedToolingCommandKey = GeneratedToolingCommandId;
3
+ export interface GeneratedToolingCommand {
4
+ id: GeneratedToolingCommandId;
5
+ command: string;
6
+ wrapperName: string;
7
+ wrapperPath: `scripts/${string}.mts`;
8
+ contractKey: string;
9
+ rootScript?: string;
10
+ templatePath?: `templates/workspace-scripts/${string}.mjs`;
11
+ cwd?: 'invocation';
12
+ }
13
+ export declare const generatedToolingCommands: readonly [GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand, GeneratedToolingCommand];
14
+ export declare const toolingCommandById: Record<GeneratedToolingCommandId, GeneratedToolingCommand>;
15
+ export declare const GENERATED_TOOLING_COMMANDS: Record<GeneratedToolingCommandId, GeneratedToolingCommand>;
16
+ export declare const generatedToolingCommandList: () => string[];
17
+ export declare const createToolingWrapperContract: () => Record<GeneratedToolingCommandKey, GeneratedToolingCommand['wrapperPath']>;
18
+ export declare const createGeneratedToolingWrapperMap: () => Record<GeneratedToolingCommandKey, GeneratedToolingCommand['wrapperPath']>;
@@ -13,9 +13,10 @@ export declare const CLOUDFLARE_COMPATIBILITY_DATE = "2026-06-02";
13
13
  export declare const TAILWIND_VERSION = "4.3.1";
14
14
  export declare const TAILWIND_POSTCSS_VERSION = "4.3.1";
15
15
  export declare const POSTCSS_VERSION = "8.5.15";
16
- export declare const EFFECT_VERSION = "4.0.0-beta.91";
17
- export declare const EFFECT_VITEST_VERSION = "4.0.0-beta.91";
16
+ export declare const EFFECT_VERSION = "4.0.0-beta.92";
17
+ export declare const EFFECT_VITEST_VERSION = "4.0.0-beta.92";
18
18
  export declare const EFFECT_TSGO_VERSION = "0.14.6";
19
+ export declare const DRIZZLE_ORM_VERSION = "1.0.0-rc.4";
19
20
  export declare const TYPESCRIPT_STABLE_VERSION = "6.0.3";
20
21
  export declare const TYPESCRIPT_NATIVE_PREVIEW_VERSION = "7.0.0-dev.20260628.1";
21
22
  export declare const TYPESCRIPT_VERSION = "6.0.3";
@@ -27,7 +28,7 @@ export declare const I18NEXT_VERSION = "26.3.1";
27
28
  export declare const NODE_FETCH_VERSION = "^3.3.2";
28
29
  export declare const REACT_VERSION = "^19.2.7";
29
30
  export declare const REACT_DOM_VERSION = "^19.2.7";
30
- export declare const REACT_ROUTER_VERSION = "7.18.0";
31
+ export declare const REACT_ROUTER_VERSION = "7.18.1";
31
32
  export declare const TYPES_REACT_VERSION = "^19.2.17";
32
33
  export declare const TYPES_REACT_DOM_VERSION = "^19.2.3";
33
34
  export declare const NODE_VERSION = "26.3.0";
@@ -40,6 +41,7 @@ export declare const ultramodernWorkspaceVersions: {
40
41
  moduleFederation: string;
41
42
  effect: string;
42
43
  effectVitest: string;
44
+ drizzleOrm: string;
43
45
  tailwind: string;
44
46
  tailwindPostcss: string;
45
47
  };
@@ -0,0 +1,72 @@
1
+ import { type GeneratedToolingCommandKey } from './tooling-command-catalog';
2
+ import type { WorkspaceApp } from './types';
3
+ export declare const rootToolingScriptName: (key: GeneratedToolingCommandKey) => string;
4
+ export declare const rootToolingWrapperCommand: (key: GeneratedToolingCommandKey) => string;
5
+ export declare const packageToolingWrapperCommand: (packageDir: string, key: GeneratedToolingCommandKey) => string;
6
+ export interface WorkspaceRootScriptPlan {
7
+ build: string;
8
+ cloudflareBuild: string;
9
+ cloudflareDeploy: string;
10
+ cloudflareProof: string;
11
+ cloudflareOutputVerify: string;
12
+ backendFederationGenerate: string;
13
+ nodeProof: string;
14
+ mfTypes: string;
15
+ performanceReadiness: string;
16
+ migrateStrictEffect: string;
17
+ zeropsMaterialize: string;
18
+ contractCheck: string;
19
+ typecheck: string;
20
+ check: string;
21
+ }
22
+ export declare const workspaceRootPackageScriptNames: {
23
+ readonly build: 'build';
24
+ readonly cloudflareBuild: 'cloudflare:build';
25
+ readonly cloudflareDeploy: 'cloudflare:deploy';
26
+ readonly cloudflareProof: string;
27
+ readonly cloudflareOutputVerify: string;
28
+ readonly backendFederationGenerate: string;
29
+ readonly nodeProof: string;
30
+ readonly mfTypes: string;
31
+ readonly performanceReadiness: string;
32
+ readonly migrateStrictEffect: string;
33
+ readonly zeropsMaterialize: 'zerops:materialize';
34
+ readonly contractCheck: string;
35
+ readonly typecheck: 'typecheck';
36
+ readonly check: 'check';
37
+ };
38
+ export type WorkspaceRootPackageScriptName = (typeof workspaceRootPackageScriptNames)[keyof typeof workspaceRootPackageScriptNames];
39
+ export type WorkspaceRootPackageScripts = Record<WorkspaceRootPackageScriptName, string>;
40
+ export interface WorkspaceAppScriptPlan {
41
+ dev: string;
42
+ build: string;
43
+ cloudflareBuild: string;
44
+ cloudflareDeploy: string;
45
+ cloudflarePreview: string;
46
+ cloudflareProof: string;
47
+ serve: string;
48
+ typecheck: string;
49
+ }
50
+ export declare const workspaceAppPackageScriptNames: {
51
+ readonly dev: 'dev';
52
+ readonly build: 'build';
53
+ readonly cloudflareBuild: 'cloudflare:build';
54
+ readonly cloudflareDeploy: 'cloudflare:deploy';
55
+ readonly cloudflarePreview: 'cloudflare:preview';
56
+ readonly cloudflareProof: 'cloudflare:proof';
57
+ readonly serve: 'serve';
58
+ readonly typecheck: 'typecheck';
59
+ };
60
+ export type WorkspaceAppPackageScriptName = (typeof workspaceAppPackageScriptNames)[keyof typeof workspaceAppPackageScriptNames];
61
+ export type WorkspaceAppPackageScripts = Record<WorkspaceAppPackageScriptName, string>;
62
+ export declare const createStrictTsgoTypecheckCommand: (packageDir: string) => string;
63
+ export declare function createWorkspaceAppScriptPlan(app: WorkspaceApp): WorkspaceAppScriptPlan;
64
+ export declare function createWorkspaceAppPackageScripts(app: WorkspaceApp): WorkspaceAppPackageScripts;
65
+ export declare function createWorkspaceRootScriptPlan(remotes?: WorkspaceApp[], options?: {
66
+ bridgeCheck?: string;
67
+ typecheck?: string;
68
+ }): WorkspaceRootScriptPlan;
69
+ export declare function createWorkspaceRootPackageScripts(remotes?: WorkspaceApp[], options?: {
70
+ bridgeCheck?: string;
71
+ typecheck?: string;
72
+ }): WorkspaceRootPackageScripts;
@@ -1,6 +1,19 @@
1
1
  import type { WorkspaceApp } from './types';
2
+ export declare function writeGeneratedToolWrapperScripts(targetDir: string): void;
2
3
  export declare function createWorkspaceValidationScript(scope: string, enableTailwind: boolean, remotes?: WorkspaceApp[]): string;
3
4
  export declare function createWorkspaceI18nBoundaryValidationScript(): string;
4
5
  export declare function createWorkspaceApiBoundaryValidationScript(): string;
5
6
  export declare function createPerformanceReadinessConfigScript(): string;
7
+ export declare function createNodeBackendFederationProofScript(): string;
8
+ export declare function createZeropsRuntimeMaterializationScript(): string;
6
9
  export declare function writeGeneratedWorkspaceScripts(targetDir: string, _scope: string, _enableTailwind: boolean, _remotes?: WorkspaceApp[]): void;
10
+ export declare function createAgentReferenceReposSetupScript(): string;
11
+ export interface MigratedWorkspaceScriptArtifact {
12
+ relativePath: string;
13
+ content: string;
14
+ legacyPath?: string;
15
+ }
16
+ export declare function migratedWorkspaceScriptArtifacts(options: {
17
+ shellOnly: boolean;
18
+ }): MigratedWorkspaceScriptArtifact[];
19
+ export declare const migratedWorkspaceScriptBasenames: readonly string[];
@@ -0,0 +1,42 @@
1
+ import type { WorkspaceApp } from './types';
2
+ export type WorkspaceValidationContract = ReturnType<typeof createWorkspaceValidationContract>;
3
+ export declare function createWorkspaceValidationContract(scope: string, enableTailwind: boolean, remotes?: WorkspaceApp[]): {
4
+ packageScope: string;
5
+ versions: {
6
+ cloudflareCompatibilityDate: string;
7
+ effect: string;
8
+ moduleFederation: string;
9
+ node: string;
10
+ pnpm: string;
11
+ };
12
+ tailwindEnabled: boolean;
13
+ fullStackVerticals: {
14
+ id: string;
15
+ domain: string | undefined;
16
+ stem: string;
17
+ group: string;
18
+ path: string;
19
+ port: number;
20
+ mfName: string;
21
+ apiPrefix: string;
22
+ tailwindPrefix: string;
23
+ zephyrAlias: string;
24
+ packageName: string;
25
+ backendFederation: import("./types").JsonValue | undefined;
26
+ deliveryUnit: import("./delivery-unit").DeliveryUnitRecord;
27
+ exposes: string[];
28
+ componentPaths: string[];
29
+ namespace: string;
30
+ routePagePaths: string[];
31
+ routeMetaPaths: string[];
32
+ localisedUrls: Record<string, import("./types").JsonValue>;
33
+ verticalRefs: string[];
34
+ }[];
35
+ shellNamespace: string;
36
+ oldRemotePaths: string[];
37
+ scripts: import("./workspace-script-plan").WorkspaceRootScriptPlan;
38
+ packageScripts: import("./workspace-script-plan").WorkspaceRootPackageScripts;
39
+ cloudflareSecurity: import("./types").JsonValue;
40
+ publicSurfaceManagedSourceAssetPaths: ("config/public/robots.txt" | "config/public/site.webmanifest" | "config/public/sitemap.xml")[];
41
+ shellRouteMetaPaths: string[];
42
+ };
@@ -0,0 +1,2 @@
1
+ import type { WorkspaceApp } from './types';
2
+ export declare function createZeropsYaml(scope: string, apps: WorkspaceApp[]): string;
package/package.json CHANGED
@@ -21,7 +21,7 @@
21
21
  "engines": {
22
22
  "node": ">=20"
23
23
  },
24
- "version": "3.5.0-ultramodern.3",
24
+ "version": "3.5.0-ultramodern.30",
25
25
  "types": "./dist/types/index.d.ts",
26
26
  "main": "./dist/esm-node/index.js",
27
27
  "bin": {
@@ -77,7 +77,7 @@
77
77
  "@modern-js/codesmith": "2.6.9",
78
78
  "oxfmt": "0.56.0",
79
79
  "ultracite": "7.8.3",
80
- "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.5.0-ultramodern.3"
80
+ "@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.5.0-ultramodern.30"
81
81
  },
82
82
  "devDependencies": {
83
83
  "@rslib/core": "0.23.1",
@@ -99,6 +99,6 @@
99
99
  "test": "rm -rf dist && rslib build -c rslibconfig.mts && rstest --passWithNoTests"
100
100
  },
101
101
  "ultramodern": {
102
- "frameworkVersion": "3.5.0-ultramodern.3"
102
+ "frameworkVersion": "3.5.0-ultramodern.30"
103
103
  }
104
104
  }
@@ -1,8 +1,12 @@
1
1
  node_modules/
2
2
  dist/
3
+ dist-cloudflare/
3
4
  build/
4
5
  .modernjs/cache/
5
6
  .modern-js/
6
7
  **/.modern-js/
8
+ .mf/
9
+ **/.mf/
7
10
  .modernjs/agent-reference-repos-tmp/
8
11
  .codex/reports/
12
+ .zerops/runtime/
@@ -117,19 +117,21 @@ regenerating or updating the workspace.
117
117
  | `ULTRAMODERN_ASSET_PREFIX` | UltraModern compatibility asset prefix | Modern/Rspack-emitted asset URLs when `MODERN_ASSET_PREFIX` is unset |
118
118
  | `ULTRAMODERN_PUBLIC_URL_<APP_ID>` | Per-app deployment/proof URL | Cloudflare proof inputs and Module Federation remote URLs |
119
119
 
120
- Asset URLs use this precedence: `MODERN_ASSET_PREFIX` →
121
- `ULTRAMODERN_ASSET_PREFIX` → origin-relative `/`. `MODERN_PUBLIC_SITE_URL` is
122
- canonical/SEO-only and must not be used as an asset-prefix fallback.
120
+ Shell asset URLs use this precedence: `MODERN_ASSET_PREFIX` →
121
+ `ULTRAMODERN_ASSET_PREFIX` → origin-relative `/`. Module Federation remotes use
122
+ the same env precedence, then fall back to their per-app public origin:
123
+ configured public URL, inferred workers.dev URL, or local dev port.
124
+ `MODERN_PUBLIC_SITE_URL` is canonical/SEO-only and must not be used as an
125
+ asset-prefix fallback.
123
126
  SEO output uses `MODERN_PUBLIC_SITE_URL`; if it is unset, generated local and
124
127
  preview outputs remain non-public until deployment proof provides explicit
125
128
  public URLs.
126
129
 
127
- Without public URLs configured, asset paths are origin-relative (`/`), and the
128
- dev server uses `dev.assetPrefix: '/'` so apps work through tunnels and
129
- reverse proxies (ngrok, cloudflared) without triggering Chrome's Local Network
130
- Access prompt or mixed-content errors. Shell-only workspaces can set
131
- `MODERN_PUBLIC_SITE_URL` for SEO output without changing where assets load
132
- from.
130
+ Without public URLs configured, shell asset paths are origin-relative (`/`).
131
+ Remote dev manifests publish their own local origin so host shells load
132
+ `remoteEntry.js` and exposed chunks from the remote dev server. Shell-only
133
+ workspaces can set `MODERN_PUBLIC_SITE_URL` for SEO output without changing
134
+ where assets load from.
133
135
 
134
136
  ## Cloudflare Proof
135
137
 
@@ -144,7 +146,7 @@ pattern with hyphens converted to underscores and uppercased.
144
146
  ```bash
145
147
  pnpm cloudflare:deploy
146
148
  ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP=https://shell-super-app.example.workers.dev \
147
- pnpm cloudflare:proof -- --require-public-urls
149
+ pnpm cloudflare:proof --require-public-urls
148
150
  ```
149
151
 
150
152
  ## Strict Effect API
@@ -169,15 +171,16 @@ in API modules.
169
171
  Generated pnpm overrides pin the framework-compatible Effect cohort. Keep
170
172
  `effect` and `@effect/vitest` aligned with `pnpm-workspace.yaml`; do not add
171
173
  new direct package-level Effect versions unless the whole UltraModern cohort is
172
- upgraded. The generated pnpm trust policy intentionally excludes the matching
173
- `@effect/opentelemetry` cohort package from no-downgrade checks while Effect's
174
- beta publishes move from trusted-publisher metadata to provenance attestations.
174
+ upgraded. The generated pnpm policy intentionally excludes the matching
175
+ `effect` and `@effect/opentelemetry` cohort versions from the
176
+ minimum-release-age and no-downgrade checks while Effect's beta publishes move
177
+ from trusted-publisher metadata to provenance attestations.
175
178
 
176
179
  For older generated workspaces, run the framework migration command first:
177
180
 
178
181
  ```bash
179
- pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.3 ultramodern \
180
- migrate-strict-effect --version 3.5.0-ultramodern.3
182
+ pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.10 ultramodern \
183
+ migrate-strict-effect --version 3.5.0-ultramodern.10
181
184
  pnpm api:check
182
185
  pnpm contract:check
183
186
  ```