Last active
January 4, 2023 01:35
-
-
Save ThePooN/5ea95d5d92536b486ac3493811ad8fac to your computer and use it in GitHub Desktop.
IPv4 subnets vs. ASN grouping
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { readFile } from "fs/promises"; | |
import { Reader } from '@maxmind/geoip2-node'; | |
const anonymize = true; | |
const ipaddresses = (await readFile("ipaddresses.csv", "utf8")).split("\n"); | |
const countsPerASN: Map<number, number> = new Map(); | |
const reader = await Reader.open("./GeoLite2-ASN.mmdb"); | |
for (const ipstr of ipaddresses) { | |
const ASN = reader.asn(ipstr).autonomousSystemNumber!; | |
if(ASN) | |
countsPerASN.set(ASN, (countsPerASN.get(ASN) ?? 0) + 1); | |
else | |
console.warn(`No ASN for ${ipstr}`); | |
} | |
console.log("ASN,Count"); | |
let i = 0; | |
for (const [ASN, count] of countsPerASN.entries()) { | |
console.log(`${!anonymize ? `AS${ASN}` : `AS${++i}`},${count}`); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "ipscan", | |
"lockfileVersion": 2, | |
"requires": true, | |
"packages": { | |
"": { | |
"dependencies": { | |
"@maxmind/geoip2-node": "^3.5.0" | |
}, | |
"devDependencies": { | |
"@types/node": "^18.11.18", | |
"tsx": "^3.12.1" | |
} | |
}, | |
"node_modules/@esbuild-kit/cjs-loader": { | |
"version": "2.4.1", | |
"resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.1.tgz", | |
"integrity": "sha512-lhc/XLith28QdW0HpHZvZKkorWgmCNT7sVelMHDj3HFdTfdqkwEKvT+aXVQtNAmCC39VJhunDkWhONWB7335mg==", | |
"dev": true, | |
"dependencies": { | |
"@esbuild-kit/core-utils": "^3.0.0", | |
"get-tsconfig": "^4.2.0" | |
} | |
}, | |
"node_modules/@esbuild-kit/core-utils": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.0.0.tgz", | |
"integrity": "sha512-TXmwH9EFS3DC2sI2YJWJBgHGhlteK0Xyu1VabwetMULfm3oYhbrsWV5yaSr2NTWZIgDGVLHbRf0inxbjXqAcmQ==", | |
"dev": true, | |
"dependencies": { | |
"esbuild": "~0.15.10", | |
"source-map-support": "^0.5.21" | |
} | |
}, | |
"node_modules/@esbuild-kit/esm-loader": { | |
"version": "2.5.4", | |
"resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.4.tgz", | |
"integrity": "sha512-afmtLf6uqxD5IgwCzomtqCYIgz/sjHzCWZFvfS5+FzeYxOURPUo4QcHtqJxbxWOMOogKriZanN/1bJQE/ZL93A==", | |
"dev": true, | |
"dependencies": { | |
"@esbuild-kit/core-utils": "^3.0.0", | |
"get-tsconfig": "^4.2.0" | |
} | |
}, | |
"node_modules/@esbuild/android-arm": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", | |
"integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", | |
"cpu": [ | |
"arm" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"android" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/@esbuild/linux-loong64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", | |
"integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", | |
"cpu": [ | |
"loong64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/@maxmind/geoip2-node": { | |
"version": "3.5.0", | |
"resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-3.5.0.tgz", | |
"integrity": "sha512-WG2TNxMwDWDOrljLwyZf5bwiEYubaHuICvQRlgz74lE9OZA/z4o+ZT6OisjDBAZh/yRJVNK6mfHqmP5lLlAwsA==", | |
"dependencies": { | |
"camelcase-keys": "^7.0.0", | |
"ip6addr": "^0.2.5", | |
"maxmind": "^4.2.0" | |
} | |
}, | |
"node_modules/@types/node": { | |
"version": "18.11.18", | |
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", | |
"integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", | |
"dev": true | |
}, | |
"node_modules/assert-plus": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", | |
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", | |
"engines": { | |
"node": ">=0.8" | |
} | |
}, | |
"node_modules/buffer-from": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", | |
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", | |
"dev": true | |
}, | |
"node_modules/camelcase": { | |
"version": "6.3.0", | |
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", | |
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", | |
"engines": { | |
"node": ">=10" | |
}, | |
"funding": { | |
"url": "https://github.com/sponsors/sindresorhus" | |
} | |
}, | |
"node_modules/camelcase-keys": { | |
"version": "7.0.2", | |
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", | |
"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", | |
"dependencies": { | |
"camelcase": "^6.3.0", | |
"map-obj": "^4.1.0", | |
"quick-lru": "^5.1.1", | |
"type-fest": "^1.2.1" | |
}, | |
"engines": { | |
"node": ">=12" | |
}, | |
"funding": { | |
"url": "https://github.com/sponsors/sindresorhus" | |
} | |
}, | |
"node_modules/core-util-is": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", | |
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" | |
}, | |
"node_modules/esbuild": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", | |
"integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", | |
"dev": true, | |
"hasInstallScript": true, | |
"bin": { | |
"esbuild": "bin/esbuild" | |
}, | |
"engines": { | |
"node": ">=12" | |
}, | |
"optionalDependencies": { | |
"@esbuild/android-arm": "0.15.18", | |
"@esbuild/linux-loong64": "0.15.18", | |
"esbuild-android-64": "0.15.18", | |
"esbuild-android-arm64": "0.15.18", | |
"esbuild-darwin-64": "0.15.18", | |
"esbuild-darwin-arm64": "0.15.18", | |
"esbuild-freebsd-64": "0.15.18", | |
"esbuild-freebsd-arm64": "0.15.18", | |
"esbuild-linux-32": "0.15.18", | |
"esbuild-linux-64": "0.15.18", | |
"esbuild-linux-arm": "0.15.18", | |
"esbuild-linux-arm64": "0.15.18", | |
"esbuild-linux-mips64le": "0.15.18", | |
"esbuild-linux-ppc64le": "0.15.18", | |
"esbuild-linux-riscv64": "0.15.18", | |
"esbuild-linux-s390x": "0.15.18", | |
"esbuild-netbsd-64": "0.15.18", | |
"esbuild-openbsd-64": "0.15.18", | |
"esbuild-sunos-64": "0.15.18", | |
"esbuild-windows-32": "0.15.18", | |
"esbuild-windows-64": "0.15.18", | |
"esbuild-windows-arm64": "0.15.18" | |
} | |
}, | |
"node_modules/esbuild-android-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", | |
"integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"android" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-android-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", | |
"integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", | |
"cpu": [ | |
"arm64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"android" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-darwin-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", | |
"integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"darwin" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-darwin-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", | |
"integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", | |
"cpu": [ | |
"arm64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"darwin" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-freebsd-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", | |
"integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"freebsd" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-freebsd-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", | |
"integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", | |
"cpu": [ | |
"arm64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"freebsd" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-32": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", | |
"integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", | |
"cpu": [ | |
"ia32" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", | |
"integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-arm": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", | |
"integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", | |
"cpu": [ | |
"arm" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", | |
"integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", | |
"cpu": [ | |
"arm64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-mips64le": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", | |
"integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", | |
"cpu": [ | |
"mips64el" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-ppc64le": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", | |
"integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", | |
"cpu": [ | |
"ppc64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-riscv64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", | |
"integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", | |
"cpu": [ | |
"riscv64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-linux-s390x": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", | |
"integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", | |
"cpu": [ | |
"s390x" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"linux" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-netbsd-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", | |
"integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"netbsd" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-openbsd-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", | |
"integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"openbsd" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-sunos-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", | |
"integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"sunos" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-windows-32": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", | |
"integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", | |
"cpu": [ | |
"ia32" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"win32" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-windows-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", | |
"integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", | |
"cpu": [ | |
"x64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"win32" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/esbuild-windows-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", | |
"integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", | |
"cpu": [ | |
"arm64" | |
], | |
"dev": true, | |
"optional": true, | |
"os": [ | |
"win32" | |
], | |
"engines": { | |
"node": ">=12" | |
} | |
}, | |
"node_modules/extsprintf": { | |
"version": "1.3.0", | |
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", | |
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", | |
"engines": [ | |
"node >=0.6.0" | |
] | |
}, | |
"node_modules/fsevents": { | |
"version": "2.3.2", | |
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", | |
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", | |
"dev": true, | |
"hasInstallScript": true, | |
"optional": true, | |
"os": [ | |
"darwin" | |
], | |
"engines": { | |
"node": "^8.16.0 || ^10.6.0 || >=11.0.0" | |
} | |
}, | |
"node_modules/get-tsconfig": { | |
"version": "4.3.0", | |
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.3.0.tgz", | |
"integrity": "sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ==", | |
"dev": true, | |
"funding": { | |
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" | |
} | |
}, | |
"node_modules/ip6addr": { | |
"version": "0.2.5", | |
"resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz", | |
"integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==", | |
"dependencies": { | |
"assert-plus": "^1.0.0", | |
"jsprim": "^2.0.2" | |
} | |
}, | |
"node_modules/json-schema": { | |
"version": "0.4.0", | |
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", | |
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" | |
}, | |
"node_modules/jsprim": { | |
"version": "2.0.2", | |
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", | |
"integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", | |
"engines": [ | |
"node >=0.6.0" | |
], | |
"dependencies": { | |
"assert-plus": "1.0.0", | |
"extsprintf": "1.3.0", | |
"json-schema": "0.4.0", | |
"verror": "1.10.0" | |
} | |
}, | |
"node_modules/map-obj": { | |
"version": "4.3.0", | |
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", | |
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", | |
"engines": { | |
"node": ">=8" | |
}, | |
"funding": { | |
"url": "https://github.com/sponsors/sindresorhus" | |
} | |
}, | |
"node_modules/maxmind": { | |
"version": "4.3.8", | |
"resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.8.tgz", | |
"integrity": "sha512-HrfxEu5yPBPtTy/OT+W5bPQwEfLUX0EHqe2EbJiB47xQMumHqXvSP7PAwzV8Z++NRCmQwy4moQrTSt0+dH+Jmg==", | |
"dependencies": { | |
"mmdb-lib": "2.0.2", | |
"tiny-lru": "9.0.3" | |
}, | |
"engines": { | |
"node": ">=12", | |
"npm": ">=6" | |
} | |
}, | |
"node_modules/mmdb-lib": { | |
"version": "2.0.2", | |
"resolved": "https://registry.npmjs.org/mmdb-lib/-/mmdb-lib-2.0.2.tgz", | |
"integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==", | |
"engines": { | |
"node": ">=10", | |
"npm": ">=6" | |
} | |
}, | |
"node_modules/quick-lru": { | |
"version": "5.1.1", | |
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", | |
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", | |
"engines": { | |
"node": ">=10" | |
}, | |
"funding": { | |
"url": "https://github.com/sponsors/sindresorhus" | |
} | |
}, | |
"node_modules/source-map": { | |
"version": "0.6.1", | |
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | |
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | |
"dev": true, | |
"engines": { | |
"node": ">=0.10.0" | |
} | |
}, | |
"node_modules/source-map-support": { | |
"version": "0.5.21", | |
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", | |
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", | |
"dev": true, | |
"dependencies": { | |
"buffer-from": "^1.0.0", | |
"source-map": "^0.6.0" | |
} | |
}, | |
"node_modules/tiny-lru": { | |
"version": "9.0.3", | |
"resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-9.0.3.tgz", | |
"integrity": "sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw==", | |
"engines": { | |
"node": ">=6" | |
} | |
}, | |
"node_modules/tsx": { | |
"version": "3.12.1", | |
"resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.1.tgz", | |
"integrity": "sha512-Rcg1x+rNe7qwlP8j7kx4VjP/pJo/V57k+17hlrn6a7FuQLNwkaw5W4JF75tYornNVCxkXdSUnqlIT8JY/ttvIw==", | |
"dev": true, | |
"dependencies": { | |
"@esbuild-kit/cjs-loader": "^2.4.0", | |
"@esbuild-kit/core-utils": "^3.0.0", | |
"@esbuild-kit/esm-loader": "^2.5.0" | |
}, | |
"bin": { | |
"tsx": "dist/cli.js" | |
}, | |
"optionalDependencies": { | |
"fsevents": "~2.3.2" | |
} | |
}, | |
"node_modules/type-fest": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", | |
"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", | |
"engines": { | |
"node": ">=10" | |
}, | |
"funding": { | |
"url": "https://github.com/sponsors/sindresorhus" | |
} | |
}, | |
"node_modules/verror": { | |
"version": "1.10.0", | |
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", | |
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", | |
"engines": [ | |
"node >=0.6.0" | |
], | |
"dependencies": { | |
"assert-plus": "^1.0.0", | |
"core-util-is": "1.0.2", | |
"extsprintf": "^1.2.0" | |
} | |
} | |
}, | |
"dependencies": { | |
"@esbuild-kit/cjs-loader": { | |
"version": "2.4.1", | |
"resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.1.tgz", | |
"integrity": "sha512-lhc/XLith28QdW0HpHZvZKkorWgmCNT7sVelMHDj3HFdTfdqkwEKvT+aXVQtNAmCC39VJhunDkWhONWB7335mg==", | |
"dev": true, | |
"requires": { | |
"@esbuild-kit/core-utils": "^3.0.0", | |
"get-tsconfig": "^4.2.0" | |
} | |
}, | |
"@esbuild-kit/core-utils": { | |
"version": "3.0.0", | |
"resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.0.0.tgz", | |
"integrity": "sha512-TXmwH9EFS3DC2sI2YJWJBgHGhlteK0Xyu1VabwetMULfm3oYhbrsWV5yaSr2NTWZIgDGVLHbRf0inxbjXqAcmQ==", | |
"dev": true, | |
"requires": { | |
"esbuild": "~0.15.10", | |
"source-map-support": "^0.5.21" | |
} | |
}, | |
"@esbuild-kit/esm-loader": { | |
"version": "2.5.4", | |
"resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.4.tgz", | |
"integrity": "sha512-afmtLf6uqxD5IgwCzomtqCYIgz/sjHzCWZFvfS5+FzeYxOURPUo4QcHtqJxbxWOMOogKriZanN/1bJQE/ZL93A==", | |
"dev": true, | |
"requires": { | |
"@esbuild-kit/core-utils": "^3.0.0", | |
"get-tsconfig": "^4.2.0" | |
} | |
}, | |
"@esbuild/android-arm": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", | |
"integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", | |
"dev": true, | |
"optional": true | |
}, | |
"@esbuild/linux-loong64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", | |
"integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"@maxmind/geoip2-node": { | |
"version": "3.5.0", | |
"resolved": "https://registry.npmjs.org/@maxmind/geoip2-node/-/geoip2-node-3.5.0.tgz", | |
"integrity": "sha512-WG2TNxMwDWDOrljLwyZf5bwiEYubaHuICvQRlgz74lE9OZA/z4o+ZT6OisjDBAZh/yRJVNK6mfHqmP5lLlAwsA==", | |
"requires": { | |
"camelcase-keys": "^7.0.0", | |
"ip6addr": "^0.2.5", | |
"maxmind": "^4.2.0" | |
} | |
}, | |
"@types/node": { | |
"version": "18.11.18", | |
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", | |
"integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", | |
"dev": true | |
}, | |
"assert-plus": { | |
"version": "1.0.0", | |
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", | |
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" | |
}, | |
"buffer-from": { | |
"version": "1.1.2", | |
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", | |
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", | |
"dev": true | |
}, | |
"camelcase": { | |
"version": "6.3.0", | |
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", | |
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" | |
}, | |
"camelcase-keys": { | |
"version": "7.0.2", | |
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", | |
"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", | |
"requires": { | |
"camelcase": "^6.3.0", | |
"map-obj": "^4.1.0", | |
"quick-lru": "^5.1.1", | |
"type-fest": "^1.2.1" | |
} | |
}, | |
"core-util-is": { | |
"version": "1.0.2", | |
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", | |
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" | |
}, | |
"esbuild": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", | |
"integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", | |
"dev": true, | |
"requires": { | |
"@esbuild/android-arm": "0.15.18", | |
"@esbuild/linux-loong64": "0.15.18", | |
"esbuild-android-64": "0.15.18", | |
"esbuild-android-arm64": "0.15.18", | |
"esbuild-darwin-64": "0.15.18", | |
"esbuild-darwin-arm64": "0.15.18", | |
"esbuild-freebsd-64": "0.15.18", | |
"esbuild-freebsd-arm64": "0.15.18", | |
"esbuild-linux-32": "0.15.18", | |
"esbuild-linux-64": "0.15.18", | |
"esbuild-linux-arm": "0.15.18", | |
"esbuild-linux-arm64": "0.15.18", | |
"esbuild-linux-mips64le": "0.15.18", | |
"esbuild-linux-ppc64le": "0.15.18", | |
"esbuild-linux-riscv64": "0.15.18", | |
"esbuild-linux-s390x": "0.15.18", | |
"esbuild-netbsd-64": "0.15.18", | |
"esbuild-openbsd-64": "0.15.18", | |
"esbuild-sunos-64": "0.15.18", | |
"esbuild-windows-32": "0.15.18", | |
"esbuild-windows-64": "0.15.18", | |
"esbuild-windows-arm64": "0.15.18" | |
} | |
}, | |
"esbuild-android-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", | |
"integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-android-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", | |
"integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-darwin-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", | |
"integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-darwin-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", | |
"integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-freebsd-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", | |
"integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-freebsd-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", | |
"integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-32": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", | |
"integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", | |
"integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-arm": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", | |
"integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", | |
"integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-mips64le": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", | |
"integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-ppc64le": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", | |
"integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-riscv64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", | |
"integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-linux-s390x": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", | |
"integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-netbsd-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", | |
"integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-openbsd-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", | |
"integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-sunos-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", | |
"integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-windows-32": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", | |
"integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-windows-64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", | |
"integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", | |
"dev": true, | |
"optional": true | |
}, | |
"esbuild-windows-arm64": { | |
"version": "0.15.18", | |
"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", | |
"integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", | |
"dev": true, | |
"optional": true | |
}, | |
"extsprintf": { | |
"version": "1.3.0", | |
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", | |
"integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" | |
}, | |
"fsevents": { | |
"version": "2.3.2", | |
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", | |
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", | |
"dev": true, | |
"optional": true | |
}, | |
"get-tsconfig": { | |
"version": "4.3.0", | |
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.3.0.tgz", | |
"integrity": "sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ==", | |
"dev": true | |
}, | |
"ip6addr": { | |
"version": "0.2.5", | |
"resolved": "https://registry.npmjs.org/ip6addr/-/ip6addr-0.2.5.tgz", | |
"integrity": "sha512-9RGGSB6Zc9Ox5DpDGFnJdIeF0AsqXzdH+FspCfPPaU/L/4tI6P+5lIoFUFm9JXs9IrJv1boqAaNCQmoDADTSKQ==", | |
"requires": { | |
"assert-plus": "^1.0.0", | |
"jsprim": "^2.0.2" | |
} | |
}, | |
"json-schema": { | |
"version": "0.4.0", | |
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", | |
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" | |
}, | |
"jsprim": { | |
"version": "2.0.2", | |
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", | |
"integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", | |
"requires": { | |
"assert-plus": "1.0.0", | |
"extsprintf": "1.3.0", | |
"json-schema": "0.4.0", | |
"verror": "1.10.0" | |
} | |
}, | |
"map-obj": { | |
"version": "4.3.0", | |
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", | |
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" | |
}, | |
"maxmind": { | |
"version": "4.3.8", | |
"resolved": "https://registry.npmjs.org/maxmind/-/maxmind-4.3.8.tgz", | |
"integrity": "sha512-HrfxEu5yPBPtTy/OT+W5bPQwEfLUX0EHqe2EbJiB47xQMumHqXvSP7PAwzV8Z++NRCmQwy4moQrTSt0+dH+Jmg==", | |
"requires": { | |
"mmdb-lib": "2.0.2", | |
"tiny-lru": "9.0.3" | |
} | |
}, | |
"mmdb-lib": { | |
"version": "2.0.2", | |
"resolved": "https://registry.npmjs.org/mmdb-lib/-/mmdb-lib-2.0.2.tgz", | |
"integrity": "sha512-shi1I+fCPQonhTi7qyb6hr7hi87R7YS69FlfJiMFuJ12+grx0JyL56gLNzGTYXPU7EhAPkMLliGeyHer0K+AVA==" | |
}, | |
"quick-lru": { | |
"version": "5.1.1", | |
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", | |
"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" | |
}, | |
"source-map": { | |
"version": "0.6.1", | |
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", | |
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", | |
"dev": true | |
}, | |
"source-map-support": { | |
"version": "0.5.21", | |
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", | |
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", | |
"dev": true, | |
"requires": { | |
"buffer-from": "^1.0.0", | |
"source-map": "^0.6.0" | |
} | |
}, | |
"tiny-lru": { | |
"version": "9.0.3", | |
"resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-9.0.3.tgz", | |
"integrity": "sha512-/i9GruRjXsnDgehxvy6iZ4AFNVxngEFbwzirhdulomMNPGPVV3ECMZOWSw0w4sRMZ9Al9m4jy08GPvRxRUGYlw==" | |
}, | |
"tsx": { | |
"version": "3.12.1", | |
"resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.1.tgz", | |
"integrity": "sha512-Rcg1x+rNe7qwlP8j7kx4VjP/pJo/V57k+17hlrn6a7FuQLNwkaw5W4JF75tYornNVCxkXdSUnqlIT8JY/ttvIw==", | |
"dev": true, | |
"requires": { | |
"@esbuild-kit/cjs-loader": "^2.4.0", | |
"@esbuild-kit/core-utils": "^3.0.0", | |
"@esbuild-kit/esm-loader": "^2.5.0", | |
"fsevents": "~2.3.2" | |
} | |
}, | |
"type-fest": { | |
"version": "1.4.0", | |
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", | |
"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" | |
}, | |
"verror": { | |
"version": "1.10.0", | |
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", | |
"integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", | |
"requires": { | |
"assert-plus": "^1.0.0", | |
"core-util-is": "1.0.2", | |
"extsprintf": "^1.2.0" | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"type": "module", | |
"scripts": { | |
"subnets": "tsx subnets.ts", | |
"asn": "tsx asn.ts" | |
}, | |
"devDependencies": { | |
"@types/node": "^18.11.18", | |
"tsx": "^3.12.1" | |
}, | |
"dependencies": { | |
"@maxmind/geoip2-node": "^3.5.0" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { readFile } from "fs/promises"; | |
const anonymize = true; | |
const ipaddresses = (await readFile("ipaddresses.csv", "utf8")).split("\n"); | |
const countsPerSubnet: Map<string, number> = new Map(); | |
for (const ipstr of ipaddresses) { | |
const splits = ipstr.split("."); | |
splits[3] = "0/24"; | |
const subnet = splits.join("."); | |
countsPerSubnet.set(subnet, (countsPerSubnet.get(subnet) ?? 0) + 1); | |
} | |
console.log("Subnet,Count"); | |
let i = 0; | |
for (const [subnet, count] of countsPerSubnet.entries()) { | |
console.log(`${!anonymize ? subnet : `/24 ${++i}`},${count}`); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment