From 38c52cc8d7f2e0e7de5c1c6e3721ae916782d79b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:24:06 +0000 Subject: [PATCH 1/7] Initial plan From 568670156681176693aea50b6351481b59a7e277 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:41:32 +0000 Subject: [PATCH 2/7] Upgrade Node.js from version 20 to version 22 --- .changeset/upgrade-nodejs-22.md | 14 + .github/workflows/build-test.yml | 2 +- docker/Dockerfile | 2 +- package.json | 4 +- packages/airnode-admin/docker/Dockerfile | 2 +- packages/airnode-admin/package.json | 2 +- packages/airnode-deployer/docker/Dockerfile | 2 +- packages/airnode-deployer/package.json | 4 +- .../src/infrastructure/index.ts | 2 +- .../terraform/aws/modules/function/main.tf | 2 +- .../terraform/gcp/modules/function/main.tf | 2 +- packages/airnode-examples/package.json | 2 +- packages/airnode-node/docker/Dockerfile | 2 +- packages/airnode-node/package.json | 2 +- packages/airnode-utilities/package.json | 2 +- .../src/caching/index.test.ts | 16 +- yarn.lock | 243 +++++++----------- 17 files changed, 137 insertions(+), 168 deletions(-) create mode 100644 .changeset/upgrade-nodejs-22.md diff --git a/.changeset/upgrade-nodejs-22.md b/.changeset/upgrade-nodejs-22.md new file mode 100644 index 0000000000..7a04ca139a --- /dev/null +++ b/.changeset/upgrade-nodejs-22.md @@ -0,0 +1,14 @@ +--- +"@api3/airnode-admin": minor +"@api3/airnode-deployer": minor +"@api3/airnode-node": minor +"@api3/airnode-adapter": minor +"@api3/airnode-utilities": minor +"@api3/airnode-validator": minor +"@api3/airnode-abi": minor +"@api3/airnode-protocol": minor +"@api3/airnode-operation": minor +"@api3/airnode-examples": minor +--- + +Upgrade Node.js from version 20 to version 22 diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 19987df1c9..7025da513a 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -9,7 +9,7 @@ on: env: DOCKER_BUILDKIT: 1 - TARGET_NODE_VERSION: '20.17.0' + TARGET_NODE_VERSION: '22.12.0' jobs: documentation: diff --git a/docker/Dockerfile b/docker/Dockerfile index 9ab140d77d..e555b6d0bc 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.17.0-alpine3.20 AS environment +FROM node:22.12.0-alpine3.21 AS environment ENV appDir="/app" \ buildDir="/build" \ diff --git a/package.json b/package.json index 080a78afab..e57dfa4121 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.1.0", "private": true, "engines": { - "node": "^20.17.0" + "node": "^22.12.0" }, "repository": { "type": "git", @@ -110,7 +110,7 @@ "@changesets/cli": "^2.27.1", "@octokit/core": "^5.2.0", "@types/libsodium-wrappers": "^0.7.14", - "@types/node": "^20.17.0", + "@types/node": "^22.10.0", "@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/parser": "^7.8.0", "@vercel/ncc": "^0.38.1", diff --git a/packages/airnode-admin/docker/Dockerfile b/packages/airnode-admin/docker/Dockerfile index c22b1e9488..c2208374ad 100644 --- a/packages/airnode-admin/docker/Dockerfile +++ b/packages/airnode-admin/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.17.0-alpine3.20 +FROM node:22.12.0-alpine3.21 ARG npmRegistryUrl=https://registry.npmjs.org/ ARG npmTag=latest diff --git a/packages/airnode-admin/package.json b/packages/airnode-admin/package.json index c9f843eca3..fc612ebfb4 100644 --- a/packages/airnode-admin/package.json +++ b/packages/airnode-admin/package.json @@ -35,7 +35,7 @@ }, "devDependencies": { "@types/lodash": "^4.17.0", - "@types/node": "^20.17.0", + "@types/node": "^22.10.0", "@types/yargs": "^17.0.32", "jest": "^29.7.0", "rimraf": "^6.0.1", diff --git a/packages/airnode-deployer/docker/Dockerfile b/packages/airnode-deployer/docker/Dockerfile index 56575dbe19..62bdb36bdd 100644 --- a/packages/airnode-deployer/docker/Dockerfile +++ b/packages/airnode-deployer/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.17.0-alpine3.20 +FROM node:22.12.0-alpine3.21 ARG npmRegistryUrl=https://registry.npmjs.org/ ARG npmTag=latest diff --git a/packages/airnode-deployer/package.json b/packages/airnode-deployer/package.json index 7548ed0b3d..fa6bab96dc 100644 --- a/packages/airnode-deployer/package.json +++ b/packages/airnode-deployer/package.json @@ -47,11 +47,11 @@ }, "devDependencies": { "@aws-sdk/util-stream-node": "^3.374.0", - "@google-cloud/functions-framework": "^3.4.0", + "@google-cloud/functions-framework": "^4.0.0", "@types/adm-zip": "^0.5.7", "@types/aws-lambda": "^8.10.137", "@types/lodash": "^4.17.0", - "@types/node": "^20.17.0", + "@types/node": "^22.10.0", "@types/yargs": "^17.0.32", "aws-sdk-client-mock": "^4.0.0", "aws-sdk-client-mock-jest": "^4.0.0", diff --git a/packages/airnode-deployer/src/infrastructure/index.ts b/packages/airnode-deployer/src/infrastructure/index.ts index dd19d67757..b900bf9e01 100644 --- a/packages/airnode-deployer/src/infrastructure/index.ts +++ b/packages/airnode-deployer/src/infrastructure/index.ts @@ -91,7 +91,7 @@ export async function runCommand(command: string, options: CommandOptions) { } commandSpinner.succeed(`Finished command '${command}' with options ${stringifiedOptions}`); - return goExec.data.stdout; + return goExec.data.stdout.toString(); } export type CommandArg = string | [string, string] | [string, string, string]; diff --git a/packages/airnode-deployer/terraform/aws/modules/function/main.tf b/packages/airnode-deployer/terraform/aws/modules/function/main.tf index 0a8b3e9ea8..a3a45ba173 100644 --- a/packages/airnode-deployer/terraform/aws/modules/function/main.tf +++ b/packages/airnode-deployer/terraform/aws/modules/function/main.tf @@ -43,7 +43,7 @@ resource "aws_lambda_function" "lambda" { function_name = var.name handler = var.handler memory_size = var.memory_size - runtime = "nodejs20.x" + runtime = "nodejs22.x" role = aws_iam_role.lambda_role.arn timeout = var.timeout reserved_concurrent_executions = var.reserved_concurrent_executions diff --git a/packages/airnode-deployer/terraform/gcp/modules/function/main.tf b/packages/airnode-deployer/terraform/gcp/modules/function/main.tf index cb014d8170..fcd34954fc 100644 --- a/packages/airnode-deployer/terraform/gcp/modules/function/main.tf +++ b/packages/airnode-deployer/terraform/gcp/modules/function/main.tf @@ -56,7 +56,7 @@ resource "google_storage_bucket_object" "function_zip" { resource "google_cloudfunctions_function" "function" { name = var.name - runtime = "nodejs20" + runtime = "nodejs22" available_memory_mb = var.memory_size source_archive_bucket = google_storage_bucket_object.function_zip.bucket diff --git a/packages/airnode-examples/package.json b/packages/airnode-examples/package.json index 5163e23a2d..cd927ef3ee 100644 --- a/packages/airnode-examples/package.json +++ b/packages/airnode-examples/package.json @@ -46,7 +46,7 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@types/jest": "^29.5.12", - "@types/node": "^20.17.0", + "@types/node": "^22.10.0", "@types/prompts": "^2.4.9", "chalk": "^4.1.2", "dotenv": "^16.4.7", diff --git a/packages/airnode-node/docker/Dockerfile b/packages/airnode-node/docker/Dockerfile index ea66a2efac..e16dd4bce7 100644 --- a/packages/airnode-node/docker/Dockerfile +++ b/packages/airnode-node/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.17.0-alpine3.20 +FROM node:22.12.0-alpine3.21 ARG npmRegistryUrl=https://registry.npmjs.org/ ARG npmTag=latest diff --git a/packages/airnode-node/package.json b/packages/airnode-node/package.json index 99f5bcbf46..2cf74a99f2 100644 --- a/packages/airnode-node/package.json +++ b/packages/airnode-node/package.json @@ -48,7 +48,7 @@ "@types/express": "^4.17.21", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.0", - "@types/node": "^20.17.0", + "@types/node": "^22.10.0", "@types/yargs": "^17.0.32", "aws-sdk-client-mock": "^4.0.0", "aws-sdk-client-mock-jest": "^4.0.0", diff --git a/packages/airnode-utilities/package.json b/packages/airnode-utilities/package.json index affcf4b8cb..9ef96a0a3d 100644 --- a/packages/airnode-utilities/package.json +++ b/packages/airnode-utilities/package.json @@ -26,7 +26,7 @@ "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.2.3", "@types/jest": "^29.5.12", - "@types/node": "^20.17.0", + "@types/node": "^22.10.0", "hardhat": "^2.22.18", "jest": "^29.7.0", "rimraf": "^6.0.1", diff --git a/packages/airnode-utilities/src/caching/index.test.ts b/packages/airnode-utilities/src/caching/index.test.ts index 5eb2dc4f9c..52acf38863 100644 --- a/packages/airnode-utilities/src/caching/index.test.ts +++ b/packages/airnode-utilities/src/caching/index.test.ts @@ -1,4 +1,4 @@ -import fs, { Dirent, PathLike, Stats } from 'fs'; +import fs, { PathLike, Stats } from 'fs'; import { caching, CACHE_BASE_PATH } from './index'; describe('caching utils', () => { @@ -35,8 +35,11 @@ describe('caching utils', () => { const files = ['1', '2', '3', '4', '5']; const filesStatData = files.map((file) => ({ file, mtimeMs: 1 })); - const readdirSyncSpy = jest.spyOn(fs, 'readdirSync'); - readdirSyncSpy.mockReturnValueOnce(files as unknown as Dirent[]); + const readdirSyncSpy = jest.spyOn(fs, 'readdirSync') as unknown as jest.SpyInstance< + string[], + [path: fs.PathLike, options?: (fs.ObjectEncodingOptions & { withFileTypes?: false }) | BufferEncoding | null] + >; + readdirSyncSpy.mockImplementationOnce(() => files); const statSyncSpy = jest.spyOn(fs, 'statSync'); @@ -59,8 +62,11 @@ describe('caching utils', () => { const files = ['1', '2', '3', '4', '5']; const filesStatData = files.map((file) => ({ file, mtimeMs: Date.now() })); - const readdirSyncSpy = jest.spyOn(fs, 'readdirSync'); - readdirSyncSpy.mockReturnValueOnce(files as unknown as Dirent[]); + const readdirSyncSpy = jest.spyOn(fs, 'readdirSync') as unknown as jest.SpyInstance< + string[], + [path: fs.PathLike, options?: (fs.ObjectEncodingOptions & { withFileTypes?: false }) | BufferEncoding | null] + >; + readdirSyncSpy.mockImplementationOnce(() => files); const statSyncSpy = jest.spyOn(fs, 'statSync'); diff --git a/yarn.lock b/yarn.lock index bff20fcb8c..662e618961 100644 --- a/yarn.lock +++ b/yarn.lock @@ -768,6 +768,15 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@^7.26.2": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" @@ -882,6 +891,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.27.1": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" @@ -1998,19 +2012,19 @@ optionalDependencies: "@trufflesuite/bigint-buffer" "1.1.9" -"@google-cloud/functions-framework@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@google-cloud/functions-framework/-/functions-framework-3.4.0.tgz#978ea9165592c746c58f4f4042ec9db7c0137e01" - integrity sha512-TAh4h8bspgWkZBgFEUfali5C1NQBgqEGIIKdBjrAeG3vaPtI4CjV4AzGNA6TrEBidLIXXqHb3naO2lI1eqT7+A== - dependencies: - "@types/express" "4.17.21" - body-parser "^1.18.3" - cloudevents "^8.0.0" - express "^4.16.4" - minimist "^1.2.7" +"@google-cloud/functions-framework@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/functions-framework/-/functions-framework-4.0.0.tgz#a21a8d1ef68e28e157304555214ec822fc5489db" + integrity sha512-CNcYrz0/hw35Oq0D9RipHUB8KzH4ixq7o12L//qoOg0TFYv4953KrzCo0L2VP++19P39RShKTftDKMFmQhCeEw== + dependencies: + "@types/express" "^4.17.21" + body-parser "1.20.3" + cloudevents "^8.0.2" + express "^4.21.2" + minimist "^1.2.8" on-finished "^2.3.0" - read-pkg-up "^7.0.1" - semver "^7.3.5" + read-package-up "^11.0.0" + semver "^7.7.1" "@google-cloud/paginator@^5.0.0": version "5.0.0" @@ -4245,7 +4259,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@4.17.21", "@types/express@^4.17.21": +"@types/express@^4.17.21": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -4427,19 +4441,19 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^20.17.0": - version "20.17.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.16.tgz#b33b0edc1bf925b27349e494b871ca4451fabab4" - integrity sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw== +"@types/node@^22.10.0": + version "22.19.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.19.1.tgz#1188f1ddc9f46b4cc3aec76749050b4e1f459b7b" + integrity sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ== dependencies: - undici-types "~6.19.2" + undici-types "~6.21.0" "@types/node@^8.0.0": version "8.10.66" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== -"@types/normalize-package-data@^2.4.0": +"@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.3": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== @@ -5796,24 +5810,6 @@ bodec@^0.1.0: resolved "https://registry.yarnpkg.com/bodec/-/bodec-0.1.0.tgz#bc851555430f23c9f7650a75ef64c6a94c3418cc" integrity sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ== -body-parser@1.20.2, body-parser@^1.18.3: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - body-parser@1.20.3: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" @@ -6397,10 +6393,10 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -cloudevents@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cloudevents/-/cloudevents-8.0.0.tgz#d5e3f9f56fc70aad5a97f3ea272559d8b7d74317" - integrity sha512-G1Z/r8QMFAsP+F1PuZSHzx1ocPy4vrdQMTHD3orjDaM5kccmPU6nMmpVrF07b53aaxcrLbORUmRepY/DgvdhVw== +cloudevents@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/cloudevents/-/cloudevents-8.0.3.tgz#f6d6be177e014aa78c4bac13e0b5a7170b389f9c" + integrity sha512-wTixKNjfLeyj9HQpESvLVVO4xgdqdvX4dTeg1IZ2SCunu/fxVzCamcIZneEyj31V82YolFCKwVeSkr8zResB0Q== dependencies: ajv "^8.11.0" ajv-formats "^2.1.1" @@ -6727,11 +6723,6 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - cookie@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" @@ -8292,43 +8283,6 @@ exponential-backoff@^3.1.1: resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== -express@^4.16.4: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - express@^4.21.2: version "4.21.2" resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" @@ -8514,19 +8468,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - finalhandler@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" @@ -8547,6 +8488,11 @@ find-replace@^3.0.0: dependencies: array-back "^3.0.1" +find-up-simple@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e" + integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ== + find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -9713,6 +9659,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +index-to-position@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/index-to-position/-/index-to-position-1.2.0.tgz#c800eb34dacf4dbf96b9b06c7eb78d5f704138b4" + integrity sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -11536,11 +11487,6 @@ meow@^8.1.2: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" @@ -11711,7 +11657,7 @@ minimist-options@4.1.0, minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -12764,6 +12710,15 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-json@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-8.3.0.tgz#88a195a2157025139a2317a4f2f9252b61304ed5" + integrity sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ== + dependencies: + "@babel/code-frame" "^7.26.2" + index-to-position "^1.1.0" + type-fest "^4.39.1" + parse-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" @@ -12834,11 +12789,6 @@ path-to-regexp@0.1.12: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - path-to-regexp@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" @@ -13222,13 +13172,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - qs@6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" @@ -13338,6 +13281,15 @@ read-package-json@^7.0.0: normalize-package-data "^6.0.0" npm-normalize-package-bin "^3.0.0" +read-package-up@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/read-package-up/-/read-package-up-11.0.0.tgz#71fb879fdaac0e16891e6e666df22de24a48d5ba" + integrity sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ== + dependencies: + find-up-simple "^1.0.0" + read-pkg "^9.0.0" + type-fest "^4.6.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -13374,6 +13326,17 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" +read-pkg@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-9.0.1.tgz#b1b81fb15104f5dbb121b6bbdee9bbc9739f569b" + integrity sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA== + dependencies: + "@types/normalize-package-data" "^2.4.3" + normalize-package-data "^6.0.0" + parse-json "^8.0.0" + type-fest "^4.6.0" + unicorn-magic "^0.1.0" + read-yaml-file@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" @@ -13902,6 +13865,11 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.2, semver@^7.3.4, semver@^7.3.5, semver@ dependencies: lru-cache "^6.0.0" +semver@^7.7.1: + version "7.7.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + semver@~7.5.0, semver@~7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -13909,25 +13877,6 @@ semver@~7.5.0, semver@~7.5.4: dependencies: lru-cache "^6.0.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - send@0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" @@ -13961,16 +13910,6 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - serve-static@1.16.2: version "1.16.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" @@ -15154,6 +15093,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^4.39.1, type-fest@^4.6.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -15267,10 +15211,10 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== undici@^5.14.0: version "5.28.4" @@ -15279,6 +15223,11 @@ undici@^5.14.0: dependencies: "@fastify/busboy" "^2.0.0" +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" From e623e00a1bf4577e06c0a8cc902d11eca49d69ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:04:00 +0000 Subject: [PATCH 3/7] Replace 'as unknown' with @ts-expect-error for type safety --- packages/airnode-utilities/src/caching/index.test.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/airnode-utilities/src/caching/index.test.ts b/packages/airnode-utilities/src/caching/index.test.ts index 52acf38863..e6d27371e3 100644 --- a/packages/airnode-utilities/src/caching/index.test.ts +++ b/packages/airnode-utilities/src/caching/index.test.ts @@ -35,10 +35,8 @@ describe('caching utils', () => { const files = ['1', '2', '3', '4', '5']; const filesStatData = files.map((file) => ({ file, mtimeMs: 1 })); - const readdirSyncSpy = jest.spyOn(fs, 'readdirSync') as unknown as jest.SpyInstance< - string[], - [path: fs.PathLike, options?: (fs.ObjectEncodingOptions & { withFileTypes?: false }) | BufferEncoding | null] - >; + const readdirSyncSpy = jest.spyOn(fs, 'readdirSync'); + // @ts-expect-error - Jest's spyOn infers the Dirent overload, but we need the string[] overload readdirSyncSpy.mockImplementationOnce(() => files); const statSyncSpy = jest.spyOn(fs, 'statSync'); @@ -62,10 +60,8 @@ describe('caching utils', () => { const files = ['1', '2', '3', '4', '5']; const filesStatData = files.map((file) => ({ file, mtimeMs: Date.now() })); - const readdirSyncSpy = jest.spyOn(fs, 'readdirSync') as unknown as jest.SpyInstance< - string[], - [path: fs.PathLike, options?: (fs.ObjectEncodingOptions & { withFileTypes?: false }) | BufferEncoding | null] - >; + const readdirSyncSpy = jest.spyOn(fs, 'readdirSync'); + // @ts-expect-error - Jest's spyOn infers the Dirent overload, but we need the string[] overload readdirSyncSpy.mockImplementationOnce(() => files); const statSyncSpy = jest.spyOn(fs, 'statSync'); From df579c0a6582c6ecb05f122efb6da4bf0446d3de Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:14:17 +0000 Subject: [PATCH 4/7] Update Node.js version from 22.12.0 to 22.18.0 Co-authored-by: dcroote <13989647+dcroote@users.noreply.github.com> --- .github/workflows/build-test.yml | 2 +- docker/Dockerfile | 2 +- package.json | 2 +- packages/airnode-admin/docker/Dockerfile | 2 +- packages/airnode-deployer/docker/Dockerfile | 2 +- packages/airnode-node/docker/Dockerfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 7025da513a..83843f1231 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -9,7 +9,7 @@ on: env: DOCKER_BUILDKIT: 1 - TARGET_NODE_VERSION: '22.12.0' + TARGET_NODE_VERSION: '22.18.0' jobs: documentation: diff --git a/docker/Dockerfile b/docker/Dockerfile index e555b6d0bc..2bae1b0ed0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.12.0-alpine3.21 AS environment +FROM node:22.18.0-alpine3.21 AS environment ENV appDir="/app" \ buildDir="/build" \ diff --git a/package.json b/package.json index e57dfa4121..c33b4dde3c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.1.0", "private": true, "engines": { - "node": "^22.12.0" + "node": "^22.18.0" }, "repository": { "type": "git", diff --git a/packages/airnode-admin/docker/Dockerfile b/packages/airnode-admin/docker/Dockerfile index c2208374ad..67c9c76910 100644 --- a/packages/airnode-admin/docker/Dockerfile +++ b/packages/airnode-admin/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.12.0-alpine3.21 +FROM node:22.18.0-alpine3.21 ARG npmRegistryUrl=https://registry.npmjs.org/ ARG npmTag=latest diff --git a/packages/airnode-deployer/docker/Dockerfile b/packages/airnode-deployer/docker/Dockerfile index 62bdb36bdd..6041fd948d 100644 --- a/packages/airnode-deployer/docker/Dockerfile +++ b/packages/airnode-deployer/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.12.0-alpine3.21 +FROM node:22.18.0-alpine3.21 ARG npmRegistryUrl=https://registry.npmjs.org/ ARG npmTag=latest diff --git a/packages/airnode-node/docker/Dockerfile b/packages/airnode-node/docker/Dockerfile index e16dd4bce7..4d9067fb33 100644 --- a/packages/airnode-node/docker/Dockerfile +++ b/packages/airnode-node/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.12.0-alpine3.21 +FROM node:22.18.0-alpine3.21 ARG npmRegistryUrl=https://registry.npmjs.org/ ARG npmTag=latest From 8a645a4320a0c2f37208f905b96c3e8843fbe6e3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 12 Nov 2025 01:30:12 +0000 Subject: [PATCH 5/7] Fix type incompatibility without using @ts-expect-error or as unknown --- .../src/caching/index.test.ts | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/airnode-utilities/src/caching/index.test.ts b/packages/airnode-utilities/src/caching/index.test.ts index e6d27371e3..04ec6f9314 100644 --- a/packages/airnode-utilities/src/caching/index.test.ts +++ b/packages/airnode-utilities/src/caching/index.test.ts @@ -36,15 +36,17 @@ describe('caching utils', () => { const filesStatData = files.map((file) => ({ file, mtimeMs: 1 })); const readdirSyncSpy = jest.spyOn(fs, 'readdirSync'); - // @ts-expect-error - Jest's spyOn infers the Dirent overload, but we need the string[] overload - readdirSyncSpy.mockImplementationOnce(() => files); + readdirSyncSpy.mockImplementation( + ((_path: fs.PathLike, _options?: BufferEncoding | fs.ObjectEncodingOptions | null) => + files) as typeof fs.readdirSync + ); const statSyncSpy = jest.spyOn(fs, 'statSync'); - statSyncSpy.mockImplementation( - (file: PathLike) => - filesStatData.find((statData) => file.toString().indexOf(statData.file) > -1)! as unknown as Stats - ); + statSyncSpy.mockImplementation((file: PathLike) => { + const fileData = filesStatData.find((statData) => file.toString().indexOf(statData.file) > -1)!; + return { mtimeMs: fileData.mtimeMs } as Stats; + }); const rmSyncSpy = jest.spyOn(fs, 'rmSync'); rmSyncSpy.mockImplementation(() => {}); @@ -61,15 +63,17 @@ describe('caching utils', () => { const filesStatData = files.map((file) => ({ file, mtimeMs: Date.now() })); const readdirSyncSpy = jest.spyOn(fs, 'readdirSync'); - // @ts-expect-error - Jest's spyOn infers the Dirent overload, but we need the string[] overload - readdirSyncSpy.mockImplementationOnce(() => files); + readdirSyncSpy.mockImplementation( + ((_path: fs.PathLike, _options?: BufferEncoding | fs.ObjectEncodingOptions | null) => + files) as typeof fs.readdirSync + ); const statSyncSpy = jest.spyOn(fs, 'statSync'); - statSyncSpy.mockImplementation( - (file: PathLike) => - filesStatData.find((statData) => file.toString().indexOf(statData.file) > -1)! as unknown as Stats - ); + statSyncSpy.mockImplementation((file: PathLike) => { + const fileData = filesStatData.find((statData) => file.toString().indexOf(statData.file) > -1)!; + return { mtimeMs: fileData.mtimeMs } as Stats; + }); const rmSyncSpy = jest.spyOn(fs, 'rmSync'); rmSyncSpy.mockImplementation(() => {}); From 1b032fb9c62eec61a522790a182e62730b69128b Mon Sep 17 00:00:00 2001 From: Derek Croote Date: Tue, 11 Nov 2025 22:25:56 -0800 Subject: [PATCH 6/7] Fix failing airnode-deployer test --- packages/airnode-deployer/src/infrastructure/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/airnode-deployer/src/infrastructure/index.test.ts b/packages/airnode-deployer/src/infrastructure/index.test.ts index 56174abf71..b14fb919fa 100644 --- a/packages/airnode-deployer/src/infrastructure/index.test.ts +++ b/packages/airnode-deployer/src/infrastructure/index.test.ts @@ -908,7 +908,7 @@ describe('removeAirnode', () => { beforeEach(() => { mutableDirectoryStructure = cloneDeep(mockBucketDirectoryStructure); - exec.mockImplementation(() => ({})); + exec.mockImplementation(() => ({ stdout: '' })); awsGetAirnodeBucketSpy = jest.spyOn(aws, 'getAirnodeBucket').mockResolvedValue(bucket); awsGetBucketDirectoryStructureSpy = jest .spyOn(aws, 'getBucketDirectoryStructure') From 2b5ac303cd100ff1a12fd7fded827aba77c5223f Mon Sep 17 00:00:00 2001 From: Derek Croote Date: Tue, 11 Nov 2025 22:33:08 -0800 Subject: [PATCH 7/7] Bump node version in protocol-verify CI workflow --- .github/workflows/codeql-analysis.yml | 1 - .github/workflows/protocol-verify.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a348d7f36d..1ea332f056 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -15,7 +15,6 @@ on: push: branches: - master - types: [opened, synchronize, reopened] pull_request: # The branches below must be a subset of the branches above branches: diff --git a/.github/workflows/protocol-verify.yml b/.github/workflows/protocol-verify.yml index 9d3b158df4..90be828ed9 100644 --- a/.github/workflows/protocol-verify.yml +++ b/.github/workflows/protocol-verify.yml @@ -11,7 +11,7 @@ on: env: DOCKER_BUILDKIT: 1 - TARGET_NODE_VERSION: '20.17.0' + TARGET_NODE_VERSION: '22.18.0' jobs: pre-build: