@bleedingdev/modern-js-create 3.4.0-ultramodern.11 → 3.4.0-ultramodern.13

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 (104) hide show
  1. package/README.md +13 -11
  2. package/dist/cjs/index.cjs +36 -3
  3. package/dist/cjs/locale/en.cjs +10 -0
  4. package/dist/cjs/locale/zh.cjs +10 -0
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +185 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +248 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +39 -18
  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 +119 -653
  11. package/dist/cjs/ultramodern-workspace/descriptors.cjs +4 -0
  12. package/dist/cjs/ultramodern-workspace/generation-result.cjs +1 -1
  13. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  14. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +572 -0
  15. package/dist/cjs/ultramodern-workspace/module-federation.cjs +14 -0
  16. package/dist/cjs/ultramodern-workspace/package-json.cjs +26 -12
  17. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  18. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +74 -44
  19. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +37 -8
  20. package/dist/esm/index.js +36 -3
  21. package/dist/esm/locale/en.js +10 -0
  22. package/dist/esm/locale/zh.js +10 -0
  23. package/dist/esm/ultramodern-tooling/commands.js +132 -0
  24. package/dist/esm/ultramodern-tooling/config.js +196 -0
  25. package/dist/esm/ultramodern-workspace/add-vertical.js +39 -21
  26. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  27. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  28. package/dist/esm/ultramodern-workspace/contracts.js +122 -608
  29. package/dist/esm/ultramodern-workspace/descriptors.js +2 -1
  30. package/dist/esm/ultramodern-workspace/generation-result.js +2 -2
  31. package/dist/esm/ultramodern-workspace/index.js +1 -0
  32. package/dist/esm/ultramodern-workspace/mf-validation.js +517 -0
  33. package/dist/esm/ultramodern-workspace/module-federation.js +14 -0
  34. package/dist/esm/ultramodern-workspace/package-json.js +26 -12
  35. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  36. package/dist/esm/ultramodern-workspace/workspace-scripts.js +75 -27
  37. package/dist/esm/ultramodern-workspace/write-workspace.js +38 -12
  38. package/dist/esm-node/index.js +36 -3
  39. package/dist/esm-node/locale/en.js +10 -0
  40. package/dist/esm-node/locale/zh.js +10 -0
  41. package/dist/esm-node/ultramodern-tooling/commands.js +133 -0
  42. package/dist/esm-node/ultramodern-tooling/config.js +197 -0
  43. package/dist/esm-node/ultramodern-workspace/add-vertical.js +39 -21
  44. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  45. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  46. package/dist/esm-node/ultramodern-workspace/contracts.js +122 -608
  47. package/dist/esm-node/ultramodern-workspace/descriptors.js +2 -1
  48. package/dist/esm-node/ultramodern-workspace/generation-result.js +2 -2
  49. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  50. package/dist/esm-node/ultramodern-workspace/mf-validation.js +518 -0
  51. package/dist/esm-node/ultramodern-workspace/module-federation.js +14 -0
  52. package/dist/esm-node/ultramodern-workspace/package-json.js +26 -12
  53. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  54. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +75 -27
  55. package/dist/esm-node/ultramodern-workspace/write-workspace.js +38 -12
  56. package/dist/types/locale/en.d.ts +10 -0
  57. package/dist/types/locale/index.d.ts +20 -0
  58. package/dist/types/locale/zh.d.ts +10 -0
  59. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  60. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  61. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  62. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  63. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  64. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  65. package/dist/types/ultramodern-workspace/descriptors.d.ts +1 -0
  66. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  67. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  68. package/dist/types/ultramodern-workspace/package-json.d.ts +4 -3
  69. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  70. package/dist/types/ultramodern-workspace/types.d.ts +2 -0
  71. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +1 -7
  72. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  73. package/package.json +3 -3
  74. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  75. package/template-workspace/.gitignore.handlebars +3 -0
  76. package/template-workspace/AGENTS.md.handlebars +11 -5
  77. package/template-workspace/README.md.handlebars +15 -12
  78. package/template-workspace/oxfmt.config.ts +1 -0
  79. package/template-workspace/oxlint.config.ts +1 -0
  80. package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
  81. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +56 -3
  82. package/templates/workspace-scripts/generate-public-surface-assets.mjs +239 -4
  83. package/templates/workspace-scripts/proof-cloudflare-version.mjs +282 -4
  84. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +172 -1
  85. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  86. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +783 -26
  87. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  88. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  89. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  90. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  91. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  92. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  93. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  94. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  95. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  96. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  97. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  98. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  99. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  100. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  101. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  102. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  103. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  104. /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_CORE_VERSION, 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 {
@@ -144,604 +120,142 @@ function createDevelopmentOverlay(remotes = []) {
144
120
  ]))
145
121
  };
146
122
  }
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() {
123
+ function createUltramodernConfig(scope, modernVersion, packageSource, apps = [
124
+ createShellHost()
125
+ ], enableTailwind = true, bridge) {
126
+ const remotes = apps.filter((app)=>'shell' !== app.kind);
127
+ const shellHost = createShellHost(remotes);
242
128
  return {
243
129
  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
- ]
130
+ profile: 'cloudflare-ssr-mf-effect-v1',
131
+ generator: {
132
+ package: '@modern-js/create',
133
+ version: modernVersion
274
134
  },
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.'
135
+ workspace: {
136
+ packageScope: scope,
137
+ packageManager: {
138
+ name: 'pnpm',
139
+ version: PNPM_VERSION
287
140
  },
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.'
141
+ node: {
142
+ version: NODE_VERSION,
143
+ engineRange: '>=26'
311
144
  }
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
145
  },
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'
146
+ packageSource: {
147
+ strategy: packageSource.strategy,
148
+ modernPackageVersion: packageSource.modernPackageVersion,
149
+ ...packageSource.registry ? {
150
+ registry: packageSource.registry
151
+ } : {},
152
+ ...packageSource.aliasScope ? {
153
+ aliasScope: packageSource.aliasScope
154
+ } : {},
155
+ ...packageSource.aliasPackageNamePrefix ? {
156
+ aliasPackageNamePrefix: packageSource.aliasPackageNamePrefix
379
157
  } : {}
380
158
  },
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
159
+ features: {
160
+ tailwind: enableTailwind
390
161
  },
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
- }
162
+ topology: {
163
+ source: './topology/reference-topology.json',
164
+ apps: apps.map((app)=>({
165
+ id: app.id,
166
+ kind: app.kind,
167
+ package: packageName(scope, app.packageSuffix),
168
+ packageSuffix: app.packageSuffix,
169
+ displayName: app.displayName,
170
+ path: app.directory,
171
+ ...app.domain ? {
172
+ domain: app.domain
173
+ } : {},
174
+ port: app.port,
175
+ portEnv: app.portEnv,
176
+ moduleFederation: {
177
+ role: 'shell' === app.kind ? 'host' : 'remote',
178
+ name: app.mfName,
179
+ exposes: Object.keys(app.exposes ?? {}),
180
+ ...'shell' === app.kind ? {
181
+ verticalRefs: shellHost.verticalRefs,
182
+ remotes: createModuleFederationRemoteContracts(shellHost, remotes)
183
+ } : app.verticalRefs?.length ? {
184
+ verticalRefs: app.verticalRefs,
185
+ remotes: createModuleFederationRemoteContracts(app, remotes)
186
+ } : {},
187
+ ssr: true,
188
+ dts: {
189
+ compilerInstance: 'tsgo',
190
+ tsConfigPath: './tsconfig.mf-types.json'
191
+ }
192
+ },
193
+ ...app.effectApi ? {
194
+ effectApi: {
195
+ stem: app.effectApi.stem,
196
+ prefix: app.effectApi.prefix,
197
+ consumedBy: app.effectApi.consumedBy
198
+ }
199
+ } : {}
200
+ }))
434
201
  },
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'
202
+ bridge: bridge ?? {
203
+ enabled: false,
204
+ workspacePackages: [],
205
+ dependencies: [],
206
+ lockfilePolicy: 'nested',
207
+ gates: [],
208
+ reactSingletons: [
209
+ 'react',
210
+ 'react-dom'
446
211
  ]
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),
212
+ },
478
213
  deploy: {
479
- target: 'cloudflare',
480
- cloudflare: createCloudflareDeployContract(scope, app),
481
214
  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
- tanstackRouterCore: TANSTACK_ROUTER_CORE_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'
215
+ wrangler: {
216
+ compatibility_date: CLOUDFLARE_COMPATIBILITY_DATE,
217
+ compatibility_flags: [
218
+ 'nodejs_compat',
219
+ 'global_fetch_strictly_public'
220
+ ]
640
221
  },
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'
222
+ artifacts: [],
223
+ publicAssetExcludes: []
651
224
  }
652
225
  },
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
- 'patches/**',
671
- 'pnpm-workspace.yaml',
672
- "scripts/**",
673
- 'topology/**',
674
- 'tsconfig.json',
675
- 'tsconfig.base.json'
676
- ],
677
- deniedPaths: [
678
- '.git/**',
679
- '.npmrc',
680
- '.yarnrc',
681
- '.env',
682
- '.env.*',
683
- 'node_modules/**',
684
- 'dist/**'
685
- ],
686
- overwritePolicy: 'deny-existing'
687
- },
688
- packageSource: {
689
- strategy: packageSource.strategy,
690
- config: '.modernjs/ultramodern-package-source.json',
691
- modernPackageSpecifier: modernPackageVersion(packageSource),
692
- generatedWorkspacePackageSpecifier: WORKSPACE_PACKAGE_VERSION
226
+ moduleFederation: {
227
+ apps: apps.map((app)=>({
228
+ id: app.id,
229
+ path: app.directory,
230
+ role: 'shell' === app.kind ? 'host' : 'remote',
231
+ name: app.mfName,
232
+ exposes: Object.keys(app.exposes ?? {}),
233
+ hostOnly: 'shell' === app.kind && 0 === Object.keys(app.exposes ?? {}).length
234
+ }))
693
235
  },
694
236
  agentSkills: {
695
- installDir: '.agents/skills',
696
- source: {
697
- repository: 'https://github.com/rstackjs/agent-skills',
698
- commit: RSTACK_AGENT_SKILLS_COMMIT,
699
- license: 'MIT',
700
- licensePath: '.agents/rstackjs-agent-skills-LICENSE'
701
- },
702
- baseline: baselineAgentSkills,
703
- moduleFederationSource: {
704
- repository: 'https://github.com/module-federation/agent-skills',
705
- commit: MODULE_FEDERATION_AGENT_SKILLS_COMMIT,
706
- install: 'clone',
707
- baseline: moduleFederationAgentSkills
708
- },
709
- privateSource: {
710
- repository: 'https://github.com/TechsioCZ/skills',
711
- install: 'clone-if-authorized',
712
- baseline: privateAgentSkills
713
- },
714
- lockFile: '.agents/skills-lock.json'
715
- },
716
- validation: {
717
- schemaValidation: true,
718
- sourceValidation: [
719
- 'source-type-supported',
720
- 'checksum-verified',
721
- 'provenance-present'
722
- ],
723
- materializationValidation: [
724
- 'path-boundary-policy',
725
- 'path-boundary-denylist',
726
- 'no-path-traversal',
727
- 'no-absolute-paths',
728
- 'overwrite-policy-enforced'
729
- ],
730
- postMaterializationValidation: [
731
- 'ultramodern-workspace-contract-check',
732
- 'github-workflow-security-enforced',
733
- 'pnpm-11-policy-enforced',
734
- 'template-manifest-retained'
735
- ],
736
- expectedCommands: [
737
- 'mise install',
738
- 'pnpm install',
739
- 'pnpm run typecheck',
740
- 'pnpm run i18n:boundaries',
741
- 'pnpm run contract:check',
742
- 'pnpm run performance:readiness'
237
+ target: 'codex',
238
+ lockfile: './.codex/skills-lock.json',
239
+ installDir: './.codex/skills',
240
+ mode: 'repo-owned-default-on',
241
+ selfContainedVendoring: true,
242
+ optOutEnv: [
243
+ 'ULTRAMODERN_SKIP_CODEX_SKILLS=1',
244
+ 'ULTRAMODERN_CODEX_SKILLS=0'
743
245
  ]
246
+ },
247
+ tooling: {
248
+ command: 'modern-js-create ultramodern',
249
+ wrappers: {
250
+ validate: "scripts/validate-ultramodern-workspace.mjs",
251
+ typecheck: "scripts/ultramodern-typecheck.mjs",
252
+ mfTypes: "scripts/assert-mf-types.mjs",
253
+ publicSurface: "scripts/generate-public-surface-assets.mjs",
254
+ cloudflareProof: "scripts/proof-cloudflare-version.mjs",
255
+ performanceReadiness: "scripts/ultramodern-performance-readiness.mjs",
256
+ skills: "scripts/bootstrap-agent-skills.mjs"
257
+ }
744
258
  }
745
259
  };
746
260
  }
747
- export { baselineAgentSkills, createAppConfigContract, createAppCssFederationContract, createAppGeneratedContract, createCssDedupeContract, createCssFederationContract, createCssSsrContract, createDevelopmentOverlay, createGeneratedContract, createOwnership, createPackageSourceMetadata, createPerformanceReadinessContract, createStylingContract, createTemplateManifest, createTopology, cssClassPrefix, cssLayerName, cssRole, moduleFederationAgentSkills, privateAgentSkills };
261
+ export { createDevelopmentOverlay, createOwnership, createTopology, createUltramodernConfig };