@bleedingdev/modern-js-create 3.4.0-ultramodern.9 → 3.5.0-ultramodern.1

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 (135) hide show
  1. package/README.md +49 -23
  2. package/dist/cjs/index.cjs +37 -4
  3. package/dist/cjs/locale/en.cjs +12 -2
  4. package/dist/cjs/locale/zh.cjs +12 -2
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +431 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +87 -75
  8. package/dist/cjs/ultramodern-workspace/{effect-api.cjs → api.cjs} +207 -208
  9. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  10. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  11. package/dist/cjs/ultramodern-workspace/contracts.cjs +128 -657
  12. package/dist/cjs/ultramodern-workspace/demo-components.cjs +12 -12
  13. package/dist/cjs/ultramodern-workspace/descriptors.cjs +25 -25
  14. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  15. package/dist/cjs/ultramodern-workspace/generation-result.cjs +5 -5
  16. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  17. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +571 -0
  18. package/dist/cjs/ultramodern-workspace/module-federation.cjs +39 -12
  19. package/dist/cjs/ultramodern-workspace/overlays.cjs +2 -2
  20. package/dist/cjs/ultramodern-workspace/package-json.cjs +58 -41
  21. package/dist/cjs/ultramodern-workspace/policy.cjs +4 -4
  22. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  23. package/dist/cjs/ultramodern-workspace/public-surface.cjs +2 -2
  24. package/dist/cjs/ultramodern-workspace/versions.cjs +15 -0
  25. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +120 -50
  26. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +64 -21
  27. package/dist/esm/index.js +37 -4
  28. package/dist/esm/locale/en.js +12 -2
  29. package/dist/esm/locale/zh.js +12 -2
  30. package/dist/esm/ultramodern-tooling/commands.js +378 -0
  31. package/dist/esm/ultramodern-tooling/config.js +120 -0
  32. package/dist/esm/ultramodern-workspace/add-vertical.js +88 -79
  33. package/dist/esm/ultramodern-workspace/{effect-api.js → api.js} +146 -147
  34. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  35. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  36. package/dist/esm/ultramodern-workspace/contracts.js +130 -611
  37. package/dist/esm/ultramodern-workspace/demo-components.js +13 -13
  38. package/dist/esm/ultramodern-workspace/descriptors.js +11 -11
  39. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  40. package/dist/esm/ultramodern-workspace/generation-result.js +6 -6
  41. package/dist/esm/ultramodern-workspace/index.js +1 -0
  42. package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
  43. package/dist/esm/ultramodern-workspace/module-federation.js +40 -13
  44. package/dist/esm/ultramodern-workspace/overlays.js +2 -2
  45. package/dist/esm/ultramodern-workspace/package-json.js +57 -40
  46. package/dist/esm/ultramodern-workspace/policy.js +5 -5
  47. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  48. package/dist/esm/ultramodern-workspace/public-surface.js +2 -2
  49. package/dist/esm/ultramodern-workspace/versions.js +7 -1
  50. package/dist/esm/ultramodern-workspace/workspace-scripts.js +108 -34
  51. package/dist/esm/ultramodern-workspace/write-workspace.js +66 -26
  52. package/dist/esm-node/index.js +37 -4
  53. package/dist/esm-node/locale/en.js +12 -2
  54. package/dist/esm-node/locale/zh.js +12 -2
  55. package/dist/esm-node/ultramodern-tooling/commands.js +379 -0
  56. package/dist/esm-node/ultramodern-tooling/config.js +121 -0
  57. package/dist/esm-node/ultramodern-workspace/add-vertical.js +88 -79
  58. package/dist/esm-node/ultramodern-workspace/{effect-api.js → api.js} +146 -147
  59. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  60. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  61. package/dist/esm-node/ultramodern-workspace/contracts.js +130 -611
  62. package/dist/esm-node/ultramodern-workspace/demo-components.js +13 -13
  63. package/dist/esm-node/ultramodern-workspace/descriptors.js +11 -11
  64. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  65. package/dist/esm-node/ultramodern-workspace/generation-result.js +6 -6
  66. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  67. package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
  68. package/dist/esm-node/ultramodern-workspace/module-federation.js +40 -13
  69. package/dist/esm-node/ultramodern-workspace/overlays.js +2 -2
  70. package/dist/esm-node/ultramodern-workspace/package-json.js +57 -40
  71. package/dist/esm-node/ultramodern-workspace/policy.js +5 -5
  72. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  73. package/dist/esm-node/ultramodern-workspace/public-surface.js +2 -2
  74. package/dist/esm-node/ultramodern-workspace/versions.js +7 -1
  75. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +108 -34
  76. package/dist/esm-node/ultramodern-workspace/write-workspace.js +66 -26
  77. package/dist/types/locale/en.d.ts +10 -0
  78. package/dist/types/locale/index.d.ts +20 -0
  79. package/dist/types/locale/zh.d.ts +10 -0
  80. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  81. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  82. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  83. package/dist/types/ultramodern-workspace/api.d.ts +73 -0
  84. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  85. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  86. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  87. package/dist/types/ultramodern-workspace/descriptors.d.ts +10 -10
  88. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  89. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  90. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  91. package/dist/types/ultramodern-workspace/package-json.d.ts +5 -4
  92. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  93. package/dist/types/ultramodern-workspace/types.d.ts +9 -7
  94. package/dist/types/ultramodern-workspace/versions.d.ts +6 -0
  95. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
  96. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  97. package/package.json +5 -3
  98. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  99. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +2 -0
  100. package/template-workspace/.gitignore.handlebars +3 -0
  101. package/template-workspace/AGENTS.md.handlebars +11 -5
  102. package/template-workspace/README.md.handlebars +55 -13
  103. package/template-workspace/oxfmt.config.ts +1 -0
  104. package/template-workspace/oxlint.config.ts +1 -0
  105. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
  106. package/template-workspace/pnpm-workspace.yaml.handlebars +7 -0
  107. package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
  108. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +51 -8
  109. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +366 -0
  110. package/templates/workspace-scripts/{check-ultramodern-i18n-boundaries.mjs → check-ultramodern-i18n-boundaries.mts} +1 -1
  111. package/templates/workspace-scripts/generate-public-surface-assets.mjs +246 -9
  112. package/templates/workspace-scripts/proof-cloudflare-version.mjs +277 -9
  113. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
  114. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +165 -2
  115. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  116. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +842 -84
  117. package/dist/types/ultramodern-workspace/effect-api.d.ts +0 -73
  118. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  119. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  120. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  121. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  122. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  123. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  124. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  125. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  126. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  127. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  128. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  129. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  130. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  131. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  132. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  133. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  134. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  135. /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
@@ -1,33 +1,9 @@
1
1
  import "node:module";
2
- import { ULTRAMODERN_WORKSPACE_MODERN_PACKAGES, WORKSPACE_PACKAGE_VERSION, createModernPackagesMetadata, modernPackageVersion } from "../ultramodern-package-source.js";
3
- import { appHasEffectApi, appI18nNamespace, createCloudflarePublicUrlEnv, createCloudflareWorkerName, createModuleFederationRemoteContracts, createShellHost, effectApiPrefix, sharedPackages, shellApp, verticalEffectApps } from "./descriptors.js";
4
- import { createEffectDomainOperations, createEffectOperationContract, createEffectReadinessContract, createEffectRequestContextContract, effectApiTopologyMetadata } from "./effect-api.js";
5
- import { fileTemplatesDir, hashTemplateTree, workspaceTemplateDir } from "./fs-io.js";
6
- import { createBuildMarker } from "./module-federation.js";
7
- import { createRspackChunkLoadingGlobal, createRspackUniqueName, packageName, tailwindPrefixForApp } from "./naming.js";
8
- import { createCloudflareDeployContract, createCloudflareSecurityContract } from "./policy.js";
9
- import { createPublicWebAppArtifacts } from "./public-surface.js";
10
- import { createLocalisedUrlsMap, createPublicRouteMetadata, createRouteOwnedI18nPaths } from "./routes.js";
11
- import { CLOUDFLARE_COMPATIBILITY_DATE, I18NEXT_VERSION, MODULE_FEDERATION_AGENT_SKILLS_COMMIT, MODULE_FEDERATION_VERSION, NODE_VERSION, PNPM_VERSION, RSTACK_AGENT_SKILLS_COMMIT, TANSTACK_ROUTER_VERSION, TYPESCRIPT_NATIVE_PREVIEW_VERSION, TYPESCRIPT_VERSION, WRANGLER_VERSION, ZEPHYR_AGENT_VERSION, ZEPHYR_RSPACK_PLUGIN_VERSION } from "./versions.js";
12
- const baselineAgentSkills = [
13
- 'rsbuild-best-practices',
14
- 'rspack-best-practices',
15
- 'rspack-tracing',
16
- 'rsdoctor-analysis',
17
- 'rslib-best-practices',
18
- 'rslib-modern-package',
19
- 'rstest-best-practices'
20
- ];
21
- const moduleFederationAgentSkills = [
22
- 'mf'
23
- ];
24
- const privateAgentSkills = [
25
- 'plan-graph',
26
- 'dag',
27
- 'subagent-graph',
28
- 'helm',
29
- 'debugger-mode'
30
- ];
2
+ import { apiTopologyMetadata } from "./api.js";
3
+ import { createModuleFederationRemoteContracts, createShellHost, resolveApiPrefix, sharedPackages, shellApp, verticalApiApps } from "./descriptors.js";
4
+ import { packageName } from "./naming.js";
5
+ import { createCloudflareDeployContract } from "./policy.js";
6
+ import { CLOUDFLARE_COMPATIBILITY_DATE, NODE_VERSION, PNPM_VERSION } from "./versions.js";
31
7
  function createTopology(scope, remotes = []) {
32
8
  const shellHost = createShellHost(remotes);
33
9
  return {
@@ -69,8 +45,8 @@ function createTopology(scope, remotes = []) {
69
45
  fallbackTelemetryEvent: 'modernjs:mv-runtime-parity',
70
46
  sharedContractVersion: 'mf-ssr-contract-v1'
71
47
  },
72
- ...effectApiTopologyMetadata(vertical) ? {
73
- api: effectApiTopologyMetadata(vertical)
48
+ ...apiTopologyMetadata(vertical) ? {
49
+ api: apiTopologyMetadata(vertical)
74
50
  } : {},
75
51
  cloudflare: createCloudflareDeployContract(scope, vertical),
76
52
  ownership: vertical.ownership
@@ -82,9 +58,10 @@ function createTopology(scope, remotes = []) {
82
58
  description: sharedPackage.description
83
59
  })),
84
60
  validation: {
85
- script: "scripts/validate-ultramodern-workspace.mjs",
61
+ script: "scripts/validate-ultramodern-workspace.mts",
86
62
  commands: [
87
63
  'pnpm i18n:boundaries',
64
+ 'pnpm api:check',
88
65
  'pnpm contract:check'
89
66
  ]
90
67
  }
@@ -139,608 +116,150 @@ function createDevelopmentOverlay(remotes = []) {
139
116
  remote.id,
140
117
  `http://localhost:${remote.port}/mf-manifest.json`
141
118
  ])),
142
- apis: Object.fromEntries(verticalEffectApps(remotes).map((app)=>[
119
+ apis: Object.fromEntries(verticalApiApps(remotes).map((app)=>[
143
120
  app.id,
144
- `http://localhost:${app.port}${effectApiPrefix(app)}`
121
+ `http://localhost:${app.port}${resolveApiPrefix(app)}`
145
122
  ]))
146
123
  };
147
124
  }
148
- function createPackageSourceMetadata(scope, packageSource) {
149
- return {
150
- schemaVersion: 1,
151
- strategy: packageSource.strategy,
152
- modernPackages: createModernPackagesMetadata(ULTRAMODERN_WORKSPACE_MODERN_PACKAGES, packageSource),
153
- generatedWorkspacePackages: {
154
- packages: sharedPackages.map((sharedPackage)=>packageName(scope, sharedPackage.id)),
155
- specifier: WORKSPACE_PACKAGE_VERSION
156
- },
157
- validation: {
158
- validator: "scripts/validate-ultramodern-workspace.mjs",
159
- strategyAwareChecks: [
160
- 'generated-validator'
161
- ]
162
- }
163
- };
164
- }
165
- function createAppConfigContract(app) {
166
- return {
167
- preset: 'presetUltramodern',
168
- plugins: [
169
- 'appTools',
170
- 'tanstackRouterPlugin',
171
- 'i18nPlugin',
172
- ...appHasEffectApi(app) ? [
173
- 'bffPlugin'
174
- ] : [],
175
- 'moduleFederationPlugin',
176
- 'zephyrRspackPlugin'
177
- ],
178
- dev: {
179
- assetPrefix: '/'
180
- },
181
- output: {
182
- assetPrefix: {
183
- envFallbackOrder: [
184
- 'MODERN_ASSET_PREFIX',
185
- 'ULTRAMODERN_ASSET_PREFIX'
186
- ],
187
- default: '/'
188
- },
189
- disableTsChecker: false,
190
- distPath: {
191
- html: './'
192
- },
193
- polyfill: 'off',
194
- splitRouteChunks: true
195
- },
196
- performance: {
197
- readinessDiagnostics: {
198
- default: 'enabled',
199
- optOut: {
200
- env: 'ULTRAMODERN_PERFORMANCE_READINESS_DIAGNOSTICS=false',
201
- config: "scripts/ultramodern-performance-readiness.config.mjs"
202
- },
203
- report: '.codex/reports/performance-readiness/ultramodern-performance-readiness.json',
204
- failOn: 'framework-invariant'
205
- },
206
- rsdoctor: {
207
- enabledByEnv: 'ULTRAMODERN_RSDOCTOR=true',
208
- disableClientServer: true
209
- }
210
- },
211
- rspack: {
212
- output: {
213
- uniqueName: createRspackUniqueName(app),
214
- chunkLoadingGlobal: createRspackChunkLoadingGlobal(app)
215
- }
216
- },
217
- html: {
218
- outputStructure: 'flat'
219
- },
220
- source: {
221
- mainEntryName: 'index',
222
- siteUrl: {
223
- envFallbackOrder: [
224
- 'MODERN_PUBLIC_SITE_URL',
225
- createCloudflarePublicUrlEnv(app),
226
- 'ULTRAMODERN_CLOUDFLARE_WORKERS_DEV_SUBDOMAIN',
227
- app.portEnv
228
- ],
229
- defaultLocalhostPort: app.port
230
- },
231
- siteUrlGlobal: 'ULTRAMODERN_SITE_URL'
232
- },
233
- ...appHasEffectApi(app) ? {
234
- bff: {
235
- runtimeFramework: 'effect',
236
- prefix: app.effectApi.prefix,
237
- openapi: '/openapi.json'
238
- }
239
- } : {}
240
- };
241
- }
242
- function createPerformanceReadinessContract() {
125
+ function createUltramodernConfig(scope, modernVersion, packageSource, apps = [
126
+ createShellHost()
127
+ ], enableTailwind = true, bridge) {
128
+ const remotes = apps.filter((app)=>'shell' !== app.kind);
129
+ const shellHost = createShellHost(remotes);
243
130
  return {
244
131
  schemaVersion: 1,
245
- default: 'enabled',
246
- mode: 'diagnostic',
247
- scope: 'ultramodern-generated-and-framework-owned',
248
- report: {
249
- script: "scripts/ultramodern-performance-readiness.mjs",
250
- config: "scripts/ultramodern-performance-readiness.config.mjs",
251
- defaultPath: '.codex/reports/performance-readiness/ultramodern-performance-readiness.json',
252
- deterministic: true
253
- },
254
- optOut: {
255
- env: 'ULTRAMODERN_PERFORMANCE_READINESS_DIAGNOSTICS=false',
256
- config: {
257
- path: "scripts/ultramodern-performance-readiness.config.mjs",
258
- field: 'enabled',
259
- value: false
260
- }
261
- },
262
- failurePolicy: {
263
- defaultFailOn: 'framework-invariant',
264
- allowedValues: [
265
- 'framework-invariant',
266
- 'never'
267
- ],
268
- rejects: [
269
- 'accessibility-certification',
270
- 'product-ui-scoring',
271
- 'marketing-copy-scoring',
272
- 'broad-compliance-engine',
273
- 'rsdoctor-artifact-revival'
274
- ]
132
+ profile: 'cloudflare-ssr-mf-effect-v1',
133
+ generator: {
134
+ package: '@modern-js/create',
135
+ version: modernVersion
275
136
  },
276
- signals: [
277
- {
278
- id: 'bfcache',
279
- title: 'BFCache diagnostics',
280
- ownedCheck: 'generated-runtime-static-analysis',
281
- invariant: 'Generated UltraModern files must not install beforeunload or unload handlers.'
282
- },
283
- {
284
- id: 'core-web-vitals-rum',
285
- title: 'Core Web Vitals/RUM readiness',
286
- ownedCheck: 'preset-telemetry-contract',
287
- invariant: 'UltraModern preset telemetry must remain enabled by default without requiring local collectors.'
137
+ workspace: {
138
+ packageScope: scope,
139
+ packageManager: {
140
+ name: 'pnpm',
141
+ version: PNPM_VERSION
288
142
  },
289
- {
290
- id: 'duplicate-prefetch-warmup',
291
- title: 'Duplicate prefetch/warmup waste',
292
- ownedCheck: 'topology-and-route-contract',
293
- invariant: 'Generated route URLs, remote refs, and manifest URLs must stay deterministic and duplicate-free.'
294
- },
295
- {
296
- id: 'cache-policy-sanity',
297
- title: 'Cache policy sanity',
298
- ownedCheck: 'generated-cloudflare-contract',
299
- invariant: 'Generated Cloudflare contracts must retain CSS cache-control and public-surface cache expectations.'
300
- },
301
- {
302
- id: 'save-data-behavior',
303
- title: 'Save-Data behavior',
304
- ownedCheck: 'framework-router-contract',
305
- invariant: 'Automatic framework warmup must remain skippable by browser Save-Data policy.'
306
- },
307
- {
308
- id: 'cloudflare-ssr-cache-hints',
309
- title: 'Cloudflare SSR response and caching hints',
310
- ownedCheck: 'generated-cloudflare-proof-contract',
311
- invariant: 'Generated Cloudflare SSR proof routes and response/cache hint contracts must be present.'
143
+ node: {
144
+ version: NODE_VERSION,
145
+ engineRange: '>=26'
312
146
  }
313
- ]
314
- };
315
- }
316
- function cssLayerName(app) {
317
- if ('shell' === app.kind) return 'ultramodern-shell-base';
318
- return `ultramodern-vertical-${app.domain ?? app.id}`;
319
- }
320
- function cssRole(app) {
321
- if ('shell' === app.kind) return 'shell-base-overlay';
322
- return 'vertical-css';
323
- }
324
- function cssClassPrefix(app) {
325
- return `${tailwindPrefixForApp(app)}:`;
326
- }
327
- function createCssDedupeContract(scope) {
328
- return {
329
- strategy: 'shared-token-package-plus-css-content-hash',
330
- sharedPackage: packageName(scope, 'shared-design-tokens'),
331
- sharedLayers: [
332
- 'ultramodern-shared-tokens'
333
- ],
334
- runtimeLoad: 'once-per-content-hash',
335
- duplicateBaseStylesAllowed: false
336
- };
337
- }
338
- function createCssSsrContract(app) {
339
- return {
340
- cloudflare: true,
341
- firstPaintRequired: true,
342
- linkEmission: 'modern-ssr-css-assets',
343
- verticalCss: 'shell' === app.kind ? 'host-preloads-shell-and-shared-css' : 'federated-manifest-owned-css'
344
- };
345
- }
346
- function createAppCssFederationContract(scope, app) {
347
- const ownedLayers = 'shell' === app.kind ? [
348
- 'ultramodern-shell-base',
349
- 'ultramodern-shell-overlay'
350
- ] : [
351
- cssLayerName(app)
352
- ];
353
- return {
354
- owner: {
355
- id: app.id,
356
- package: packageName(scope, app.packageSuffix),
357
- team: app.ownership.team
358
147
  },
359
- role: cssRole(app),
360
- rootSelector: `[data-app-id="${app.id}"]`,
361
- classPrefix: cssClassPrefix(app),
362
- layers: {
363
- shared: [
364
- 'ultramodern-shared-tokens'
365
- ],
366
- owned: ownedLayers,
367
- imports: 'shell' === app.kind ? [
368
- 'ultramodern-shared-tokens'
369
- ] : [
370
- 'ultramodern-shared-tokens'
371
- ]
372
- },
373
- entrypoints: {
374
- layoutImport: 'src/routes/layout.tsx',
375
- css: [
376
- 'src/routes/index.css'
377
- ],
378
- ...'shell' !== app.kind ? {
379
- federationEntry: 'src/federation-entry.tsx'
148
+ packageSource: {
149
+ strategy: packageSource.strategy,
150
+ modernPackageVersion: packageSource.modernPackageVersion,
151
+ ...packageSource.registry ? {
152
+ registry: packageSource.registry
153
+ } : {},
154
+ ...packageSource.aliasScope ? {
155
+ aliasScope: packageSource.aliasScope
156
+ } : {},
157
+ ...packageSource.aliasPackageNamePrefix ? {
158
+ aliasPackageNamePrefix: packageSource.aliasPackageNamePrefix
380
159
  } : {}
381
160
  },
382
- assets: {
383
- shared: [
384
- `${packageName(scope, 'shared-design-tokens')}/tokens.css`
385
- ],
386
- owned: [
387
- 'src/routes/index.css'
388
- ],
389
- emittedBy: 'modern-rspack-css-extraction',
390
- contentHash: true
161
+ features: {
162
+ tailwind: enableTailwind
391
163
  },
392
- dedupe: createCssDedupeContract(scope),
393
- ssr: createCssSsrContract(app)
394
- };
395
- }
396
- function createCssFederationContract(scope) {
397
- return {
398
- schemaVersion: 1,
399
- sharedDesignTokens: {
400
- owner: {
401
- id: 'shared-design-tokens',
402
- package: packageName(scope, 'shared-design-tokens'),
403
- team: 'super-app-platform'
404
- },
405
- role: 'shared-design-tokens',
406
- rootSelector: ':root',
407
- classPrefix: '--um-',
408
- layers: {
409
- owned: [
410
- 'ultramodern-shared-tokens'
411
- ]
412
- },
413
- entrypoints: {
414
- css: [
415
- 'packages/shared-design-tokens/src/tokens.css'
416
- ],
417
- typescript: [
418
- 'packages/shared-design-tokens/src/index.ts'
419
- ]
420
- },
421
- assets: {
422
- exports: [
423
- './tokens.css'
424
- ],
425
- css: [
426
- 'packages/shared-design-tokens/src/tokens.css'
427
- ]
428
- },
429
- dedupe: createCssDedupeContract(scope),
430
- ssr: {
431
- cloudflare: true,
432
- firstPaintRequired: true,
433
- importedByApps: true
434
- }
164
+ topology: {
165
+ source: './topology/reference-topology.json',
166
+ apps: apps.map((app)=>({
167
+ id: app.id,
168
+ kind: app.kind,
169
+ package: packageName(scope, app.packageSuffix),
170
+ packageSuffix: app.packageSuffix,
171
+ displayName: app.displayName,
172
+ path: app.directory,
173
+ ...app.domain ? {
174
+ domain: app.domain
175
+ } : {},
176
+ port: app.port,
177
+ portEnv: app.portEnv,
178
+ moduleFederation: {
179
+ role: 'shell' === app.kind ? 'host' : 'remote',
180
+ name: app.mfName,
181
+ exposes: Object.keys(app.exposes ?? {}),
182
+ ...'shell' === app.kind ? {
183
+ verticalRefs: shellHost.verticalRefs,
184
+ remotes: createModuleFederationRemoteContracts(shellHost, remotes)
185
+ } : app.verticalRefs?.length ? {
186
+ verticalRefs: app.verticalRefs,
187
+ remotes: createModuleFederationRemoteContracts(app, remotes)
188
+ } : {},
189
+ ssr: true,
190
+ dts: {
191
+ compilerInstance: 'tsgo',
192
+ tsConfigPath: './tsconfig.mf-types.json'
193
+ }
194
+ },
195
+ ...app.api ? {
196
+ api: {
197
+ stem: app.api.stem,
198
+ prefix: app.api.prefix,
199
+ consumedBy: app.api.consumedBy
200
+ }
201
+ } : {}
202
+ }))
435
203
  },
436
- ownershipRules: {
437
- shell: [
438
- 'base',
439
- 'overlay'
440
- ],
441
- verticals: [
442
- 'vertical-css'
443
- ],
444
- forbiddenVerticalLayers: [
445
- 'ultramodern-shell-base',
446
- 'ultramodern-shell-overlay'
204
+ bridge: bridge ?? {
205
+ enabled: false,
206
+ workspacePackages: [],
207
+ dependencies: [],
208
+ lockfilePolicy: 'nested',
209
+ gates: [],
210
+ reactSingletons: [
211
+ 'react',
212
+ 'react-dom'
447
213
  ]
448
- }
449
- };
450
- }
451
- function createStylingContract(scope, app, enableTailwind) {
452
- return {
453
- tailwind: enableTailwind,
454
- ...enableTailwind ? {
455
- postcssPlugins: [
456
- '@tailwindcss/postcss'
457
- ],
458
- prefix: tailwindPrefixForApp(app),
459
- source: '..',
460
- sourceMode: 'source(none)'
461
- } : {},
462
- federation: createAppCssFederationContract(scope, app)
463
- };
464
- }
465
- function createAppGeneratedContract(scope, app, apps, enableTailwind) {
466
- const appWithResolvedRefs = 'shell' === app.kind ? {
467
- ...app,
468
- verticalRefs: apps.filter((candidate)=>'shell' !== candidate.kind).map((candidate)=>candidate.id)
469
- } : app;
470
- const publicWeb = createPublicWebAppArtifacts(app);
471
- const consumedRemotes = createModuleFederationRemoteContracts(appWithResolvedRefs, apps);
472
- return {
473
- id: app.id,
474
- package: packageName(scope, app.packageSuffix),
475
- path: app.directory,
476
- kind: app.kind,
477
- config: createAppConfigContract(app),
478
- styling: createStylingContract(scope, app, enableTailwind),
214
+ },
479
215
  deploy: {
480
- target: 'cloudflare',
481
- cloudflare: createCloudflareDeployContract(scope, app),
482
216
  worker: {
483
- compatibilityDate: CLOUDFLARE_COMPATIBILITY_DATE,
484
- name: createCloudflareWorkerName(scope, app),
485
- security: createCloudflareSecurityContract(),
486
- ssr: true
487
- },
488
- output: {
489
- flat: true,
490
- htmlDistPath: './'
491
- }
492
- },
493
- ssr: {
494
- mode: 'string',
495
- moduleFederationAppSSR: true
496
- },
497
- i18n: {
498
- plugin: '@modern-js/plugin-i18n',
499
- backend: {
500
- enabled: true,
501
- loadPath: '/locales/{{lng}}/{{ns}}.json'
502
- },
503
- reactI18next: false,
504
- languages: [
505
- 'en',
506
- 'cs'
507
- ],
508
- fallbackLanguage: 'en',
509
- namespace: appI18nNamespace(app),
510
- namespaces: [
511
- appI18nNamespace(app),
512
- 'translation'
513
- ],
514
- publicDir: [
515
- './locales',
516
- './assets'
517
- ],
518
- localisedUrls: createLocalisedUrlsMap(app),
519
- resourceOwnership: {
520
- ownerAppId: app.id,
521
- source: 'route-owned',
522
- staticJson: `./locales/{lng}/${appI18nNamespace(app)}.json`
523
- }
524
- },
525
- routes: {
526
- source: 'route-owned',
527
- metadataAuthoring: 'colocated-route-meta',
528
- generatedManifest: true,
529
- metadataExport: './src/routes/ultramodern-route-metadata',
530
- localisedUrls: createLocalisedUrlsMap(app),
531
- owned: createRouteOwnedI18nPaths(app),
532
- publicRoutes: createPublicRouteMetadata(app),
533
- privateByDefault: true,
534
- publicnessDefault: 'private-app-screen',
535
- generatedRouteMap: true,
536
- manualOverrides: [],
537
- publicHead: publicWeb.publicHead,
538
- publicSurface: publicWeb.publicSurface
539
- },
540
- moduleFederation: {
541
- name: app.mfName,
542
- ...appWithResolvedRefs.verticalRefs?.length ? {
543
- verticalRefs: appWithResolvedRefs.verticalRefs,
544
- remotes: consumedRemotes
545
- } : {},
546
- exposes: Object.keys(app.exposes ?? {}),
547
- dts: {
548
- compilerInstance: 'tsgo',
549
- displayErrorInTerminal: true,
550
- tsConfigPath: './tsconfig.mf-types.json'
551
- },
552
- browserSafeExposesOnly: true,
553
- zephyrRspackPlugin: ZEPHYR_RSPACK_PLUGIN_VERSION
554
- },
555
- marker: {
556
- appId: app.id,
557
- packageName: packageName(scope, app.packageSuffix),
558
- version: '0.1.0',
559
- build: createBuildMarker(scope, app),
560
- deployProfile: 'cloudflare-ssr-mf-effect-v1',
561
- uiSurface: 'ui',
562
- ...appHasEffectApi(app) ? {
563
- apiSurface: 'effect-bff'
564
- } : {}
565
- },
566
- ...appHasEffectApi(app) ? {
567
- effect: {
568
- runtime: 'effect',
569
- import: '@modern-js/plugin-bff/effect-edge',
570
- prefix: app.effectApi.prefix,
571
- openapi: '/openapi.json',
572
- workerEntry: 'worker/__modern_bff_effect.js',
573
- contract: './shared/effect/api',
574
- client: './effect/client',
575
- readiness: createEffectReadinessContract(app),
576
- requestContext: createEffectRequestContextContract(),
577
- domainOperations: createEffectDomainOperations(app),
578
- ...createEffectOperationContract(app)
579
- }
580
- } : {}
581
- };
582
- }
583
- function createGeneratedContract(scope, apps = [
584
- createShellHost()
585
- ], enableTailwind = true) {
586
- return {
587
- schemaVersion: 1,
588
- profile: 'cloudflare-ssr-mf-effect-v1',
589
- packageManager: {
590
- source: 'package.json',
591
- manager: 'pnpm',
592
- version: PNPM_VERSION,
593
- toolchain: 'mise'
594
- },
595
- node: {
596
- source: 'package.json engines.node and .mise.toml',
597
- version: NODE_VERSION,
598
- engineRange: '>=26',
599
- toolchain: 'mise'
600
- },
601
- versions: {
602
- typescript: TYPESCRIPT_NATIVE_PREVIEW_VERSION,
603
- typescriptCompatibility: TYPESCRIPT_VERSION,
604
- typescriptNativePreview: TYPESCRIPT_NATIVE_PREVIEW_VERSION,
605
- moduleFederation: MODULE_FEDERATION_VERSION,
606
- tanstackRouter: TANSTACK_ROUTER_VERSION,
607
- i18next: I18NEXT_VERSION,
608
- zephyrRspackPlugin: ZEPHYR_RSPACK_PLUGIN_VERSION,
609
- zephyrAgent: ZEPHYR_AGENT_VERSION,
610
- wrangler: WRANGLER_VERSION
611
- },
612
- performanceReadiness: createPerformanceReadinessContract(),
613
- cssFederation: createCssFederationContract(scope),
614
- apps: apps.map((app)=>createAppGeneratedContract(scope, app, apps, enableTailwind))
615
- };
616
- }
617
- function createTemplateManifest(modernVersion, packageSource) {
618
- return {
619
- schemaVersion: 1,
620
- template: {
621
- id: 'modernjs-ultramodern-superapp-workspace',
622
- version: modernVersion,
623
- displayName: 'Modern.js UltraModern SuperApp Workspace',
624
- description: 'Growable SuperApp shell, shared packages, and topology skeleton.',
625
- compatibilityLane: 'ultramodern-mv',
626
- minimumModernVersion: modernVersion
627
- },
628
- source: {
629
- type: 'builtin',
630
- name: 'modernjs-ultramodern-superapp-workspace',
631
- repositoryPath: 'packages/toolkit/create/template-workspace',
632
- generator: 'packages/toolkit/create/src/ultramodern-workspace/'
633
- },
634
- integrity: {
635
- checksums: [
636
- {
637
- algorithm: 'sha256',
638
- value: hashTemplateTree(workspaceTemplateDir),
639
- scope: 'source-tree'
217
+ wrangler: {
218
+ compatibility_date: CLOUDFLARE_COMPATIBILITY_DATE,
219
+ compatibility_flags: [
220
+ 'nodejs_compat',
221
+ 'global_fetch_strictly_public'
222
+ ]
640
223
  },
641
- {
642
- algorithm: 'sha256',
643
- value: hashTemplateTree(fileTemplatesDir),
644
- scope: 'file-templates-tree'
645
- }
646
- ],
647
- provenance: {
648
- kind: 'repo-local',
649
- issuer: '@modern-js/create',
650
- subject: 'packages/toolkit/create/template-workspace'
224
+ artifacts: [],
225
+ publicAssetExcludes: []
651
226
  }
652
227
  },
653
- materialization: {
654
- targetRoot: 'generated-project-root',
655
- allowedPaths: [
656
- '.agents/**',
657
- '.codex/**',
658
- '.github/**',
659
- '.gitignore',
660
- '.mise.toml',
661
- '.modernjs/**',
662
- 'AGENTS.md',
663
- 'README.md',
664
- 'apps/**',
665
- 'packages/**',
666
- 'lefthook.yml',
667
- 'package.json',
668
- 'oxfmt.config.ts',
669
- 'oxlint.config.ts',
670
- 'pnpm-workspace.yaml',
671
- "scripts/**",
672
- 'topology/**',
673
- 'tsconfig.json',
674
- 'tsconfig.base.json'
675
- ],
676
- deniedPaths: [
677
- '.git/**',
678
- '.npmrc',
679
- '.yarnrc',
680
- '.env',
681
- '.env.*',
682
- 'node_modules/**',
683
- 'dist/**'
684
- ],
685
- overwritePolicy: 'deny-existing'
686
- },
687
- packageSource: {
688
- strategy: packageSource.strategy,
689
- config: '.modernjs/ultramodern-package-source.json',
690
- modernPackageSpecifier: modernPackageVersion(packageSource),
691
- generatedWorkspacePackageSpecifier: WORKSPACE_PACKAGE_VERSION
228
+ moduleFederation: {
229
+ apps: apps.map((app)=>({
230
+ id: app.id,
231
+ path: app.directory,
232
+ role: 'shell' === app.kind ? 'host' : 'remote',
233
+ name: app.mfName,
234
+ exposes: Object.keys(app.exposes ?? {}),
235
+ hostOnly: 'shell' === app.kind && 0 === Object.keys(app.exposes ?? {}).length
236
+ }))
692
237
  },
693
238
  agentSkills: {
694
- installDir: '.agents/skills',
695
- source: {
696
- repository: 'https://github.com/rstackjs/agent-skills',
697
- commit: RSTACK_AGENT_SKILLS_COMMIT,
698
- license: 'MIT',
699
- licensePath: '.agents/rstackjs-agent-skills-LICENSE'
700
- },
701
- baseline: baselineAgentSkills,
702
- moduleFederationSource: {
703
- repository: 'https://github.com/module-federation/agent-skills',
704
- commit: MODULE_FEDERATION_AGENT_SKILLS_COMMIT,
705
- install: 'clone',
706
- baseline: moduleFederationAgentSkills
707
- },
708
- privateSource: {
709
- repository: 'https://github.com/TechsioCZ/skills',
710
- install: 'clone-if-authorized',
711
- baseline: privateAgentSkills
712
- },
713
- lockFile: '.agents/skills-lock.json'
714
- },
715
- validation: {
716
- schemaValidation: true,
717
- sourceValidation: [
718
- 'source-type-supported',
719
- 'checksum-verified',
720
- 'provenance-present'
721
- ],
722
- materializationValidation: [
723
- 'path-boundary-policy',
724
- 'path-boundary-denylist',
725
- 'no-path-traversal',
726
- 'no-absolute-paths',
727
- 'overwrite-policy-enforced'
728
- ],
729
- postMaterializationValidation: [
730
- 'ultramodern-workspace-contract-check',
731
- 'github-workflow-security-enforced',
732
- 'pnpm-11-policy-enforced',
733
- 'template-manifest-retained'
734
- ],
735
- expectedCommands: [
736
- 'mise install',
737
- 'pnpm install',
738
- 'pnpm run typecheck',
739
- 'pnpm run i18n:boundaries',
740
- 'pnpm run contract:check',
741
- 'pnpm run performance:readiness'
239
+ target: 'codex',
240
+ lockfile: './.codex/skills-lock.json',
241
+ installDir: './.codex/skills',
242
+ mode: 'repo-owned-default-on',
243
+ selfContainedVendoring: true,
244
+ optOutEnv: [
245
+ 'ULTRAMODERN_SKIP_CODEX_SKILLS=1',
246
+ 'ULTRAMODERN_CODEX_SKILLS=0'
742
247
  ]
248
+ },
249
+ tooling: {
250
+ command: 'modern-js-create ultramodern',
251
+ wrappers: {
252
+ validate: "scripts/validate-ultramodern-workspace.mts",
253
+ typecheck: "scripts/ultramodern-typecheck.mts",
254
+ mfTypes: "scripts/assert-mf-types.mts",
255
+ publicSurface: "scripts/generate-public-surface-assets.mts",
256
+ cloudflareProof: "scripts/proof-cloudflare-version.mts",
257
+ performanceReadiness: "scripts/ultramodern-performance-readiness.mts",
258
+ migrateStrictEffect: "scripts/migrate-strict-effect.mts",
259
+ apiBoundaries: "scripts/check-ultramodern-api-boundaries.mts",
260
+ skills: "scripts/bootstrap-agent-skills.mts"
261
+ }
743
262
  }
744
263
  };
745
264
  }
746
- export { baselineAgentSkills, createAppConfigContract, createAppCssFederationContract, createAppGeneratedContract, createCssDedupeContract, createCssFederationContract, createCssSsrContract, createDevelopmentOverlay, createGeneratedContract, createOwnership, createPackageSourceMetadata, createPerformanceReadinessContract, createStylingContract, createTemplateManifest, createTopology, cssClassPrefix, cssLayerName, cssRole, moduleFederationAgentSkills, privateAgentSkills };
265
+ export { createDevelopmentOverlay, createOwnership, createTopology, createUltramodernConfig };