@bleedingdev/modern-js-create 3.5.0-ultramodern.3 → 3.5.0-ultramodern.5
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/README.md +6 -5
- package/dist/cjs/ultramodern-tooling/commands.cjs +29 -16
- package/dist/esm/ultramodern-tooling/commands.js +29 -16
- package/dist/esm-node/ultramodern-tooling/commands.js +29 -16
- package/package.json +3 -3
- package/template-workspace/README.md.handlebars +6 -5
- package/template-workspace/pnpm-workspace.yaml.handlebars +3 -0
package/README.md
CHANGED
|
@@ -193,8 +193,8 @@ For strict Effect API migrations, update generated package metadata and Modern
|
|
|
193
193
|
package aliases through the framework command before hand-editing app code:
|
|
194
194
|
|
|
195
195
|
```bash
|
|
196
|
-
pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.
|
|
197
|
-
migrate-strict-effect --version 3.5.0-ultramodern.
|
|
196
|
+
pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.5 ultramodern \
|
|
197
|
+
migrate-strict-effect --version 3.5.0-ultramodern.5
|
|
198
198
|
pnpm api:check
|
|
199
199
|
pnpm contract:check
|
|
200
200
|
pnpm check
|
|
@@ -212,9 +212,10 @@ your back. If `pnpm api:check` still fails, migrate the source to
|
|
|
212
212
|
Generated strict Effect workspaces pin the compatible Effect cohort through
|
|
213
213
|
`pnpm-workspace.yaml` overrides: `effect@4.0.0-beta.91` and
|
|
214
214
|
`@effect/vitest@4.0.0-beta.91`. The generated pnpm policy also excludes the
|
|
215
|
-
known `@effect/opentelemetry@4.0.0-beta.91`
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
known `effect@4.0.0-beta.91` and `@effect/opentelemetry@4.0.0-beta.91`
|
|
216
|
+
versions from the 24-hour minimum-release-age gate and their trusted-publisher
|
|
217
|
+
to provenance transitions from no-downgrade checks. Do not override those in
|
|
218
|
+
app packages; update the framework cohort when the runtime moves.
|
|
218
219
|
|
|
219
220
|
Use `--ultramodern-package-source=install` for published cohort proof and pin a
|
|
220
221
|
specific release with `--ultramodern-package-version` when CI must prove an
|
|
@@ -229,6 +229,10 @@ const generatedToolingDependencyPins = new Map([
|
|
|
229
229
|
versions_cjs_namespaceObject.ZEPHYR_RSPACK_PLUGIN_VERSION
|
|
230
230
|
]
|
|
231
231
|
]);
|
|
232
|
+
const strictEffectPackageVersionPolicyExclusions = [
|
|
233
|
+
`effect@${versions_cjs_namespaceObject.EFFECT_VERSION}`,
|
|
234
|
+
`@effect/opentelemetry@${versions_cjs_namespaceObject.EFFECT_VERSION}`
|
|
235
|
+
];
|
|
232
236
|
function updateGeneratedToolingDependencies(packageJson) {
|
|
233
237
|
let changed = false;
|
|
234
238
|
for (const section of [
|
|
@@ -322,16 +326,17 @@ function replaceYamlLine(source, pattern, replacement) {
|
|
|
322
326
|
function ensureYamlListItem(source, key, item) {
|
|
323
327
|
const itemLine = ` - '${item}'`;
|
|
324
328
|
const headerPattern = new RegExp(`^${key}:\\n(?:(?: - .+\\n)*)`, 'mu');
|
|
325
|
-
const existingItemPattern = new RegExp(`^ - '${item.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&')}'$`, 'mu');
|
|
326
|
-
if (existingItemPattern.test(source)) return {
|
|
327
|
-
source,
|
|
328
|
-
changed: false
|
|
329
|
-
};
|
|
330
329
|
const header = source.match(headerPattern);
|
|
331
|
-
if (header)
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
330
|
+
if (header) {
|
|
331
|
+
if (header[0].split('\n').includes(itemLine)) return {
|
|
332
|
+
source,
|
|
333
|
+
changed: false
|
|
334
|
+
};
|
|
335
|
+
return {
|
|
336
|
+
source: source.replace(headerPattern, `${header[0]}${itemLine}\n`),
|
|
337
|
+
changed: true
|
|
338
|
+
};
|
|
339
|
+
}
|
|
335
340
|
const block = `${key}:\n${itemLine}\n`;
|
|
336
341
|
const afterTrustPolicyIgnore = source.replace(/^(trustPolicyIgnoreAfter: .+\n)/mu, `$1${block}`);
|
|
337
342
|
if (afterTrustPolicyIgnore !== source) return {
|
|
@@ -360,10 +365,6 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
|
|
|
360
365
|
[
|
|
361
366
|
/^ {2}effect: .+$/mu,
|
|
362
367
|
` effect: ${versions_cjs_namespaceObject.EFFECT_VERSION}`
|
|
363
|
-
],
|
|
364
|
-
[
|
|
365
|
-
/^ {2}- '@effect\/opentelemetry@[^']+'$/mu,
|
|
366
|
-
` - '@effect/opentelemetry@${versions_cjs_namespaceObject.EFFECT_VERSION}'`
|
|
367
368
|
]
|
|
368
369
|
];
|
|
369
370
|
for (const [pattern, replacement] of replacements){
|
|
@@ -371,9 +372,21 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
|
|
|
371
372
|
source = result.source;
|
|
372
373
|
changed = result.changed || changed;
|
|
373
374
|
}
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
|
|
375
|
+
for (const item of strictEffectPackageVersionPolicyExclusions){
|
|
376
|
+
const packageName = item.slice(0, item.lastIndexOf('@'));
|
|
377
|
+
const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
378
|
+
const currentVersion = replaceYamlLine(source, new RegExp(`^ {2}- '${escapedPackageName}@[^']+'$`, 'gmu'), ` - '${item}'`);
|
|
379
|
+
source = currentVersion.source;
|
|
380
|
+
changed = currentVersion.changed || changed;
|
|
381
|
+
for (const policyKey of [
|
|
382
|
+
'minimumReleaseAgeExclude',
|
|
383
|
+
'trustPolicyExclude'
|
|
384
|
+
]){
|
|
385
|
+
const policyExclude = ensureYamlListItem(source, policyKey, item);
|
|
386
|
+
source = policyExclude.source;
|
|
387
|
+
changed = policyExclude.changed || changed;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
377
390
|
if (changed) external_node_fs_default().writeFileSync(workspaceFile, source, 'utf-8');
|
|
378
391
|
return changed;
|
|
379
392
|
}
|
|
@@ -182,6 +182,10 @@ const generatedToolingDependencyPins = new Map([
|
|
|
182
182
|
ZEPHYR_RSPACK_PLUGIN_VERSION
|
|
183
183
|
]
|
|
184
184
|
]);
|
|
185
|
+
const strictEffectPackageVersionPolicyExclusions = [
|
|
186
|
+
`effect@${EFFECT_VERSION}`,
|
|
187
|
+
`@effect/opentelemetry@${EFFECT_VERSION}`
|
|
188
|
+
];
|
|
185
189
|
function updateGeneratedToolingDependencies(packageJson) {
|
|
186
190
|
let changed = false;
|
|
187
191
|
for (const section of [
|
|
@@ -275,16 +279,17 @@ function replaceYamlLine(source, pattern, replacement) {
|
|
|
275
279
|
function ensureYamlListItem(source, key, item) {
|
|
276
280
|
const itemLine = ` - '${item}'`;
|
|
277
281
|
const headerPattern = new RegExp(`^${key}:\\n(?:(?: - .+\\n)*)`, 'mu');
|
|
278
|
-
const existingItemPattern = new RegExp(`^ - '${item.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&')}'$`, 'mu');
|
|
279
|
-
if (existingItemPattern.test(source)) return {
|
|
280
|
-
source,
|
|
281
|
-
changed: false
|
|
282
|
-
};
|
|
283
282
|
const header = source.match(headerPattern);
|
|
284
|
-
if (header)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
283
|
+
if (header) {
|
|
284
|
+
if (header[0].split('\n').includes(itemLine)) return {
|
|
285
|
+
source,
|
|
286
|
+
changed: false
|
|
287
|
+
};
|
|
288
|
+
return {
|
|
289
|
+
source: source.replace(headerPattern, `${header[0]}${itemLine}\n`),
|
|
290
|
+
changed: true
|
|
291
|
+
};
|
|
292
|
+
}
|
|
288
293
|
const block = `${key}:\n${itemLine}\n`;
|
|
289
294
|
const afterTrustPolicyIgnore = source.replace(/^(trustPolicyIgnoreAfter: .+\n)/mu, `$1${block}`);
|
|
290
295
|
if (afterTrustPolicyIgnore !== source) return {
|
|
@@ -313,10 +318,6 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
|
|
|
313
318
|
[
|
|
314
319
|
/^ {2}effect: .+$/mu,
|
|
315
320
|
` effect: ${EFFECT_VERSION}`
|
|
316
|
-
],
|
|
317
|
-
[
|
|
318
|
-
/^ {2}- '@effect\/opentelemetry@[^']+'$/mu,
|
|
319
|
-
` - '@effect/opentelemetry@${EFFECT_VERSION}'`
|
|
320
321
|
]
|
|
321
322
|
];
|
|
322
323
|
for (const [pattern, replacement] of replacements){
|
|
@@ -324,9 +325,21 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
|
|
|
324
325
|
source = result.source;
|
|
325
326
|
changed = result.changed || changed;
|
|
326
327
|
}
|
|
327
|
-
const
|
|
328
|
-
|
|
329
|
-
|
|
328
|
+
for (const item of strictEffectPackageVersionPolicyExclusions){
|
|
329
|
+
const packageName = item.slice(0, item.lastIndexOf('@'));
|
|
330
|
+
const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
331
|
+
const currentVersion = replaceYamlLine(source, new RegExp(`^ {2}- '${escapedPackageName}@[^']+'$`, 'gmu'), ` - '${item}'`);
|
|
332
|
+
source = currentVersion.source;
|
|
333
|
+
changed = currentVersion.changed || changed;
|
|
334
|
+
for (const policyKey of [
|
|
335
|
+
'minimumReleaseAgeExclude',
|
|
336
|
+
'trustPolicyExclude'
|
|
337
|
+
]){
|
|
338
|
+
const policyExclude = ensureYamlListItem(source, policyKey, item);
|
|
339
|
+
source = policyExclude.source;
|
|
340
|
+
changed = policyExclude.changed || changed;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
330
343
|
if (changed) node_fs.writeFileSync(workspaceFile, source, 'utf-8');
|
|
331
344
|
return changed;
|
|
332
345
|
}
|
|
@@ -183,6 +183,10 @@ const generatedToolingDependencyPins = new Map([
|
|
|
183
183
|
ZEPHYR_RSPACK_PLUGIN_VERSION
|
|
184
184
|
]
|
|
185
185
|
]);
|
|
186
|
+
const strictEffectPackageVersionPolicyExclusions = [
|
|
187
|
+
`effect@${EFFECT_VERSION}`,
|
|
188
|
+
`@effect/opentelemetry@${EFFECT_VERSION}`
|
|
189
|
+
];
|
|
186
190
|
function updateGeneratedToolingDependencies(packageJson) {
|
|
187
191
|
let changed = false;
|
|
188
192
|
for (const section of [
|
|
@@ -276,16 +280,17 @@ function replaceYamlLine(source, pattern, replacement) {
|
|
|
276
280
|
function ensureYamlListItem(source, key, item) {
|
|
277
281
|
const itemLine = ` - '${item}'`;
|
|
278
282
|
const headerPattern = new RegExp(`^${key}:\\n(?:(?: - .+\\n)*)`, 'mu');
|
|
279
|
-
const existingItemPattern = new RegExp(`^ - '${item.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&')}'$`, 'mu');
|
|
280
|
-
if (existingItemPattern.test(source)) return {
|
|
281
|
-
source,
|
|
282
|
-
changed: false
|
|
283
|
-
};
|
|
284
283
|
const header = source.match(headerPattern);
|
|
285
|
-
if (header)
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
284
|
+
if (header) {
|
|
285
|
+
if (header[0].split('\n').includes(itemLine)) return {
|
|
286
|
+
source,
|
|
287
|
+
changed: false
|
|
288
|
+
};
|
|
289
|
+
return {
|
|
290
|
+
source: source.replace(headerPattern, `${header[0]}${itemLine}\n`),
|
|
291
|
+
changed: true
|
|
292
|
+
};
|
|
293
|
+
}
|
|
289
294
|
const block = `${key}:\n${itemLine}\n`;
|
|
290
295
|
const afterTrustPolicyIgnore = source.replace(/^(trustPolicyIgnoreAfter: .+\n)/mu, `$1${block}`);
|
|
291
296
|
if (afterTrustPolicyIgnore !== source) return {
|
|
@@ -314,10 +319,6 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
|
|
|
314
319
|
[
|
|
315
320
|
/^ {2}effect: .+$/mu,
|
|
316
321
|
` effect: ${EFFECT_VERSION}`
|
|
317
|
-
],
|
|
318
|
-
[
|
|
319
|
-
/^ {2}- '@effect\/opentelemetry@[^']+'$/mu,
|
|
320
|
-
` - '@effect/opentelemetry@${EFFECT_VERSION}'`
|
|
321
322
|
]
|
|
322
323
|
];
|
|
323
324
|
for (const [pattern, replacement] of replacements){
|
|
@@ -325,9 +326,21 @@ function updateGeneratedPnpmWorkspacePolicy(workspaceRoot) {
|
|
|
325
326
|
source = result.source;
|
|
326
327
|
changed = result.changed || changed;
|
|
327
328
|
}
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
329
|
+
for (const item of strictEffectPackageVersionPolicyExclusions){
|
|
330
|
+
const packageName = item.slice(0, item.lastIndexOf('@'));
|
|
331
|
+
const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
332
|
+
const currentVersion = replaceYamlLine(source, new RegExp(`^ {2}- '${escapedPackageName}@[^']+'$`, 'gmu'), ` - '${item}'`);
|
|
333
|
+
source = currentVersion.source;
|
|
334
|
+
changed = currentVersion.changed || changed;
|
|
335
|
+
for (const policyKey of [
|
|
336
|
+
'minimumReleaseAgeExclude',
|
|
337
|
+
'trustPolicyExclude'
|
|
338
|
+
]){
|
|
339
|
+
const policyExclude = ensureYamlListItem(source, policyKey, item);
|
|
340
|
+
source = policyExclude.source;
|
|
341
|
+
changed = policyExclude.changed || changed;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
331
344
|
if (changed) node_fs.writeFileSync(workspaceFile, source, 'utf-8');
|
|
332
345
|
return changed;
|
|
333
346
|
}
|
package/package.json
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20"
|
|
23
23
|
},
|
|
24
|
-
"version": "3.5.0-ultramodern.
|
|
24
|
+
"version": "3.5.0-ultramodern.5",
|
|
25
25
|
"types": "./dist/types/index.d.ts",
|
|
26
26
|
"main": "./dist/esm-node/index.js",
|
|
27
27
|
"bin": {
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@modern-js/codesmith": "2.6.9",
|
|
78
78
|
"oxfmt": "0.56.0",
|
|
79
79
|
"ultracite": "7.8.3",
|
|
80
|
-
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.5.0-ultramodern.
|
|
80
|
+
"@modern-js/i18n-utils": "npm:@bleedingdev/modern-js-i18n-utils@3.5.0-ultramodern.5"
|
|
81
81
|
},
|
|
82
82
|
"devDependencies": {
|
|
83
83
|
"@rslib/core": "0.23.1",
|
|
@@ -99,6 +99,6 @@
|
|
|
99
99
|
"test": "rm -rf dist && rslib build -c rslibconfig.mts && rstest --passWithNoTests"
|
|
100
100
|
},
|
|
101
101
|
"ultramodern": {
|
|
102
|
-
"frameworkVersion": "3.5.0-ultramodern.
|
|
102
|
+
"frameworkVersion": "3.5.0-ultramodern.5"
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -169,15 +169,16 @@ in API modules.
|
|
|
169
169
|
Generated pnpm overrides pin the framework-compatible Effect cohort. Keep
|
|
170
170
|
`effect` and `@effect/vitest` aligned with `pnpm-workspace.yaml`; do not add
|
|
171
171
|
new direct package-level Effect versions unless the whole UltraModern cohort is
|
|
172
|
-
upgraded. The generated pnpm
|
|
173
|
-
`@effect/opentelemetry` cohort
|
|
174
|
-
|
|
172
|
+
upgraded. The generated pnpm policy intentionally excludes the matching
|
|
173
|
+
`effect` and `@effect/opentelemetry` cohort versions from the
|
|
174
|
+
minimum-release-age and no-downgrade checks while Effect's beta publishes move
|
|
175
|
+
from trusted-publisher metadata to provenance attestations.
|
|
175
176
|
|
|
176
177
|
For older generated workspaces, run the framework migration command first:
|
|
177
178
|
|
|
178
179
|
```bash
|
|
179
|
-
pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.
|
|
180
|
-
migrate-strict-effect --version 3.5.0-ultramodern.
|
|
180
|
+
pnpm dlx @bleedingdev/modern-js-create@3.5.0-ultramodern.5 ultramodern \
|
|
181
|
+
migrate-strict-effect --version 3.5.0-ultramodern.5
|
|
181
182
|
pnpm api:check
|
|
182
183
|
pnpm contract:check
|
|
183
184
|
```
|
|
@@ -8,6 +8,8 @@ minimumReleaseAgeStrict: true
|
|
|
8
8
|
minimumReleaseAgeIgnoreMissingTime: false
|
|
9
9
|
minimumReleaseAgeExclude:
|
|
10
10
|
- '@bleedingdev/modern-js-*'
|
|
11
|
+
- 'effect@{{effectVersion}}'
|
|
12
|
+
- '@effect/opentelemetry@{{effectVersion}}'
|
|
11
13
|
- '@tanstack/react-router'
|
|
12
14
|
- '@tanstack/router-core'
|
|
13
15
|
- 'typescript'
|
|
@@ -25,6 +27,7 @@ minimumReleaseAgeExclude:
|
|
|
25
27
|
trustPolicy: no-downgrade
|
|
26
28
|
trustPolicyIgnoreAfter: 1440
|
|
27
29
|
trustPolicyExclude:
|
|
30
|
+
- 'effect@{{effectVersion}}'
|
|
28
31
|
- '@effect/opentelemetry@{{effectVersion}}'
|
|
29
32
|
blockExoticSubdeps: true
|
|
30
33
|
engineStrict: true
|