@bleedingdev/modern-js-create 3.4.0-ultramodern.2 → 3.4.0-ultramodern.20

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 (128) hide show
  1. package/README.md +13 -11
  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 +185 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +79 -61
  8. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  9. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  10. package/dist/cjs/ultramodern-workspace/contracts.cjs +121 -648
  11. package/dist/cjs/ultramodern-workspace/demo-components.cjs +26 -33
  12. package/dist/cjs/ultramodern-workspace/descriptors.cjs +4 -4
  13. package/dist/cjs/ultramodern-workspace/effect-api.cjs +230 -100
  14. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  15. package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
  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 +51 -20
  19. package/dist/cjs/ultramodern-workspace/package-json.cjs +62 -19
  20. package/dist/cjs/ultramodern-workspace/policy.cjs +2 -2
  21. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  22. package/dist/cjs/ultramodern-workspace/versions.cjs +5 -0
  23. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +80 -43
  24. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +63 -20
  25. package/dist/esm/index.js +37 -4
  26. package/dist/esm/locale/en.js +12 -2
  27. package/dist/esm/locale/zh.js +12 -2
  28. package/dist/esm/ultramodern-tooling/commands.js +132 -0
  29. package/dist/esm/ultramodern-tooling/config.js +120 -0
  30. package/dist/esm/ultramodern-workspace/add-vertical.js +81 -66
  31. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  32. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  33. package/dist/esm/ultramodern-workspace/contracts.js +124 -603
  34. package/dist/esm/ultramodern-workspace/demo-components.js +26 -33
  35. package/dist/esm/ultramodern-workspace/descriptors.js +2 -2
  36. package/dist/esm/ultramodern-workspace/effect-api.js +230 -100
  37. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  38. package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
  39. package/dist/esm/ultramodern-workspace/index.js +1 -0
  40. package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
  41. package/dist/esm/ultramodern-workspace/module-federation.js +49 -21
  42. package/dist/esm/ultramodern-workspace/package-json.js +60 -20
  43. package/dist/esm/ultramodern-workspace/policy.js +2 -2
  44. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  45. package/dist/esm/ultramodern-workspace/versions.js +3 -1
  46. package/dist/esm/ultramodern-workspace/workspace-scripts.js +78 -26
  47. package/dist/esm/ultramodern-workspace/write-workspace.js +67 -27
  48. package/dist/esm-node/index.js +37 -4
  49. package/dist/esm-node/locale/en.js +12 -2
  50. package/dist/esm-node/locale/zh.js +12 -2
  51. package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
  52. package/dist/esm-node/ultramodern-tooling/config.js +121 -0
  53. package/dist/esm-node/ultramodern-workspace/add-vertical.js +81 -66
  54. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  55. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  56. package/dist/esm-node/ultramodern-workspace/contracts.js +124 -603
  57. package/dist/esm-node/ultramodern-workspace/demo-components.js +26 -33
  58. package/dist/esm-node/ultramodern-workspace/descriptors.js +2 -2
  59. package/dist/esm-node/ultramodern-workspace/effect-api.js +230 -100
  60. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  61. package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
  62. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  63. package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
  64. package/dist/esm-node/ultramodern-workspace/module-federation.js +49 -21
  65. package/dist/esm-node/ultramodern-workspace/package-json.js +60 -20
  66. package/dist/esm-node/ultramodern-workspace/policy.js +2 -2
  67. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  68. package/dist/esm-node/ultramodern-workspace/versions.js +3 -1
  69. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +78 -26
  70. package/dist/esm-node/ultramodern-workspace/write-workspace.js +67 -27
  71. package/dist/types/locale/en.d.ts +10 -0
  72. package/dist/types/locale/index.d.ts +20 -0
  73. package/dist/types/locale/zh.d.ts +10 -0
  74. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  75. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  76. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  77. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  78. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  79. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  80. package/dist/types/ultramodern-workspace/descriptors.d.ts +1 -1
  81. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  82. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  83. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  84. package/dist/types/ultramodern-workspace/module-federation.d.ts +1 -0
  85. package/dist/types/ultramodern-workspace/package-json.d.ts +5 -3
  86. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  87. package/dist/types/ultramodern-workspace/types.d.ts +2 -0
  88. package/dist/types/ultramodern-workspace/versions.d.ts +2 -0
  89. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
  90. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  91. package/package.json +5 -3
  92. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  93. package/template-workspace/.gitignore.handlebars +3 -0
  94. package/template-workspace/AGENTS.md.handlebars +11 -5
  95. package/template-workspace/README.md.handlebars +15 -12
  96. package/template-workspace/oxfmt.config.ts +1 -0
  97. package/template-workspace/oxlint.config.ts +1 -0
  98. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
  99. package/template-workspace/pnpm-workspace.yaml.handlebars +12 -0
  100. package/template-workspace/scripts/bootstrap-agent-skills.mjs +96 -69
  101. package/templates/app/shell-frame.tsx +1 -2
  102. package/templates/app/ultramodern-route-head.tsx.handlebars +5 -6
  103. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +59 -7
  104. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mjs +339 -0
  105. package/templates/workspace-scripts/generate-public-surface-assets.mjs +245 -8
  106. package/templates/workspace-scripts/proof-cloudflare-version.mjs +276 -8
  107. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
  108. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +164 -1
  109. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  110. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +949 -63
  111. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  112. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  113. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  114. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  115. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  116. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  117. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  118. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  119. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  120. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  121. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  122. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  123. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  124. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  125. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  126. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  127. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  128. /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 { createModuleFederationRemoteContracts, createShellHost, effectApiPrefix, sharedPackages, shellApp, verticalEffectApps } from "./descriptors.js";
2
+ import { effectApiTopologyMetadata } from "./effect-api.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 {
@@ -84,6 +60,7 @@ function createTopology(scope, remotes = []) {
84
60
  script: "scripts/validate-ultramodern-workspace.mjs",
85
61
  commands: [
86
62
  'pnpm i18n:boundaries',
63
+ 'pnpm api:check',
87
64
  'pnpm contract:check'
88
65
  ]
89
66
  }
@@ -144,599 +121,143 @@ function createDevelopmentOverlay(remotes = []) {
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.effectApi ? {
195
+ effectApi: {
196
+ stem: app.effectApi.stem,
197
+ prefix: app.effectApi.prefix,
198
+ consumedBy: app.effectApi.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
- displayErrorInTerminal: true,
548
- compilerInstance: 'tsgo'
549
- },
550
- browserSafeExposesOnly: true,
551
- zephyrRspackPlugin: ZEPHYR_RSPACK_PLUGIN_VERSION
552
- },
553
- marker: {
554
- appId: app.id,
555
- packageName: packageName(scope, app.packageSuffix),
556
- version: '0.1.0',
557
- build: createBuildMarker(scope, app),
558
- deployProfile: 'cloudflare-ssr-mf-effect-v1',
559
- uiSurface: 'ui',
560
- ...appHasEffectApi(app) ? {
561
- apiSurface: 'effect-bff'
562
- } : {}
563
- },
564
- ...appHasEffectApi(app) ? {
565
- effect: {
566
- runtime: 'effect',
567
- import: '@modern-js/plugin-bff/effect-edge',
568
- prefix: app.effectApi.prefix,
569
- openapi: '/openapi.json',
570
- workerEntry: 'worker/__modern_bff_effect.js',
571
- contract: './shared/effect/api',
572
- client: './effect/client',
573
- readiness: createEffectReadinessContract(app),
574
- requestContext: createEffectRequestContextContract(),
575
- domainOperations: createEffectDomainOperations(app),
576
- ...createEffectOperationContract(app)
577
- }
578
- } : {}
579
- };
580
- }
581
- function createGeneratedContract(scope, apps = [
582
- createShellHost()
583
- ], enableTailwind = true) {
584
- return {
585
- schemaVersion: 1,
586
- profile: 'cloudflare-ssr-mf-effect-v1',
587
- packageManager: {
588
- source: 'package.json',
589
- manager: 'pnpm',
590
- version: PNPM_VERSION,
591
- toolchain: 'mise'
592
- },
593
- node: {
594
- source: 'package.json engines.node and .mise.toml',
595
- version: NODE_VERSION,
596
- engineRange: '>=26',
597
- toolchain: 'mise'
598
- },
599
- versions: {
600
- typescript: TYPESCRIPT_NATIVE_PREVIEW_VERSION,
601
- typescriptCompatibility: TYPESCRIPT_VERSION,
602
- typescriptNativePreview: TYPESCRIPT_NATIVE_PREVIEW_VERSION,
603
- moduleFederation: MODULE_FEDERATION_VERSION,
604
- tanstackRouter: TANSTACK_ROUTER_VERSION,
605
- i18next: I18NEXT_VERSION,
606
- zephyrRspackPlugin: ZEPHYR_RSPACK_PLUGIN_VERSION,
607
- zephyrAgent: ZEPHYR_AGENT_VERSION,
608
- wrangler: WRANGLER_VERSION
609
- },
610
- performanceReadiness: createPerformanceReadinessContract(),
611
- cssFederation: createCssFederationContract(scope),
612
- apps: apps.map((app)=>createAppGeneratedContract(scope, app, apps, enableTailwind))
613
- };
614
- }
615
- function createTemplateManifest(modernVersion, packageSource) {
616
- return {
617
- schemaVersion: 1,
618
- template: {
619
- id: 'modernjs-ultramodern-superapp-workspace',
620
- version: modernVersion,
621
- displayName: 'Modern.js UltraModern SuperApp Workspace',
622
- description: 'Growable SuperApp shell, shared packages, and topology skeleton.',
623
- compatibilityLane: 'ultramodern-mv',
624
- minimumModernVersion: modernVersion
625
- },
626
- source: {
627
- type: 'builtin',
628
- name: 'modernjs-ultramodern-superapp-workspace',
629
- repositoryPath: 'packages/toolkit/create/template-workspace',
630
- generator: 'packages/toolkit/create/src/ultramodern-workspace/'
631
- },
632
- integrity: {
633
- checksums: [
634
- {
635
- algorithm: 'sha256',
636
- value: hashTemplateTree(workspaceTemplateDir),
637
- scope: 'source-tree'
216
+ wrangler: {
217
+ compatibility_date: CLOUDFLARE_COMPATIBILITY_DATE,
218
+ compatibility_flags: [
219
+ 'nodejs_compat',
220
+ 'global_fetch_strictly_public'
221
+ ]
638
222
  },
639
- {
640
- algorithm: 'sha256',
641
- value: hashTemplateTree(fileTemplatesDir),
642
- scope: 'file-templates-tree'
643
- }
644
- ],
645
- provenance: {
646
- kind: 'repo-local',
647
- issuer: '@modern-js/create',
648
- subject: 'packages/toolkit/create/template-workspace'
223
+ artifacts: [],
224
+ publicAssetExcludes: []
649
225
  }
650
226
  },
651
- materialization: {
652
- targetRoot: 'generated-project-root',
653
- allowedPaths: [
654
- '.agents/**',
655
- '.codex/**',
656
- '.github/**',
657
- '.gitignore',
658
- '.mise.toml',
659
- '.modernjs/**',
660
- 'AGENTS.md',
661
- 'README.md',
662
- 'apps/**',
663
- 'packages/**',
664
- 'lefthook.yml',
665
- 'package.json',
666
- 'oxfmt.config.ts',
667
- 'oxlint.config.ts',
668
- 'pnpm-workspace.yaml',
669
- "scripts/**",
670
- 'topology/**',
671
- 'tsconfig.base.json'
672
- ],
673
- deniedPaths: [
674
- '.git/**',
675
- '.npmrc',
676
- '.yarnrc',
677
- '.env',
678
- '.env.*',
679
- 'node_modules/**',
680
- 'dist/**'
681
- ],
682
- overwritePolicy: 'deny-existing'
683
- },
684
- packageSource: {
685
- strategy: packageSource.strategy,
686
- config: '.modernjs/ultramodern-package-source.json',
687
- modernPackageSpecifier: modernPackageVersion(packageSource),
688
- 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
+ }))
689
236
  },
690
237
  agentSkills: {
691
- installDir: '.agents/skills',
692
- source: {
693
- repository: 'https://github.com/rstackjs/agent-skills',
694
- commit: RSTACK_AGENT_SKILLS_COMMIT,
695
- license: 'MIT',
696
- licensePath: '.agents/rstackjs-agent-skills-LICENSE'
697
- },
698
- baseline: baselineAgentSkills,
699
- moduleFederationSource: {
700
- repository: 'https://github.com/module-federation/agent-skills',
701
- commit: MODULE_FEDERATION_AGENT_SKILLS_COMMIT,
702
- install: 'clone',
703
- baseline: moduleFederationAgentSkills
704
- },
705
- privateSource: {
706
- repository: 'https://github.com/TechsioCZ/skills',
707
- install: 'clone-if-authorized',
708
- baseline: privateAgentSkills
709
- },
710
- lockFile: '.agents/skills-lock.json'
711
- },
712
- validation: {
713
- schemaValidation: true,
714
- sourceValidation: [
715
- 'source-type-supported',
716
- 'checksum-verified',
717
- 'provenance-present'
718
- ],
719
- materializationValidation: [
720
- 'path-boundary-policy',
721
- 'path-boundary-denylist',
722
- 'no-path-traversal',
723
- 'no-absolute-paths',
724
- 'overwrite-policy-enforced'
725
- ],
726
- postMaterializationValidation: [
727
- 'ultramodern-workspace-contract-check',
728
- 'github-workflow-security-enforced',
729
- 'pnpm-11-policy-enforced',
730
- 'template-manifest-retained'
731
- ],
732
- expectedCommands: [
733
- 'mise install',
734
- 'pnpm install',
735
- 'pnpm run i18n:boundaries',
736
- 'pnpm run contract:check',
737
- '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'
738
246
  ]
247
+ },
248
+ tooling: {
249
+ command: 'modern-js-create ultramodern',
250
+ wrappers: {
251
+ validate: "scripts/validate-ultramodern-workspace.mjs",
252
+ typecheck: "scripts/ultramodern-typecheck.mjs",
253
+ mfTypes: "scripts/assert-mf-types.mjs",
254
+ publicSurface: "scripts/generate-public-surface-assets.mjs",
255
+ cloudflareProof: "scripts/proof-cloudflare-version.mjs",
256
+ performanceReadiness: "scripts/ultramodern-performance-readiness.mjs",
257
+ apiBoundaries: "scripts/check-ultramodern-api-boundaries.mjs",
258
+ skills: "scripts/bootstrap-agent-skills.mjs"
259
+ }
739
260
  }
740
261
  };
741
262
  }
742
- export { baselineAgentSkills, createAppConfigContract, createAppCssFederationContract, createAppGeneratedContract, createCssDedupeContract, createCssFederationContract, createCssSsrContract, createDevelopmentOverlay, createGeneratedContract, createOwnership, createPackageSourceMetadata, createPerformanceReadinessContract, createStylingContract, createTemplateManifest, createTopology, cssClassPrefix, cssLayerName, cssRole, moduleFederationAgentSkills, privateAgentSkills };
263
+ export { createDevelopmentOverlay, createOwnership, createTopology, createUltramodernConfig };