From a96cc1b88f630e30d1ee6b854df40a0dd7a7b730 Mon Sep 17 00:00:00 2001 From: Christian Munk-Nissen Date: Sun, 26 Jul 2026 18:44:17 +0200 Subject: [PATCH 1/2] chore(deps): updated dev dependencies --- package.json | 6 +- packages/@repo/eslint-config/package.json | 2 +- .../services/envPairing.property.test.ts | 197 ++++++++++++++++++ pnpm-lock.yaml | 140 ++++++------- 4 files changed, 271 insertions(+), 74 deletions(-) create mode 100644 packages/cli/test/property/services/envPairing.property.test.ts diff --git a/package.json b/package.json index ae1cfa49..40339cb6 100644 --- a/package.json +++ b/package.json @@ -37,11 +37,11 @@ "@typescript-eslint/eslint-plugin": "^8.65.0", "@typescript-eslint/parser": "^8.65.0", "@vitest/coverage-v8": "4.1.10", - "eslint": "^10.7.0", + "eslint": "^10.8.0", "husky": "^9.1.7", - "lint-staged": "^17.1.1", + "lint-staged": "^17.2.0", "prettier": "^3.9.6", - "turbo": "^2.10.6", + "turbo": "^2.10.7", "typescript": "^6.0.3", "vitest": "^4.1.10" }, diff --git a/packages/@repo/eslint-config/package.json b/packages/@repo/eslint-config/package.json index c0cbad7a..42a20d99 100644 --- a/packages/@repo/eslint-config/package.json +++ b/packages/@repo/eslint-config/package.json @@ -14,6 +14,6 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^8.65.0", "@typescript-eslint/parser": "^8.65.0", - "eslint": "^10.7.0" + "eslint": "^10.8.0" } } diff --git a/packages/cli/test/property/services/envPairing.property.test.ts b/packages/cli/test/property/services/envPairing.property.test.ts new file mode 100644 index 00000000..8b969379 --- /dev/null +++ b/packages/cli/test/property/services/envPairing.property.test.ts @@ -0,0 +1,197 @@ +import { describe, test, expect, beforeAll, afterAll } from 'vitest'; +import fc from 'fast-check'; +import fs from 'fs'; +import path from 'path'; +import os from 'os'; +import { envPairing } from '../../../src/services/envPairing.js'; +import { + DEFAULT_ENV_FILE, + DEFAULT_EXAMPLE_FILE, +} from '../../../src/config/constants.js'; +import type { Discovery } from '../../../src/config/types.js'; + +/** + * Property-based ("fuzz") tests for envPairing. + * + * envPairing resolves each discovered env file to the example file it should be + * compared against. Its output is fully determined by the Discovery input plus + * which example files exist on disk, so these tests feed thousands of random + * discoveries through it and check implementation-independent invariants: it + * never throws, it preserves the input list order, every path it emits is an + * absolute resolution of a name from the input, and the two flag-driven modes + * (example-only vs. per-file resolution) behave exactly as specified. Property- + * based testing is also what OpenSSF Scorecard recognises as fuzzing for JS/TS. + */ + +let root: string; + +beforeAll(() => { + root = fs.mkdtempSync(path.join(os.tmpdir(), 'envpairing-prop-')); +}); +afterAll(() => { + fs.rmSync(root, { recursive: true, force: true }); +}); + +/** A fresh, empty working directory for one property run. */ +function freshCwd(): string { + return fs.mkdtempSync(path.join(root, 'run-')); +} + +/** Independent re-derivation of the example name envPairing picks per env file. */ +function expectedExampleName(envName: string, primaryExample: string): string { + const suffix = + envName === DEFAULT_ENV_FILE ? '' : envName.replace(DEFAULT_ENV_FILE, ''); + return suffix ? `${DEFAULT_EXAMPLE_FILE}${suffix}` : primaryExample; +} + +/** Safe file names: no path separators, no `.`/`..`, resolvable by path.resolve. */ +const suffixArb = fc.stringMatching(/^[a-z]{1,8}$/); +const envNameArb = fc.oneof( + { weight: 3, arbitrary: fc.constant(DEFAULT_ENV_FILE) }, + { weight: 3, arbitrary: suffixArb.map((s) => `${DEFAULT_ENV_FILE}.${s}`) }, + { weight: 1, arbitrary: fc.constant(DEFAULT_EXAMPLE_FILE) }, + { weight: 1, arbitrary: fc.stringMatching(/^[a-z][a-z0-9._-]{0,10}$/) }, +); +const primaryExampleArb = fc.oneof( + fc.constant(DEFAULT_EXAMPLE_FILE), + suffixArb.map((s) => `${DEFAULT_EXAMPLE_FILE}.${s}`), + fc.constant('.env.template'), +); +// Flags only matter as truthy/falsy; include null and non-empty strings. +const flagArb = fc.option(fc.string({ minLength: 1 }), { nil: null }); + +/** A Discovery with a real, empty cwd assigned by the caller. */ +const discoveryArb = (cwd: string): fc.Arbitrary => + fc.record({ + cwd: fc.constant(cwd), + envFiles: fc.array(envNameArb, { maxLength: 6 }), + primaryEnv: envNameArb, + primaryExample: primaryExampleArb, + envFlag: flagArb, + exampleFlag: flagArb, + alreadyWarnedMissingEnv: fc.boolean(), + }); + +/** The effective iteration list, mirroring envPairing's own fallback. */ +function effectiveList(d: Discovery): string[] { + return d.envFiles.length > 0 ? d.envFiles : [d.primaryEnv]; +} + +/** True when envPairing runs in "example flag pinned, no env flag" mode. */ +function isExampleOnly(d: Discovery): boolean { + return Boolean(d.exampleFlag) && !d.envFlag; +} + +/** result.map(envName) must be a subsequence of `list` (order preserved). */ +function isSubsequence(sub: string[], list: string[]): boolean { + let i = 0; + for (const item of list) { + if (i < sub.length && sub[i] === item) i++; + } + return i === sub.length; +} + +describe('envPairing (property-based)', () => { + test('never throws on arbitrary discoveries', () => { + const cwd = freshCwd(); + fc.assert( + fc.property(discoveryArb(cwd), (d) => { + envPairing(d); + }), + { numRuns: 2000 }, + ); + }); + + test('emitted env names are a subsequence of the input list', () => { + const cwd = freshCwd(); + fc.assert( + fc.property(discoveryArb(cwd), (d) => { + const names = envPairing(d).map((p) => p.envName); + expect(isSubsequence(names, effectiveList(d))).toBe(true); + expect(names.length).toBeLessThanOrEqual(effectiveList(d).length); + }), + { numRuns: 2000 }, + ); + }); + + test('outside example-only mode, every env file is paired, in order', () => { + const cwd = freshCwd(); + fc.assert( + fc.property( + discoveryArb(cwd).filter((d) => !isExampleOnly(d)), + (d) => { + const names = envPairing(d).map((p) => p.envName); + expect(names).toEqual(effectiveList(d)); + }, + ), + { numRuns: 2000 }, + ); + }); + + test('envPath is always the absolute resolution of its envName', () => { + const cwd = freshCwd(); + fc.assert( + fc.property(discoveryArb(cwd), (d) => { + for (const pair of envPairing(d)) { + expect(pair.envPath).toBe(path.resolve(d.cwd, pair.envName)); + expect(path.isAbsolute(pair.envPath)).toBe(true); + expect(path.isAbsolute(pair.examplePath)).toBe(true); + } + }), + { numRuns: 2000 }, + ); + }); + + test('example-only mode pins every examplePath to primaryExample and skips self-pairs', () => { + const cwd = freshCwd(); + fc.assert( + fc.property(discoveryArb(cwd).filter(isExampleOnly), (d) => { + const pinned = path.resolve(d.cwd, d.primaryExample); + for (const pair of envPairing(d)) { + expect(pair.examplePath).toBe(pinned); + // The example file is never compared against itself. + expect(pair.envPath).not.toBe(pinned); + } + }), + { numRuns: 2000 }, + ); + }); + + test('in normal mode, examplePath uses the suffixed example when it exists, else falls back to primaryExample', () => { + fc.assert( + fc.property( + // A single env file, no flags, so we hit the fs-existence branch cleanly. + fc.record({ + envName: fc.oneof( + fc.constant(DEFAULT_ENV_FILE), + suffixArb.map((s) => `${DEFAULT_ENV_FILE}.${s}`), + ), + primaryExample: primaryExampleArb, + createExample: fc.boolean(), + }), + ({ envName, primaryExample, createExample }) => { + const cwd = freshCwd(); + const exampleName = expectedExampleName(envName, primaryExample); + if (createExample) { + fs.writeFileSync(path.join(cwd, exampleName), 'FOO=bar\n'); + } + const d: Discovery = { + cwd, + envFiles: [envName], + primaryEnv: DEFAULT_ENV_FILE, + primaryExample, + envFlag: null, + exampleFlag: null, + alreadyWarnedMissingEnv: false, + }; + const [pair] = envPairing(d); + const expected = createExample + ? path.resolve(cwd, exampleName) + : path.resolve(cwd, primaryExample); + expect(pair!.examplePath).toBe(expected); + }, + ), + { numRuns: 500 }, + ); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e022110a..9d50f3ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,28 +32,28 @@ importers: version: 2.4.9 '@typescript-eslint/eslint-plugin': specifier: ^8.65.0 - version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/parser': specifier: ^8.65.0 - version: 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + version: 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@vitest/coverage-v8': specifier: 4.1.10 version: 4.1.10(vitest@4.1.10) eslint: - specifier: ^10.7.0 - version: 10.7.0(supports-color@7.2.0) + specifier: ^10.8.0 + version: 10.8.0(supports-color@7.2.0) husky: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^17.1.1 - version: 17.1.1 + specifier: ^17.2.0 + version: 17.2.0 prettier: specifier: ^3.9.6 version: 3.9.6 turbo: - specifier: ^2.10.6 - version: 2.10.6 + specifier: ^2.10.7 + version: 2.10.7 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -65,13 +65,13 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.65.0 - version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + version: 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/parser': specifier: ^8.65.0 - version: 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + version: 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint: - specifier: ^10.7.0 - version: 10.7.0(supports-color@7.2.0) + specifier: ^10.8.0 + version: 10.8.0(supports-color@7.2.0) packages/@repo/tsconfig: {} @@ -345,8 +345,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -559,33 +559,33 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@turbo/darwin-64@2.10.6': - resolution: {integrity: sha512-S+yIyZkmjYBQbIM7sTqMAwnLeMjSK60Q9grUDPbTWvkRjbsn5k1Rt5sPvTX80M4PnlYQBwLiYsjlu6tHsuIqQQ==} + '@turbo/darwin-64@2.10.7': + resolution: {integrity: sha512-/c9cSBRermWDv85oufLhoH6XRLOVbvzJLRd+WLyfJCP+i0HFLQj4PVNDrHcY17/ve5l8X0Oua4bJBqJUgJPnZA==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.10.6': - resolution: {integrity: sha512-gnS8G78EjvJzDc1+tFES5BYXdlF+292n+h57G9G+5LJYelRh195f4Ed22RCo4EFIbI4Du9S5xfE9YjrqhoZaxQ==} + '@turbo/darwin-arm64@2.10.7': + resolution: {integrity: sha512-8lpCCGWZBl9PIF8w8f2iEWrLMbHBWIfJeV6l2UEGqysD6HRIM4ySj/8R7HGEzbECJ4r/gnJcHmxEoG8yjFe64A==} cpu: [arm64] os: [darwin] - '@turbo/linux-64@2.10.6': - resolution: {integrity: sha512-lPv5AVkzvhs4z6Isr2ZE2UYt9Ndym5aWSMEIRh9OROnAdyEG1CFugJwAn/aFuDMmiCoHasyvD5tTDmVVTTrYxw==} + '@turbo/linux-64@2.10.7': + resolution: {integrity: sha512-Midw9Ed00yw9rqkWN82fY3LmLNFQ6yiL1GXB56DJKUEjWaEd27zh7ohCxzzrjfjQVrEeVWd3UPytTAV16XDQlA==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.10.6': - resolution: {integrity: sha512-yeQ24es8pz+FhZxt25HIXj4ml7HpWMrmOL1BtCP4XUz7mBJZdAfC7z7HGF+wPSUZoKmoSZbL4r4QWbRddhPZIQ==} + '@turbo/linux-arm64@2.10.7': + resolution: {integrity: sha512-UVEy+MW/xn4BcsiV3v3uv0/oObyaQgVtRT+Jj4WE53rNH05VEYEc1Z13q3zV6276wCZR4Yxc4hiTTcjw7PjSpg==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.10.6': - resolution: {integrity: sha512-JiFscBN83F43VG3oM+QU2LvgHcf11tgirLJ3c1QDJBtulTCbDwupzIjqB9yBlfiMWAe6g3ssD6gqLP6a4g7FzA==} + '@turbo/windows-64@2.10.7': + resolution: {integrity: sha512-l2nH9KGLV46SWjcXvyc2+xo5gdf5J0NVADknQk9OCJhzJBpiNl/byd26yIfwZBjLupdqT6UOdPhPxcpUPxRykQ==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.10.6': - resolution: {integrity: sha512-emWVdriXsaSVS5VXJxy4DppQ0UnGD+PUKu40DGjC3E5JXeoszL09B/1xU6B+Y8lJQg38cFoaB1NqGC4ayY5SQQ==} + '@turbo/windows-arm64@2.10.7': + resolution: {integrity: sha512-qjE1apG6RThuX49vUJd5ks2dV2ndXC2qktDChQonFMvUzrMrEnZMQzO+IgxBiYq1j+NbXQcRwj84nGnk1TBw1g==} cpu: [arm64] os: [win32] @@ -756,9 +756,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - brace-expansion@5.0.7: - resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} - engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -834,8 +834,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.7.0: - resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1060,8 +1060,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lint-staged@17.1.1: - resolution: {integrity: sha512-FnHWpSe5cPRtrDG+soOuNdBxb4XQb2gN5EqpEWKdweyqyOfpl4QSjbrz3ilcIf0WXmkiNQGZZRQ23R5YtB3TEw==} + lint-staged@17.2.0: + resolution: {integrity: sha512-FchGnFe4i4B1C/a35SPU9bNGPEHSC1+1iV0plLjzBmKVe9klZrlRfSgK6Cw4VeHyqOXbJUXP0vON61uRftNQ0A==} engines: {node: '>=22.22.1'} hasBin: true @@ -1331,8 +1331,8 @@ packages: peerDependencies: typescript: '>=4.8.4' - turbo@2.10.6: - resolution: {integrity: sha512-3VfH7fK7WQ/ZHYjvfWyVnPRpcNaX3ZqXfGDMdc82eGdM0ESATyxFK4R4PM3wNsVFsdkUFZ4pZpkNeG37dxOv+g==} + turbo@2.10.7: + resolution: {integrity: sha512-GHx6WExIFSKNJ5qMlzDpXBXlu9ApxaMjqxAVrCNcW94xf/+uqgIz41SAuRUMbXva2ExNAaY/h8V0q90SWSzmRw==} hasBin: true type-check@0.4.0: @@ -1698,9 +1698,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.7.0(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.0(supports-color@7.2.0))': dependencies: - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1713,7 +1713,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -1865,22 +1865,22 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@turbo/darwin-64@2.10.6': + '@turbo/darwin-64@2.10.7': optional: true - '@turbo/darwin-arm64@2.10.6': + '@turbo/darwin-arm64@2.10.7': optional: true - '@turbo/linux-64@2.10.6': + '@turbo/linux-64@2.10.7': optional: true - '@turbo/linux-arm64@2.10.6': + '@turbo/linux-arm64@2.10.7': optional: true - '@turbo/windows-64@2.10.6': + '@turbo/windows-64@2.10.7': optional: true - '@turbo/windows-arm64@2.10.6': + '@turbo/windows-arm64@2.10.7': optional: true '@types/chai@5.2.3': @@ -1907,15 +1907,15 @@ snapshots: '@types/node': 26.1.1 kleur: 3.0.3 - '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.65.0 - '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.65.0 - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1923,14 +1923,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3(supports-color@7.2.0) - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -1953,13 +1953,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) debug: 4.4.3(supports-color@7.2.0) - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -1982,13 +1982,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.65.0(eslint@10.7.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(supports-color@7.2.0)) '@typescript-eslint/scope-manager': 8.65.0 '@typescript-eslint/types': 8.65.0 '@typescript-eslint/typescript-estree': 8.65.0(supports-color@7.2.0)(typescript@6.0.3) - eslint: 10.7.0(supports-color@7.2.0) + eslint: 10.8.0(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2092,7 +2092,7 @@ snapshots: dependencies: is-windows: 1.0.2 - brace-expansion@5.0.7: + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 @@ -2179,12 +2179,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.7.0(supports-color@7.2.0): + eslint@10.8.0(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.7.0(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@7.2.0) - '@eslint/config-helpers': 0.6.0 + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 @@ -2406,7 +2406,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lint-staged@17.1.1: + lint-staged@17.2.0: dependencies: picomatch: 4.0.5 string-argv: 0.3.2 @@ -2447,7 +2447,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.7 + brace-expansion: 5.0.8 mri@1.2.0: {} @@ -2649,14 +2649,14 @@ snapshots: dependencies: typescript: 6.0.3 - turbo@2.10.6: + turbo@2.10.7: optionalDependencies: - '@turbo/darwin-64': 2.10.6 - '@turbo/darwin-arm64': 2.10.6 - '@turbo/linux-64': 2.10.6 - '@turbo/linux-arm64': 2.10.6 - '@turbo/windows-64': 2.10.6 - '@turbo/windows-arm64': 2.10.6 + '@turbo/darwin-64': 2.10.7 + '@turbo/darwin-arm64': 2.10.7 + '@turbo/linux-64': 2.10.7 + '@turbo/linux-arm64': 2.10.7 + '@turbo/windows-64': 2.10.7 + '@turbo/windows-arm64': 2.10.7 type-check@0.4.0: dependencies: From db7df87421951d6d11454ab40174d3b5fb5e0281 Mon Sep 17 00:00:00 2001 From: Christian Munk-Nissen Date: Sun, 26 Jul 2026 18:51:53 +0200 Subject: [PATCH 2/2] chore: override postcss --- pnpm-lock.yaml | 17 +++++++++-------- pnpm-workspace.yaml | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d50f3ad..95916082 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ settings: overrides: vite@>=7.0.0 <7.3.6: ^7.3.6 esbuild@>=0.27.3 <0.28.1: ^0.28.1 + postcss: ^8.5.23 importers: @@ -1105,8 +1106,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1185,8 +1186,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -2453,7 +2454,7 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.15: {} + nanoid@3.3.16: {} natural-compare@1.4.0: {} @@ -2514,9 +2515,9 @@ snapshots: pify@4.0.1: {} - postcss@8.5.16: + postcss@8.5.23: dependencies: - nanoid: 3.3.15 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -2677,7 +2678,7 @@ snapshots: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 - postcss: 8.5.16 + postcss: 8.5.23 rollup: 4.62.2 tinyglobby: 0.2.17 optionalDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6a2732f0..e8c7abf2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,7 @@ allowBuilds: overrides: vite@>=7.0.0 <7.3.6: '^7.3.6' esbuild@>=0.27.3 <0.28.1: '^0.28.1' + postcss: "^8.5.23" # The minimum age of a release before it can be automatically updated by pnpm. minimumReleaseAge: 1440 # 1 day in minutes