From 54da30e7534404fd11dc9949d34d2319c73a502d Mon Sep 17 00:00:00 2001 From: Ludovico Fischer Date: Thu, 20 Aug 2026 18:59:06 +0200 Subject: [PATCH 1/2] chore: tighten lint rules --- .oxlintrc.json | 20 ++++- scripts/tokenizer-compat.mjs | 2 +- src/lib/parser.js | 6 +- src/lib/serialize.js | 10 +-- src/lib/simplify/atan2.js | 4 +- src/lib/simplify/inverse-trig.js | 4 +- src/lib/simplify/mod-rem.js | 14 ++-- src/lib/simplify/round.js | 16 ++-- test/conformance/csstools.test.mjs | 2 +- test/helpers/arbitraries.mjs | 4 +- test/property/algebraic-laws.test.mjs | 104 +++++++++++++++----------- test/property/naive-oracle.test.mjs | 58 +++++++------- test/unit/serialize.test.mjs | 15 ++-- 13 files changed, 148 insertions(+), 111 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 233166f..2aa59cb 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -1,6 +1,6 @@ { "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["typescript", "unicorn", "oxc"], + "plugins": ["typescript", "unicorn", "oxc", "promise"], "categories": { "correctness": "error" }, @@ -8,6 +8,7 @@ "array-callback-return": "error", "complexity": ["error", { "max": 25 }], "guard-for-in": "error", + "no-duplicate-imports": "error", "no-bitwise": "error", "no-case-declarations": "error", "no-empty": "error", @@ -17,11 +18,26 @@ "no-prototype-builtins": "error", "no-redeclare": "error", "no-regex-spaces": "error", + "no-underscore-dangle": ["error", { "allow": ["_default"] }], + "no-shadow": "error", + "no-throw-literal": "error", + "no-unnecessary-await": "error", "no-void": "error", + "no-useless-assignment": "error", + "only-throw-error": "error", + "prefer-const": ["error", { "destructuring": "all" }], "preserve-caught-error": "error", + "promise/always-return": "error", + "promise/prefer-await-to-then": "error", "unicorn/no-array-for-each": "error", "unicorn/no-array-reduce": "error", - "unicorn/prefer-array-flat": "error" + "unicorn/prefer-array-flat": "error", + "unicorn/prefer-includes": "error", + "unicorn/prefer-node-protocol": "error", + "unicorn/prefer-regexp-test": "error", + "unicorn/prefer-set-has": "error", + "unicorn/prefer-type-error": "error", + "unicorn/prefer-number-properties": "error" }, "env": { "builtin": true diff --git a/scripts/tokenizer-compat.mjs b/scripts/tokenizer-compat.mjs index 11ce8cb..b8ae12c 100644 --- a/scripts/tokenizer-compat.mjs +++ b/scripts/tokenizer-compat.mjs @@ -81,7 +81,7 @@ export function fromOurs(tokens) { if (t.type === 'number' || t.type === 'dimension') { out.push({ type: t.type, - num: parseFloat(t.value), + num: Number.parseFloat(t.value), unit: t.unit, raw: `${t.value}${t.unit ?? ''}`, ws: t.ws, diff --git a/src/lib/parser.js b/src/lib/parser.js index 097a923..c8d3f48 100644 --- a/src/lib/parser.js +++ b/src/lib/parser.js @@ -30,7 +30,7 @@ function foldCalcKeyword(name) { // form arrives as a single ident because CSS Syntax tokenizes leading // `-` + ident-start as one ident-token. if (name === 'NaN' || name === '-NaN') { - return { type: 'Num', value: NaN }; + return { type: 'Num', value: Number.NaN }; } switch (name.toLowerCase()) { case 'pi': @@ -228,12 +228,12 @@ function requireSurroundingWs(p, token) { /** @type {Record} */ const PREFIX = { - number: (_p, t) => ({ type: 'Num', value: parseFloat(t.value) }), + number: (_p, t) => ({ type: 'Num', value: Number.parseFloat(t.value) }), // Unit case normalization per §10.12: `1PX` serializes as `1px`. dimension: (_p, t) => ({ type: 'Dim', - value: parseFloat(t.value), + value: Number.parseFloat(t.value), unit: t.unit === '%' ? '%' : /** @type {string} */ (t.unit).toLowerCase(), }), diff --git a/src/lib/serialize.js b/src/lib/serialize.js index 46b8e0d..6250670 100644 --- a/src/lib/serialize.js +++ b/src/lib/serialize.js @@ -45,7 +45,7 @@ function round(v, prec) { * @return {boolean} */ function isDegenerate(v) { - return !isFinite(v) || isNaN(v); + return !Number.isFinite(v) || Number.isNaN(v); } /** @@ -53,7 +53,7 @@ function isDegenerate(v) { * @return {string} */ function degenerateKeyword(v) { - if (isNaN(v)) { + if (Number.isNaN(v)) { return 'NaN'; } return v > 0 ? 'infinity' : '-infinity'; @@ -160,13 +160,13 @@ function serializeExpr(node, prec) { */ function displaySign(term) { const { sign, node } = term; - if (node.type === 'Num' && isFinite(node.value) && node.value < 0) { + if (node.type === 'Num' && Number.isFinite(node.value) && node.value < 0) { return { sign: /** @type {1 | -1} */ (-sign), magnitude: { type: 'Num', value: -node.value }, }; } - if (node.type === 'Dim' && isFinite(node.value) && node.value < 0) { + if (node.type === 'Dim' && Number.isFinite(node.value) && node.value < 0) { return { sign: /** @type {1 | -1} */ (-sign), magnitude: { type: 'Dim', value: -node.value, unit: node.unit }, @@ -219,7 +219,7 @@ function serializeLeadingNeg(node, prec) { node.factors.length > 0 && node.factors[0].exponent === 1 && node.factors[0].node.type === 'Num' && - isFinite(node.factors[0].node.value) && + Number.isFinite(node.factors[0].node.value) && node.factors[0].node.value !== 0 ) { const head = node.factors[0].node; diff --git a/src/lib/simplify/atan2.js b/src/lib/simplify/atan2.js index d459f7a..2e0ab76 100644 --- a/src/lib/simplify/atan2.js +++ b/src/lib/simplify/atan2.js @@ -20,8 +20,8 @@ function simplifyAtan2(args) { } const [y, x] = /** @type {[number, number]} */ (fold.values); const radians = Math.atan2(y, x); - if (isNaN(radians)) { - return num(NaN); + if (Number.isNaN(radians)) { + return num(Number.NaN); } return dim((radians * 180) / Math.PI, 'deg'); } diff --git a/src/lib/simplify/inverse-trig.js b/src/lib/simplify/inverse-trig.js index a1374ed..7af2d73 100644 --- a/src/lib/simplify/inverse-trig.js +++ b/src/lib/simplify/inverse-trig.js @@ -24,8 +24,8 @@ function simplifyInverseTrig(name, args) { return call(name, args); } const radians = INVERSE_TRIG_OPS[name](a.value); - if (isNaN(radians)) { - return num(NaN); + if (Number.isNaN(radians)) { + return num(Number.NaN); } return dim((radians * 180) / Math.PI, 'deg'); } diff --git a/src/lib/simplify/mod-rem.js b/src/lib/simplify/mod-rem.js index d6a9306..0b67b85 100644 --- a/src/lib/simplify/mod-rem.js +++ b/src/lib/simplify/mod-rem.js @@ -20,8 +20,8 @@ function simplifyModRem(name, args) { const result = applyModRem(name, a, b); // NaN results drop the unit (`mod(5px, 0px)` → `calc(NaN)`, not // `calc(NaN * 1px)`). §10.12 unit-preserving form is a known divergence. - if (isNaN(result)) { - return num(NaN); + if (Number.isNaN(result)) { + return num(Number.NaN); } return fold.unit === '' ? num(result) : dim(result, fold.unit); } @@ -34,16 +34,16 @@ function simplifyModRem(name, args) { */ function applyModRem(name, a, b) { if (b === 0) { - return NaN; + return Number.NaN; } - if (!isFinite(a)) { - return NaN; + if (!Number.isFinite(a)) { + return Number.NaN; } - if (!isFinite(b)) { + if (!Number.isFinite(b)) { // mod: result is NaN when A has opposite sign to B; otherwise A. // rem: result is A regardless of signs. if (name === 'mod' && a !== 0 && Math.sign(a) !== Math.sign(b)) { - return NaN; + return Number.NaN; } return a; } diff --git a/src/lib/simplify/round.js b/src/lib/simplify/round.js index f3c4565..a1fad3f 100644 --- a/src/lib/simplify/round.js +++ b/src/lib/simplify/round.js @@ -43,12 +43,12 @@ function simplifyRound(args) { // case folds to ±0 carrying A's sign. Infinite-A / finite-B falls through // to applyRound, where floor*b===ceil*b===±∞ collapses back to A // (§10.3.1 "result is the same infinity"). - if (isNaN(b)) { - return num(NaN); + if (Number.isNaN(b)) { + return num(Number.NaN); } - if (!isFinite(b)) { - if (!isFinite(a)) { - return num(NaN); + if (!Number.isFinite(b)) { + if (!Number.isFinite(a)) { + return num(Number.NaN); } let result; if (strategy === 'up' && a > 0) { @@ -62,8 +62,8 @@ function simplifyRound(args) { } const result = applyRound(strategy, a, b); - if (isNaN(result)) { - return num(NaN); + if (Number.isNaN(result)) { + return num(Number.NaN); } return fold.unit === '' ? num(result) : dim(result, fold.unit); } @@ -90,7 +90,7 @@ function argsForRoundFold(args) { */ function applyRound(strategy, a, b) { if (b === 0) { - return NaN; + return Number.NaN; } const q = a / b; const c1 = Math.floor(q) * b; diff --git a/test/conformance/csstools.test.mjs b/test/conformance/csstools.test.mjs index 45a065c..a6d2dd3 100644 --- a/test/conformance/csstools.test.mjs +++ b/test/conformance/csstools.test.mjs @@ -305,7 +305,7 @@ test('csstools pow: pow(2, 3) → 8', () => { }); test('csstools pow: pow(8, 1 / 3) ≈ 2', () => { // csstools agrees on the cube-root identity within FP precision. - const got = parseFloat(out('pow(8, 1 / 3)')); + const got = Number.parseFloat(out('pow(8, 1 / 3)')); assert.ok(Math.abs(got - 2) < 1e-9, `got ${got}`); }); test('csstools sqrt: sqrt(16) → 4', () => { diff --git a/test/helpers/arbitraries.mjs b/test/helpers/arbitraries.mjs index 05b4397..7308485 100644 --- a/test/helpers/arbitraries.mjs +++ b/test/helpers/arbitraries.mjs @@ -37,11 +37,11 @@ const floatLeafArb = fc.oneof(floatNumLeaf, floatDimLeaf); // lives in unit tests; mixing them in differential adds noise without // adding signal. const degenerateNumLeaf = fc - .constantFrom(Infinity, -Infinity, NaN, 0) + .constantFrom(Infinity, -Infinity, Number.NaN, 0) .map((v) => ({ type: 'Num', value: v })); const degenerateDimLeaf = fc .tuple( - fc.constantFrom(Infinity, -Infinity, NaN), + fc.constantFrom(Infinity, -Infinity, Number.NaN), fc.constantFrom(...KNOWN_UNITS) ) .map(([v, u]) => ({ type: 'Dim', value: v, unit: u })); diff --git a/test/property/algebraic-laws.test.mjs b/test/property/algebraic-laws.test.mjs index 14cbb62..8b9ef84 100644 --- a/test/property/algebraic-laws.test.mjs +++ b/test/property/algebraic-laws.test.mjs @@ -69,7 +69,7 @@ test('law: sign is idempotent on its codomain — sign(sign(x)) ≡ sign(x)', () const inner = out(call('sign', [x])); // sign(x) returns a bare number in {-1, 0, 1}; sign of that is the // same number. - const outer = out(call('sign', [num(parseFloat(inner))])); + const outer = out(call('sign', [num(Number.parseFloat(inner))])); return inner === outer; }), { numRuns: NUM_RUNS } @@ -79,8 +79,8 @@ test('law: sign is odd — sign(-x) ≡ -sign(x) (when x ≠ 0)', () => { fc.assert( fc.property(finiteNonzeroNum, (x) => { const negX = num(-x.value); - const lhs = parseFloat(out(call('sign', [negX]))); - const rhs = -parseFloat(out(call('sign', [x]))); + const lhs = Number.parseFloat(out(call('sign', [negX]))); + const rhs = -Number.parseFloat(out(call('sign', [x]))); return Object.is(lhs, rhs) || lhs === rhs; }), { numRuns: NUM_RUNS } @@ -89,8 +89,8 @@ test('law: sign is odd — sign(-x) ≡ -sign(x) (when x ≠ 0)', () => { test('law: abs(x) * sign(x) ≡ x — for finite numeric x', () => { fc.assert( fc.property(finiteNonzeroNum, (x) => { - const a = parseFloat(out(call('abs', [x]))); - const s = parseFloat(out(call('sign', [x]))); + const a = Number.parseFloat(out(call('abs', [x]))); + const s = Number.parseFloat(out(call('sign', [x]))); return a * s === x.value; }), { numRuns: NUM_RUNS } @@ -107,7 +107,7 @@ test('law: round is idempotent on the same step — round(round(x, B), B) ≡ ro const inner = call('round', [ident(strategy), x, b]); const once = out(inner); const twice = out( - call('round', [ident(strategy), num(parseFloat(once)), b]) + call('round', [ident(strategy), num(Number.parseFloat(once)), b]) ); return once === twice; } @@ -118,9 +118,11 @@ test('law: round is idempotent on the same step — round(round(x, B), B) ≡ ro test('law: round monotone in strategy — up ≥ nearest ≥ down', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const up = parseFloat(out(call('round', [ident('up'), x, b]))); - const nearest = parseFloat(out(call('round', [ident('nearest'), x, b]))); - const down = parseFloat(out(call('round', [ident('down'), x, b]))); + const up = Number.parseFloat(out(call('round', [ident('up'), x, b]))); + const nearest = Number.parseFloat( + out(call('round', [ident('nearest'), x, b])) + ); + const down = Number.parseFloat(out(call('round', [ident('down'), x, b]))); return up >= nearest && nearest >= down; }), { numRuns: NUM_RUNS } @@ -129,9 +131,11 @@ test('law: round monotone in strategy — up ≥ nearest ≥ down', () => { test('law: round to-zero ∈ {up, down} and minimizes |result|', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const up = parseFloat(out(call('round', [ident('up'), x, b]))); - const down = parseFloat(out(call('round', [ident('down'), x, b]))); - const tz = parseFloat(out(call('round', [ident('to-zero'), x, b]))); + const up = Number.parseFloat(out(call('round', [ident('up'), x, b]))); + const down = Number.parseFloat(out(call('round', [ident('down'), x, b]))); + const tz = Number.parseFloat( + out(call('round', [ident('to-zero'), x, b])) + ); const inSet = tz === up || tz === down; const minimal = Math.abs(tz) <= Math.abs(up) && Math.abs(tz) <= Math.abs(down); @@ -147,7 +151,9 @@ test('law: round result is on the B-grid — (result / B) is integer', () => { finiteNum, positiveNum, (strategy, x, b) => { - const r = parseFloat(out(call('round', [ident(strategy), x, b]))); + const r = Number.parseFloat( + out(call('round', [ident(strategy), x, b])) + ); const q = r / b.value; // Allow tiny FP drift: integer means q ≡ round(q) within EPSILON. return Math.abs(q - Math.round(q)) < 1e-9; @@ -163,7 +169,9 @@ test('law: round result is within B of A — |round(x, B) − x| ≤ B', () => { finiteNum, positiveNum, (strategy, x, b) => { - const r = parseFloat(out(call('round', [ident(strategy), x, b]))); + const r = Number.parseFloat( + out(call('round', [ident(strategy), x, b])) + ); return Math.abs(r - x.value) <= b.value + 1e-9; } ), @@ -173,9 +181,11 @@ test('law: round result is within B of A — |round(x, B) − x| ≤ B', () => { test('law: nearest minimizes |result − x| (with tie → upper)', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const up = parseFloat(out(call('round', [ident('up'), x, b]))); - const down = parseFloat(out(call('round', [ident('down'), x, b]))); - const nearest = parseFloat(out(call('round', [ident('nearest'), x, b]))); + const up = Number.parseFloat(out(call('round', [ident('up'), x, b]))); + const down = Number.parseFloat(out(call('round', [ident('down'), x, b]))); + const nearest = Number.parseFloat( + out(call('round', [ident('nearest'), x, b])) + ); const dUp = Math.abs(up - x.value); const dDown = Math.abs(down - x.value); return dUp <= dDown ? nearest === up : nearest === down; @@ -187,7 +197,7 @@ test('law: nearest minimizes |result − x| (with tie → upper)', () => { test('law: mod range — 0 ≤ mod(x, B) < B (for B > 0, finite x)', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const r = parseFloat(out(call('mod', [x, b]))); + const r = Number.parseFloat(out(call('mod', [x, b]))); return r >= 0 && r < b.value; }), { numRuns: NUM_RUNS } @@ -196,7 +206,7 @@ test('law: mod range — 0 ≤ mod(x, B) < B (for B > 0, finite x)', () => { test('law: rem range — |rem(x, B)| < B (for B > 0, finite x)', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const r = parseFloat(out(call('rem', [x, b]))); + const r = Number.parseFloat(out(call('rem', [x, b]))); return Math.abs(r) < b.value; }), { numRuns: NUM_RUNS } @@ -205,7 +215,7 @@ test('law: rem range — |rem(x, B)| < B (for B > 0, finite x)', () => { test('law: rem sign follows dividend — sign(rem(x, B)) ∈ {sign(x), 0}', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const r = parseFloat(out(call('rem', [x, b]))); + const r = Number.parseFloat(out(call('rem', [x, b]))); if (r === 0) return true; return Math.sign(r) === Math.sign(x.value); }), @@ -215,8 +225,10 @@ test('law: rem sign follows dividend — sign(rem(x, B)) ∈ {sign(x), 0}', () = test('law: mod periodicity — mod(x + B, B) ≡ mod(x, B)', () => { fc.assert( fc.property(finiteNum, positiveNum, (x, b) => { - const lhs = parseFloat(out(call('mod', [num(x.value + b.value), b]))); - const rhs = parseFloat(out(call('mod', [x, b]))); + const lhs = Number.parseFloat( + out(call('mod', [num(x.value + b.value), b])) + ); + const rhs = Number.parseFloat(out(call('mod', [x, b]))); return Math.abs(lhs - rhs) < 1e-9; }), { numRuns: NUM_RUNS } @@ -225,8 +237,8 @@ test('law: mod periodicity — mod(x + B, B) ≡ mod(x, B)', () => { test('law: spec line 1017 — rem(A, B) ≡ A − round(to-zero, A, B)', () => { fc.assert( fc.property(finiteNum, positiveNum, (a, b) => { - const lhs = parseFloat(out(call('rem', [a, b]))); - const r = parseFloat(out(call('round', [ident('to-zero'), a, b]))); + const lhs = Number.parseFloat(out(call('rem', [a, b]))); + const r = Number.parseFloat(out(call('round', [ident('to-zero'), a, b]))); const rhs = a.value - r; return Math.abs(lhs - rhs) < 1e-9; }), @@ -238,8 +250,8 @@ test('law: spec line 1017 — mod(A, B) ≡ A − round(down, A, B) (for B > 0)' // For B > 0 this reduces to mod(A, B) = A − round(down, A, B). fc.assert( fc.property(finiteNum, positiveNum, (a, b) => { - const lhs = parseFloat(out(call('mod', [a, b]))); - const r = parseFloat(out(call('round', [ident('down'), a, b]))); + const lhs = Number.parseFloat(out(call('mod', [a, b]))); + const r = Number.parseFloat(out(call('round', [ident('down'), a, b]))); const rhs = a.value - r; return Math.abs(lhs - rhs) < 1e-9; }), @@ -255,10 +267,10 @@ test('metamorphic: round scales — round(k·x, k·B) ≡ k·round(x, B), k > 0' fc.integer({ min: 1, max: 100 }), fc.integer({ min: 1, max: 10 }), (strategy, xRaw, bRaw, k) => { - const lhs = parseFloat( + const lhs = Number.parseFloat( out(call('round', [ident(strategy), num(k * xRaw), num(k * bRaw)])) ); - const inner = parseFloat( + const inner = Number.parseFloat( out(call('round', [ident(strategy), num(xRaw), num(bRaw)])) ); const rhs = k * inner; @@ -291,8 +303,8 @@ const CURATED_ANGLES = [ ]; test('law: sin is odd — sin(-x) ≡ -sin(x) for curated angles', () => { for (const x of CURATED_ANGLES) { - const lhs = parseFloat(out(call('sin', [num(-x)]))); - const rhs = -parseFloat(out(call('sin', [num(x)]))); + const lhs = Number.parseFloat(out(call('sin', [num(-x)]))); + const rhs = -Number.parseFloat(out(call('sin', [num(x)]))); if (Math.abs(lhs - rhs) > 1e-9) { throw new Error(`sin(-${x}) (${lhs}) ≠ -sin(${x}) (${rhs})`); } @@ -300,8 +312,8 @@ test('law: sin is odd — sin(-x) ≡ -sin(x) for curated angles', () => { }); test('law: cos is even — cos(-x) ≡ cos(x) for curated angles', () => { for (const x of CURATED_ANGLES) { - const lhs = parseFloat(out(call('cos', [num(-x)]))); - const rhs = parseFloat(out(call('cos', [num(x)]))); + const lhs = Number.parseFloat(out(call('cos', [num(-x)]))); + const rhs = Number.parseFloat(out(call('cos', [num(x)]))); if (Math.abs(lhs - rhs) > 1e-9) { throw new Error(`cos(-${x}) (${lhs}) ≠ cos(${x}) (${rhs})`); } @@ -316,8 +328,8 @@ test('law: tan(0) ≡ 0; atan(0) ≡ 0deg; atan(1) ≡ 45deg', () => { test('law: sin² + cos² ≡ 1 over a finite range (away from asymptotes)', () => { fc.assert( fc.property(finiteFloat, (x) => { - const s = parseFloat(out(call('sin', [num(x)]))); - const c = parseFloat(out(call('cos', [num(x)]))); + const s = Number.parseFloat(out(call('sin', [num(x)]))); + const c = Number.parseFloat(out(call('cos', [num(x)]))); return Math.abs(s * s + c * c - 1) < 1e-9; }), { numRuns: NUM_RUNS } @@ -335,8 +347,8 @@ test('law: asin(sin(x)) ≡ x for x ∈ [-π/2 + 0.05, π/2 − 0.05]', () => { }); fc.assert( fc.property(principalRange, (x) => { - const s = parseFloat(out(call('sin', [num(x)]))); - const aDeg = parseFloat(out(call('asin', [num(s)]))); + const s = Number.parseFloat(out(call('sin', [num(x)]))); + const aDeg = Number.parseFloat(out(call('asin', [num(s)]))); const aRad = (aDeg * Math.PI) / 180; return Math.abs(aRad - x) < 1e-6; }), @@ -347,9 +359,9 @@ test('law: atan2(sin(θ), cos(θ)) ≡ θ (in degrees) for θ ∈ (-180, 180]', fc.assert( fc.property(fc.float({ min: -179, max: 180, noNaN: true }), (degRaw) => { const theta = (degRaw * Math.PI) / 180; - const s = parseFloat(out(call('sin', [num(theta)]))); - const c = parseFloat(out(call('cos', [num(theta)]))); - const recovered = parseFloat(out(call('atan2', [num(s), num(c)]))); + const s = Number.parseFloat(out(call('sin', [num(theta)]))); + const c = Number.parseFloat(out(call('cos', [num(theta)]))); + const recovered = Number.parseFloat(out(call('atan2', [num(s), num(c)]))); return Math.abs(recovered - degRaw) < 1e-6; }), { numRuns: NUM_RUNS } @@ -363,8 +375,10 @@ test('law: atan2 only depends on the ratio — atan2(k·y, k·x) ≡ atan2(y, x) fc.integer({ min: 1, max: 100 }), (y, x, k) => { if (x === 0 && y === 0) return true; // atan2(0,0) is degenerate - const lhs = parseFloat(out(call('atan2', [num(k * y), num(k * x)]))); - const rhs = parseFloat(out(call('atan2', [num(y), num(x)]))); + const lhs = Number.parseFloat( + out(call('atan2', [num(k * y), num(k * x)])) + ); + const rhs = Number.parseFloat(out(call('atan2', [num(y), num(x)]))); return Math.abs(lhs - rhs) < 1e-9; } ), @@ -393,7 +407,7 @@ test('law: pow(x, 0) ≡ 1 for finite x', () => { test('law: sqrt(pow(x, 2)) ≡ abs(x) for finite x', () => { fc.assert( fc.property(fc.integer({ min: -100, max: 100 }), (v) => { - const lhs = parseFloat( + const lhs = Number.parseFloat( out(call('sqrt', [call('pow', [num(v), num(2)])])) ); const rhs = Math.abs(v); @@ -405,7 +419,7 @@ test('law: sqrt(pow(x, 2)) ≡ abs(x) for finite x', () => { test('law: log(exp(x)) ≡ x for finite x within precision', () => { fc.assert( fc.property(fc.float({ min: -50, max: 50, noNaN: true }), (v) => { - const lhs = parseFloat(out(call('log', [call('exp', [num(v)])]))); + const lhs = Number.parseFloat(out(call('log', [call('exp', [num(v)])]))); return Math.abs(lhs - v) < 1e-6; }), { numRuns: NUM_RUNS } @@ -416,7 +430,9 @@ test('law: exp(log(x)) ≡ x for finite x > 0 within precision', () => { fc.property( fc.float({ min: Math.fround(1e-3), max: Math.fround(1e6), noNaN: true }), (v) => { - const lhs = parseFloat(out(call('exp', [call('log', [num(v)])]))); + const lhs = Number.parseFloat( + out(call('exp', [call('log', [num(v)])])) + ); return Math.abs((lhs - v) / v) < 1e-6; } ), diff --git a/test/property/naive-oracle.test.mjs b/test/property/naive-oracle.test.mjs index ffb8384..a59ff7a 100644 --- a/test/property/naive-oracle.test.mjs +++ b/test/property/naive-oracle.test.mjs @@ -25,9 +25,9 @@ const out = (s) => serialize(simplify(parse(tokenize(s))), { precision: 10 }); // uses A − B·floor(A/B). // - naiveRem mirrors production's native `%` directly (see below). function naiveRound(strategy, a, b) { - if (b === 0) return NaN; - if (!isFinite(b)) return NaN; // out of scope here; production passthroughs - if (!isFinite(a)) return a; // §10.3.1 line 1022 + if (b === 0) return Number.NaN; + if (!Number.isFinite(b)) return Number.NaN; // out of scope here; production passthroughs + if (!Number.isFinite(a)) return a; // §10.3.1 line 1022 const absB = Math.abs(b); const q = a / absB; const fl = Math.floor(q); @@ -53,10 +53,10 @@ function naiveRound(strategy, a, b) { } } function naiveMod(a, b) { - if (b === 0) return NaN; - if (!isFinite(a)) return NaN; - if (!isFinite(b)) { - if (a !== 0 && Math.sign(a) !== Math.sign(b)) return NaN; + if (b === 0) return Number.NaN; + if (!Number.isFinite(a)) return Number.NaN; + if (!Number.isFinite(b)) { + if (a !== 0 && Math.sign(a) !== Math.sign(b)) return Number.NaN; return a; } // Iterative reduction: keep adding/subtracting B until r is in the @@ -74,9 +74,9 @@ function naiveMod(a, b) { return r; } function naiveRem(a, b) { - if (b === 0) return NaN; - if (!isFinite(a)) return NaN; - if (!isFinite(b)) return a; + if (b === 0) return Number.NaN; + if (!Number.isFinite(a)) return Number.NaN; + if (!Number.isFinite(b)) return a; // `%` is exact IEEE-754 remainder; any division-based formula adds its // own rounding and disagrees at near-exact-quotient inputs (see [small B]). return a % b; @@ -120,7 +120,9 @@ for (const row of rows) { for (const strategy of STRATEGIES) { test(`oracle: round(${strategy}, ${row.a}, ${row.b}) [${row.desc}]`, () => { const expected = naiveRound(strategy, row.a, row.b); - const got = parseFloat(out(`round(${strategy}, ${row.a}, ${row.b})`)); + const got = Number.parseFloat( + out(`round(${strategy}, ${row.a}, ${row.b})`) + ); // NaN === NaN check via Object.is. if (Number.isNaN(expected)) { assert.ok(Number.isNaN(got), `expected NaN, got ${got}`); @@ -140,7 +142,7 @@ for (const row of rows) { if (row.b !== 0 && Math.abs(row.a / row.b) > 100000) continue; test(`oracle: mod(${row.a}, ${row.b}) [${row.desc}]`, () => { const expected = naiveMod(row.a, row.b); - const got = parseFloat(out(`mod(${row.a}, ${row.b})`)); + const got = Number.parseFloat(out(`mod(${row.a}, ${row.b})`)); if (Number.isNaN(expected)) { assert.ok(Number.isNaN(got), `expected NaN, got ${got}`); } else { @@ -152,7 +154,7 @@ for (const row of rows) { }); test(`oracle: rem(${row.a}, ${row.b}) [${row.desc}]`, () => { const expected = naiveRem(row.a, row.b); - const got = parseFloat(out(`rem(${row.a}, ${row.b})`)); + const got = Number.parseFloat(out(`rem(${row.a}, ${row.b})`)); if (Number.isNaN(expected)) { assert.ok(Number.isNaN(got), `expected NaN, got ${got}`); } else { @@ -168,14 +170,14 @@ const SIGN_INPUTS = [0, -0, 1, -1, 5, -5, 100, -100, 0.0001, -0.0001]; for (const a of SIGN_INPUTS) { test(`oracle: abs(${a})`, () => { const expected = Math.abs(a); - const got = parseFloat(out(`abs(${a})`)); + const got = Number.parseFloat(out(`abs(${a})`)); assert.equal(got, expected); }); test(`oracle: sign(${a})`, () => { // Math.sign(-0) === -0; we serialize that as "0". Compare via // `+got === +expected` to fold ±0. const expected = Math.sign(a); - const got = parseFloat(out(`sign(${a})`)); + const got = Number.parseFloat(out(`sign(${a})`)); assert.ok(+got === +expected, `naive=${expected}, prod=${got}`); }); } @@ -205,7 +207,7 @@ const TRIG_RADIAN_INPUTS = [ for (const x of TRIG_RADIAN_INPUTS) { test(`oracle: sin(${x}) [radians]`, () => { const expected = Math.sin(x); - const got = parseFloat(out(`sin(${x})`)); + const got = Number.parseFloat(out(`sin(${x})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` @@ -213,7 +215,7 @@ for (const x of TRIG_RADIAN_INPUTS) { }); test(`oracle: cos(${x}) [radians]`, () => { const expected = Math.cos(x); - const got = parseFloat(out(`cos(${x})`)); + const got = Number.parseFloat(out(`cos(${x})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` @@ -221,7 +223,7 @@ for (const x of TRIG_RADIAN_INPUTS) { }); test(`oracle: tan(${x}) [radians, may be near-asymptote]`, () => { const expected = Math.tan(x); - const got = parseFloat(out(`tan(${x})`)); + const got = Number.parseFloat(out(`tan(${x})`)); // tan diverges near ±π/2; compare via relative error there. if (Math.abs(expected) > 1e6) { // Both sides should be huge and the same sign — exact match @@ -241,7 +243,7 @@ const INVERSE_TRIG_NUMBER_INPUTS = [-1, -0.5, 0, 0.25, 0.5, 0.75, 1]; for (const x of INVERSE_TRIG_NUMBER_INPUTS) { test(`oracle: asin(${x})`, () => { const expectedDeg = (Math.asin(x) * 180) / Math.PI; - const got = parseFloat(out(`asin(${x})`)); + const got = Number.parseFloat(out(`asin(${x})`)); assert.ok( Math.abs(got - expectedDeg) < 1e-9, `naive=${expectedDeg}deg, prod=${got}deg` @@ -249,7 +251,7 @@ for (const x of INVERSE_TRIG_NUMBER_INPUTS) { }); test(`oracle: acos(${x})`, () => { const expectedDeg = (Math.acos(x) * 180) / Math.PI; - const got = parseFloat(out(`acos(${x})`)); + const got = Number.parseFloat(out(`acos(${x})`)); assert.ok( Math.abs(got - expectedDeg) < 1e-9, `naive=${expectedDeg}deg, prod=${got}deg` @@ -260,7 +262,7 @@ const ATAN_INPUTS = [-1000, -1, -0.5, 0, 0.5, 1, 1000]; for (const x of ATAN_INPUTS) { test(`oracle: atan(${x})`, () => { const expectedDeg = (Math.atan(x) * 180) / Math.PI; - const got = parseFloat(out(`atan(${x})`)); + const got = Number.parseFloat(out(`atan(${x})`)); assert.ok( Math.abs(got - expectedDeg) < 1e-9, `naive=${expectedDeg}deg, prod=${got}deg` @@ -285,7 +287,7 @@ const ATAN2_INPUTS = [ for (const [y, x] of ATAN2_INPUTS) { test(`oracle: atan2(${y}, ${x})`, () => { const expectedDeg = (Math.atan2(y, x) * 180) / Math.PI; - const got = parseFloat(out(`atan2(${y}, ${x})`)); + const got = Number.parseFloat(out(`atan2(${y}, ${x})`)); assert.ok( Math.abs(got - expectedDeg) < 1e-9, `naive=${expectedDeg}deg, prod=${got}deg` @@ -311,7 +313,7 @@ const POW_INPUTS = [ for (const [a, b] of POW_INPUTS) { test(`oracle: pow(${a}, ${b})`, () => { const expected = Math.pow(a, b); - const got = parseFloat(out(`pow(${a}, ${b})`)); + const got = Number.parseFloat(out(`pow(${a}, ${b})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` @@ -322,7 +324,7 @@ const SQRT_INPUTS = [0, 1, 2, 4, 9, 16, 25, 100, 0.25]; for (const x of SQRT_INPUTS) { test(`oracle: sqrt(${x})`, () => { const expected = Math.sqrt(x); - const got = parseFloat(out(`sqrt(${x})`)); + const got = Number.parseFloat(out(`sqrt(${x})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` @@ -333,7 +335,7 @@ const EXP_INPUTS = [-2, -1, 0, 0.5, 1, 2, 5]; for (const x of EXP_INPUTS) { test(`oracle: exp(${x})`, () => { const expected = Math.exp(x); - const got = parseFloat(out(`exp(${x})`)); + const got = Number.parseFloat(out(`exp(${x})`)); assert.ok( Math.abs(got - expected) < 1e-6, `naive=${expected}, prod=${got}` @@ -344,7 +346,7 @@ const LOG1_INPUTS = [1, 2, Math.E, 10, 100, 0.5]; for (const x of LOG1_INPUTS) { test(`oracle: log(${x})`, () => { const expected = Math.log(x); - const got = parseFloat(out(`log(${x})`)); + const got = Number.parseFloat(out(`log(${x})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` @@ -361,7 +363,7 @@ const LOG2_INPUTS = [ for (const [a, b] of LOG2_INPUTS) { test(`oracle: log(${a}, ${b})`, () => { const expected = Math.log(a) / Math.log(b); - const got = parseFloat(out(`log(${a}, ${b})`)); + const got = Number.parseFloat(out(`log(${a}, ${b})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` @@ -380,7 +382,7 @@ const HYPOT_INPUTS = [ for (const args of HYPOT_INPUTS) { test(`oracle: hypot(${args.join(', ')})`, () => { const expected = Math.hypot(...args); - const got = parseFloat(out(`hypot(${args.join(', ')})`)); + const got = Number.parseFloat(out(`hypot(${args.join(', ')})`)); assert.ok( Math.abs(got - expected) < 1e-9, `naive=${expected}, prod=${got}` diff --git a/test/unit/serialize.test.mjs b/test/unit/serialize.test.mjs index 4b9da59..228597d 100644 --- a/test/unit/serialize.test.mjs +++ b/test/unit/serialize.test.mjs @@ -181,7 +181,7 @@ test('serialize: Num(-Infinity) → calc(-infinity)', () => { assert.equal(serialize(num(-Infinity)), 'calc(-infinity)'); }); test('serialize: Num(NaN) → calc(NaN)', () => { - assert.equal(serialize(num(NaN)), 'calc(NaN)'); + assert.equal(serialize(num(Number.NaN)), 'calc(NaN)'); }); test('serialize: Dim(Infinity, px) → calc(infinity * 1px)', () => { assert.equal(serialize(dim(Infinity, 'px')), 'calc(infinity * 1px)'); @@ -190,7 +190,7 @@ test('serialize: Dim(-Infinity, px) → calc(-infinity * 1px)', () => { assert.equal(serialize(dim(-Infinity, 'px')), 'calc(-infinity * 1px)'); }); test('serialize: Dim(NaN, deg) → calc(NaN * 1deg)', () => { - assert.equal(serialize(dim(NaN, 'deg')), 'calc(NaN * 1deg)'); + assert.equal(serialize(dim(Number.NaN, 'deg')), 'calc(NaN * 1deg)'); }); test('serialize: degenerate uses calcName option (vendor prefix)', () => { assert.equal( @@ -198,13 +198,16 @@ test('serialize: degenerate uses calcName option (vendor prefix)', () => { '-webkit-calc(infinity)' ); assert.equal( - serialize(dim(NaN, 'px'), { calcName: '-moz-calc' }), + serialize(dim(Number.NaN, 'px'), { calcName: '-moz-calc' }), '-moz-calc(NaN * 1px)' ); }); test('serialize: precision does not round Infinity / NaN', () => { assert.equal(serialize(num(Infinity), { precision: 2 }), 'calc(infinity)'); - assert.equal(serialize(dim(NaN, 'px'), { precision: 0 }), 'calc(NaN * 1px)'); + assert.equal( + serialize(dim(Number.NaN, 'px'), { precision: 0 }), + 'calc(NaN * 1px)' + ); }); test('serialize: degenerate Num inside Sum context emits keyword', () => { // var(--x) + Infinity → keyword spelling, no nested calc(). @@ -216,6 +219,6 @@ test('serialize: degenerate Num inside Sum context emits keyword', () => { }); test('serialize: NaN keeps canonical casing (never nan/NAN)', () => { // §10.7.2 line 1182. - assert.equal(serialize(num(NaN)).includes('NaN'), true); - assert.equal(serialize(num(NaN)).includes('nan'), false); + assert.equal(serialize(num(Number.NaN)).includes('NaN'), true); + assert.equal(serialize(num(Number.NaN)).includes('nan'), false); }); From b22e76db80a32863a9f5d4bae062b26744b91557 Mon Sep 17 00:00:00 2001 From: Ludovico Fischer Date: Thu, 20 Aug 2026 19:12:01 +0200 Subject: [PATCH 2/2] chore: update development deps --- package.json | 4 +- pnpm-lock.yaml | 326 ++++++++++++++++++++++++------------------------- 2 files changed, 165 insertions(+), 165 deletions(-) diff --git a/package.json b/package.json index c15cc8a..9afd759 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ "@rmenke/css-tokenizer-tests": "^1.2.0", "@types/node": "^26.2.0", "fast-check": "^4.9.0", - "oxfmt": "^0.63.0", - "oxlint": "^1.78.0", + "oxfmt": "^0.64.0", + "oxlint": "^1.79.0", "postcss": "^8.5.26", "typescript": "~7.0.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0fba150..a874ab4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -227,11 +227,11 @@ importers: specifier: ^4.9.0 version: 4.9.0 oxfmt: - specifier: ^0.63.0 - version: 0.63.0 + specifier: ^0.64.0 + version: 0.64.0 oxlint: - specifier: ^1.78.0 - version: 1.78.0 + specifier: ^1.79.0 + version: 1.79.0 postcss: specifier: ^8.5.26 version: 8.5.26 @@ -258,246 +258,246 @@ packages: resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} engines: {node: '>=20.19.0'} - '@oxfmt/binding-android-arm-eabi@0.63.0': - resolution: {integrity: sha512-YmRth4ZPGgEXcgmkhvANbC9uD67dxmSobW7DQuyt5tOBOKvPnIpk5SVHBj88E+7wMNRI2FhqaDbOhQFBix+b8A==} + '@oxfmt/binding-android-arm-eabi@0.64.0': + resolution: {integrity: sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.63.0': - resolution: {integrity: sha512-icbahX8X2X3sRamOMecvdYeZXWjPDazRDIfvWfy7Ca1nc/ZDT2Y9k5Nt7s46EqFd7NQPdgk+CM3/SgIT5LPCaQ==} + '@oxfmt/binding-android-arm64@0.64.0': + resolution: {integrity: sha512-jRGSUeeP7p3Gynw2YaCVtjBIA6ZxY6bEB/ES5i54OhqmRTyuVg7ZgstEtzgq6GOAJd+2QZ5pvf+bFfmW5Mp9cw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.63.0': - resolution: {integrity: sha512-WV+Ze5v5gI2qoj8jpAovt8KBTW8pjEz/AiMXXjeTQS+Bmf/MmZXTS40S8xNPDszX+W8WDv2Bbk6qKrMTtUGu1A==} + '@oxfmt/binding-darwin-arm64@0.64.0': + resolution: {integrity: sha512-JINwtU2lW7nOFSqi+H2qplipNUqah9Gc1jgGmB82kTD4UnZrZIVxCJ9qEmFiKfjNq27gYLFhrUb0to86aCwMjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.63.0': - resolution: {integrity: sha512-CJGSBdDxXOWIpoFXHpverimCvz084KA7L483rqJ44c3jDtzv6d4qOSoR/V9ywSHfV+Ks1lwIj2P49BFhunLNAA==} + '@oxfmt/binding-darwin-x64@0.64.0': + resolution: {integrity: sha512-gCmuswrgrOSajV4HCRFkVCGIruPq8bjYuPYgSE2WQB3mD6XrdyZ3JMSRZCkQ8zCxOyGWriBo6QoZ5nmMHQ1BfA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.63.0': - resolution: {integrity: sha512-BDfKY+KhL2078cgswBBFQPAYuxCy93bS/iC5frdSeSbTLcGrR6VC2hsuPTanoJmg84+wSyWl0wWC1eR+uTnkRg==} + '@oxfmt/binding-freebsd-x64@0.64.0': + resolution: {integrity: sha512-Ab8g7a38pT0MMImjh7anRSTve6buWBIlcXIFBYa5xl4s6UxEgKSc2xOOhbGtLwvXnEi2PsEDGoJh3oUU7xkehQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.63.0': - resolution: {integrity: sha512-Ov1cQEXT4mj7cojAokWSS1eoxkoyvbDfAbxNsGIKY2o36kvdAaFzPxRN6NxFRk9fD72B8oCoTTX/NuYTUWlpsg==} + '@oxfmt/binding-linux-arm-gnueabihf@0.64.0': + resolution: {integrity: sha512-BgvS3CoQ+Xy2deoZqEN8JVKabcCZi2RxA3yant8G9OAv9KuPJ9TCjHkqigzdHUVwErZxEP5d2bzLIEyKYyBDLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.63.0': - resolution: {integrity: sha512-0LE7ro3+6L79jcMANycAZfRaC7zxr9YZ2+vEL5uMD9QlEep+rS/r1kSJsnuLl991NXJZD60euh0PC1GHrR20vw==} + '@oxfmt/binding-linux-arm-musleabihf@0.64.0': + resolution: {integrity: sha512-QXpNxwoMj0YvnceCNZadNSden3bIcnvjn/sDp/rwZhRoZoZYGpHvtPyhGsdJz9uvT9GkaMW7SsLddurU56dt8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.63.0': - resolution: {integrity: sha512-izPk+2Z4gjuZK32Fqh5qXoMpT/2NXzLh++ob57HiEiVSQZ1iYXu8EKMzb+K5AvWyIEXhdDIt7ADjGGtFhkT9Bw==} + '@oxfmt/binding-linux-arm64-gnu@0.64.0': + resolution: {integrity: sha512-BBgH3I1ppDsI5pZ4Pdhw0ceYxwVCfbU/bZEBCeZ6caRS9x0ZabErxubP7riGUn11PXZBhe8DYdjkDKP1FlVQ5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.63.0': - resolution: {integrity: sha512-alPmbOuWXFXiSo+lOtv6X71C7SYMEDW2WVvywOvf9BwKgEhSNGhMTLeFVSjKUMCamcjbbgVdsWF8GN1uy8xshg==} + '@oxfmt/binding-linux-arm64-musl@0.64.0': + resolution: {integrity: sha512-v19HSjC/BGXdt26qEvKZtwAHgGmQ2Agcap2kQP+KIqoRZqivVzYth3ui2dJA1i+6/fjpjga85lIOaJJjQ/bOOw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.63.0': - resolution: {integrity: sha512-BdzCPvolJc4AWZ+YMzgUDJcDzbQWrFjYuqBHoNHNqP1aCaluQRJNs4k3vNU5IG7vTpjf9zeD73D7MFM1TecZpg==} + '@oxfmt/binding-linux-ppc64-gnu@0.64.0': + resolution: {integrity: sha512-PElLnOo4xFTBZrxPhgTIj0eHqZXwEBQoNWtb7facUV170T0B0FRET0iNbb3LUeLWTybkUW+vsdyv4ihOdyXGyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.63.0': - resolution: {integrity: sha512-7sIgfLzqtNKSkMGsGVyRpHwpjNezRg2XONvUOheFZs95TSZpM0JAuPpA8KrQFsWc4wPU95roX2O69JgH8igOgw==} + '@oxfmt/binding-linux-riscv64-gnu@0.64.0': + resolution: {integrity: sha512-Qzsg15n4F5CH+MorcRW4MkAEMiLzXmeG+DiDSbP/bBTqCmWOH3K9DHryNrve+JHlV0txS+B6Z9P5Xz+cmWeL+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.63.0': - resolution: {integrity: sha512-9Tcg0y0WcVa6Mm9AgcgFMseDS+VkFJZpKZ8We9SpDY4gg5jewSwln+0sO04QLcTS1BtfDl9MwR+NfID8L7PUTg==} + '@oxfmt/binding-linux-riscv64-musl@0.64.0': + resolution: {integrity: sha512-/GZ358wnQ/Ez4UVnCcZIi56JkY0sOdZ+B108pqXKqZz3jLS59F4KEAB1Qv3fRlObrFEk+3L2vUQ/xoPx+3vjXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.63.0': - resolution: {integrity: sha512-qWKC1pEOpx1qYhXaugPhHUeXwSfqEOk2wJH2LqVXGPV5iQYfdAZdt+d2XDiX4DTSWA2QDMUcFB+wEORh3Xn/sA==} + '@oxfmt/binding-linux-s390x-gnu@0.64.0': + resolution: {integrity: sha512-/C9We3DXegowfLXtVCYHeNiU9azwCDr5cQkEtCVlc74vyn+lLQSPApJ1CZmxAduqeq/Oi3gQ+IVptyhCaTMtkQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.63.0': - resolution: {integrity: sha512-S9wXYOiGSqYGS4Fx/TFsY+xDd/7dE5s+rUgbA4TsHiVF9e8J3ZcKmP7dsP/7iqLI9Wz7Ic7TzEr3mdthRCTdrA==} + '@oxfmt/binding-linux-x64-gnu@0.64.0': + resolution: {integrity: sha512-91KM2CeRWscIEHlj1NsW2WSnzGeq1Ehq+39bfDowTdkn+fcvK/x4Y1RcyqT7glyBjZio0ldkeCG6Usj3v7ASog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.63.0': - resolution: {integrity: sha512-5eGyTJuMZNwBSHCivXt8Yuta6GeTYksOPXRk2MIhajiyFGQx7bjaHIwY+ZusAoFHhT157A9x6sktLjYo9D5oMQ==} + '@oxfmt/binding-linux-x64-musl@0.64.0': + resolution: {integrity: sha512-gw7uEk9I+7zoT1EYLra1eWArIzNcz8e3jkv+Noo2+o2T7wPvsNSQbfoa4DSfZlvn1i6mJ05RiZ4/omaXPDNhQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.63.0': - resolution: {integrity: sha512-Rz7hx+Dv3DoW/S6pwVAyjfFXp7/trdQ1zg+vNmsdsdDNlUccugp4XNqambSuEAeP0DaG9k72AtNyfDXCEg0AGw==} + '@oxfmt/binding-openharmony-arm64@0.64.0': + resolution: {integrity: sha512-HYHFf616FHSPSO07c09mjmXBfQ73wIVM3m0txOiooa5XZkGoxFd6B14PVj0LB0DXIqJ6wAO/dDR/NX/5UUaqnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.63.0': - resolution: {integrity: sha512-T/IuizKN9mr4Xw6YYnptkXRNdLkyIlUZ7c8zfTOBpoytZyJ1BAsMUvsMDEx0X4YvSMpaivm+DR8112rQfzC25g==} + '@oxfmt/binding-win32-arm64-msvc@0.64.0': + resolution: {integrity: sha512-uQjFp081IZSWD6VAofX2iO2z01awAdHmfC+NrieWIPKrT2hZKQDyq/U18M7ifC0sm0Wz8aHY/p6+FDYIzs/CrQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.63.0': - resolution: {integrity: sha512-XjrO5FJ5Wl9vsAxtCP1G/eaeT6y1K2s9CICUHGE42cEjou32/J6S+B1KnrOAboj6E7uhJnwPbRSvznWcxNdA0g==} + '@oxfmt/binding-win32-ia32-msvc@0.64.0': + resolution: {integrity: sha512-lNM6byTAQ881jugzFu8juJTbNRgsUTlswMA6pJmwi1XDvmIqnnb49lcUAs5gz94fCJLrVN+/X3s3jOKqx23WIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.63.0': - resolution: {integrity: sha512-sgsHCQy432OTQH4Ikk3tZptp3GqwnhwUDuY0loBH41zyHWfMZY9v8Dy78wsnSofHejvFozZGgJgBB1A0LQRwMQ==} + '@oxfmt/binding-win32-x64-msvc@0.64.0': + resolution: {integrity: sha512-BtmbtL/QjMtF1a6C3CqoDluH2IfB6fJt62E+B9RFfUPtFk4Iz9PFS6+y/SzzOvSxc7aUk2Kphwg7Dh8lMbwu6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.78.0': - resolution: {integrity: sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==} + '@oxlint/binding-android-arm-eabi@1.79.0': + resolution: {integrity: sha512-TebFaaMklO/RXzTv7PucaCq9l3X6D1gA+C8H6K4njtjFOV+zWE9MKLpulcJZN9bzytbUbQIY0mZuz12nQ5Kv4Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.78.0': - resolution: {integrity: sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==} + '@oxlint/binding-android-arm64@1.79.0': + resolution: {integrity: sha512-KqqnOtAVgNsPPF0YSodkFZA1O80jcKoCZCTu3bgsszxA+MrMP9TLzfXitKjEj1FmrPprKDMdRDMmY3weESO9sg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.78.0': - resolution: {integrity: sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==} + '@oxlint/binding-darwin-arm64@1.79.0': + resolution: {integrity: sha512-BVC2nsMzqQzRDPc5RhixkZ+m1p7iH4bxRRvqkbwDXX0PlQKm1BPy8J8cRjnAFafOq2QzI+BfO3vE8w2GZ3CBag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.78.0': - resolution: {integrity: sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==} + '@oxlint/binding-darwin-x64@1.79.0': + resolution: {integrity: sha512-p6Lm+snmhGuLKL1+CpCV8L6ijkE/qJzK2H2jG9+eKJT0n31RbY4FLsdhexekgP3bLpw4Kgde+9DZuDZQ4yIInA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.78.0': - resolution: {integrity: sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==} + '@oxlint/binding-freebsd-x64@1.79.0': + resolution: {integrity: sha512-qDMm0dXZnoHyRqSL4N4xUq82T4sqK5cbKSjvd/dF/YbMUXc2R1wEPf+vmA5S0qUmi0nwXfNbjXBtZaIqzQLIMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.78.0': - resolution: {integrity: sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==} + '@oxlint/binding-linux-arm-gnueabihf@1.79.0': + resolution: {integrity: sha512-2od7s0nuKPzqyUZAWk9KkCyGg7eI9dwFPZg+20lB15fKFkVZ0c9ZFxqPfiBAyDTlTkh9stPI0t+JlPCqMbItVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.78.0': - resolution: {integrity: sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==} + '@oxlint/binding-linux-arm-musleabihf@1.79.0': + resolution: {integrity: sha512-ZOQUjkzDnvlhSE3+tWC3YXx94MMl+sYMlwH+u1+YGApGHOJP/YAc8ZBRFOXZ6eOBmxtXAWuS/fBcdZr8qqNO1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.78.0': - resolution: {integrity: sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==} + '@oxlint/binding-linux-arm64-gnu@1.79.0': + resolution: {integrity: sha512-lu158FR4nGqGeRS3BQvtG85wRgU/Fy4MD5Cxp1hzJXizGiLo6u2742wJSCDKh8cFcZntvX7fcxlq4mMmfryH1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.78.0': - resolution: {integrity: sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==} + '@oxlint/binding-linux-arm64-musl@1.79.0': + resolution: {integrity: sha512-mbpKQeE2aflTjddaHK7MP8KP/OFbUM++lt5M635ENM8IyIdK0jm2t9pb+2v9mVVIvhF6TqA4l7F79Pll1mi+uw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.78.0': - resolution: {integrity: sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==} + '@oxlint/binding-linux-ppc64-gnu@1.79.0': + resolution: {integrity: sha512-WpGNua7gaxaHnpSDeog2ji8IDHn/QLPl9LPzwkR/FvVv58vT5BcXjRXnU+wbu3N75cpeha8CdC7ho/U2OIsB4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.78.0': - resolution: {integrity: sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==} + '@oxlint/binding-linux-riscv64-gnu@1.79.0': + resolution: {integrity: sha512-tK1E93A5LVzISg4ngpKJnfTs7EqtIUceGI7MQ4GyDjJiLi8wPCkEyKlj2xkyKWZ1yzkDJyLHTBJ5/iFWRdnJvg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.78.0': - resolution: {integrity: sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==} + '@oxlint/binding-linux-riscv64-musl@1.79.0': + resolution: {integrity: sha512-qhQvUIrngXivA2A9pQ+xPCychztn/5qUv7yS3gDwXv3w7Rag+eTeeXWmRyx+t7XsW5x6LuY/8AsTq36UgFIblg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.78.0': - resolution: {integrity: sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==} + '@oxlint/binding-linux-s390x-gnu@1.79.0': + resolution: {integrity: sha512-sv6AaVgU/eE6u+6WFiQVDcPPwTxP6IJMSB9k701W2r/r6Tx465e8vPvVyRxquNH4Vy6KwRNu90mVbxXJN8+5gg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.78.0': - resolution: {integrity: sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==} + '@oxlint/binding-linux-x64-gnu@1.79.0': + resolution: {integrity: sha512-iFZL02deziHslb3jEX9KdqlAkYoo4fGyotchKDzdfK1f5mxlIBeiQeHhvK3iFpuEJSB4ma/qeFn9oxPiwnhUPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.78.0': - resolution: {integrity: sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==} + '@oxlint/binding-linux-x64-musl@1.79.0': + resolution: {integrity: sha512-3DtZR2raqObnh7wXZoFYFd0Fw7skBvcb3f7A+/lkEiDuh8hrE6vv9b/62Qxao1a9/OeHLw/FcXlXzgsW9wTRFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.78.0': - resolution: {integrity: sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==} + '@oxlint/binding-openharmony-arm64@1.79.0': + resolution: {integrity: sha512-Oatt4GuA1WJkqzk2ozx4HrWROOi7opV3AKDw/U8qDIqeTqzsjn5K2x3REJMNjU3/KU/Bkq96Zi3CknaiDTaC/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.78.0': - resolution: {integrity: sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==} + '@oxlint/binding-win32-arm64-msvc@1.79.0': + resolution: {integrity: sha512-NAgZr9Qp8nIA9rpo0JEvwiabTF/2UVqBNnupBG9X4kxXcQoScJUTi+qHhvabb9s/thgj5wQ4XcIaJvb+ZMgoKw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.78.0': - resolution: {integrity: sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==} + '@oxlint/binding-win32-ia32-msvc@1.79.0': + resolution: {integrity: sha512-+KyXjIvcpaXmWW/j9NNY5yWjrIVxaX18VyIheQy3jwc2GSYgpCr7MGI/HxIGQ/shAL5IWEKbhsqoMpAO5Stiog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.78.0': - resolution: {integrity: sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==} + '@oxlint/binding-win32-x64-msvc@1.79.0': + resolution: {integrity: sha512-mEelcCMMBS57sIXh2veGMNy+pQwuGtcMxHxGIZWQ5Ba9pJ5jCCUFOZB9E2JhBaxGsURe+WGe0zJp4RVre52gpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -637,8 +637,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - oxfmt@0.63.0: - resolution: {integrity: sha512-kgdDwv35wvVf6554U2Ab8Jnd0zTM+TsEQWwaB70RAjK3gICFAFGO+2Hd3Be27GMoXj3XRL9IKSNRVl7KBQL6iw==} + oxfmt@0.64.0: + resolution: {integrity: sha512-XZ4GFBN/PLbXKq+0zrgpQfPKYuJlUuj+nzZJY7UpIbFMNyefNLCdN9EwViycNqnYcv0wrn0jXcQLlqJp8RCKBg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -650,8 +650,8 @@ packages: vite-plus: optional: true - oxlint@1.78.0: - resolution: {integrity: sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==} + oxlint@1.79.0: + resolution: {integrity: sha512-hVJ9hq9m2unPS+Of4eJJgCPdIeCC+3DHEUX3tkmrPJr3OK2hz7PhXwgC+ZP71ZcYu8cCDEtQrqLxWNvxBppBVg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -702,118 +702,118 @@ snapshots: '@csstools/css-tokenizer@4.0.0': {} - '@oxfmt/binding-android-arm-eabi@0.63.0': + '@oxfmt/binding-android-arm-eabi@0.64.0': optional: true - '@oxfmt/binding-android-arm64@0.63.0': + '@oxfmt/binding-android-arm64@0.64.0': optional: true - '@oxfmt/binding-darwin-arm64@0.63.0': + '@oxfmt/binding-darwin-arm64@0.64.0': optional: true - '@oxfmt/binding-darwin-x64@0.63.0': + '@oxfmt/binding-darwin-x64@0.64.0': optional: true - '@oxfmt/binding-freebsd-x64@0.63.0': + '@oxfmt/binding-freebsd-x64@0.64.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.63.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.64.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.63.0': + '@oxfmt/binding-linux-arm-musleabihf@0.64.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.63.0': + '@oxfmt/binding-linux-arm64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.63.0': + '@oxfmt/binding-linux-arm64-musl@0.64.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.63.0': + '@oxfmt/binding-linux-ppc64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.63.0': + '@oxfmt/binding-linux-riscv64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.63.0': + '@oxfmt/binding-linux-riscv64-musl@0.64.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.63.0': + '@oxfmt/binding-linux-s390x-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.63.0': + '@oxfmt/binding-linux-x64-gnu@0.64.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.63.0': + '@oxfmt/binding-linux-x64-musl@0.64.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.63.0': + '@oxfmt/binding-openharmony-arm64@0.64.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.63.0': + '@oxfmt/binding-win32-arm64-msvc@0.64.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.63.0': + '@oxfmt/binding-win32-ia32-msvc@0.64.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.63.0': + '@oxfmt/binding-win32-x64-msvc@0.64.0': optional: true - '@oxlint/binding-android-arm-eabi@1.78.0': + '@oxlint/binding-android-arm-eabi@1.79.0': optional: true - '@oxlint/binding-android-arm64@1.78.0': + '@oxlint/binding-android-arm64@1.79.0': optional: true - '@oxlint/binding-darwin-arm64@1.78.0': + '@oxlint/binding-darwin-arm64@1.79.0': optional: true - '@oxlint/binding-darwin-x64@1.78.0': + '@oxlint/binding-darwin-x64@1.79.0': optional: true - '@oxlint/binding-freebsd-x64@1.78.0': + '@oxlint/binding-freebsd-x64@1.79.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.78.0': + '@oxlint/binding-linux-arm-gnueabihf@1.79.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.78.0': + '@oxlint/binding-linux-arm-musleabihf@1.79.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.78.0': + '@oxlint/binding-linux-arm64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.78.0': + '@oxlint/binding-linux-arm64-musl@1.79.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.78.0': + '@oxlint/binding-linux-ppc64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.78.0': + '@oxlint/binding-linux-riscv64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.78.0': + '@oxlint/binding-linux-riscv64-musl@1.79.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.78.0': + '@oxlint/binding-linux-s390x-gnu@1.79.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.78.0': + '@oxlint/binding-linux-x64-gnu@1.79.0': optional: true - '@oxlint/binding-linux-x64-musl@1.78.0': + '@oxlint/binding-linux-x64-musl@1.79.0': optional: true - '@oxlint/binding-openharmony-arm64@1.78.0': + '@oxlint/binding-openharmony-arm64@1.79.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.78.0': + '@oxlint/binding-win32-arm64-msvc@1.79.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.78.0': + '@oxlint/binding-win32-ia32-msvc@1.79.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.78.0': + '@oxlint/binding-win32-x64-msvc@1.79.0': optional: true '@rmenke/css-tokenizer-tests@1.2.0': {} @@ -888,51 +888,51 @@ snapshots: nanoid@3.3.18: {} - oxfmt@0.63.0: + oxfmt@0.64.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.63.0 - '@oxfmt/binding-android-arm64': 0.63.0 - '@oxfmt/binding-darwin-arm64': 0.63.0 - '@oxfmt/binding-darwin-x64': 0.63.0 - '@oxfmt/binding-freebsd-x64': 0.63.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.63.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.63.0 - '@oxfmt/binding-linux-arm64-gnu': 0.63.0 - '@oxfmt/binding-linux-arm64-musl': 0.63.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.63.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.63.0 - '@oxfmt/binding-linux-riscv64-musl': 0.63.0 - '@oxfmt/binding-linux-s390x-gnu': 0.63.0 - '@oxfmt/binding-linux-x64-gnu': 0.63.0 - '@oxfmt/binding-linux-x64-musl': 0.63.0 - '@oxfmt/binding-openharmony-arm64': 0.63.0 - '@oxfmt/binding-win32-arm64-msvc': 0.63.0 - '@oxfmt/binding-win32-ia32-msvc': 0.63.0 - '@oxfmt/binding-win32-x64-msvc': 0.63.0 - - oxlint@1.78.0: + '@oxfmt/binding-android-arm-eabi': 0.64.0 + '@oxfmt/binding-android-arm64': 0.64.0 + '@oxfmt/binding-darwin-arm64': 0.64.0 + '@oxfmt/binding-darwin-x64': 0.64.0 + '@oxfmt/binding-freebsd-x64': 0.64.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.64.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.64.0 + '@oxfmt/binding-linux-arm64-gnu': 0.64.0 + '@oxfmt/binding-linux-arm64-musl': 0.64.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.64.0 + '@oxfmt/binding-linux-riscv64-musl': 0.64.0 + '@oxfmt/binding-linux-s390x-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-gnu': 0.64.0 + '@oxfmt/binding-linux-x64-musl': 0.64.0 + '@oxfmt/binding-openharmony-arm64': 0.64.0 + '@oxfmt/binding-win32-arm64-msvc': 0.64.0 + '@oxfmt/binding-win32-ia32-msvc': 0.64.0 + '@oxfmt/binding-win32-x64-msvc': 0.64.0 + + oxlint@1.79.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.78.0 - '@oxlint/binding-android-arm64': 1.78.0 - '@oxlint/binding-darwin-arm64': 1.78.0 - '@oxlint/binding-darwin-x64': 1.78.0 - '@oxlint/binding-freebsd-x64': 1.78.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.78.0 - '@oxlint/binding-linux-arm-musleabihf': 1.78.0 - '@oxlint/binding-linux-arm64-gnu': 1.78.0 - '@oxlint/binding-linux-arm64-musl': 1.78.0 - '@oxlint/binding-linux-ppc64-gnu': 1.78.0 - '@oxlint/binding-linux-riscv64-gnu': 1.78.0 - '@oxlint/binding-linux-riscv64-musl': 1.78.0 - '@oxlint/binding-linux-s390x-gnu': 1.78.0 - '@oxlint/binding-linux-x64-gnu': 1.78.0 - '@oxlint/binding-linux-x64-musl': 1.78.0 - '@oxlint/binding-openharmony-arm64': 1.78.0 - '@oxlint/binding-win32-arm64-msvc': 1.78.0 - '@oxlint/binding-win32-ia32-msvc': 1.78.0 - '@oxlint/binding-win32-x64-msvc': 1.78.0 + '@oxlint/binding-android-arm-eabi': 1.79.0 + '@oxlint/binding-android-arm64': 1.79.0 + '@oxlint/binding-darwin-arm64': 1.79.0 + '@oxlint/binding-darwin-x64': 1.79.0 + '@oxlint/binding-freebsd-x64': 1.79.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.79.0 + '@oxlint/binding-linux-arm-musleabihf': 1.79.0 + '@oxlint/binding-linux-arm64-gnu': 1.79.0 + '@oxlint/binding-linux-arm64-musl': 1.79.0 + '@oxlint/binding-linux-ppc64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-gnu': 1.79.0 + '@oxlint/binding-linux-riscv64-musl': 1.79.0 + '@oxlint/binding-linux-s390x-gnu': 1.79.0 + '@oxlint/binding-linux-x64-gnu': 1.79.0 + '@oxlint/binding-linux-x64-musl': 1.79.0 + '@oxlint/binding-openharmony-arm64': 1.79.0 + '@oxlint/binding-win32-arm64-msvc': 1.79.0 + '@oxlint/binding-win32-ia32-msvc': 1.79.0 + '@oxlint/binding-win32-x64-msvc': 1.79.0 picocolors@1.1.1: {}