From b18969ac8034222f342de876766d14f516e91e55 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Thu, 16 Jul 2026 22:36:05 +0000 Subject: [PATCH 1/3] Require @maxmind/geoip2-node 7.1.0 for residential data The 7.1.0 release adds the residential property to the AnonymizerRecord type, which is needed to support the new anonymizer.residential data added in this release. Co-Authored-By: Claude Opus 4.8 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index c45484f3..132e781f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "9.0.0", "license": "Apache-2.0", "dependencies": { - "@maxmind/geoip2-node": "^7.0.0" + "@maxmind/geoip2-node": "^7.1.0" }, "devDependencies": { "@eslint/js": "^10.0.1", @@ -1260,9 +1260,9 @@ } }, "node_modules/@maxmind/geoip2-node": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-7.0.0.tgz", - "integrity": "sha512-TUuCUXP93+cCkHmSy42vLwKquMsr20vrhcDBqqEPrpfdFFw16sL6hcmEuAyHbs2S+IVgouqsF37wnCdtbi+i7A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-7.1.0.tgz", + "integrity": "sha512-tOXoITRIPLQdUPf9JEU5ZRsFjO1guKba7kkhoUnZUsDGpS6gX3xcJLQBQgeW4nXL6Ko0LACdbL1aAGY5sgPMmg==", "license": "Apache-2.0", "dependencies": { "maxmind": "^5.0.0" diff --git a/package.json b/package.json index 25ec51f7..2ccc6f5d 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,6 @@ "prepublishOnly": "if [ -z \"$GITHUB_ACTIONS\" ]; then echo 'Manual publishing is disabled. Use ./dev-bin/release.sh instead.' && exit 1; fi" }, "dependencies": { - "@maxmind/geoip2-node": "^7.0.0" + "@maxmind/geoip2-node": "^7.1.0" } } From 17e46b227642b7e93b98243be027df98523c582a Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Fri, 10 Jul 2026 21:02:55 +0000 Subject: [PATCH 2/3] Add residential proxy data to anonymizer object This surfaces the new residential sub-object nested within the anonymizer object in the minFraud Insights and Factors ip_address response. The IpAddress model reuses GeoIP2-node's AnonymizerRecord type directly and the response parsing recursively camelCases nested objects, so the new field flows through automatically once the @maxmind/geoip2-node dependency is updated to a version that types it. This commit updates the fixture and test coverage and documents the change, along with the future dependency bump, in the changelog. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 15 +++++++++++++++ fixtures/insights.json | 7 ++++++- src/response/models/insights.spec.ts | 5 +++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65b697c7..dea30f40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,21 @@ CHANGELOG ========= +9.1.0 (unreleased) +------------------ + +* A new `residential` property has been added to the `anonymizer` object on + `IpAddress`. This contains residential proxy data for the network and is + available from the minFraud Insights and Factors web services only. It may + be populated even when no other `anonymizer` properties are set. The + `residential` object includes the following properties: + * `confidence`: A score (1-99) representing MaxMind's confidence that the + network is part of an actively used residential proxy + * `networkLastSeen`: The last day (YYYY-MM-DD) the network was sighted in + our analysis of residential proxies + * `providerName`: The name of the residential proxy provider associated + with the network + 9.0.0 (2026-06-29) ------------------ diff --git a/fixtures/insights.json b/fixtures/insights.json index 8f2ef903..2e0f8935 100644 --- a/fixtures/insights.json +++ b/fixtures/insights.json @@ -34,7 +34,12 @@ "is_residential_proxy": false, "is_tor_exit_node": true, "network_last_seen": "2025-01-15", - "provider_name": "TestVPN" + "provider_name": "TestVPN", + "residential": { + "confidence": 82, + "network_last_seen": "2026-05-11", + "provider_name": "quickshift" + } }, "city": { "confidence": 25, diff --git a/src/response/models/insights.spec.ts b/src/response/models/insights.spec.ts index 65718fca..b4ea2918 100644 --- a/src/response/models/insights.spec.ts +++ b/src/response/models/insights.spec.ts @@ -76,6 +76,11 @@ describe('Insights()', () => { isTorExitNode: true, networkLastSeen: '2025-01-15', providerName: 'TestVPN', + residential: { + confidence: 82, + networkLastSeen: '2026-05-11', + providerName: 'quickshift', + }, }); }); From 1344f1914704bba8a1ba0a94c43f149e23e78dd4 Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Thu, 16 Jul 2026 22:38:32 +0000 Subject: [PATCH 3/3] Update mise tools Bumps node (26.1.0 -> 26.5.0) and lychee (0.23.0 -> 0.24.2) via `mise up`. Lychee 0.24.0 replaced the boolean `include_fragments` config option with an enum (none/anchor-only/text-only/full); migrate lychee.toml to `include_fragments = "full"` so both anchor fragments (`#section`) and text fragments (`#:~:text=example`) are checked. Co-Authored-By: Claude Opus 4.8 --- lychee.toml | 6 +++-- mise.lock | 67 +++++++++++++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/lychee.toml b/lychee.toml index 13a88f2c..662e395f 100644 --- a/lychee.toml +++ b/lychee.toml @@ -4,8 +4,10 @@ # Run locally with: # lychee './**/*.md' './src/**/*.ts' './package.json' -# Include URL fragments in checks -include_fragments = true +# Check URL fragments in links. Lychee 0.24.0 replaced the boolean form with an +# enum (none/anchor-only/text-only/full); "full" checks both anchor fragments +# (e.g. `#section`) and text fragments (e.g. `#:~:text=example`). +include_fragments = "full" # Don't allow any redirects, so links that have moved are surfaced and updated # to their canonical destination. diff --git a/mise.lock b/mise.lock index 4bc8f1c7..ecddc23c 100644 --- a/mise.lock +++ b/mise.lock @@ -1,61 +1,72 @@ # @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html [[tools.lychee]] -version = "0.23.0" +version = "0.24.2" backend = "aqua:lycheeverse/lychee" [tools.lychee."platforms.linux-arm64"] -checksum = "sha256:97eb93b02a7d78a752fc33e5b0983439ccaadbf3db952b68a0a4401acd92e6e0" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-aarch64-unknown-linux-gnu.tar.gz" +checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602" [tools.lychee."platforms.linux-arm64-musl"] -checksum = "sha256:97eb93b02a7d78a752fc33e5b0983439ccaadbf3db952b68a0a4401acd92e6e0" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-aarch64-unknown-linux-gnu.tar.gz" +checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602" [tools.lychee."platforms.linux-x64"] -checksum = "sha256:5538440d2c69a45a0a09983271e5dee0c2fe7137d8035d25b2632e10a66a090a" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-unknown-linux-musl.tar.gz" +checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959271" [tools.lychee."platforms.linux-x64-musl"] -checksum = "sha256:5538440d2c69a45a0a09983271e5dee0c2fe7137d8035d25b2632e10a66a090a" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-unknown-linux-musl.tar.gz" +checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959271" [tools.lychee."platforms.macos-arm64"] -checksum = "sha256:4c8034900e11083b68ac6f6582c377ff1f704e268991999e09d717973e493e7f" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-arm64-macos.dmg" +checksum = "sha256:c9d3740ea2d891854d37116c9fba840f37b6e7c89d330e7db84ac333631c4977" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409957951" + +[tools.lychee."platforms.macos-x64"] +checksum = "sha256:887503a9cff667d322b8d0892b40bf49976eb9507af8483220a3706cdad55978" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409957687" [tools.lychee."platforms.windows-x64"] -checksum = "sha256:0fda7ff0a60c0250939fc25361c2d4e6e7853c31c996733fdd5a1dd760bcb824" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-windows.exe" +checksum = "sha256:32975d1493ee1a975d6bb41e4fb56fe419cb442ded628bb772ba2e614acfacad" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959491" [[tools.node]] -version = "26.1.0" +version = "26.5.0" backend = "core:node" [tools.node."platforms.linux-arm64"] -checksum = "sha256:fcb4c339eef70c909cae72091008a6497278e2d0fcd221c0653068cf4ea4f0c7" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-linux-arm64.tar.gz" +checksum = "sha256:308e5fe89a82461ba5a6cf15ff5221b2cdbd7ae87600aa72bb3c3fbdc66412d1" +url = "https://nodejs.org/dist/v26.5.0/node-v26.5.0-linux-arm64.tar.gz" [tools.node."platforms.linux-arm64-musl"] -checksum = "sha256:fcb4c339eef70c909cae72091008a6497278e2d0fcd221c0653068cf4ea4f0c7" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-linux-arm64.tar.gz" +checksum = "sha256:1ab31aef6561191693f366cacd75bbcefa0301e49a18bc05554c21893bbdb490" +url = "https://unofficial-builds.nodejs.org/download/release/v26.5.0/node-v26.5.0-linux-arm64-musl.tar.gz" [tools.node."platforms.linux-x64"] -checksum = "sha256:62d555c329e05e3625109f2e3a8b5195b368d5ef38266292469d32f63cd98ffd" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-linux-x64.tar.gz" +checksum = "sha256:22b5f47ad6ae78837e4c2b846019965ce1a06ba143de176102294a1bf44fc677" +url = "https://nodejs.org/dist/v26.5.0/node-v26.5.0-linux-x64.tar.gz" [tools.node."platforms.linux-x64-musl"] -checksum = "sha256:62d555c329e05e3625109f2e3a8b5195b368d5ef38266292469d32f63cd98ffd" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-linux-x64.tar.gz" +checksum = "sha256:00f1398411a4216c5a6ecaad3b825a0da5ec00e79ee8c173ab65a094d97b9ad8" +url = "https://unofficial-builds.nodejs.org/download/release/v26.5.0/node-v26.5.0-linux-x64-musl.tar.gz" [tools.node."platforms.macos-arm64"] -checksum = "sha256:91063f665c2f5d6e69e4f8fcb66d3d476bc2785ace82267274bf4da789985ceb" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-darwin-arm64.tar.gz" +checksum = "sha256:ee920559aaa2391569cff4d737e3b83963430e3a14dedd91bfe0ff53171b5af9" +url = "https://nodejs.org/dist/v26.5.0/node-v26.5.0-darwin-arm64.tar.gz" [tools.node."platforms.macos-x64"] -checksum = "sha256:33519b28a352de668ab0a2a64366db032a45cb629d5353f86e4576e2780f4fcf" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-darwin-x64.tar.gz" +checksum = "sha256:98293394c945a24e64e00b4177bf075ec963ea70b34d1d2e24bd4a71716d334f" +url = "https://nodejs.org/dist/v26.5.0/node-v26.5.0-darwin-x64.tar.gz" [tools.node."platforms.windows-x64"] -checksum = "sha256:089a02c4c687451c9f0b7f1bfd252dae85a7ba27df0295a14096bdcc956fdc92" -url = "https://nodejs.org/dist/v26.1.0/node-v26.1.0-win-x64.zip" +checksum = "sha256:d3b2277dbcccfdf24ef6302928f64f484cff1d77a6d3caa3a28f4d20ce9158f6" +url = "https://nodejs.org/dist/v26.5.0/node-v26.5.0-win-x64.zip"