From c7204f7e85289ef0ac43a84bfe7d5b7c698651cd Mon Sep 17 00:00:00 2001 From: Daryl Ronningen Date: Tue, 6 Jul 2021 11:50:06 -0500 Subject: [PATCH] feat: basic api client --- .eslintrc | 11 +- package.json | 6 +- src/api/apiClient.ts | 27 +++ src/api/apiHandler.ts | 65 ++++++ src/client/client.ts | 14 +- src/utils/defaults.ts | 10 + src/utils/types.ts | 62 ++++++ src/utils/utils.ts | 0 yarn.lock | 470 ++++++++++++++++++++++++++++++++++++++---- 9 files changed, 625 insertions(+), 40 deletions(-) create mode 100644 src/api/apiClient.ts create mode 100644 src/api/apiHandler.ts create mode 100644 src/utils/defaults.ts create mode 100644 src/utils/types.ts create mode 100644 src/utils/utils.ts diff --git a/.eslintrc b/.eslintrc index b8a8e3b..dbb5e84 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,6 +7,8 @@ }, "extends": [ "eslint:recommended", + "plugin:import/recommended", + "plugin:import/typescript", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended" ], @@ -58,6 +60,12 @@ ], "no-case-declarations": "off", "camelcase": "off", + "keyword-spacing": "error", + "spaced-comment": [ + "error", + "always" + ], + "no-var": "error", // TypeScript Rules "@typescript-eslint/naming-convention": [ "error", @@ -101,6 +109,7 @@ "accessibility": "explicit" } ], + "@typescript-eslint/explicit-function-return-type": "error", // Unicorn Rules "unicorn/filename-case": [ "error", @@ -110,4 +119,4 @@ ] }, "reportUnusedDisableDirectives": true -} \ No newline at end of file +} diff --git a/package.json b/package.json index d4a36bf..73111db 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,9 @@ "release": "semantic-release" }, "dependencies": { + "abort-controller": "^3.0.0", + "async": "^3.2.0", + "form-data": "^4.0.0", "node-fetch": "^2.6.1", "tslib": "^2.3.0", "ws": "^7.5.2" @@ -50,6 +53,7 @@ "@semantic-release/git": "^9.0.0", "@semantic-release/npm": "^7.1.3", "@semantic-release/release-notes-generator": "^9.0.3", + "@types/async": "^3", "@types/chai": "^4.2.19", "@types/eslint": "^7.2.13", "@types/mocha": "^8.2.2", @@ -67,6 +71,7 @@ "eslint": "^7.29.0", "eslint-formatter-pretty": "^4.1.0", "eslint-plugin-header": "^3.1.1", + "eslint-plugin-import": "^2.23.4", "eslint-plugin-unicorn": "^34.0.1", "husky": "^7.0.0", "inquirer": "^8.1.1", @@ -85,7 +90,6 @@ }, "optionalDependencies": { "bufferutil": "^4.0.3", - "erlpack": "^0.1.3", "utf-8-validate": "^5.0.5", "zlib-sync": "^0.1.7" }, diff --git a/src/api/apiClient.ts b/src/api/apiClient.ts new file mode 100644 index 0000000..7a20e42 --- /dev/null +++ b/src/api/apiClient.ts @@ -0,0 +1,27 @@ +import { ApiHandler } from './apiHandler'; + +import type { DeepRequired, IApiClientOptions } from '../utils/types'; + +export class ApiClient { + public handler: ApiHandler + public options: DeepRequired; + + private _token: string; + + public constructor(token: string, options: DeepRequired) { + this.options = options; + this._token = token; + + this.handler = new ApiHandler(this._token, this.options); + } + + public async get(): Promise { + return this.handler.makeRequest({ + method: 'GET', + body: '', + headers: {}, + path: '/', + requireAuth: false, + }); + } +} diff --git a/src/api/apiHandler.ts b/src/api/apiHandler.ts new file mode 100644 index 0000000..a1802ff --- /dev/null +++ b/src/api/apiHandler.ts @@ -0,0 +1,65 @@ +import { AbortController } from 'abort-controller'; +import { queue, QueueObject } from 'async'; +import FormData from 'form-data'; +import fetch from 'node-fetch'; + +import type { DeepRequired, IApiClientOptions, IMakeRequestOptions } from '../utils/types'; + +export class ApiHandler { + public options: DeepRequired; + public queue: QueueObject; + + private _token: string; + + public constructor(token: string, options: DeepRequired) { + this.options = options; + this._token = token; + + this.queue = queue(async (requestOptions: IMakeRequestOptions, callback) => { + callback(await this.makeRequest(requestOptions)); + }); + } + + public get baseApiUrl(): string { + return `${this.options.apiUrl}/${this.options.apiVersion}`; + } + + public async makeRequest(options: IMakeRequestOptions): Promise { + let headers: Record = options.headers ?? {}; + + if (options.requireAuth) headers['Authorization'] = `Bot ${this._token}`; + if (options.reason) headers['X-Audit-Log-Reason'] = encodeURIComponent(options.reason); + + let body: FormData | string; + if (options.files && options.files.length) { + body = new FormData(); + for (const file of options.files) if (file && file.file) body.append(file.name, file.file, file.name); + if (options.body) body.append('payload_json', JSON.stringify(options.body)); + headers = Object.assign(headers, body.getHeaders()); + } else if (options.body) { + body = JSON.stringify(options.body); + headers['Content-Type'] = 'application/json'; + } + + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), this.options.apiRequestTimeout); + + try { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const res = await fetch(`${this.baseApiUrl}/${options.path}`, { method: options.method, headers, signal: controller.signal, body }); + + // TODO: handle Ratelimits + + // TODO: Handle non-2xx responses + + return res.json() as unknown as T; + } finally { + clearTimeout(timeout); + } + } + + public async push(requestOptions: IMakeRequestOptions): Promise { + return await this.queue.pushAsync(requestOptions); + } +} diff --git a/src/client/client.ts b/src/client/client.ts index 79eff01..d00a0d9 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -1,8 +1,18 @@ -export default class Client { +import { ApiClient } from '../api/apiClient'; +import { defaults } from '../utils/defaults'; + +import type { DeepRequired, IClientOptions } from '../utils/types'; + +export class Client { + public api: ApiClient; + public options: DeepRequired; private _token: string; - public constructor(token: string) { + public constructor(token: string, options?: DeepRequired) { + this.options = Object.assign(options, defaults.clientOptions); this._token = token; + + this.api = new ApiClient(this._token, this.options.api); } } diff --git a/src/utils/defaults.ts b/src/utils/defaults.ts new file mode 100644 index 0000000..4e02bb5 --- /dev/null +++ b/src/utils/defaults.ts @@ -0,0 +1,10 @@ +import type { IDefaultOptions } from './types'; + +export const defaults: IDefaultOptions = { + clientOptions: { + api: { + apiUrl: 'https://discord.com/api', + apiVersion: 9, + }, + }, +}; diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 0000000..5db5dd9 --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,62 @@ +// Interfaces +export interface IApiClientOptions { + apiUrl?: string; + + apiVersion?: number; + apiRequestTimeout?: number; +} + +export interface IClientOptions { + api?: IApiClientOptions; +} + +export interface IDefaultOptions { + clientOptions: IClientOptions; +} + +export interface IMakeRequestOptions { + path: string; + reason?: string; + + requireAuth?: boolean; + + body?: unknown; + + headers?: Record; + + method: ApiMethods; + + files?: { + name: string; + file: Buffer; + }[]; +} + +// Enums + +// Type Aliases +export type ApiMethods = 'GET' | 'POST' | 'DELETE'; +export type Primitives = string | number | boolean | bigint | symbol | undefined | null; +// eslint-disable-next-line @typescript-eslint/ban-types +export type Builtin = Primitives | Function | Date | Error | RegExp; +export type DeepRequired = T extends Builtin + ? NonNullable + : T extends Map + ? Map, DeepRequired> + : T extends ReadonlyMap + ? ReadonlyMap, DeepRequired> + : T extends WeakMap + ? WeakMap, DeepRequired> + : T extends Set + ? Set> + : T extends ReadonlySet + ? ReadonlySet> + : T extends WeakSet + ? WeakSet> + : T extends Promise + ? Promise> + // eslint-disable-next-line @typescript-eslint/ban-types + : T extends {} + ? { [K in keyof T]-?: DeepRequired } + : NonNullable; + diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock index 9944ebf..93d0576 100644 --- a/yarn.lock +++ b/yarn.lock @@ -546,6 +546,7 @@ __metadata: "@semantic-release/git": ^9.0.0 "@semantic-release/npm": ^7.1.3 "@semantic-release/release-notes-generator": ^9.0.3 + "@types/async": ^3 "@types/chai": ^4.2.19 "@types/eslint": ^7.2.13 "@types/mocha": ^8.2.2 @@ -558,14 +559,17 @@ __metadata: "@typescript-eslint/eslint-plugin": ^4.28.1 "@typescript-eslint/parser": ^4.28.1 "@typescript-eslint/typescript-estree": ^4.28.1 + abort-controller: ^3.0.0 + async: ^3.2.0 bufferutil: ^4.0.3 chai: ^4.3.4 commitizen: ^4.2.4 - erlpack: ^0.1.3 eslint: ^7.29.0 eslint-formatter-pretty: ^4.1.0 eslint-plugin-header: ^3.1.1 + eslint-plugin-import: ^2.23.4 eslint-plugin-unicorn: ^34.0.1 + form-data: ^4.0.0 husky: ^7.0.0 inquirer: ^8.1.1 lint-staged: ^11.0.0 @@ -588,8 +592,6 @@ __metadata: dependenciesMeta: bufferutil: optional: true - erlpack: - optional: true utf-8-validate: optional: true zlib-sync: @@ -1160,6 +1162,13 @@ __metadata: languageName: node linkType: hard +"@types/async@npm:^3": + version: 3.2.6 + resolution: "@types/async@npm:3.2.6" + checksum: a4d06f473d7167b7537247f629f9bd5df8ad43001ea5bf421e94dd55df1d19685b5900b4943b795febe53d719fd32b21b4792516f7920e35249c6c8de60254f0 + languageName: node + linkType: hard + "@types/cacheable-request@npm:^6.0.1": version: 6.0.1 resolution: "@types/cacheable-request@npm:6.0.1" @@ -1472,6 +1481,15 @@ __metadata: languageName: node linkType: hard +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.1": version: 5.3.1 resolution: "acorn-jsx@npm:5.3.1" @@ -1714,6 +1732,19 @@ __metadata: languageName: node linkType: hard +"array-includes@npm:^3.1.3": + version: 3.1.3 + resolution: "array-includes@npm:3.1.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.18.0-next.2 + get-intrinsic: ^1.1.1 + is-string: ^1.0.5 + checksum: eaab8812412b5ec921c8fe678a9d61f501b12f6c72e271e0e8652fe7f4145276cc7ad79ff303ac4ed69cbf5135155bfb092b1b6d552e423e75106d1c887da150 + languageName: node + linkType: hard + "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -1721,6 +1752,17 @@ __metadata: languageName: node linkType: hard +"array.prototype.flat@npm:^1.2.4": + version: 1.2.4 + resolution: "array.prototype.flat@npm:1.2.4" + dependencies: + call-bind: ^1.0.0 + define-properties: ^1.1.3 + es-abstract: ^1.18.0-next.1 + checksum: 1ec5d9887ae45e70e4b993e801b440ae5ddcd0d2c6d1dbe214c311e91436152f510916bdac82b066693544b9801a3c510dfbec8a278ababf8de7eb0bde74636f + languageName: node + linkType: hard + "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -1765,6 +1807,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.0": + version: 3.2.0 + resolution: "async@npm:3.2.0" + checksum: 6739fae769e6c9f76b272558f118ef041d45c979c573a8fe93f8cfbc32eb9c92da032e9effe6bbcc9b1131292cde6c4a9e61a442894aa06a262addd8dd3adda1 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -1844,15 +1893,6 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.5.0": - version: 1.5.0 - resolution: "bindings@npm:1.5.0" - dependencies: - file-uri-to-path: 1.0.0 - checksum: 65b6b48095717c2e6105a021a7da4ea435aa8d3d3cd085cb9e85bcb6e5773cf318c4745c3f7c504412855940b585bdf9b918236612a1c7a7942491de176f1ae7 - languageName: node - linkType: hard - "bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -2029,6 +2069,16 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind@npm:1.0.2" + dependencies: + function-bind: ^1.1.1 + get-intrinsic: ^1.0.2 + checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -2674,6 +2724,24 @@ __metadata: languageName: node linkType: hard +"debug@npm:^2.6.9": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + "debuglog@npm:^1.0.1": version: 1.0.1 resolution: "debuglog@npm:1.0.1" @@ -2769,6 +2837,15 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.1.3": + version: 1.1.3 + resolution: "define-properties@npm:1.1.3" + dependencies: + object-keys: ^1.0.12 + checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317 + languageName: node + linkType: hard + "del@npm:^6.0.0": version: 6.0.0 resolution: "del@npm:6.0.0" @@ -2860,6 +2937,15 @@ __metadata: languageName: node linkType: hard +"doctrine@npm:^2.1.0": + version: 2.1.0 + resolution: "doctrine@npm:2.1.0" + dependencies: + esutils: ^2.0.2 + checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + languageName: node + linkType: hard + "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -2962,17 +3048,6 @@ __metadata: languageName: node linkType: hard -"erlpack@npm:^0.1.3": - version: 0.1.3 - resolution: "erlpack@npm:0.1.3" - dependencies: - bindings: ^1.5.0 - nan: ^2.14.0 - node-gyp: latest - checksum: 7ef4effc58ec90f31bae6450f732abac7f7b52942a3838dc25aac2866a7ef3385ac38fa324669b4be913f6fbacd36a4e512fd083fdbd7592240789db689c95d6 - languageName: node - linkType: hard - "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -2989,6 +3064,41 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.18.0-next.1, es-abstract@npm:^1.18.0-next.2, es-abstract@npm:^1.18.2": + version: 1.18.3 + resolution: "es-abstract@npm:1.18.3" + dependencies: + call-bind: ^1.0.2 + es-to-primitive: ^1.2.1 + function-bind: ^1.1.1 + get-intrinsic: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.2 + is-callable: ^1.2.3 + is-negative-zero: ^2.0.1 + is-regex: ^1.1.3 + is-string: ^1.0.6 + object-inspect: ^1.10.3 + object-keys: ^1.1.1 + object.assign: ^4.1.2 + string.prototype.trimend: ^1.0.4 + string.prototype.trimstart: ^1.0.4 + unbox-primitive: ^1.0.1 + checksum: 6bbf526b5a60cdbd390397644facbf654fc6616564614533a5ce223ecc185f7812a1f45c3ab6d0334b4ff2e8f554237539f4d05a0fceb036be24dd5d1ec022b0 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + "es6-error@npm:^4.0.1": version: 4.1.1 resolution: "es6-error@npm:4.1.1" @@ -3033,6 +3143,26 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.3.4": + version: 0.3.4 + resolution: "eslint-import-resolver-node@npm:0.3.4" + dependencies: + debug: ^2.6.9 + resolve: ^1.13.1 + checksum: a0db55ec26c5bb385c8681af6b8d6dee16768d5f27dff72c3113407d0f028f28e56dcb1cc3a4689c79396a5f6a9c24bd0cac9a2c9c588c7d7357d24a42bec876 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.6.1": + version: 2.6.1 + resolution: "eslint-module-utils@npm:2.6.1" + dependencies: + debug: ^3.2.7 + pkg-dir: ^2.0.0 + checksum: 3cc43a36a0075d300db6a3946203ec92249b6da1539694ef205a43b4ccfbc2eaf4961475d4b89c24b12c187d6bfd882c7c7d0b2ce02adb40c2dedb7fd022a7e2 + languageName: node + linkType: hard + "eslint-plugin-header@npm:^3.1.1": version: 3.1.1 resolution: "eslint-plugin-header@npm:3.1.1" @@ -3042,6 +3172,31 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-import@npm:^2.23.4": + version: 2.23.4 + resolution: "eslint-plugin-import@npm:2.23.4" + dependencies: + array-includes: ^3.1.3 + array.prototype.flat: ^1.2.4 + debug: ^2.6.9 + doctrine: ^2.1.0 + eslint-import-resolver-node: ^0.3.4 + eslint-module-utils: ^2.6.1 + find-up: ^2.0.0 + has: ^1.0.3 + is-core-module: ^2.4.0 + minimatch: ^3.0.4 + object.values: ^1.1.3 + pkg-up: ^2.0.0 + read-pkg-up: ^3.0.0 + resolve: ^1.20.0 + tsconfig-paths: ^3.9.0 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + checksum: 8c64bb96fa35607de3da1ddf5d127a5913aebde5677bc276c55fecb3e539a7287569dc697af4f5c523bd2b08bff8f5b525448df5aa7d6256c86436b615be5abc + languageName: node + linkType: hard + "eslint-plugin-unicorn@npm:^34.0.1": version: 34.0.1 resolution: "eslint-plugin-unicorn@npm:34.0.1" @@ -3240,6 +3395,13 @@ __metadata: languageName: node linkType: hard +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + "execa@npm:^4.0.0": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -3385,13 +3547,6 @@ __metadata: languageName: node linkType: hard -"file-uri-to-path@npm:1.0.0": - version: 1.0.0 - resolution: "file-uri-to-path@npm:1.0.0" - checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 - languageName: node - linkType: hard - "fill-range@npm:^7.0.1": version: 7.0.1 resolution: "fill-range@npm:7.0.1" @@ -3439,7 +3594,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.0.0": +"find-up@npm:^2.0.0, find-up@npm:^2.1.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" dependencies: @@ -3533,6 +3688,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + "form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" @@ -3680,6 +3846,17 @@ fsevents@~2.3.2: languageName: node linkType: hard +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1": + version: 1.1.1 + resolution: "get-intrinsic@npm:1.1.1" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.1 + checksum: a9fe2ca8fa3f07f9b0d30fb202bcd01f3d9b9b6b732452e79c48e79f7d6d8d003af3f9e38514250e3553fdc83c61650851cb6870832ac89deaaceb08e3721a17 + languageName: node + linkType: hard + "get-own-enumerable-property-symbols@npm:^3.0.0": version: 3.0.2 resolution: "get-own-enumerable-property-symbols@npm:3.0.2" @@ -3943,6 +4120,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"has-bigints@npm:^1.0.1": + version: 1.0.1 + resolution: "has-bigints@npm:1.0.1" + checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183 + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -3957,6 +4141,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": + version: 1.0.2 + resolution: "has-symbols@npm:1.0.2" + checksum: 2309c426071731be792b5be43b3da6fb4ed7cbe8a9a6bcfca1862587709f01b33d575ce8f5c264c1eaad09fca2f9a8208c0a2be156232629daa2dd0c0740976b + languageName: node + linkType: hard + "has-unicode@npm:^2.0.0": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -4318,6 +4509,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-bigint@npm:^1.0.1": + version: 1.0.2 + resolution: "is-bigint@npm:1.0.2" + checksum: 5268edbde844583d8d5ce86f8e47669bf9dd9b3d4de0238b25bb2ddfc620b47e0e226171a906f19ac4c10debba160353fb98c134d0309898495e1b691efcfb80 + languageName: node + linkType: hard + "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -4327,6 +4525,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-boolean-object@npm:^1.1.0": + version: 1.1.1 + resolution: "is-boolean-object@npm:1.1.1" + dependencies: + call-bind: ^1.0.2 + checksum: 95b832242638b8495d012538716761122dfc4a930baf2aa676e0bc344fe39cda2364c739893a6d07d10863ced67cc95e11884732104d7904bd0d896033414d11 + languageName: node + linkType: hard + "is-builtin-module@npm:^3.1.0": version: 3.1.0 resolution: "is-builtin-module@npm:3.1.0" @@ -4336,6 +4543,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-callable@npm:^1.1.4, is-callable@npm:^1.2.3": + version: 1.2.3 + resolution: "is-callable@npm:1.2.3" + checksum: 084a732afd78e14a40cd5f6f34001edd500f43bb542991c1305b88842cab5f2fb6b48f0deed4cd72270b2e71cab3c3a56c69b324e3a02d486f937824bb7de553 + languageName: node + linkType: hard + "is-cidr@npm:^4.0.2": version: 4.0.2 resolution: "is-cidr@npm:4.0.2" @@ -4345,7 +4559,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"is-core-module@npm:^2.2.0": +"is-core-module@npm:^2.2.0, is-core-module@npm:^2.4.0": version: 2.4.0 resolution: "is-core-module@npm:2.4.0" dependencies: @@ -4354,6 +4568,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-date-object@npm:^1.0.1": + version: 1.0.4 + resolution: "is-date-object@npm:1.0.4" + checksum: 20ce7b73fda926b4dfad2457e0d6fa04bb0a4cf555456d68918e334cbf80ac30523155adac420be0c8a4bc126fafe0874c4cfc0ffe0d97bac6333a8f02de1b94 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -4407,6 +4628,20 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.1": + version: 2.0.1 + resolution: "is-negative-zero@npm:2.0.1" + checksum: a46f2e0cb5e16fdb8f2011ed488979386d7e68d381966682e3f4c98fc126efe47f26827912baca2d06a02a644aee458b9cba307fb389f6b161e759125db7a3b8 + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.5 + resolution: "is-number-object@npm:1.0.5" + checksum: 8c217b4a16632fc3a900121792e4293f2d2d3c73158895deca4593aa4779995203fc6f31b57b47d90df981936a82ea4e8e8a3af2e5ed646cf979287c1d201089 + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -4463,6 +4698,16 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-regex@npm:^1.1.3": + version: 1.1.3 + resolution: "is-regex@npm:1.1.3" + dependencies: + call-bind: ^1.0.2 + has-symbols: ^1.0.2 + checksum: 19a831a1ba88d09bb43ab30194672e6ae1461caff27254d2c160ed63c95015155ad8784e80995e46a637d0880da8f4ed63b5c3242af1b49c0b5c4666a7a2d3d8 + languageName: node + linkType: hard + "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" @@ -4477,6 +4722,22 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-string@npm:^1.0.5, is-string@npm:^1.0.6": + version: 1.0.6 + resolution: "is-string@npm:1.0.6" + checksum: 9990bf0abf2eea6255f0218f82ba1bcfc8d27923af99bcbb2c77ec5eae4ddbe6c23f1f916d6f19f9e9aa57ec7cd8a91a3e026a34e207c51af35fced1ad50bba8 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + "is-text-path@npm:^1.0.1": version: 1.0.1 resolution: "is-text-path@npm:1.0.1" @@ -5612,6 +5873,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + languageName: node + linkType: hard + "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -5619,7 +5887,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.2": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.2": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -5800,7 +6068,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"normalize-package-data@npm:^2.5.0": +"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" dependencies: @@ -6097,6 +6365,43 @@ fsevents@~2.3.2: languageName: node linkType: hard +"object-inspect@npm:^1.10.3": + version: 1.10.3 + resolution: "object-inspect@npm:1.10.3" + checksum: 9a56db2e0146fe94a7a9c78f677a2a28eec11d0ae13430e0bb2cb908fdd2d3feb7dbba7c638b9b7f88ace01d9a937227a8801709d13afb76613775aeb68632d3 + languageName: node + linkType: hard + +"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object.assign@npm:^4.1.2": + version: 4.1.2 + resolution: "object.assign@npm:4.1.2" + dependencies: + call-bind: ^1.0.0 + define-properties: ^1.1.3 + has-symbols: ^1.0.1 + object-keys: ^1.1.1 + checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 + languageName: node + linkType: hard + +"object.values@npm:^1.1.3": + version: 1.1.4 + resolution: "object.values@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.18.2 + checksum: 1a2f1e9d0bcfc299b8491170a50e6e7ca23392641d7781a8528e96c72f0013ba7ee731792ff8586c8eaec0328acda16c59622924c82c58bd0eb5c4ee67794856 + languageName: node + linkType: hard + "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -6470,6 +6775,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: ^3.0.0 + checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -6526,6 +6840,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"pkg-dir@npm:^2.0.0": + version: 2.0.0 + resolution: "pkg-dir@npm:2.0.0" + dependencies: + find-up: ^2.1.0 + checksum: 8c72b712305b51e1108f0ffda5ec1525a8307e54a5855db8fb1dcf77561a5ae98e2ba3b4814c9806a679f76b2f7e5dd98bde18d07e594ddd9fdd25e9cf242ea1 + languageName: node + linkType: hard + "pkg-dir@npm:^4.1.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -6535,6 +6858,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"pkg-up@npm:^2.0.0": + version: 2.0.0 + resolution: "pkg-up@npm:2.0.0" + dependencies: + find-up: ^2.1.0 + checksum: de4b418175281a082e366ce1a919f032520ee53cf421578b35173f03816f6ec4c19e1552066840bb0988c3e1215859653948efd6ca3507a23f4f44229269500d + languageName: node + linkType: hard + "please-upgrade-node@npm:^3.2.0": version: 3.2.0 resolution: "please-upgrade-node@npm:3.2.0" @@ -6757,6 +7089,16 @@ fsevents@~2.3.2: languageName: node linkType: hard +"read-pkg-up@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg-up@npm:3.0.0" + dependencies: + find-up: ^2.0.0 + read-pkg: ^3.0.0 + checksum: 16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb + languageName: node + linkType: hard + "read-pkg-up@npm:^7.0.0, read-pkg-up@npm:^7.0.1": version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" @@ -6768,6 +7110,17 @@ fsevents@~2.3.2: languageName: node linkType: hard +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: ^4.0.0 + normalize-package-data: ^2.3.2 + path-type: ^3.0.0 + checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 + languageName: node + linkType: hard + "read-pkg@npm:^5.0.0, read-pkg@npm:^5.2.0": version: 5.2.0 resolution: "read-pkg@npm:5.2.0" @@ -6978,7 +7331,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"resolve@^1.10.0, resolve@^1.20.0": +"resolve@^1.10.0, resolve@^1.13.1, resolve@^1.20.0": version: 1.20.0 resolution: "resolve@npm:1.20.0" dependencies: @@ -6988,7 +7341,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin": +"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.13.1#~builtin, resolve@patch:resolve@^1.20.0#~builtin": version: 1.20.0 resolution: "resolve@patch:resolve@npm%3A1.20.0#~builtin::version=1.20.0&hash=00b1ff" dependencies: @@ -7524,6 +7877,26 @@ fsevents@~2.3.2: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.4": + version: 1.0.4 + resolution: "string.prototype.trimend@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + checksum: 17e5aa45c3983f582693161f972c1c1fa4bbbdf22e70e582b00c91b6575f01680dc34e83005b98e31abe4d5d29e0b21fcc24690239c106c7b2315aade6a898ac + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.4": + version: 1.0.4 + resolution: "string.prototype.trimstart@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + checksum: 3fb06818d3cccac5fa3f5f9873d984794ca0e9f6616fae6fcc745885d9efed4e17fe15f832515d9af5e16c279857fdbffdfc489ca4ed577811b017721b30302f + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -8063,6 +8436,18 @@ typescript@^4.3.5: languageName: node linkType: hard +"unbox-primitive@npm:^1.0.1": + version: 1.0.1 + resolution: "unbox-primitive@npm:1.0.1" + dependencies: + function-bind: ^1.1.1 + has-bigints: ^1.0.1 + has-symbols: ^1.0.2 + which-boxed-primitive: ^1.0.2 + checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba + languageName: node + linkType: hard + "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -8206,6 +8591,19 @@ typescript@^4.3.5: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + dependencies: + is-bigint: ^1.0.1 + is-boolean-object: ^1.1.0 + is-number-object: ^1.0.4 + is-string: ^1.0.5 + is-symbol: ^1.0.3 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + "which-module@npm:^2.0.0": version: 2.0.0 resolution: "which-module@npm:2.0.0"