@bleedingdev/modern-js-create 3.2.0-ultramodern.40 → 3.2.0-ultramodern.42
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.
package/dist/index.js
CHANGED
|
@@ -4676,7 +4676,7 @@ function createTemplateManifest(modernVersion, packageSource) {
|
|
|
4676
4676
|
'provenance-present'
|
|
4677
4677
|
],
|
|
4678
4678
|
materializationValidation: [
|
|
4679
|
-
'path-boundary-
|
|
4679
|
+
'path-boundary-policy',
|
|
4680
4680
|
'path-boundary-denylist',
|
|
4681
4681
|
'no-path-traversal',
|
|
4682
4682
|
'no-absolute-paths',
|
|
@@ -5138,6 +5138,7 @@ async function fetchText(url) {
|
|
|
5138
5138
|
return {
|
|
5139
5139
|
ok: response.ok,
|
|
5140
5140
|
status: response.status,
|
|
5141
|
+
accessControlAllowOrigin: response.headers.get('access-control-allow-origin'),
|
|
5141
5142
|
contentType: response.headers.get('content-type'),
|
|
5142
5143
|
body: await response.text(),
|
|
5143
5144
|
};
|
|
@@ -5246,6 +5247,16 @@ async function validateApp(app, publicUrl) {
|
|
|
5246
5247
|
manifest.ok,
|
|
5247
5248
|
\`\${app.id} MF manifest returned HTTP \${manifest.status}\`,
|
|
5248
5249
|
);
|
|
5250
|
+
evidence.assertions.push({
|
|
5251
|
+
type: 'mf-manifest-cors',
|
|
5252
|
+
route: manifestRoute,
|
|
5253
|
+
actual: manifest.accessControlAllowOrigin,
|
|
5254
|
+
status: manifest.accessControlAllowOrigin === '*' ? 'pass' : 'fail',
|
|
5255
|
+
});
|
|
5256
|
+
assert(
|
|
5257
|
+
manifest.accessControlAllowOrigin === '*',
|
|
5258
|
+
\`\${app.id} MF manifest is missing Cloudflare CORS headers\`,
|
|
5259
|
+
);
|
|
5249
5260
|
|
|
5250
5261
|
const localeRoute = routes.locale ?? \`/locales/en/\${app.i18n?.namespace}.json\`;
|
|
5251
5262
|
const locale = await fetchText(joinUrl(publicUrl, localeRoute));
|
|
@@ -5263,6 +5274,16 @@ async function validateApp(app, publicUrl) {
|
|
|
5263
5274
|
statusCode: locale.status,
|
|
5264
5275
|
});
|
|
5265
5276
|
assert(locale.ok, \`\${app.id} locale JSON returned HTTP \${locale.status}\`);
|
|
5277
|
+
evidence.assertions.push({
|
|
5278
|
+
type: 'i18n-cors',
|
|
5279
|
+
route: localeRoute,
|
|
5280
|
+
actual: locale.accessControlAllowOrigin,
|
|
5281
|
+
status: locale.accessControlAllowOrigin === '*' ? 'pass' : 'fail',
|
|
5282
|
+
});
|
|
5283
|
+
assert(
|
|
5284
|
+
locale.accessControlAllowOrigin === '*',
|
|
5285
|
+
\`\${app.id} locale JSON is missing Cloudflare CORS headers\`,
|
|
5286
|
+
);
|
|
5266
5287
|
assert(
|
|
5267
5288
|
localeJson && Object.hasOwn(localeJson, app.i18n?.namespace),
|
|
5268
5289
|
\`\${app.id} locale JSON is missing namespace \${app.i18n?.namespace}\`,
|
|
@@ -5377,23 +5398,13 @@ function writeApp(targetDir, scope, app, packageSource, enableTailwind) {
|
|
|
5377
5398
|
writeFile(targetDir, `${app.directory}/module-federation.config.ts`, 'shell' === app.kind ? createShellModuleFederationConfig() : createRemoteModuleFederationConfig(app));
|
|
5378
5399
|
writeFile(targetDir, `${app.directory}/src/routes/layout.tsx`, createLayout(app.id));
|
|
5379
5400
|
writeFile(targetDir, `${app.directory}/src/routes/[lang]/page.tsx`, 'shell' === app.kind ? createShellPage() : createRemotePage(app));
|
|
5380
|
-
for (const route of createRouteOwnedI18nPaths(app))
|
|
5381
|
-
if ('/' === route.canonicalPath || 'shell' === app.kind) continue;
|
|
5382
|
-
const routePaths = new Set([
|
|
5383
|
-
route.canonicalPath,
|
|
5384
|
-
...Object.values(route.localisedPaths)
|
|
5385
|
-
]);
|
|
5386
|
-
for (const routePath of routePaths)if ('/' !== routePath) writeFile(targetDir, createRoutePageFilePath(app, routePath), createRouteAliasPage(routePath));
|
|
5387
|
-
}
|
|
5401
|
+
for (const route of createRouteOwnedI18nPaths(app))if ('/' !== route.canonicalPath && 'shell' !== app.kind) writeFile(targetDir, createRoutePageFilePath(app, route.canonicalPath), createRouteAliasPage(route.canonicalPath));
|
|
5388
5402
|
if ('shell' === app.kind) {
|
|
5389
5403
|
writeFile(targetDir, `${app.directory}/src/routes/remote-components.tsx`, createShellRemoteComponents());
|
|
5390
5404
|
writeFile(targetDir, `${app.directory}/src/effect/recommendations-client.ts`, createShellEffectClient(scope));
|
|
5391
5405
|
writeFile(targetDir, `${app.directory}/src/routes/[lang]/tractors/page.tsx`, createShellTractorsPage());
|
|
5392
|
-
writeFile(targetDir, `${app.directory}/src/routes/[lang]/traktory/page.tsx`, createShellTractorsPage());
|
|
5393
5406
|
writeFile(targetDir, `${app.directory}/src/routes/[lang]/tractors/[slug]/page.tsx`, createShellProductPage());
|
|
5394
|
-
writeFile(targetDir, `${app.directory}/src/routes/[lang]/traktory/[slug]/page.tsx`, createShellProductPage());
|
|
5395
5407
|
writeFile(targetDir, `${app.directory}/src/routes/[lang]/cart/page.tsx`, createShellCartPage());
|
|
5396
|
-
writeFile(targetDir, `${app.directory}/src/routes/[lang]/kosik/page.tsx`, createShellCartPage());
|
|
5397
5408
|
}
|
|
5398
5409
|
if (appHasEffectApi(app)) {
|
|
5399
5410
|
writeFile(targetDir, `${app.directory}/shared/effect/api.ts`, createEffectSharedApi(app));
|
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20"
|
|
23
23
|
},
|
|
24
|
-
"version": "3.2.0-ultramodern.
|
|
24
|
+
"version": "3.2.0-ultramodern.42",
|
|
25
25
|
"types": "./dist/types/index.d.ts",
|
|
26
26
|
"main": "./dist/index.js",
|
|
27
27
|
"bin": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@types/node": "^25.9.1",
|
|
42
42
|
"@typescript/native-preview": "7.0.0-dev.20260527.2",
|
|
43
43
|
"tsx": "^4.22.3",
|
|
44
|
-
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.
|
|
44
|
+
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.2.0-ultramodern.42"
|
|
45
45
|
},
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"registry": "https://registry.npmjs.org/",
|
|
@@ -54,6 +54,6 @@
|
|
|
54
54
|
"start": "node ./dist/index.js"
|
|
55
55
|
},
|
|
56
56
|
"ultramodern": {
|
|
57
|
-
"frameworkVersion": "3.2.0-ultramodern.
|
|
57
|
+
"frameworkVersion": "3.2.0-ultramodern.42"
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -36,7 +36,7 @@ ScriptedAlchemy/TechsioCZ skills are private and are cloned only when the curren
|
|
|
36
36
|
pnpm skills:install
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
The installer copies only the
|
|
39
|
+
The installer copies only the pinned private skills from `.agents/skills-lock.json`: `plan-graph`, `dag`, `subagent-graph`, `helm`, and `debugger-mode`.
|
|
40
40
|
|
|
41
41
|
## Agent Reference Repositories
|
|
42
42
|
|
|
@@ -58,4 +58,4 @@ Agents may read files under `repos/` to understand upstream patterns, APIs, and
|
|
|
58
58
|
|
|
59
59
|
## Skill Provenance
|
|
60
60
|
|
|
61
|
-
The vendored Rstack skills, public Module Federation skill, and private TechsioCZ skill
|
|
61
|
+
The vendored Rstack skills, public Module Federation skill, and private TechsioCZ skill set are pinned in `.agents/skills-lock.json`. Do not update, remove, or replace them casually. If a skill needs updating, update the lock file and run `pnpm check`.
|
|
@@ -4,22 +4,7 @@ packages:
|
|
|
4
4
|
- services/*
|
|
5
5
|
- packages/*
|
|
6
6
|
|
|
7
|
-
minimumReleaseAge:
|
|
8
|
-
minimumReleaseAgeStrict: true
|
|
9
|
-
minimumReleaseAgeIgnoreMissingTime: false
|
|
10
|
-
minimumReleaseAgeExclude:
|
|
11
|
-
- '@modern-js/*'
|
|
12
|
-
- '@bleedingdev/*'
|
|
13
|
-
- '@effect/tsgo'
|
|
14
|
-
- '@effect/tsgo-*'
|
|
15
|
-
- '@typescript/native-preview'
|
|
16
|
-
- '@typescript/native-preview-*'
|
|
17
|
-
- '@cloudflare/*'
|
|
18
|
-
- miniflare
|
|
19
|
-
- workerd
|
|
20
|
-
- wrangler
|
|
21
|
-
trustPolicy: no-downgrade
|
|
22
|
-
trustPolicyIgnoreAfter: 1440
|
|
7
|
+
minimumReleaseAge: 0
|
|
23
8
|
blockExoticSubdeps: true
|
|
24
9
|
engineStrict: true
|
|
25
10
|
pmOnFail: error
|
|
@@ -244,30 +244,18 @@ assert(
|
|
|
244
244
|
JSON.stringify(['apps/*', 'apps/remotes/*', 'services/*', 'packages/*']),
|
|
245
245
|
'pnpm-workspace.yaml must retain workspace package globs',
|
|
246
246
|
);
|
|
247
|
-
assert(readPnpmConfig('minimumReleaseAge') ===
|
|
248
|
-
assert(readPnpmConfig('minimumReleaseAgeStrict') ===
|
|
249
|
-
assert(
|
|
250
|
-
readPnpmConfig('minimumReleaseAgeIgnoreMissingTime') ===
|
|
251
|
-
'pnpm minimumReleaseAgeIgnoreMissingTime must
|
|
252
|
-
);
|
|
253
|
-
assert(
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
'@effect/tsgo-*',
|
|
260
|
-
'@typescript/native-preview',
|
|
261
|
-
'@typescript/native-preview-*',
|
|
262
|
-
'@cloudflare/*',
|
|
263
|
-
'miniflare',
|
|
264
|
-
'workerd',
|
|
265
|
-
'wrangler',
|
|
266
|
-
]),
|
|
267
|
-
'pnpm minimumReleaseAgeExclude must retain framework and Cloudflare exceptions',
|
|
268
|
-
);
|
|
269
|
-
assert(readPnpmConfig('trustPolicy') === 'no-downgrade', 'pnpm trustPolicy must be no-downgrade');
|
|
270
|
-
assert(readPnpmConfig('trustPolicyIgnoreAfter') === 1440, 'pnpm trustPolicyIgnoreAfter must be 1440');
|
|
247
|
+
assert(readPnpmConfig('minimumReleaseAge') === 0, 'pnpm minimumReleaseAge must be 0');
|
|
248
|
+
assert(readPnpmConfig('minimumReleaseAgeStrict') === undefined, 'pnpm minimumReleaseAgeStrict must stay unset');
|
|
249
|
+
assert(
|
|
250
|
+
readPnpmConfig('minimumReleaseAgeIgnoreMissingTime') === undefined,
|
|
251
|
+
'pnpm minimumReleaseAgeIgnoreMissingTime must stay unset',
|
|
252
|
+
);
|
|
253
|
+
assert(
|
|
254
|
+
readPnpmConfig('minimumReleaseAgeExclude') === undefined,
|
|
255
|
+
'pnpm minimumReleaseAgeExclude must stay unset',
|
|
256
|
+
);
|
|
257
|
+
assert(readPnpmConfig('trustPolicy') === undefined, 'pnpm trustPolicy must stay unset');
|
|
258
|
+
assert(readPnpmConfig('trustPolicyIgnoreAfter') === undefined, 'pnpm trustPolicyIgnoreAfter must stay unset');
|
|
271
259
|
assert(readPnpmConfig('blockExoticSubdeps') === true, 'pnpm blockExoticSubdeps must be true');
|
|
272
260
|
assert(readPnpmConfig('engineStrict') === true, 'pnpm engineStrict must be true');
|
|
273
261
|
assert(readPnpmConfig('pmOnFail') === 'error', 'pnpm pmOnFail must be error');
|
|
@@ -492,7 +480,7 @@ assert(
|
|
|
492
480
|
for (const skillName of privateAgentSkills) {
|
|
493
481
|
assert(
|
|
494
482
|
privateSource.baseline?.some((skill) => skill.name === skillName),
|
|
495
|
-
`Agent skills lock must
|
|
483
|
+
`Agent skills lock must pin private skill ${skillName}`,
|
|
496
484
|
);
|
|
497
485
|
}
|
|
498
486
|
|
|
@@ -926,7 +914,7 @@ assert(
|
|
|
926
914
|
privateAgentSkills.every((skillName) =>
|
|
927
915
|
manifest.agentSkills?.privateSource?.baseline?.includes(skillName),
|
|
928
916
|
),
|
|
929
|
-
'Template manifest must list every private agent skill
|
|
917
|
+
'Template manifest must list every pinned private agent skill entry',
|
|
930
918
|
);
|
|
931
919
|
assert(
|
|
932
920
|
manifest.validation?.expectedCommands?.includes('mise exec -- pnpm run ultramodern:check'),
|