@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 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.3 ultramodern \
197
- migrate-strict-effect --version 3.5.0-ultramodern.3
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` trusted-publisher to provenance
216
- transition from no-downgrade checks. Do not override those in app packages;
217
- update the framework cohort when the runtime moves.
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) return {
332
- source: source.replace(headerPattern, `${header[0]}${itemLine}\n`),
333
- changed: true
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 trustPolicyExclude = ensureYamlListItem(source, 'trustPolicyExclude', `@effect/opentelemetry@${versions_cjs_namespaceObject.EFFECT_VERSION}`);
375
- source = trustPolicyExclude.source;
376
- changed = trustPolicyExclude.changed || changed;
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) return {
285
- source: source.replace(headerPattern, `${header[0]}${itemLine}\n`),
286
- changed: true
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 trustPolicyExclude = ensureYamlListItem(source, 'trustPolicyExclude', `@effect/opentelemetry@${EFFECT_VERSION}`);
328
- source = trustPolicyExclude.source;
329
- changed = trustPolicyExclude.changed || changed;
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) return {
286
- source: source.replace(headerPattern, `${header[0]}${itemLine}\n`),
287
- changed: true
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 trustPolicyExclude = ensureYamlListItem(source, 'trustPolicyExclude', `@effect/opentelemetry@${EFFECT_VERSION}`);
329
- source = trustPolicyExclude.source;
330
- changed = trustPolicyExclude.changed || changed;
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.3",
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.3"
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.3"
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 trust policy intentionally excludes the matching
173
- `@effect/opentelemetry` cohort package from no-downgrade checks while Effect's
174
- beta publishes move from trusted-publisher metadata to provenance attestations.
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.3 ultramodern \
180
- migrate-strict-effect --version 3.5.0-ultramodern.3
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