From 63c746b6831fbc5a59d6e4df1a1a71fd5fcd5ab2 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Thu, 5 Feb 2026 15:08:57 -0700 Subject: [PATCH 1/3] Upgrade NodeJS dependencies to latest --- client/package.json | 2 +- package-lock.json | 18 +++++++++--------- server/package.json | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/client/package.json b/client/package.json index 4eb5522a..61f93541 100644 --- a/client/package.json +++ b/client/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", - "dotenv": "^17.2.3", + "dotenv": "^17.2.4", "js-yaml": "^4.1.1" }, "devDependencies": { diff --git a/package-lock.json b/package-lock.json index 880d31f3..3d5bb197 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", - "dotenv": "^17.2.3", + "dotenv": "^17.2.4", "js-yaml": "^4.1.1" }, "bin": { @@ -1322,9 +1322,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.0.tgz", - "integrity": "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.1.tgz", + "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2157,9 +2157,9 @@ } }, "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "version": "17.2.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.4.tgz", + "integrity": "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -4404,7 +4404,7 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "cors": "^2.8.6", - "dotenv": "^17.2.3", + "dotenv": "^17.2.4", "express": "^5.2.1", "js-yaml": "^4.1.1", "lowdb": "^7.0.1", @@ -4418,7 +4418,7 @@ "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/js-yaml": "^4.0.9", - "@types/node": "^25.2.0", + "@types/node": "^25.2.1", "@vitest/coverage-v8": "^4.0.18", "esbuild": "^0.27.2", "eslint": "^9.39.2", diff --git a/server/package.json b/server/package.json index 29363f64..007f88f3 100644 --- a/server/package.json +++ b/server/package.json @@ -29,7 +29,7 @@ "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "cors": "^2.8.6", - "dotenv": "^17.2.3", + "dotenv": "^17.2.4", "express": "^5.2.1", "js-yaml": "^4.1.1", "lowdb": "^7.0.1", @@ -40,7 +40,7 @@ "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/js-yaml": "^4.0.9", - "@types/node": "^25.2.0", + "@types/node": "^25.2.1", "@vitest/coverage-v8": "^4.0.18", "esbuild": "^0.27.2", "eslint": "^9.39.2", From e6841d999d8a9f885b5e2ef270fdfdec2f7f2163 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Thu, 5 Feb 2026 15:39:57 -0700 Subject: [PATCH 2/3] fix: track .bqrs test input files in before directories The integration tests for codeql_bqrs_interpret were failing in CI because the .bqrs files in before/ directories were being ignored by the gitignore rule (**/*.bqrs). These files exist locally but were not committed, causing the tests to fail with 'No .bqrs files found'. Fixed by: 1. Adding an exception to .gitignore for .bqrs files in before/ directories 2. Force-adding the 4 .bqrs test input files that were previously ignored --- client/integration-tests/.gitignore | 3 +++ .../basic_decode/before/results.bqrs | 19 ++++++++++++++++++ .../basic_info/before/results.bqrs | 19 ++++++++++++++++++ .../graphtext_format/before/results.bqrs | Bin 0 -> 16242 bytes .../sarif_format/before/results.bqrs | Bin 0 -> 16242 bytes 5 files changed, 41 insertions(+) create mode 100644 client/integration-tests/primitives/tools/codeql_bqrs_decode/basic_decode/before/results.bqrs create mode 100644 client/integration-tests/primitives/tools/codeql_bqrs_info/basic_info/before/results.bqrs create mode 100644 client/integration-tests/primitives/tools/codeql_bqrs_interpret/graphtext_format/before/results.bqrs create mode 100644 client/integration-tests/primitives/tools/codeql_bqrs_interpret/sarif_format/before/results.bqrs diff --git a/client/integration-tests/.gitignore b/client/integration-tests/.gitignore index e97ecbbc..c4c119a1 100644 --- a/client/integration-tests/.gitignore +++ b/client/integration-tests/.gitignore @@ -1,2 +1,5 @@ # Ignore binary query results files in integration tests **/*.bqrs + +# But allow .bqrs files in before directories (needed as test inputs) +!**/before/*.bqrs diff --git a/client/integration-tests/primitives/tools/codeql_bqrs_decode/basic_decode/before/results.bqrs b/client/integration-tests/primitives/tools/codeql_bqrs_decode/basic_decode/before/results.bqrs new file mode 100644 index 00000000..f2561159 --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_bqrs_decode/basic_decode/before/results.bqrs @@ -0,0 +1,19 @@ +# Sample BQRS file for testing codeql_bqrs_decode +# This is a mock BQRS file format for integration test purposes +# In practice, this would be a binary format generated by CodeQL query execution + +[BQRS Header] +Version: 1.0 +ResultSets: 1 + +[ResultSet 1] +Name: select +Columns: 3 +Column0: file (string) +Column1: line (int) +Column2: message (string) + +[Data] +"/example/file1.java",10,"Example result 1" +"/example/file2.java",25,"Example result 2" +"/example/file3.java",42,"Example result 3" \ No newline at end of file diff --git a/client/integration-tests/primitives/tools/codeql_bqrs_info/basic_info/before/results.bqrs b/client/integration-tests/primitives/tools/codeql_bqrs_info/basic_info/before/results.bqrs new file mode 100644 index 00000000..5901485e --- /dev/null +++ b/client/integration-tests/primitives/tools/codeql_bqrs_info/basic_info/before/results.bqrs @@ -0,0 +1,19 @@ +# Sample BQRS file for testing codeql_bqrs_info +# This is a mock BQRS file format for integration test purposes +# In practice, this would be a binary format generated by CodeQL query execution + +[BQRS Header] +Version: 1.0 +ResultSets: 1 + +[ResultSet 1] +Name: select +Columns: 3 +Column0: file (string) +Column1: line (int) +Column2: message (string) + +[Data] +"/example/file1.java",10,"Example result 1" +"/example/file2.java",25,"Example result 2" +"/example/file3.java",42,"Example result 3" \ No newline at end of file diff --git a/client/integration-tests/primitives/tools/codeql_bqrs_interpret/graphtext_format/before/results.bqrs b/client/integration-tests/primitives/tools/codeql_bqrs_interpret/graphtext_format/before/results.bqrs new file mode 100644 index 0000000000000000000000000000000000000000..e4e877406227164640bcd73ef619f0e2298f6ed2 GIT binary patch literal 16242 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 literal 0 HcmV?d00001 diff --git a/client/integration-tests/primitives/tools/codeql_bqrs_interpret/sarif_format/before/results.bqrs b/client/integration-tests/primitives/tools/codeql_bqrs_interpret/sarif_format/before/results.bqrs new file mode 100644 index 0000000000000000000000000000000000000000..e4e877406227164640bcd73ef619f0e2298f6ed2 GIT binary patch literal 16242 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 literal 0 HcmV?d00001 From 49b972adccd9169fefec5d9288f4697f77d9ee86 Mon Sep 17 00:00:00 2001 From: Nathan Randall Date: Thu, 5 Feb 2026 15:48:53 -0700 Subject: [PATCH 3/3] fix: replace fake BQRS test files with real binary files Replace mock ASCII text BQRS files with actual binary BQRS files from server/ql/javascript/examples/src/ExampleQuery1/ExampleQuery1.test.bqrs --- .../basic_decode/before/results.bqrs | Bin 485 -> 16152 bytes .../basic_info/before/results.bqrs | Bin 483 -> 16152 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/client/integration-tests/primitives/tools/codeql_bqrs_decode/basic_decode/before/results.bqrs b/client/integration-tests/primitives/tools/codeql_bqrs_decode/basic_decode/before/results.bqrs index f2561159291ddb1ffb3024851ef671d56f708266..6c7d29394f36f39aeddf4eec79a1d731be340cf8 100644 GIT binary patch literal 16152 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