@bleedingdev/modern-js-create 3.4.0-ultramodern.12 → 3.4.0-ultramodern.14

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