From 6e5e5f1683a19d33548bab7894895c827100e189 Mon Sep 17 00:00:00 2001 From: 186526 Date: Sun, 5 Mar 2023 03:24:08 +0800 Subject: [PATCH] Init --- .drone.yml | 22 ++++++ .gitignore | 130 +++++++++++++++++++++++++++++++++++ LICENSE | 21 ++++++ config.yaml | 78 +++++++++++++++++++++ package.json | 19 ++++++ readme.md | 10 +++ src/bgpq4.ts | 21 ++++++ src/index.ts | 116 +++++++++++++++++++++++++++++++ tsconfig.json | 28 ++++++++ yarn.lock | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 629 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 config.yaml create mode 100644 package.json create mode 100644 readme.md create mode 100644 src/bgpq4.ts create mode 100644 src/index.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..3cef988 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,22 @@ +kind: pipeline +type: docker +name: updateASSETs + +platform: + os: linux + arch: arm64 + +trigger: + branch: + - master + +steps: + - name: deploy + image: node:lts-alpine + environment: + RIPE_PASSWORD: + from_secret: ripe_password + commands: + - apk add bgpq4 --repository=https://dl-cdn.alpinelinux.org/alpine/edge/testing + - yarn + - yarn deploy diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6bba59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a62c9ba --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2022 186526 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..c09aac0 --- /dev/null +++ b/config.yaml @@ -0,0 +1,78 @@ +MNT-BY: + - NET186-MNT + - real186526-MNT + +TECH-C: + - NA7759-RIPE + +ADMIN-C: + - NA7759-RIPE + +AS-SETS: + "AS200536:AS-DOWNSTREAMS": + remarks: + - 186526 Network (AS200536) Downstream AS-SET. + group: + - "*" + + "AS200536:AS-DOWNSTREAMS-EMEA": + remarks: + - 186526 Network (AS200536) Downstream AS-SET (EMEA only). + include: + - "AS200536:AS-DOWNSTREAMS-SELF" + group: + - GLOBAL + - EMEA + + "AS200536:AS-DOWNSTREAMS-APAC": + remarks: + - 186526 Network (AS200536) Downstream AS-SET (APAC only). + include: + - "AS200536:AS-DOWNSTREAMS-SELF" + group: + - GLOBAL + - APAC + + "AS200536:AS-DOWNSTREAMS-AMER": + remarks: + - 186526 Network (AS200536) Downstream AS-SET (The Americas only). + include: + - "AS200536:AS-DOWNSTREAMS-SELF" + group: + - GLOBAL + - AMER + + "AS200536:AS-DOWNSTREAMS-SELF": + remarks: + - 186526 Network Self AS AS-SET. + group: + - SELF + +members: + - AS200536: + - GLOBAL + - SELF + - AS140506: + - APAC + - SELF + - "RIPE::AS-WJY": + - GLOBAL + - "GLOBAL:CUSTOMER" + - "APNIC::AS-BLING": + - GLOBAL + - "GLOBAL:CUSTOMER" + - "AS200895:AS-GUA": + - APAC + - "APAC:CUSTOMER" + - "AS200592:AS-NETLGY": + - EMEA + - "EMEA:CUSTOMER" + - "APNIC::AS-MoeQing-EU": + - EMEA + - "EMEA:CUSTOMER" + - AS200907: + - APAC + - "APAC:CUSTOMER" + - "RIPE::AS-SET-N7DMR": + - AMER + - "AMER:CUSTOMER" diff --git a/package.json b/package.json new file mode 100644 index 0000000..5f7199b --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "net186-as-set", + "version": "1.0.0", + "main": "src/index.ts", + "license": "MIT", + "dependencies": { + "axios": "^1.3.4", + "lru-cache": "^7.18.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.5", + "yaml": "^2.2.1" + }, + "devDependencies": { + "@types/node": "^18.14.6" + }, + "scripts": { + "deploy": "cd src && ts-node ./index.ts" + } +} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..d9d8228 --- /dev/null +++ b/readme.md @@ -0,0 +1,10 @@ +# NET186 AS-SET + +> This project aims to automatically maintain our AS-SET objects. + +[![Build Status](https://ci.186526.xyz/api/badges/186526/net186-as-set/status.svg)](https://ci.186526.xyz/186526/net186-as-set) + +## Pull request + +Anyone using our (AS200536) Transit can create a pull request to add your AS-SET. +We also welcome pull requests for maintenance of the project. diff --git a/src/bgpq4.ts b/src/bgpq4.ts new file mode 100644 index 0000000..ed904bc --- /dev/null +++ b/src/bgpq4.ts @@ -0,0 +1,21 @@ +import { execFile } from "node:child_process"; +import LRUCache from "lru-cache"; + +const cache = new LRUCache({ + max: 500, + ttl: 1000 * 60 * 5, +}); + +export default async function bgpq4(asSet: string): Promise { + if (cache.has(asSet)) return cache.get(asSet) as number[]; + const answer: { as: number[] } = await new Promise((resolve) => { + execFile("bgpq4", ["-tjl", "as", "-L", "6", asSet], (error, stdout) => { + if (error) { + throw error; + } + resolve(JSON.parse(stdout)); + }); + }); + cache.set(asSet, answer.as); + return answer.as; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..f5e12aa --- /dev/null +++ b/src/index.ts @@ -0,0 +1,116 @@ +import bgpq4 from "./bgpq4"; +import fs from "node:fs"; +import YAML from "yaml"; + +import axios from "axios"; +import { env } from "node:process"; + +const main = async () => { + const config: { + "MNT-BY": string[]; + "TECH-C": string[]; + "ADMIN-C": string[]; + "AS-SETS": { + [asSetsName: string]: { + group: [groupName: string][]; + expect: number[]; + include: string[]; + remarks: string[]; + }; + }; + members: { + [member: string]: [groupName: string][]; + }[]; + } = YAML.parse(fs.readFileSync("../config.yaml", "utf8")); + + const asSets: { + "AS-SET": string; + "MNT-BY": string[]; + "TECH-C": string[]; + "ADMIN-C": string[]; + members: number[]; + remarks: string[]; + include: string[]; + }[] = []; + + console.log("INFO: start AS-SETS generation."); + + let i = 1; + + for (let asSetName in config["AS-SETS"]) { + console.log( + `INFO: generating AS-SETS <${asSetName}>... (${i}/${ + Object.keys(config["AS-SETS"]).length + })\n` + ); + let members = await Promise.all( + config.members.map(async (member) => { + const setName = Object.keys(member)[0]; + const setGroup = Object.values(member)[0]; + + if ( + config["AS-SETS"][asSetName].group.filter( + (e) => setGroup.includes(e) || (e as any) === "*" + ).length == 0 + ) + return undefined; + + const answer = await bgpq4(setName); + + console.log("Add", setName, answer, "to", asSetName); + + return answer.filter( + (as) => !(config["AS-SETS"][asSetName].expect ?? [0]).includes(as) + ); + }) + ); + + config["AS-SETS"][asSetName].remarks.push( + `Generated by git.186526.xyz/186526/net186-as-set.` + ); + config["AS-SETS"][asSetName].remarks.push( + `Updated on ${new Date().toISOString()}.` + ); + + asSets.push({ + "AS-SET": asSetName, + "MNT-BY": config["MNT-BY"], + "TECH-C": config["TECH-C"], + "ADMIN-C": config["ADMIN-C"], + remarks: config["AS-SETS"][asSetName].remarks, + members: Array.from(new Set(members.flat(Infinity))).filter( + Boolean + ) as number[], + include: config["AS-SETS"][asSetName].include, + }); + i++; + console.log(""); + } + const answer = asSets.map((k) => { + return `as-set: ${k["AS-SET"]} +${k["MNT-BY"].map((k) => `mnt-by: ${k}`).join("\n")} +${k["TECH-C"].map((k) => `tech-c: ${k}`).join("\n")} +${k["ADMIN-C"].map((k) => `admin-c: ${k}`).join("\n")} +${k.remarks.map((k) => `remarks: ${k}`).join("\n")} +${k.members.map((k) => `members: AS${k}`).join("\n")}${(k.include ?? []).map( + (k) => `\nmembers: ${k}` + )} +source: RIPE\npassword: ${env["RIPE_PASSWORD"]}\n +`; + }); + console.log("INFO: sending update to RIPE Syncupdates..."); + const update = await axios.post( + "https://syncupdates.db.ripe.net", + `DATA=${answer.join("\n")}`, + { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + "User-Agent": "net186-as-set/1.0.0 axios curl", + }, + } + ); + console.log("INFO: Updates finished.\n"); + console.log(update.data); +}; + +main(); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3b3e51b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es2017", + "module": "commonjs", + "lib": ["dom", "es6", "es2017", "esnext.asynciterable"], + "skipLibCheck": true, + "sourceMap": true, + "outDir": "./dist", + "moduleResolution": "node", + "removeComments": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "baseUrl": "." + }, + "exclude": ["node_modules"], + "include": ["./src/**/*.ts"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..9d6946c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,184 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/node@^18.14.6": + version "18.14.6" + resolved "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz" + integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +lru-cache@^7.18.1: + version "7.18.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.1.tgz#4716408dec51d5d0104732647f584d1f6738b109" + integrity sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +yaml@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==