From 9f2b69f01d832b090e593910a478197d7198132b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:23:15 +0000 Subject: [PATCH 1/2] build(deps-dev): bump @biomejs/biome from 2.5.3 to 2.5.4 Bumps [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) from 2.5.3 to 2.5.4. - [Release notes](https://github.com/biomejs/biome/releases) - [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md) - [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.4/packages/@biomejs/biome) --- updated-dependencies: - dependency-name: "@biomejs/biome" dependency-version: 2.5.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 70 +++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index b07fb97f1..3873050a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -165,9 +165,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.3.tgz", - "integrity": "sha512-MrJswFdei9EfDwwUy2tQrPDpK0AO+RmMFvBoaaJ6ayBc3sUbHdCE+XG5N8vp+5So41ZupZJQm0roHFFhMGVD7A==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.4.tgz", + "integrity": "sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -181,20 +181,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.5.3", - "@biomejs/cli-darwin-x64": "2.5.3", - "@biomejs/cli-linux-arm64": "2.5.3", - "@biomejs/cli-linux-arm64-musl": "2.5.3", - "@biomejs/cli-linux-x64": "2.5.3", - "@biomejs/cli-linux-x64-musl": "2.5.3", - "@biomejs/cli-win32-arm64": "2.5.3", - "@biomejs/cli-win32-x64": "2.5.3" + "@biomejs/cli-darwin-arm64": "2.5.4", + "@biomejs/cli-darwin-x64": "2.5.4", + "@biomejs/cli-linux-arm64": "2.5.4", + "@biomejs/cli-linux-arm64-musl": "2.5.4", + "@biomejs/cli-linux-x64": "2.5.4", + "@biomejs/cli-linux-x64-musl": "2.5.4", + "@biomejs/cli-win32-arm64": "2.5.4", + "@biomejs/cli-win32-x64": "2.5.4" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.3.tgz", - "integrity": "sha512-QhYP9muVQ0nUO5zztFuPbEwi4+94sJWVjaZds9aMi1l/KNZBiUjdiSUrGHsTaMGDXrYl+r4AS2sUKfgH3w+V3g==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.4.tgz", + "integrity": "sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==", "cpu": [ "arm64" ], @@ -209,9 +209,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.3.tgz", - "integrity": "sha512-NC1Ss13UaW7QZX+y8j44bF7AP0jSJdBl6iRhe0MAkvaSqZy+mWg3GaXsrb+eSoHoGDBtaXWEbMVV0iVN2cZ7cQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.4.tgz", + "integrity": "sha512-D32P5HkU2Y6PySuC/WsVDTOgsDwVFmujzhhhOQjajtATpVWFDXuVd3oRbsWNSEA+aaFzyzZm22szsyydBYlSyQ==", "cpu": [ "x64" ], @@ -226,9 +226,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.3.tgz", - "integrity": "sha512-ksx1KWeyYW18ILL04msF/J4ZBtBDN33znYK8Z/aNv/vlBVxL9/g3mGP+omgHJKy4+KWbK87vcmmpmurfNjSgiA==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.4.tgz", + "integrity": "sha512-pSEfW7B8kTsXUjUxC1xVVK+y85Ht3C5XxZ9gclmC7/3Ku9Vqz8jmI7k0p/BNIjQ6t4sFERI2sFeH73ybiZl6YQ==", "cpu": [ "arm64" ], @@ -246,9 +246,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.3.tgz", - "integrity": "sha512-fccix0w6xp6csCXgxeC0dU/3ecgRQal0y+cv2SP9ajNlhe7Yrk2Ug7UDe2j9AT9ZDYitkXpvUKgZjjuoYeP4Vg==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.4.tgz", + "integrity": "sha512-Rpm5/AT1m+DlJmUoYvS4/vXc+0tXJPJ2NQz25TGPyHVF5JrWy75PE0GH6kVxsKtQDuCH4OgzquZq0R4kj/wCVg==", "cpu": [ "arm64" ], @@ -266,9 +266,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.3.tgz", - "integrity": "sha512-yMkJtilsgvILDcVkh187aVLTb64xYsrxYajx5kym+r1ULkO5HUOfu9AYKLGQbOVLwJtT2utNw7hhFNg+17mUYA==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.4.tgz", + "integrity": "sha512-FNxojWJkL7EajAuzBgoLe0T2G0y112M4lBrDIFl/DomFTx8yqenYOIdsRLNXvOvBBofE8hJi85LjzLmBDpY7/Q==", "cpu": [ "x64" ], @@ -286,9 +286,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.3.tgz", - "integrity": "sha512-O/yU9YKRUiHhmcjF2f38PSjseVk3G4VLWYc0G2HWpzdBVREV6G8IGWIVEFf7MFPfWIzNUIvPsEjeAZQIOgnLcQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.4.tgz", + "integrity": "sha512-aby/PohmmgbShcHqFsZVzG8H6D98+P+A6xRWRrQcLW1pCjabcov5UUlke4UqNQBYTkDQav+jB4zyyDDeKB2GaA==", "cpu": [ "x64" ], @@ -306,9 +306,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.3.tgz", - "integrity": "sha512-cX5z+GYwRcqEok0AH3KSfQGgqYd0Nomfp6Fbe1uiTtELE38hdH2k842wQ9wLNaF/JJ7r4rjJQ4VR+ce+fRmQbw==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.4.tgz", + "integrity": "sha512-emoXexPZIPAZkz2RKmA95WJUqK3I5MJNYtwEbL5ESciRzhmFMMyekDhNG8hpeOaK+ZGRDxAU4wvGuA5IHQ0h0w==", "cpu": [ "arm64" ], @@ -323,9 +323,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.3.tgz", - "integrity": "sha512-ExSaJWi4/u6+GXCszlSKpWSjKNbDseAYqqkCznsCsZ/4uidZ/BEqsCc5/3ctlq6dfIubdIIRSVLC/PG9xPl70Q==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.4.tgz", + "integrity": "sha512-U1jaluLw1qQc2Tx7/CeSoL9N5XcqIH+GWjpUAy1ouB5nVjSCMNO+NNHdY3RAs8zxNurLWAdj6pehQdCA2zyU+Q==", "cpu": [ "x64" ], From 6ebd144997de63352ebf30e496b166102d37e2ae Mon Sep 17 00:00:00 2001 From: Carlos Almeida Date: Sun, 19 Jul 2026 18:40:39 -0600 Subject: [PATCH 2/2] fix: adapt tests to biome 2.5.4 formatting rules (#2125) Biome 2.5.4 changed how curried test.each/it.each/describe.each calls are formatted, reformatting three existing test files. Also suppress a useImportType false positive in the #1833 regression fixture, which intentionally uses a plain (non-`type`) import to test that codegraph still credits type-only consumers of a plain import. --- .../issue-1833-plain-type-import/consumer.ts | 1 + ...778-reflection-dynamic-kind-parity.test.ts | 160 +++++++++--------- tests/unit/config.test.ts | 23 ++- tests/unit/hook-track-edits-worktree.test.ts | 9 +- 4 files changed, 100 insertions(+), 93 deletions(-) diff --git a/tests/fixtures/issue-1833-plain-type-import/consumer.ts b/tests/fixtures/issue-1833-plain-type-import/consumer.ts index dca8628f9..fe8a659ca 100644 --- a/tests/fixtures/issue-1833-plain-type-import/consumer.ts +++ b/tests/fixtures/issue-1833-plain-type-import/consumer.ts @@ -3,6 +3,7 @@ // importing type-level declarations this way; codegraph must still credit // Config/Mode as consumed since interfaces/type aliases are erased before // runtime and can never receive a `calls` edge (#1833). +// biome-ignore lint/style/useImportType: intentionally a plain (non-`type`) import — this fixture regression-tests #1833's plain-import-of-type-only-symbols case import { Config, Mode } from './types.js'; export function useConfig(cfg: Config): Mode { diff --git a/tests/integration/issue-1778-reflection-dynamic-kind-parity.test.ts b/tests/integration/issue-1778-reflection-dynamic-kind-parity.test.ts index eb0fdca92..1ae4f8e6b 100644 --- a/tests/integration/issue-1778-reflection-dynamic-kind-parity.test.ts +++ b/tests/integration/issue-1778-reflection-dynamic-kind-parity.test.ts @@ -106,85 +106,89 @@ async function buildAndReadEdgesTo( } describe('#1778: .call/.apply/.bind reflection tagging — engine parity', () => { - it.each( - ENGINES, - )('%s: greet.call(ctx) with NO prior direct call resolves dyn=1 (minimal repro, no dedup collision)', async (engine) => { - // Exactly the issue's own minimal repro: no direct call to `greet` exists - // anywhere, so the dedup-collision path in emitDirectCallEdgesForCall never - // fires — this is the plain, uncomplicated case the #1693 fix wrongly broke. - const edges = await buildAndReadEdgesTo( - { - 'index.js': [ - 'export function greet(name) { return name; }', - "export function runCall(ctx) { return greet.call(ctx, 'world'); }", - '', - ].join('\n'), - }, - engine, - 'greet', - ); - expect(edges).toHaveLength(1); - expect(edges[0]).toMatchObject({ source: 'runCall', target: 'greet', confidence: 1 }); - expect(edges[0].dynamic).toBe(1); - }); + it.each(ENGINES)( + '%s: greet.call(ctx) with NO prior direct call resolves dyn=1 (minimal repro, no dedup collision)', + async (engine) => { + // Exactly the issue's own minimal repro: no direct call to `greet` exists + // anywhere, so the dedup-collision path in emitDirectCallEdgesForCall never + // fires — this is the plain, uncomplicated case the #1693 fix wrongly broke. + const edges = await buildAndReadEdgesTo( + { + 'index.js': [ + 'export function greet(name) { return name; }', + "export function runCall(ctx) { return greet.call(ctx, 'world'); }", + '', + ].join('\n'), + }, + engine, + 'greet', + ); + expect(edges).toHaveLength(1); + expect(edges[0]).toMatchObject({ source: 'runCall', target: 'greet', confidence: 1 }); + expect(edges[0].dynamic).toBe(1); + }, + ); - it.each( - ENGINES, - )('%s: direct f() followed by f.call({}) to the same target dedups to a single dyn=0 edge (#1687)', async (engine) => { - // The original #1687 scenario: a direct call and a reflection-style call to - // the SAME target from the SAME caller/scope. Must collapse to ONE edge - // (no double-edge emission) and that edge must be dyn=0, matching native's - // plain first-recorded-wins dedup (the direct call is recorded first, in - // true source order, and the later reflection call must not flip it). - const edges = await buildAndReadEdgesTo( - { 'index.js': ['function f() {}', 'f();', 'f.call({});', ''].join('\n') }, - engine, - 'f', - ); - expect(edges).toHaveLength(1); - expect(edges[0].dynamic).toBe(0); - }); + it.each(ENGINES)( + '%s: direct f() followed by f.call({}) to the same target dedups to a single dyn=0 edge (#1687)', + async (engine) => { + // The original #1687 scenario: a direct call and a reflection-style call to + // the SAME target from the SAME caller/scope. Must collapse to ONE edge + // (no double-edge emission) and that edge must be dyn=0, matching native's + // plain first-recorded-wins dedup (the direct call is recorded first, in + // true source order, and the later reflection call must not flip it). + const edges = await buildAndReadEdgesTo( + { 'index.js': ['function f() {}', 'f();', 'f.call({});', ''].join('\n') }, + engine, + 'f', + ); + expect(edges).toHaveLength(1); + expect(edges[0].dynamic).toBe(0); + }, + ); - it.each( - ENGINES, - )('%s: f.call({}) followed by direct f() to the same target dedups to a single dyn=1 edge (reverse-order sanity)', async (engine) => { - // Mirror of the #1687 fixture with the two call sites swapped: the - // reflection call is now genuinely first in source order, so it should win - // the dedup and the later direct call must not downgrade it. - const edges = await buildAndReadEdgesTo( - { 'index.js': ['function f() {}', 'f.call({});', 'f();', ''].join('\n') }, - engine, - 'f', - ); - expect(edges).toHaveLength(1); - expect(edges[0].dynamic).toBe(1); - }); + it.each(ENGINES)( + '%s: f.call({}) followed by direct f() to the same target dedups to a single dyn=1 edge (reverse-order sanity)', + async (engine) => { + // Mirror of the #1687 fixture with the two call sites swapped: the + // reflection call is now genuinely first in source order, so it should win + // the dedup and the later direct call must not downgrade it. + const edges = await buildAndReadEdgesTo( + { 'index.js': ['function f() {}', 'f.call({});', 'f();', ''].join('\n') }, + engine, + 'f', + ); + expect(edges).toHaveLength(1); + expect(edges[0].dynamic).toBe(1); + }, + ); - it.each( - ENGINES, - )('%s: bare decorator before call-expression decorator still upgrades to dyn=1 (#1683 regression guard)', async (engine) => { - // Regression guard for the ORIGINAL motivating case of the dynZeroEdgeRows - // upgrade path: the WASM query path collects `@Log()` (dyn=0) before the - // bare `@Log` (dyn=1) despite `@Log` appearing earlier in the source — the - // line-order comparison introduced by #1778's fix must still upgrade this - // to dyn=1, exactly as the pre-#1778 unconditional-upgrade logic did. - const edges = await buildAndReadEdgesTo( - { - 'index.ts': [ - 'export function Log(target: unknown): void {}', - '', - '@Log', - 'export class UserController {}', - '', - '@Log()', - 'export class OrderController {}', - '', - ].join('\n'), - }, - engine, - 'Log', - ); - expect(edges).toHaveLength(1); - expect(edges[0].dynamic).toBe(1); - }); + it.each(ENGINES)( + '%s: bare decorator before call-expression decorator still upgrades to dyn=1 (#1683 regression guard)', + async (engine) => { + // Regression guard for the ORIGINAL motivating case of the dynZeroEdgeRows + // upgrade path: the WASM query path collects `@Log()` (dyn=0) before the + // bare `@Log` (dyn=1) despite `@Log` appearing earlier in the source — the + // line-order comparison introduced by #1778's fix must still upgrade this + // to dyn=1, exactly as the pre-#1778 unconditional-upgrade logic did. + const edges = await buildAndReadEdgesTo( + { + 'index.ts': [ + 'export function Log(target: unknown): void {}', + '', + '@Log', + 'export class UserController {}', + '', + '@Log()', + 'export class OrderController {}', + '', + ].join('\n'), + }, + engine, + 'Log', + ); + expect(edges).toHaveLength(1); + expect(edges[0].dynamic).toBe(1); + }, + ); }); diff --git a/tests/unit/config.test.ts b/tests/unit/config.test.ts index 71cb22b4f..ee05001a4 100644 --- a/tests/unit/config.test.ts +++ b/tests/unit/config.test.ts @@ -440,18 +440,17 @@ describe('applyEnvOverrides', () => { expect(config.llm.provider).toBe('openai'); }); - it.each([ - 'native', - 'wasm', - 'auto', - ] as const)('overrides build.engine from env when set to "%s"', (engine) => { - process.env.CODEGRAPH_ENGINE = engine; - const config = applyEnvOverrides({ - llm: { provider: null, model: null, baseUrl: null, apiKey: null }, - build: { engine: 'auto', fastSkipDiag: false }, - }); - expect(config.build.engine).toBe(engine); - }); + it.each(['native', 'wasm', 'auto'] as const)( + 'overrides build.engine from env when set to "%s"', + (engine) => { + process.env.CODEGRAPH_ENGINE = engine; + const config = applyEnvOverrides({ + llm: { provider: null, model: null, baseUrl: null, apiKey: null }, + build: { engine: 'auto', fastSkipDiag: false }, + }); + expect(config.build.engine).toBe(engine); + }, + ); it('warns and falls back to "auto" when CODEGRAPH_ENGINE is invalid', () => { process.env.CODEGRAPH_ENGINE = 'natve'; diff --git a/tests/unit/hook-track-edits-worktree.test.ts b/tests/unit/hook-track-edits-worktree.test.ts index 123f76fb2..b7e70f15d 100644 --- a/tests/unit/hook-track-edits-worktree.test.ts +++ b/tests/unit/hook-track-edits-worktree.test.ts @@ -164,7 +164,10 @@ describe('track-edits.sh Windows path normalization', () => { it.each([ ['live hook', HOOK_PATH], ['docs example', DOCS_HOOK_PATH], - ])('%s: leaves a POSIX path with a literal backslash in the filename untouched', (_label, hookPath) => { - expect(normalize(hookPath, '/tmp/proj/weird\\name.ts')).toBe('/tmp/proj/weird\\name.ts'); - }); + ])( + '%s: leaves a POSIX path with a literal backslash in the filename untouched', + (_label, hookPath) => { + expect(normalize(hookPath, '/tmp/proj/weird\\name.ts')).toBe('/tmp/proj/weird\\name.ts'); + }, + ); });