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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +49 -23
  2. package/dist/cjs/index.cjs +37 -4
  3. package/dist/cjs/locale/en.cjs +12 -2
  4. package/dist/cjs/locale/zh.cjs +12 -2
  5. package/dist/cjs/ultramodern-tooling/commands.cjs +431 -0
  6. package/dist/cjs/ultramodern-tooling/config.cjs +172 -0
  7. package/dist/cjs/ultramodern-workspace/add-vertical.cjs +87 -75
  8. package/dist/cjs/ultramodern-workspace/{effect-api.cjs → api.cjs} +207 -208
  9. package/dist/cjs/ultramodern-workspace/bridge-config.cjs +327 -0
  10. package/dist/cjs/ultramodern-workspace/codesmith.cjs +1 -0
  11. package/dist/cjs/ultramodern-workspace/contracts.cjs +128 -657
  12. package/dist/cjs/ultramodern-workspace/demo-components.cjs +12 -12
  13. package/dist/cjs/ultramodern-workspace/descriptors.cjs +25 -25
  14. package/dist/cjs/ultramodern-workspace/fs-io.cjs +117 -0
  15. package/dist/cjs/ultramodern-workspace/generation-result.cjs +5 -5
  16. package/dist/cjs/ultramodern-workspace/index.cjs +4 -0
  17. package/dist/cjs/ultramodern-workspace/mf-validation.cjs +571 -0
  18. package/dist/cjs/ultramodern-workspace/module-federation.cjs +39 -12
  19. package/dist/cjs/ultramodern-workspace/overlays.cjs +2 -2
  20. package/dist/cjs/ultramodern-workspace/package-json.cjs +58 -41
  21. package/dist/cjs/ultramodern-workspace/policy.cjs +4 -4
  22. package/dist/cjs/ultramodern-workspace/public-api.cjs +4 -0
  23. package/dist/cjs/ultramodern-workspace/public-surface.cjs +2 -2
  24. package/dist/cjs/ultramodern-workspace/versions.cjs +15 -0
  25. package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +120 -50
  26. package/dist/cjs/ultramodern-workspace/write-workspace.cjs +64 -21
  27. package/dist/esm/index.js +37 -4
  28. package/dist/esm/locale/en.js +12 -2
  29. package/dist/esm/locale/zh.js +12 -2
  30. package/dist/esm/ultramodern-tooling/commands.js +378 -0
  31. package/dist/esm/ultramodern-tooling/config.js +120 -0
  32. package/dist/esm/ultramodern-workspace/add-vertical.js +88 -79
  33. package/dist/esm/ultramodern-workspace/{effect-api.js → api.js} +146 -147
  34. package/dist/esm/ultramodern-workspace/bridge-config.js +270 -0
  35. package/dist/esm/ultramodern-workspace/codesmith.js +1 -0
  36. package/dist/esm/ultramodern-workspace/contracts.js +130 -611
  37. package/dist/esm/ultramodern-workspace/demo-components.js +13 -13
  38. package/dist/esm/ultramodern-workspace/descriptors.js +11 -11
  39. package/dist/esm/ultramodern-workspace/fs-io.js +116 -2
  40. package/dist/esm/ultramodern-workspace/generation-result.js +6 -6
  41. package/dist/esm/ultramodern-workspace/index.js +1 -0
  42. package/dist/esm/ultramodern-workspace/mf-validation.js +516 -0
  43. package/dist/esm/ultramodern-workspace/module-federation.js +40 -13
  44. package/dist/esm/ultramodern-workspace/overlays.js +2 -2
  45. package/dist/esm/ultramodern-workspace/package-json.js +57 -40
  46. package/dist/esm/ultramodern-workspace/policy.js +5 -5
  47. package/dist/esm/ultramodern-workspace/public-api.js +1 -0
  48. package/dist/esm/ultramodern-workspace/public-surface.js +2 -2
  49. package/dist/esm/ultramodern-workspace/versions.js +7 -1
  50. package/dist/esm/ultramodern-workspace/workspace-scripts.js +108 -34
  51. package/dist/esm/ultramodern-workspace/write-workspace.js +66 -26
  52. package/dist/esm-node/index.js +37 -4
  53. package/dist/esm-node/locale/en.js +12 -2
  54. package/dist/esm-node/locale/zh.js +12 -2
  55. package/dist/esm-node/ultramodern-tooling/commands.js +379 -0
  56. package/dist/esm-node/ultramodern-tooling/config.js +121 -0
  57. package/dist/esm-node/ultramodern-workspace/add-vertical.js +88 -79
  58. package/dist/esm-node/ultramodern-workspace/{effect-api.js → api.js} +146 -147
  59. package/dist/esm-node/ultramodern-workspace/bridge-config.js +271 -0
  60. package/dist/esm-node/ultramodern-workspace/codesmith.js +1 -0
  61. package/dist/esm-node/ultramodern-workspace/contracts.js +130 -611
  62. package/dist/esm-node/ultramodern-workspace/demo-components.js +13 -13
  63. package/dist/esm-node/ultramodern-workspace/descriptors.js +11 -11
  64. package/dist/esm-node/ultramodern-workspace/fs-io.js +116 -2
  65. package/dist/esm-node/ultramodern-workspace/generation-result.js +6 -6
  66. package/dist/esm-node/ultramodern-workspace/index.js +1 -0
  67. package/dist/esm-node/ultramodern-workspace/mf-validation.js +517 -0
  68. package/dist/esm-node/ultramodern-workspace/module-federation.js +40 -13
  69. package/dist/esm-node/ultramodern-workspace/overlays.js +2 -2
  70. package/dist/esm-node/ultramodern-workspace/package-json.js +57 -40
  71. package/dist/esm-node/ultramodern-workspace/policy.js +5 -5
  72. package/dist/esm-node/ultramodern-workspace/public-api.js +1 -0
  73. package/dist/esm-node/ultramodern-workspace/public-surface.js +2 -2
  74. package/dist/esm-node/ultramodern-workspace/versions.js +7 -1
  75. package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +108 -34
  76. package/dist/esm-node/ultramodern-workspace/write-workspace.js +66 -26
  77. package/dist/types/locale/en.d.ts +10 -0
  78. package/dist/types/locale/index.d.ts +20 -0
  79. package/dist/types/locale/zh.d.ts +10 -0
  80. package/dist/types/ultramodern-tooling/commands.d.ts +1 -0
  81. package/dist/types/ultramodern-tooling/config.d.ts +43 -0
  82. package/dist/types/ultramodern-workspace/add-vertical.d.ts +5 -2
  83. package/dist/types/ultramodern-workspace/api.d.ts +73 -0
  84. package/dist/types/ultramodern-workspace/bridge-config.d.ts +64 -0
  85. package/dist/types/ultramodern-workspace/codesmith.d.ts +1 -0
  86. package/dist/types/ultramodern-workspace/contracts.d.ts +2 -17
  87. package/dist/types/ultramodern-workspace/descriptors.d.ts +10 -10
  88. package/dist/types/ultramodern-workspace/fs-io.d.ts +1 -0
  89. package/dist/types/ultramodern-workspace/index.d.ts +2 -0
  90. package/dist/types/ultramodern-workspace/mf-validation.d.ts +27 -0
  91. package/dist/types/ultramodern-workspace/package-json.d.ts +5 -4
  92. package/dist/types/ultramodern-workspace/public-api.d.ts +2 -0
  93. package/dist/types/ultramodern-workspace/types.d.ts +9 -7
  94. package/dist/types/ultramodern-workspace/versions.d.ts +6 -0
  95. package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +2 -7
  96. package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -2
  97. package/package.json +5 -3
  98. package/template-workspace/{.agents → .codex}/skills-lock.json +12 -12
  99. package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +2 -0
  100. package/template-workspace/.gitignore.handlebars +3 -0
  101. package/template-workspace/AGENTS.md.handlebars +11 -5
  102. package/template-workspace/README.md.handlebars +55 -13
  103. package/template-workspace/oxfmt.config.ts +1 -0
  104. package/template-workspace/oxlint.config.ts +1 -0
  105. package/template-workspace/patches/@tanstack__router-core@1.171.13.patch +51 -0
  106. package/template-workspace/pnpm-workspace.yaml.handlebars +7 -0
  107. package/template-workspace/scripts/bootstrap-agent-skills.mjs +77 -67
  108. package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +51 -8
  109. package/templates/workspace-scripts/check-ultramodern-api-boundaries.mts +366 -0
  110. package/templates/workspace-scripts/{check-ultramodern-i18n-boundaries.mjs → check-ultramodern-i18n-boundaries.mts} +1 -1
  111. package/templates/workspace-scripts/generate-public-surface-assets.mjs +246 -9
  112. package/templates/workspace-scripts/proof-cloudflare-version.mjs +277 -9
  113. package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +35 -10
  114. package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +165 -2
  115. package/templates/workspace-scripts/ultramodern-typecheck.mjs +4 -2
  116. package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +842 -84
  117. package/dist/types/ultramodern-workspace/effect-api.d.ts +0 -73
  118. /package/template-workspace/{.agents → .codex}/rstackjs-agent-skills-LICENSE +0 -0
  119. /package/template-workspace/{.agents → .codex}/skills/rsbuild-best-practices/SKILL.md +0 -0
  120. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/SKILL.md +0 -0
  121. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/command-map.md +0 -0
  122. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/common-analysis-patterns.md +0 -0
  123. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +0 -0
  124. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +0 -0
  125. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +0 -0
  126. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/install-rsdoctor.md +0 -0
  127. /package/template-workspace/{.agents → .codex}/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +0 -0
  128. /package/template-workspace/{.agents → .codex}/skills/rslib-best-practices/SKILL.md +0 -0
  129. /package/template-workspace/{.agents → .codex}/skills/rslib-modern-package/SKILL.md +0 -0
  130. /package/template-workspace/{.agents → .codex}/skills/rspack-best-practices/SKILL.md +0 -0
  131. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/SKILL.md +0 -0
  132. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/bottlenecks.md +0 -0
  133. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/references/tracing-guide.md +0 -0
  134. /package/template-workspace/{.agents → .codex}/skills/rspack-tracing/scripts/analyze_trace.js +0 -0
  135. /package/template-workspace/{.agents → .codex}/skills/rstest-best-practices/SKILL.md +0 -0
@@ -6,6 +6,7 @@ const root = process.cwd();
6
6
  const defaultReportPath =
7
7
  '.codex/reports/performance-readiness/ultramodern-performance-readiness.json';
8
8
  const configPath = 'scripts/ultramodern-performance-readiness.config.mjs';
9
+ const compactConfigPath = '.modernjs/ultramodern.json';
9
10
  const optOutEnv = 'ULTRAMODERN_PERFORMANCE_READINESS_DIAGNOSTICS';
10
11
  const signalIds = [
11
12
  'bfcache',
@@ -60,6 +61,168 @@ const createSignal = (id, status, evidence) => ({
60
61
 
61
62
  const unique = values => new Set(values).size === values.length;
62
63
 
64
+ const toKebabCase = value =>
65
+ String(value)
66
+ .trim()
67
+ .replace(/([a-z0-9])([A-Z])/gu, '$1-$2')
68
+ .replace(/[^a-zA-Z0-9._-]+/gu, '-')
69
+ .replace(/[._]+/gu, '-')
70
+ .toLowerCase()
71
+ .replace(/-+/gu, '-')
72
+ .replace(/^-+|-+$/gu, '');
73
+
74
+ const toPascalCase = value =>
75
+ toKebabCase(value)
76
+ .split('-')
77
+ .filter(Boolean)
78
+ .map(part => part.charAt(0).toUpperCase() + part.slice(1))
79
+ .join('');
80
+
81
+ const normalizeRelativePath = value =>
82
+ String(value ?? '').replace(/\\/gu, '/').replace(/^\.\/+/u, '');
83
+
84
+ const appNamespace = app => (app.kind === 'shell' ? 'shell' : (app.domain ?? app.id));
85
+
86
+ const normalizeCompactApp = rawApp => {
87
+ const id = String(rawApp.id);
88
+ const kind = rawApp.kind === 'vertical' ? 'vertical' : 'shell';
89
+ const appPath =
90
+ typeof rawApp.path === 'string'
91
+ ? normalizeRelativePath(rawApp.path)
92
+ : kind === 'shell'
93
+ ? 'apps/shell-super-app'
94
+ : `verticals/${toKebabCase(id)}`;
95
+ const packageSuffix =
96
+ typeof rawApp.packageSuffix === 'string'
97
+ ? rawApp.packageSuffix
98
+ : appPath.split('/').at(-1) ?? id;
99
+ const domain =
100
+ typeof rawApp.domain === 'string'
101
+ ? rawApp.domain
102
+ : kind === 'vertical'
103
+ ? packageSuffix
104
+ : undefined;
105
+ const moduleFederation =
106
+ rawApp.moduleFederation && typeof rawApp.moduleFederation === 'object'
107
+ ? rawApp.moduleFederation
108
+ : {};
109
+
110
+ return {
111
+ id,
112
+ kind,
113
+ path: appPath,
114
+ packageSuffix,
115
+ domain,
116
+ port:
117
+ typeof rawApp.port === 'number'
118
+ ? rawApp.port
119
+ : kind === 'shell'
120
+ ? 3020
121
+ : 3030,
122
+ mfName:
123
+ typeof moduleFederation.name === 'string'
124
+ ? moduleFederation.name
125
+ : kind === 'shell'
126
+ ? 'shellSuperApp'
127
+ : `vertical${toPascalCase(domain ?? id)}`,
128
+ moduleFederation: {
129
+ remotes: [],
130
+ verticalRefs: Array.isArray(moduleFederation.verticalRefs)
131
+ ? moduleFederation.verticalRefs.filter(ref => typeof ref === 'string')
132
+ : [],
133
+ },
134
+ };
135
+ };
136
+
137
+ const createRemoteContracts = (app, apps) =>
138
+ (app.moduleFederation?.verticalRefs ?? [])
139
+ .map(ref => apps.find(candidate => candidate.id === ref))
140
+ .filter(Boolean)
141
+ .map(remote => ({
142
+ id: remote.id,
143
+ name: remote.mfName,
144
+ manifestUrl: `http://localhost:${remote.port ?? 3030}/mf-manifest.json`,
145
+ }));
146
+
147
+ const createPerformanceReadinessContract = () => ({
148
+ schemaVersion: 1,
149
+ default: 'enabled',
150
+ mode: 'diagnostic',
151
+ scope: 'ultramodern-generated-and-framework-owned',
152
+ report: {
153
+ script: 'scripts/ultramodern-performance-readiness.mts',
154
+ config: 'scripts/ultramodern-performance-readiness.config.mjs',
155
+ defaultPath: defaultReportPath,
156
+ deterministic: true,
157
+ },
158
+ signals: signalIds.map(id => ({ id })),
159
+ });
160
+
161
+ const createContractApp = (config, app, apps) => {
162
+ const compatibilityDate =
163
+ typeof config.deploy?.worker?.compatibilityDate === 'string'
164
+ ? config.deploy.worker.compatibilityDate
165
+ : '2026-06-02';
166
+
167
+ return {
168
+ id: app.id,
169
+ path: app.path,
170
+ config: {
171
+ plugins: [
172
+ 'appTools',
173
+ 'tanstackRouterPlugin',
174
+ 'i18nPlugin',
175
+ ...(app.kind === 'vertical' ? ['bffPlugin'] : []),
176
+ 'moduleFederationPlugin',
177
+ 'zephyrRspackPlugin',
178
+ ],
179
+ },
180
+ deploy: {
181
+ cloudflare: {
182
+ compatibilityDate,
183
+ compatibilityFlags: ['nodejs_compat', 'global_fetch_strictly_public'],
184
+ routes: {
185
+ ssr: '/en',
186
+ mfManifest: '/mf-manifest.json',
187
+ locale: `/locales/en/${appNamespace(app)}.json`,
188
+ },
189
+ qualityGates: {
190
+ assets: {
191
+ cacheControlRequiredForCss: true,
192
+ },
193
+ },
194
+ },
195
+ },
196
+ moduleFederation: {
197
+ remotes: createRemoteContracts(app, apps),
198
+ },
199
+ routes: {
200
+ localisedUrls: {},
201
+ publicSurface: {
202
+ artifactLifecycle: 'build-and-deploy-output',
203
+ },
204
+ },
205
+ };
206
+ };
207
+
208
+ const readGeneratedContractView = () => {
209
+ if (exists(compactConfigPath)) {
210
+ const compactConfig = readJson(compactConfigPath);
211
+ const apps = Array.isArray(compactConfig.topology?.apps)
212
+ ? compactConfig.topology.apps.map(normalizeCompactApp)
213
+ : [];
214
+ return {
215
+ sourcePath: compactConfigPath,
216
+ performanceReadiness: createPerformanceReadinessContract(),
217
+ apps: apps.map(app => createContractApp(compactConfig, app, apps)),
218
+ };
219
+ }
220
+
221
+ throw new Error(
222
+ `Missing UltraModern config. Expected ${compactConfigPath}.`,
223
+ );
224
+ };
225
+
63
226
  const appGeneratedFiles = app => [
64
227
  `${app.path}/modern.config.ts`,
65
228
  `${app.path}/module-federation.config.ts`,
@@ -181,14 +344,14 @@ const main = async () => {
181
344
  return;
182
345
  }
183
346
 
184
- const contract = readJson('.modernjs/ultramodern-generated-contract.json');
347
+ const contract = readGeneratedContractView();
185
348
  assert(
186
349
  contract.performanceReadiness?.default === 'enabled',
187
350
  'Generated contract must keep performance readiness diagnostics default-on',
188
351
  );
189
352
  assert(
190
353
  contract.performanceReadiness?.report?.script ===
191
- 'scripts/ultramodern-performance-readiness.mjs',
354
+ 'scripts/ultramodern-performance-readiness.mts',
192
355
  'Generated contract must point at the performance readiness diagnostics script',
193
356
  );
194
357
  const contractSignalIds =
@@ -9,11 +9,13 @@ import {
9
9
  mkdirSync,
10
10
  } from 'node:fs';
11
11
  import os from 'node:os';
12
- import { dirname, join } from 'node:path';
12
+ import { dirname, join, resolve } from 'node:path';
13
13
  import { fileURLToPath } from 'node:url';
14
14
 
15
15
  const args = process.argv.slice(2);
16
- const workspaceRoot = join(dirname(fileURLToPath(import.meta.url)), '..');
16
+ const workspaceRoot = process.env.ULTRAMODERN_WORKSPACE_ROOT
17
+ ? resolve(process.env.ULTRAMODERN_WORKSPACE_ROOT)
18
+ : join(dirname(fileURLToPath(import.meta.url)), '..');
17
19
  const cpuCount = Math.max(
18
20
  1,
19
21
  typeof os.availableParallelism === 'function'