@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,6 +1,7 @@
1
1
  import node_fs from "node:fs";
2
- import { createApiClient, createApiServiceEntry, createSharedApi, createShellApiClient } from "./api.js";
2
+ import { createApiClient, createApiServiceEntry, createBackendEffectApiExpose, createSharedApi, createShellApiClient } from "./api.js";
3
3
  import { createAppEnvDts, createAppRuntimeConfig, createAppStyles, createPostcssConfig, createSharedDesignTokensCss, createShellFrameComponent, createTailwindConfig } from "./app-files.js";
4
+ import { createBackendFederationContractFile } from "./backend-federation.js";
4
5
  import { normalizeUltramodernBridgeConfig } from "./bridge-config.js";
5
6
  import { createDevelopmentOverlay, createOwnership, createTopology, createUltramodernConfig } from "./contracts.js";
6
7
  import { createLayout, createRemoteEntry, createRemoteExposeComponent, createRemotePage, createShellPage, createShellRemoteComponents, remoteComponentOutputPath } from "./demo-components.js";
@@ -8,14 +9,15 @@ import { ULTRAMODERN_CONFIG_PATH, appHasApi, appI18nNamespace, createShellHost,
8
9
  import { copyRootTemplate, formatGeneratedWorkspaceFiles, writeFile, writeFileReplacing, writeJson } from "./fs-io.js";
9
10
  import { createFileSnapshot, createGenerationResult, diffFileSnapshots } from "./generation-result.js";
10
11
  import { createAppPublicLocaleMessages } from "./locales.js";
11
- import { createAppModernConfig, createRemoteModuleFederationConfig, createShellModuleFederationConfig, createUltramodernBuildModule, createUltramodernBuildReexportModule } from "./module-federation.js";
12
+ import { createAppModernConfig, createBackendModuleFederationConfig, createRemoteModuleFederationConfig, createShellModuleFederationConfig, createUltramodernBuildModule, createUltramodernBuildReexportModule } from "./module-federation.js";
12
13
  import { assertUniqueTailwindPrefixes, toPackageScope } from "./naming.js";
13
14
  import { runCodeSmithOverlays } from "./overlays.js";
14
15
  import { createAppMfTypesTsConfig, createAppPackage, createAppTsConfig, createRootPackageJson, createRootTsConfig, createSharedContractsIndex, createSharedPackage, createSharedPackageTsConfig, createTsConfigBase } from "./package-json.js";
15
16
  import { resolvePackageSource } from "./package-source.js";
16
17
  import { createPublicWebAppArtifacts } from "./public-surface.js";
17
- 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";
18
+ 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";
18
19
  import { writeGeneratedWorkspaceScripts } from "./workspace-scripts.js";
20
+ import { createZeropsYaml } from "./zerops.js";
19
21
  function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes = [], bridge) {
20
22
  const resolvedApp = 'shell' === app.kind ? createShellHost(remotes) : app;
21
23
  const publicWeb = createPublicWebAppArtifacts(resolvedApp);
@@ -31,7 +33,7 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes
31
33
  writeFile(targetDir, publicWeb.jsonLdHelperFile.path, publicWeb.jsonLdHelperFile.content);
32
34
  writeFile(targetDir, publicWeb.routeMetadataFile.path, publicWeb.routeMetadataFile.content);
33
35
  writeFile(targetDir, publicWeb.routeHeadFile.path, publicWeb.routeHeadFile.content);
34
- writeFile(targetDir, `${resolvedApp.directory}/modern.config.ts`, createAppModernConfig(scope, resolvedApp));
36
+ writeFile(targetDir, `${resolvedApp.directory}/modern.config.ts`, createAppModernConfig(scope, resolvedApp, remotes));
35
37
  writeFile(targetDir, `${resolvedApp.directory}/src/modern.runtime.ts`, createAppRuntimeConfig(resolvedApp, scope, remotes));
36
38
  writeJson(targetDir, `${resolvedApp.directory}/locales/en/translation.json`, createAppPublicLocaleMessages(resolvedApp, 'en', remotes));
37
39
  writeJson(targetDir, `${resolvedApp.directory}/locales/en/${appI18nNamespace(resolvedApp)}.json`, createAppPublicLocaleMessages(resolvedApp, 'en', remotes));
@@ -43,6 +45,7 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes
43
45
  writeFile(targetDir, `${resolvedApp.directory}/tailwind.config.ts`, createTailwindConfig());
44
46
  }
45
47
  writeFile(targetDir, `${resolvedApp.directory}/module-federation.config.ts`, 'shell' === resolvedApp.kind ? createShellModuleFederationConfig(scope, remotes) : createRemoteModuleFederationConfig(scope, resolvedApp, remotes));
48
+ if (appHasApi(resolvedApp)) writeFile(targetDir, `${resolvedApp.directory}/backend-federation.config.ts`, createBackendModuleFederationConfig(resolvedApp));
46
49
  writeAppFile('src/routes/layout.tsx', createLayout(resolvedApp.id));
47
50
  writeAppFile('src/routes/[lang]/page.tsx', 'shell' === resolvedApp.kind ? createShellPage(remotes) : createRemotePage(resolvedApp));
48
51
  for (const generatedFile of publicWeb.routeMetaFiles)writeFile(targetDir, generatedFile.path, generatedFile.content);
@@ -55,6 +58,8 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind, remotes
55
58
  if (appHasApi(resolvedApp)) {
56
59
  writeFile(targetDir, `${resolvedApp.directory}/shared/api.ts`, createSharedApi(resolvedApp));
57
60
  writeFile(targetDir, `${resolvedApp.directory}/api/index.ts`, createApiServiceEntry(resolvedApp, '../shared/api.ts'));
61
+ writeFile(targetDir, `${resolvedApp.directory}/api/backend-federation.ts`, createBackendFederationContractFile(resolvedApp));
62
+ writeFile(targetDir, `${resolvedApp.directory}/api/effect-api.ts`, createBackendEffectApiExpose(scope, resolvedApp));
58
63
  writeFile(targetDir, `${resolvedApp.directory}/src/api/${resolvedApp.api.stem}-client.ts`, createApiClient(resolvedApp, '../../shared/api'));
59
64
  }
60
65
  if ('vertical' === resolvedApp.kind) {
@@ -104,7 +109,7 @@ function writePnpmWorkspacePackages(targetDir, bridge) {
104
109
  ...bridge.workspacePackages.map((entry)=>entry.pattern)
105
110
  ];
106
111
  const renderedPackages = packages.map((pattern)=>` - ${pattern}`).join('\n');
107
- writeFileReplacing(targetDir, 'pnpm-workspace.yaml', pnpmWorkspace.replace(/^packages:\n(?: {2}- .+\n)+/u, `packages:\n${renderedPackages}\n`));
112
+ writeFileReplacing(targetDir, 'pnpm-workspace.yaml', pnpmWorkspace.replace(/^packages:\r?\n(?: {2}- .+\r?\n)+/u, `packages:\n${renderedPackages}\n`));
108
113
  }
109
114
  function generateUltramodernWorkspace(options) {
110
115
  const beforeFiles = createFileSnapshot(options.targetDir);
@@ -130,8 +135,10 @@ function generateUltramodernWorkspace(options) {
130
135
  nodeVersion: NODE_VERSION,
131
136
  pnpmVersion: PNPM_VERSION,
132
137
  nodeFetchVersion: NODE_FETCH_VERSION,
138
+ drizzleOrmVersion: DRIZZLE_ORM_VERSION,
133
139
  effectVersion: EFFECT_VERSION,
134
140
  effectVitestVersion: EFFECT_VITEST_VERSION,
141
+ moduleFederationVersion: MODULE_FEDERATION_VERSION,
135
142
  tanstackRouterCoreVersion: TANSTACK_ROUTER_CORE_VERSION,
136
143
  tanstackRouterVersion: TANSTACK_ROUTER_VERSION,
137
144
  typescriptVersion: TYPESCRIPT_VERSION,
@@ -139,11 +146,12 @@ function generateUltramodernWorkspace(options) {
139
146
  });
140
147
  writePnpmWorkspacePackages(options.targetDir, bridge);
141
148
  writeJson(options.targetDir, 'package.json', createCompactRootPackageJson(scope, packageSource, initialVerticals, bridge));
149
+ writeFile(options.targetDir, 'zerops.yaml', `${createZeropsYaml(scope, createdApps)}\n`);
142
150
  writeJson(options.targetDir, 'tsconfig.base.json', createTsConfigBase());
143
151
  writeJson(options.targetDir, 'tsconfig.json', createRootTsConfig(createdApps));
144
152
  writeJson(options.targetDir, 'topology/reference-topology.json', createTopology(scope, initialVerticals));
145
153
  writeJson(options.targetDir, 'topology/ownership.json', createOwnership(scope, initialVerticals));
146
- writeJson(options.targetDir, 'topology/local-overlays/development.json', createDevelopmentOverlay(initialVerticals));
154
+ writeJson(options.targetDir, 'topology/local-overlays/development.json', createDevelopmentOverlay(scope, initialVerticals));
147
155
  writeJson(options.targetDir, ULTRAMODERN_CONFIG_PATH, createCompactUltramodernConfig(scope, options.modernVersion, packageSource, createdApps, enableTailwind, bridge));
148
156
  writeApp(options.targetDir, scope, shellApp, packageSource, enableTailwind, initialVerticals, bridge);
149
157
  for (const remote of initialVerticals)writeApp(options.targetDir, scope, remote, packageSource, enableTailwind, initialVerticals, bridge);
@@ -0,0 +1,62 @@
1
+ import { appHasApi, resolveApiPrefix, resolveApiStem } from "./descriptors.js";
2
+ import { packageName } from "./naming.js";
3
+ import { NODE_VERSION } from "./versions.js";
4
+ const zeropsNodeRuntime = `nodejs@${NODE_VERSION.split('.')[0]}`;
5
+ function quoteYamlString(value) {
6
+ return `'${value.replace(/'/gu, "''")}'`;
7
+ }
8
+ function readinessPath(app) {
9
+ if (!appHasApi(app)) return '/';
10
+ return `${resolveApiPrefix(app)}/${resolveApiStem(app)}/readiness`;
11
+ }
12
+ function createZeropsService(scope, app) {
13
+ const runtimeDirectory = `.zerops/runtime/${app.id}`;
14
+ const appPackageName = packageName(scope, app.packageSuffix);
15
+ const commands = [
16
+ 'curl https://mise.run | sh',
17
+ '~/.local/bin/mise install',
18
+ '~/.local/bin/mise exec -- pnpm install --frozen-lockfile',
19
+ `~/.local/bin/mise exec -- pnpm --filter ${appPackageName} run build`,
20
+ `~/.local/bin/mise exec -- pnpm run zerops:materialize -- --app ${app.id} --package ${appPackageName} --package-dir ${app.directory}`,
21
+ `cp topology/reference-topology.json ${runtimeDirectory}/topology.json`,
22
+ `cp topology/local-overlays/development.json ${runtimeDirectory}/local-overlay.json`
23
+ ];
24
+ return [
25
+ ` - setup: ${app.id}`,
26
+ ' build:',
27
+ ` base: ${zeropsNodeRuntime}`,
28
+ ' buildCommands:',
29
+ ' - |',
30
+ ...commands.map((command)=>` ${command}`),
31
+ ' deployFiles:',
32
+ ` - ${runtimeDirectory}`,
33
+ ' deploy:',
34
+ ' temporaryShutdown: false',
35
+ ' readinessCheck:',
36
+ ' httpGet:',
37
+ ` port: ${app.port}`,
38
+ ` path: ${readinessPath(app)}`,
39
+ ' failureTimeout: 120',
40
+ ' retryPeriod: 10',
41
+ ' run:',
42
+ ` base: ${zeropsNodeRuntime}`,
43
+ ' ports:',
44
+ ` - port: ${app.port}`,
45
+ ' protocol: TCP',
46
+ ' httpSupport: true',
47
+ ' envVariables:',
48
+ ' NODE_ENV: production',
49
+ ` ${app.portEnv}: ${quoteYamlString(String(app.port))}`,
50
+ ` ULTRAMODERN_ZEROPS_SERVICE: ${quoteYamlString(app.id)}`,
51
+ ` start: cd ${runtimeDirectory} && npm run serve`
52
+ ].join('\n');
53
+ }
54
+ function createZeropsYaml(scope, apps) {
55
+ return [
56
+ '# Generated by Modern.js UltraModern workspace tooling.',
57
+ '# Zerops runs each full-stack MicroVertical as a package-owned Node service.',
58
+ 'zerops:',
59
+ ...apps.map((app)=>createZeropsService(scope, app))
60
+ ].join('\n\n');
61
+ }
62
+ export { createZeropsYaml };