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