@bleedingdev/modern-js-create 3.2.0-ultramodern.0

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 (33) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/bin/run.js +73 -0
  4. package/dist/index.js +2320 -0
  5. package/dist/types/index.d.ts +1 -0
  6. package/dist/types/locale/en.d.ts +55 -0
  7. package/dist/types/locale/index.d.ts +112 -0
  8. package/dist/types/locale/zh.d.ts +55 -0
  9. package/dist/types/ultramodern-workspace.d.ts +20 -0
  10. package/package.json +56 -0
  11. package/template/.browserslistrc +4 -0
  12. package/template/.github/workflows/ultramodern-gates.yml.handlebars +30 -0
  13. package/template/.gitignore.handlebars +30 -0
  14. package/template/.nvmrc +2 -0
  15. package/template/README.md +78 -0
  16. package/template/api/effect/index.ts.handlebars +61 -0
  17. package/template/api/lambda/hello.ts.handlebars +6 -0
  18. package/template/biome.json +41 -0
  19. package/template/modern.config.ts.handlebars +50 -0
  20. package/template/package.json.handlebars +47 -0
  21. package/template/postcss.config.mjs.handlebars +6 -0
  22. package/template/scripts/validate-ultramodern.mjs.handlebars +102 -0
  23. package/template/shared/effect/api.ts.handlebars +18 -0
  24. package/template/src/modern-app-env.d.ts +1 -0
  25. package/template/src/modern.runtime.ts.handlebars +9 -0
  26. package/template/src/routes/index.css.handlebars +118 -0
  27. package/template/src/routes/layout.tsx.handlebars +9 -0
  28. package/template/src/routes/page.tsx.handlebars +119 -0
  29. package/template/tailwind.config.ts.handlebars +10 -0
  30. package/template/tsconfig.json +16 -0
  31. package/template-workspace/README.md.handlebars +28 -0
  32. package/template-workspace/pnpm-workspace.yaml +5 -0
  33. package/template-workspace/scripts/validate-ultramodern-workspace.mjs.handlebars +276 -0
@@ -0,0 +1,276 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ const root = process.cwd();
5
+ const packageScope = '{{packageScope}}';
6
+ const tanstackVersion = '1.170.1';
7
+ const modernPackages = [
8
+ '@modern-js/app-tools',
9
+ '@modern-js/plugin-bff',
10
+ '@modern-js/plugin-tanstack',
11
+ '@modern-js/runtime',
12
+ ];
13
+
14
+ function readText(relativePath) {
15
+ return fs.readFileSync(path.join(root, relativePath), 'utf-8');
16
+ }
17
+
18
+ function readJson(relativePath) {
19
+ return JSON.parse(readText(relativePath));
20
+ }
21
+
22
+ function assert(condition, message) {
23
+ if (!condition) {
24
+ throw new Error(message);
25
+ }
26
+ }
27
+
28
+ function assertExists(relativePath) {
29
+ assert(fs.existsSync(path.join(root, relativePath)), `Missing ${relativePath}`);
30
+ }
31
+
32
+ const requiredPaths = [
33
+ 'package.json',
34
+ 'pnpm-workspace.yaml',
35
+ 'tsconfig.base.json',
36
+ 'topology/reference-topology.json',
37
+ 'topology/ownership.json',
38
+ 'topology/local-overlays/development.json',
39
+ '.modernjs/ultramodern-workspace-template-manifest.json',
40
+ '.modernjs/ultramodern-package-source.json',
41
+ 'apps/shell-super-app/package.json',
42
+ 'apps/shell-super-app/modern.config.ts',
43
+ 'apps/shell-super-app/module-federation.config.ts',
44
+ 'apps/remotes/remote-commerce/package.json',
45
+ 'apps/remotes/remote-commerce/modern.config.ts',
46
+ 'apps/remotes/remote-commerce/module-federation.config.ts',
47
+ 'apps/remotes/remote-identity/package.json',
48
+ 'apps/remotes/remote-identity/modern.config.ts',
49
+ 'apps/remotes/remote-identity/module-federation.config.ts',
50
+ 'apps/remotes/remote-design-system/package.json',
51
+ 'apps/remotes/remote-design-system/modern.config.ts',
52
+ 'apps/remotes/remote-design-system/module-federation.config.ts',
53
+ 'services/service-recommendations-effect/package.json',
54
+ 'services/service-recommendations-effect/modern.config.ts',
55
+ 'services/service-recommendations-effect/api/effect/index.ts',
56
+ 'services/service-recommendations-effect/shared/effect/api.ts',
57
+ 'packages/shared-contracts/src/index.ts',
58
+ 'packages/shared-design-tokens/src/index.ts',
59
+ 'packages/shared-effect-api/src/index.ts',
60
+ ];
61
+
62
+ for (const requiredPath of requiredPaths) {
63
+ assertExists(requiredPath);
64
+ }
65
+
66
+ const rootPackage = readJson('package.json');
67
+ const packageSource = readJson('.modernjs/ultramodern-package-source.json');
68
+ const expectedModernSpecifier =
69
+ packageSource.strategy === 'install'
70
+ ? packageSource.modernPackages?.specifier
71
+ : 'workspace:*';
72
+
73
+ function expectedModernDependency(packageName) {
74
+ if (packageSource.strategy !== 'install') {
75
+ return 'workspace:*';
76
+ }
77
+
78
+ const aliasPackageName = packageSource.modernPackages?.aliases?.[packageName];
79
+ return aliasPackageName
80
+ ? `npm:${aliasPackageName}@${expectedModernSpecifier}`
81
+ : expectedModernSpecifier;
82
+ }
83
+
84
+ assert(rootPackage.private === true, 'Root package must be private');
85
+ assert(rootPackage.modernjs?.preset === 'presetUltramodern', 'Root must declare presetUltramodern');
86
+ assert(
87
+ rootPackage.modernjs?.packageSource?.config ===
88
+ './.modernjs/ultramodern-package-source.json',
89
+ 'Root must point to the UltraModern package source metadata',
90
+ );
91
+ assert(
92
+ rootPackage.modernjs?.packageSource?.strategy === packageSource.strategy,
93
+ 'Root package source strategy must match the UltraModern package source metadata',
94
+ );
95
+ assert(
96
+ packageSource.strategy === 'workspace' || packageSource.strategy === 'install',
97
+ 'Package source strategy must be workspace or install',
98
+ );
99
+ assert(
100
+ packageSource.generatedWorkspacePackages?.specifier === 'workspace:*',
101
+ 'Generated shared packages must keep workspace:* links',
102
+ );
103
+ assert(
104
+ modernPackages.every(packageName =>
105
+ packageSource.modernPackages?.packages?.includes(packageName),
106
+ ),
107
+ 'Package source metadata must list all Modern runtime/tooling packages',
108
+ );
109
+ assert(
110
+ expectedModernSpecifier &&
111
+ packageSource.modernPackages?.specifier === expectedModernSpecifier,
112
+ 'Package source metadata must provide a Modern package specifier',
113
+ );
114
+ assert(
115
+ rootPackage.scripts?.['ultramodern:check'] ===
116
+ 'node ./scripts/validate-ultramodern-workspace.mjs',
117
+ 'Root must expose the ultramodern:check script',
118
+ );
119
+
120
+ const appPackagePaths = [
121
+ 'apps/shell-super-app/package.json',
122
+ 'apps/remotes/remote-commerce/package.json',
123
+ 'apps/remotes/remote-identity/package.json',
124
+ 'apps/remotes/remote-design-system/package.json',
125
+ ];
126
+
127
+ for (const packagePath of appPackagePaths) {
128
+ const packageJson = readJson(packagePath);
129
+ assert(
130
+ packageJson.dependencies?.['@modern-js/plugin-tanstack'] ===
131
+ expectedModernDependency('@modern-js/plugin-tanstack'),
132
+ `${packagePath} must depend on @modern-js/plugin-tanstack through ${expectedModernDependency('@modern-js/plugin-tanstack')}`,
133
+ );
134
+ assert(
135
+ packageJson.dependencies?.['@modern-js/runtime'] ===
136
+ expectedModernDependency('@modern-js/runtime'),
137
+ `${packagePath} must depend on @modern-js/runtime through ${expectedModernDependency('@modern-js/runtime')}`,
138
+ );
139
+ assert(
140
+ packageJson.devDependencies?.['@modern-js/app-tools'] ===
141
+ expectedModernDependency('@modern-js/app-tools'),
142
+ `${packagePath} must depend on @modern-js/app-tools through ${expectedModernDependency('@modern-js/app-tools')}`,
143
+ );
144
+ assert(
145
+ packageJson.dependencies?.[`@${packageScope}/shared-contracts`] ===
146
+ 'workspace:*',
147
+ `${packagePath} must link generated shared contracts through workspace:*`,
148
+ );
149
+ assert(
150
+ packageJson.dependencies?.[`@${packageScope}/shared-design-tokens`] ===
151
+ 'workspace:*',
152
+ `${packagePath} must link generated shared design tokens through workspace:*`,
153
+ );
154
+ assert(
155
+ packageJson.dependencies?.['@tanstack/react-router'] === tanstackVersion,
156
+ `${packagePath} must use @tanstack/react-router ${tanstackVersion}`,
157
+ );
158
+ assert(
159
+ packageJson.dependencies?.['@module-federation/modern-js-v3'] === '2.4.0',
160
+ `${packagePath} must include the Module Federation plugin`,
161
+ );
162
+ assert(
163
+ packageJson.modernjs?.preset === 'presetUltramodern',
164
+ `${packagePath} must keep presetUltramodern metadata`,
165
+ );
166
+ }
167
+
168
+ for (const configPath of [
169
+ 'apps/shell-super-app/modern.config.ts',
170
+ 'apps/remotes/remote-commerce/modern.config.ts',
171
+ 'apps/remotes/remote-identity/modern.config.ts',
172
+ 'apps/remotes/remote-design-system/modern.config.ts',
173
+ ]) {
174
+ const config = readText(configPath);
175
+ assert(config.includes('presetUltramodern('), `${configPath} must use presetUltramodern`);
176
+ assert(config.includes('tanstackRouterPlugin()'), `${configPath} must enable plugin-tanstack`);
177
+ assert(config.includes('moduleFederationPlugin()'), `${configPath} must enable Module Federation`);
178
+ }
179
+
180
+ const shellMf = readText('apps/shell-super-app/module-federation.config.ts');
181
+ assert(shellMf.includes("name: 'shellSuperApp'"), 'Shell MF config must name the shell');
182
+ assert(shellMf.includes('remoteCommerce@http://localhost:3021/mf-manifest.json'), 'Shell must reference commerce remote');
183
+ assert(shellMf.includes('remoteIdentity@http://localhost:3022/mf-manifest.json'), 'Shell must reference identity remote');
184
+ assert(shellMf.includes('remoteDesignSystem@http://localhost:3023/mf-manifest.json'), 'Shell must reference design-system remote');
185
+
186
+ const commerceMf = readText('apps/remotes/remote-commerce/module-federation.config.ts');
187
+ assert(commerceMf.includes("name: 'remoteCommerce'"), 'Commerce remote MF name is missing');
188
+ assert(commerceMf.includes('"./Widget"'), 'Commerce remote must expose a widget');
189
+
190
+ const designMf = readText('apps/remotes/remote-design-system/module-federation.config.ts');
191
+ assert(designMf.includes("name: 'remoteDesignSystem'"), 'Design-system remote MF name is missing');
192
+ assert(designMf.includes('"./Button"'), 'Design-system remote must expose Button');
193
+ assert(designMf.includes('"./tokens"'), 'Design-system remote must expose tokens');
194
+
195
+ const servicePackage = readJson('services/service-recommendations-effect/package.json');
196
+ assert(
197
+ servicePackage.dependencies?.['@modern-js/runtime'] ===
198
+ expectedModernDependency('@modern-js/runtime'),
199
+ `Effect service must use @modern-js/runtime through ${expectedModernDependency('@modern-js/runtime')}`,
200
+ );
201
+ assert(
202
+ servicePackage.devDependencies?.['@modern-js/app-tools'] ===
203
+ expectedModernDependency('@modern-js/app-tools'),
204
+ `Effect service must use @modern-js/app-tools through ${expectedModernDependency('@modern-js/app-tools')}`,
205
+ );
206
+ assert(
207
+ servicePackage.devDependencies?.['@modern-js/plugin-bff'] ===
208
+ expectedModernDependency('@modern-js/plugin-bff'),
209
+ `Effect service must use @modern-js/plugin-bff through ${expectedModernDependency('@modern-js/plugin-bff')}`,
210
+ );
211
+ assert(
212
+ servicePackage.dependencies?.[`@${packageScope}/shared-effect-api`] ===
213
+ 'workspace:*',
214
+ 'Effect service must link generated shared Effect API through workspace:*',
215
+ );
216
+
217
+ const serviceConfig = readText('services/service-recommendations-effect/modern.config.ts');
218
+ assert(serviceConfig.includes("runtimeFramework: 'effect'"), 'Effect service must use Effect runtime');
219
+ assert(serviceConfig.includes('bffPlugin()'), 'Effect service must enable bffPlugin');
220
+
221
+ const serviceEntry = readText('services/service-recommendations-effect/api/effect/index.ts');
222
+ assert(serviceEntry.includes('defineEffectBff'), 'Effect service must expose defineEffectBff placeholder');
223
+ assert(serviceEntry.includes('recommendationsEffectApi'), 'Effect service must use shared recommendations API');
224
+
225
+ const serviceApi = readText('services/service-recommendations-effect/shared/effect/api.ts');
226
+ assert(serviceApi.includes('HttpApi.make'), 'Effect shared API placeholder must define HttpApi');
227
+
228
+ const topology = readJson('topology/reference-topology.json');
229
+ assert(topology.preset === 'presetUltramodern', 'Topology must reference presetUltramodern');
230
+ assert(topology.shell?.id === 'shell-super-app', 'Topology shell id is incorrect');
231
+ assert(topology.shell?.remoteRefs?.length === 3, 'Topology shell must reference three remotes');
232
+ assert(topology.remotes?.length === 3, 'Topology must contain three remotes');
233
+ assert(
234
+ topology.remotes.some(
235
+ remote =>
236
+ remote.id === 'remote-design-system' &&
237
+ remote.kind === 'horizontal-design-system',
238
+ ),
239
+ 'Topology must contain the horizontal design-system remote',
240
+ );
241
+ assert(topology.effectServices?.[0]?.runtime === 'effect', 'Topology must contain an Effect service');
242
+ assert(topology.sharedPackages?.length === 3, 'Topology must contain shared package placeholders');
243
+
244
+ const ownership = readJson('topology/ownership.json');
245
+ assert(
246
+ ownership.owners?.some(
247
+ owner =>
248
+ owner.id === 'remote-commerce' &&
249
+ owner.ownership?.team === 'commerce-experience',
250
+ ),
251
+ 'Ownership metadata must retain commerce owner',
252
+ );
253
+ assert(
254
+ ownership.owners?.some(
255
+ owner =>
256
+ owner.id === 'service-recommendations-effect' &&
257
+ owner.package === `@${packageScope}/service-recommendations-effect`,
258
+ ),
259
+ 'Ownership metadata must retain Effect service owner',
260
+ );
261
+
262
+ const manifest = readJson('.modernjs/ultramodern-workspace-template-manifest.json');
263
+ assert(
264
+ manifest.template?.id === 'modernjs-ultramodern-superapp-workspace',
265
+ 'Template manifest evidence is missing',
266
+ );
267
+ assert(
268
+ manifest.packageSource?.strategy === packageSource.strategy,
269
+ 'Template manifest must retain the generated package source strategy',
270
+ );
271
+ assert(
272
+ manifest.validation?.expectedCommands?.includes('pnpm run ultramodern:check'),
273
+ 'Template manifest must document the validation command',
274
+ );
275
+
276
+ console.log('UltraModern workspace scaffold validated');