From 8bfc9c74b8b30c48fd9439e1b8baddad46b0e152 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 31 May 2023 19:22:40 -0700 Subject: [PATCH 01/69] API: support watchdogs, multiple scopes --- .cspell.json | 5 +- api/client/newOrgRepo.ts | 2 +- api/index.ts | 2 +- business/organization.ts | 41 +++++ docs/api.md | 2 +- entities/token/token.ts | 13 ++ interfaces/web.ts | 2 +- middleware/apiAad.ts | 5 +- middleware/business/authentication.ts | 4 +- package-lock.json | 249 +++++++++++++------------- package.json | 14 +- 11 files changed, 200 insertions(+), 139 deletions(-) diff --git a/.cspell.json b/.cspell.json index 29851e090..0d74fa353 100644 --- a/.cspell.json +++ b/.cspell.json @@ -38,6 +38,7 @@ "actionsplatforms", "actionsupdated", "actionsused", + "actionsworkflowcount", "actorid", "adal", "additionals", @@ -278,8 +279,8 @@ "ghid", "GHID", "ghname", - "ghowners", "ghossapis", + "ghowners", "GHPI", "ghpimigrationphase", "ghrp", @@ -528,6 +529,7 @@ "organizationlogin", "organizationmembercache", "organizationname", + "organizationrunners", "organizationsetting", "organizationsettings", "orgid", @@ -661,6 +663,7 @@ "revokedbycorporateid", "rootdir", "rubygem", + "RUNNERDATA", "runtimes", "samplescollaboratorusername", "samplescontact", diff --git a/api/client/newOrgRepo.ts b/api/client/newOrgRepo.ts index 280dd8879..9f7317358 100644 --- a/api/client/newOrgRepo.ts +++ b/api/client/newOrgRepo.ts @@ -180,7 +180,7 @@ router.post('/repo/:repo', asyncHandler(discoverUserIdentities), asyncHandler(cr export async function createRepositoryFromClient(req: ILocalApiRequest, res, next) { const providers = getProviders(req); const { insights, diagnosticsDrop, customizedNewRepositoryLogic, graphProvider } = providers; - const individualContext = req.individualContext || req.apiContext; + const individualContext = req.watchdogContextOverride || req.individualContext || req.apiContext; const config = getProviders(req).config; const organization = (req.organization || (req as any).aeOrganization) as Organization; const existingRepoId = req.body.existingrepoid; diff --git a/api/index.ts b/api/index.ts index a26d7f502..a90a53d73 100644 --- a/api/index.ts +++ b/api/index.ts @@ -90,7 +90,7 @@ router.post('/:org/repos', aadAndCustomProviders); router.post( '/:org/repos', - requireAadApiAuthorizedScope('createRepo'), + requireAadApiAuthorizedScope(['repo/create', 'createRepo']), function (req: IApiRequest, res, next) { const orgName = req.params.org; if (!req.apiKeyToken.organizationScopes) { diff --git a/business/organization.ts b/business/organization.ts index 3a28fa96f..d16080155 100644 --- a/business/organization.ts +++ b/business/organization.ts @@ -137,6 +137,24 @@ export interface IGitHubOrganizationResponse { url: string; } +export interface RunnerData { + busy: boolean; + id: number; + name: string; + os: string; + status: string; + labels: { + id: number; + name: string; + type: string; + }; +} + +export interface IGitHubOrganizationRunners { + total_count: number; + runners: RunnerData[]; +} + export class Organization { private _name: string; private _baseUrl: string; @@ -411,6 +429,29 @@ export class Organization { return repositories; } + async getOrgRunners(options?: ICacheOptions): Promise { + options = options || {}; + const operations = throwIfNotGitHubCapable(this._operations); + const github = operations.github; + const orgName = this.name; + const parameters = { + orgName, + }; + const cacheOptions: ICacheOptions = { + maxAgeSeconds: 1, // getMaxAgeSeconds(operations, CacheDefault.accountDetailStaleSeconds, options), + }; + const runnerData = await operations.github.request( + this.authorize(AppPurpose.ActionsData), + 'GET /orgs/:orgName/actions/runners', + parameters, + cacheOptions + ); + return { + runners: runnerData.runners, + total_count: runnerData.total_count, + }; + } + get priority(): string { return this._settings.properties['priority'] || 'secondary'; } diff --git a/docs/api.md b/docs/api.md index 261e6b6aa..44d5869f4 100644 --- a/docs/api.md +++ b/docs/api.md @@ -261,7 +261,7 @@ Status: 201 OK ### Create a repo -> This API requires that your API key be authorized for the `createRepo` scope +> This API requires that your API key be authorized for the `repo/create` scope This example uses a pure POST request plus headers for authorization: diff --git a/entities/token/token.ts b/entities/token/token.ts index 0c427cee0..c036d1a1e 100644 --- a/entities/token/token.ts +++ b/entities/token/token.ts @@ -167,6 +167,19 @@ export class PersonalAccessToken implements IObjectWithDefinedKeys, ITokenEntity return apis.includes(scope.toLowerCase()); } + hasAnyScope(scope: string[]) { + if (!this.scopes) { + return false; + } + const apis = this.scopes.toLowerCase().split(','); + for (let i = 0; i < scope.length; i++) { + if (apis.includes(scope[i].toLowerCase())) { + return true; + } + } + return false; + } + hasOrganizationScope(orgName: string) { if (!this.organizationScopes) { return false; diff --git a/interfaces/web.ts b/interfaces/web.ts index 18448f877..f9cc224e5 100644 --- a/interfaces/web.ts +++ b/interfaces/web.ts @@ -56,9 +56,9 @@ export interface ReposAppRequest extends Request { correlationId?: string; scrubbedUrl?: string; - // FUTURE: apiContext: IndividualContext; individualContext: IndividualContext; + watchdogContextOverride?: IndividualContext; oauthAccessToken: AccessToken; } diff --git a/middleware/apiAad.ts b/middleware/apiAad.ts index a44c24dc1..d09203306 100644 --- a/middleware/apiAad.ts +++ b/middleware/apiAad.ts @@ -14,10 +14,11 @@ import getCompanySpecificDeployment from './companySpecificDeployment'; // CONSIDER: Caching of signing keys -export function requireAadApiAuthorizedScope(scope: string) { +export function requireAadApiAuthorizedScope(scope: string | string[]) { return (req: IApiRequest, res, next) => { const { apiKeyToken } = req; - if (!apiKeyToken.hasScope(scope)) { + const scopes = typeof scope === 'string' ? [scope] : scope; + if (!apiKeyToken.hasAnyScope(scopes)) { return next(jsonError(`Not authorized for ${scope}`, 403)); } return next(); diff --git a/middleware/business/authentication.ts b/middleware/business/authentication.ts index 2c371c112..3d6aaa520 100644 --- a/middleware/business/authentication.ts +++ b/middleware/business/authentication.ts @@ -24,9 +24,9 @@ export async function requireAuthenticatedUserOrSignInExcluding( res, next ) { - const baseUrl = req.baseUrl; + const url = req.url; for (let i = 0; i < exclusionPaths.length; i++) { - if (baseUrl.startsWith(exclusionPaths[i])) { + if (url.startsWith(exclusionPaths[i])) { console.log(`${req.method} ${req.baseUrl} excluded from auth by prefix: ${exclusionPaths[i]}`); return next(); } diff --git a/package-lock.json b/package-lock.json index 1091a3c6d..529109eb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.0.3", + "dotenv": "16.1.2", "express": "4.18.2", "express-async-handler": "1.1.4", "express-session": "1.17.3", @@ -50,7 +50,7 @@ "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.2", + "nodemailer": "6.9.3", "object-path": "0.11.8", "octicons": "5.0.1", "passport": "0.6.0", @@ -72,11 +72,11 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/debug": "4.1.7", + "@types/debug": "4.1.8", "@types/express": "4.17.17", "@types/express-session": "1.17.7", - "@types/jest": "29.5.1", - "@types/lodash": "4.14.194", + "@types/jest": "29.5.2", + "@types/lodash": "4.14.195", "@types/luxon": "3.3.0", "@types/memory-cache": "0.2.2", "@types/morgan": "1.9.4", @@ -92,8 +92,8 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.7", - "@typescript-eslint/parser": "5.59.7", + "@typescript-eslint/eslint-plugin": "5.59.8", + "@typescript-eslint/parser": "5.59.8", "cspell": "6.31.1", "eslint": "8.41.0", "eslint-config-prettier": "8.8.0", @@ -2750,9 +2750,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, "dependencies": { "@types/ms": "*" @@ -2830,9 +2830,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2840,9 +2840,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/jsonwebtoken": { @@ -2854,9 +2854,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.194", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", - "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", "dev": true }, "node_modules/@types/luxon": { @@ -3145,15 +3145,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz", - "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/type-utils": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3179,14 +3179,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", - "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -3206,13 +3206,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", - "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3223,13 +3223,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz", - "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3250,9 +3250,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", - "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3263,13 +3263,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", - "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3290,17 +3290,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz", - "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3316,12 +3316,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", - "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4845,11 +4845,14 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.2.tgz", + "integrity": "sha512-RiNjjDF5yr9NtjqJqmWYA/XZShmt3r8FtJgAaqTiYqb99SqT0+aw5xAwOIvjMyXsH/C9/fLNafFkkZDwRi1KHA==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/dtrace-provider": { @@ -8335,9 +8338,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", - "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==", + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", + "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==", "engines": { "node": ">=6.0.0" } @@ -12967,9 +12970,9 @@ } }, "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, "requires": { "@types/ms": "*" @@ -13047,9 +13050,9 @@ } }, "@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13057,9 +13060,9 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/jsonwebtoken": { @@ -13071,9 +13074,9 @@ } }, "@types/lodash": { - "version": "4.14.194", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", - "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", "dev": true }, "@types/luxon": { @@ -13348,15 +13351,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz", - "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/type-utils": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -13366,53 +13369,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", - "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", - "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/type-utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz", - "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", - "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", - "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13421,28 +13424,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz", - "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", - "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, @@ -14581,9 +14584,9 @@ } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.2.tgz", + "integrity": "sha512-RiNjjDF5yr9NtjqJqmWYA/XZShmt3r8FtJgAaqTiYqb99SqT0+aw5xAwOIvjMyXsH/C9/fLNafFkkZDwRi1KHA==" }, "dtrace-provider": { "version": "0.8.8", @@ -17167,9 +17170,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", - "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==" + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", + "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==" }, "normalize-path": { "version": "3.0.0", diff --git a/package.json b/package.json index a5214ec4a..718843739 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.0.3", + "dotenv": "16.1.2", "express": "4.18.2", "express-async-handler": "1.1.4", "express-session": "1.17.3", @@ -106,7 +106,7 @@ "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.2", + "nodemailer": "6.9.3", "object-path": "0.11.8", "octicons": "5.0.1", "passport": "0.6.0", @@ -128,11 +128,11 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/debug": "4.1.7", + "@types/debug": "4.1.8", "@types/express": "4.17.17", "@types/express-session": "1.17.7", - "@types/jest": "29.5.1", - "@types/lodash": "4.14.194", + "@types/jest": "29.5.2", + "@types/lodash": "4.14.195", "@types/luxon": "3.3.0", "@types/memory-cache": "0.2.2", "@types/morgan": "1.9.4", @@ -148,8 +148,8 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.7", - "@typescript-eslint/parser": "5.59.7", + "@typescript-eslint/eslint-plugin": "5.59.8", + "@typescript-eslint/parser": "5.59.8", "cspell": "6.31.1", "eslint": "8.41.0", "eslint-config-prettier": "8.8.0", From 3d810e750830354092a0901438375d86a9f5e4c3 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 1 Jun 2023 19:10:52 -0700 Subject: [PATCH 02/69] =?UTF-8?q?=F0=9F=A7=B0=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 90 +++++++++++++++++++++++------------------------ package.json | 8 ++--- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 529109eb6..654269566 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.1.2", + "dotenv": "16.1.3", "express": "4.18.2", "express-async-handler": "1.1.4", "express-session": "1.17.3", @@ -61,7 +61,7 @@ "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.6", + "redis": "4.6.7", "secure-compare": "3.0.1", "semver": "7.5.1", "serve-favicon": "2.5.0", @@ -80,7 +80,7 @@ "@types/luxon": "3.3.0", "@types/memory-cache": "0.2.2", "@types/morgan": "1.9.4", - "@types/node": "20.2.3", + "@types/node": "20.2.5", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -108,7 +108,7 @@ "ts-jest": "29.1.0", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.0.4" + "typescript": "5.1.3" }, "engines": { "node": ">=16" @@ -2551,9 +2551,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.7.tgz", - "integrity": "sha512-gaOBOuJPjK5fGtxSseaKgSvjiZXQCdLlGg9WYQst+/GRUjmXaiB5kVkeQMRtPc7Q2t93XZcJfBMSwzs/XS9UZw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", + "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -2580,9 +2580,9 @@ } }, "node_modules/@redis/search": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", - "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", + "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", "peerDependencies": { "@redis/client": "^1.0.0" } @@ -2892,9 +2892,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz", - "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==" + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -4845,9 +4845,9 @@ } }, "node_modules/dotenv": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.2.tgz", - "integrity": "sha512-RiNjjDF5yr9NtjqJqmWYA/XZShmt3r8FtJgAaqTiYqb99SqT0+aw5xAwOIvjMyXsH/C9/fLNafFkkZDwRi1KHA==", + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.3.tgz", + "integrity": "sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==", "engines": { "node": ">=12" }, @@ -9317,15 +9317,15 @@ } }, "node_modules/redis": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.6.tgz", - "integrity": "sha512-aLs2fuBFV/VJ28oLBqYykfnhGGkFxvx0HdCEBYdJ99FFbSEMZ7c1nVKwR6ZRv+7bb7JnC0mmCzaqu8frgOYhpA==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", + "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.7", + "@redis/client": "1.5.8", "@redis/graph": "1.1.0", "@redis/json": "1.0.4", - "@redis/search": "1.1.2", + "@redis/search": "1.1.3", "@redis/time-series": "1.0.4" } }, @@ -10300,16 +10300,16 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/uc.micro": { @@ -12783,9 +12783,9 @@ "requires": {} }, "@redis/client": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.7.tgz", - "integrity": "sha512-gaOBOuJPjK5fGtxSseaKgSvjiZXQCdLlGg9WYQst+/GRUjmXaiB5kVkeQMRtPc7Q2t93XZcJfBMSwzs/XS9UZw==", + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", + "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", "requires": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -12805,9 +12805,9 @@ "requires": {} }, "@redis/search": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", - "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", + "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", "requires": {} }, "@redis/time-series": { @@ -13112,9 +13112,9 @@ "dev": true }, "@types/node": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz", - "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==" + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "@types/node-fetch": { "version": "2.6.2", @@ -14584,9 +14584,9 @@ } }, "dotenv": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.2.tgz", - "integrity": "sha512-RiNjjDF5yr9NtjqJqmWYA/XZShmt3r8FtJgAaqTiYqb99SqT0+aw5xAwOIvjMyXsH/C9/fLNafFkkZDwRi1KHA==" + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.3.tgz", + "integrity": "sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==" }, "dtrace-provider": { "version": "0.8.8", @@ -17901,15 +17901,15 @@ } }, "redis": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.6.tgz", - "integrity": "sha512-aLs2fuBFV/VJ28oLBqYykfnhGGkFxvx0HdCEBYdJ99FFbSEMZ7c1nVKwR6ZRv+7bb7JnC0mmCzaqu8frgOYhpA==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", + "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", "requires": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.7", + "@redis/client": "1.5.8", "@redis/graph": "1.1.0", "@redis/json": "1.0.4", - "@redis/search": "1.1.2", + "@redis/search": "1.1.3", "@redis/time-series": "1.0.4" } }, @@ -18636,9 +18636,9 @@ } }, "typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index 718843739..f9748d37c 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.1.2", + "dotenv": "16.1.3", "express": "4.18.2", "express-async-handler": "1.1.4", "express-session": "1.17.3", @@ -117,7 +117,7 @@ "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.6", + "redis": "4.6.7", "secure-compare": "3.0.1", "semver": "7.5.1", "serve-favicon": "2.5.0", @@ -136,7 +136,7 @@ "@types/luxon": "3.3.0", "@types/memory-cache": "0.2.2", "@types/morgan": "1.9.4", - "@types/node": "20.2.3", + "@types/node": "20.2.5", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -164,7 +164,7 @@ "ts-jest": "29.1.0", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.0.4" + "typescript": "5.1.3" }, "engines": { "node": ">=16" From f51a81f6a497e73e80820a77fcfab7451f8b9926 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 18:50:40 +0000 Subject: [PATCH 03/69] chore(deps): bump fast-xml-parser from 4.0.11 to 4.2.4 Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.0.11 to 4.2.4. - [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases) - [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/commits) --- updated-dependencies: - dependency-name: fast-xml-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 654269566..1fa5d5303 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5556,18 +5556,24 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", + "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" } }, "node_modules/fastq": { @@ -15112,9 +15118,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", + "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", "requires": { "strnum": "^1.0.5" } From 0549ef04fd5ffdec74be0b7d023e1896a2e40e55 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 8 Jun 2023 09:30:13 -0700 Subject: [PATCH 04/69] Enterprise SAML calls --- business/enterprise.ts | 190 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 business/enterprise.ts diff --git a/business/enterprise.ts b/business/enterprise.ts new file mode 100644 index 000000000..1f2966bb3 --- /dev/null +++ b/business/enterprise.ts @@ -0,0 +1,190 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { IProviders } from '../interfaces'; + +// TODO: paginate across enterprise fix + support iterators + +export type EnterpriseSamlExternalIdentityBasics = { + id: string; + user: { + login: string; + }; + samlIdentity: { + nameId: string; + }; +}; + +export type EnterpriseSamlExternalIdentityNode = { + node: EnterpriseSamlExternalIdentityBasics; +}; + +export default class GitHubEnterprise { + constructor(private providers: IProviders, public slug: string, private administrativeToken: string) {} + + async getGitHubLoginForUserPrincipalName(userPrincipalName: string): Promise { + const node = await this.getSamlNodeFromUserPrincipalName(userPrincipalName); + return node?.user?.login; + } + + async getSamlNodeFromUserPrincipalName( + userPrincipalName: string + ): Promise { + const github = this.providers.github; + try { + const response = await github.graphql( + this.administrativeToken, + queries.getIdentityFromExternal, + { + enterpriseName: this.slug, + userPrincipalName, + }, + { + paginate: false, + } + ); + const nodes = response?.enterprise?.ownerInfo?.samlIdentityProvider?.externalIdentities + ?.edges as EnterpriseSamlExternalIdentityNode[]; + if (nodes.length > 0) { + return nodes[0].node; + } + } catch (error) { + throw error; + } + } + + async getSamlUserPrincipalNameForGitHubLogin(login: string): Promise { + const node = await this.getSamlNodeForGitHubLogin(login); + return node?.samlIdentity?.nameId; + } + + async getSamlNodeForGitHubLogin(login: string): Promise { + const github = this.providers.github; + try { + const response = await github.graphql( + this.administrativeToken, + queries.getIdentityFromGitHubLogin, + { + enterpriseName: this.slug, + login, + }, + { + paginate: false, + } + ); + const nodes = response?.enterprise?.ownerInfo?.samlIdentityProvider?.externalIdentities + ?.edges as EnterpriseSamlExternalIdentityNode[]; + if (nodes.length > 0) { + return nodes[0].node; + } + } catch (error) { + throw error; + } + } + + async getSamlMemberExternalIdentities(): Promise { + const fixedFirstFieldsCount = 8; + const github = this.providers.github; + try { + const response = await github.graphql( + this.administrativeToken, + queries.paginate, + { + enterpriseName: this.slug, + // id: this._id, + }, + { + paginate: false, // true, + } + ); + const nodes = response?.enterprise?.ownerInfo?.samlIdentityProvider?.externalIdentities + ?.edges as EnterpriseSamlExternalIdentityNode[]; + return nodes.map((node) => node.node); + } catch (error) { + throw error; + } + } +} + +const queries = { + getIdentityFromGitHubLogin: ` + query getIdentity($enterpriseName: String!, $login: String!) { + enterprise(slug: $enterpriseName) { + ownerInfo { + samlIdentityProvider { + externalIdentities(first: 5, login: $login) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + user { + login + } + samlIdentity { + nameId + } + } + } + } + } + } + } + } + `, + getIdentityFromExternal: ` + query getIdentity($enterpriseName: String!, $userPrincipalName: String!) { + enterprise(slug: $enterpriseName) { + ownerInfo { + samlIdentityProvider { + externalIdentities(first: 5, userName: $userPrincipalName) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + user { + login + } + samlIdentity { + nameId + } + } + } + } + } + } + } + } + `, + paginate: ` + query paginate($cursor: String, $enterpriseName: String!) { + enterprise(slug: $enterpriseName) { + ownerInfo { + samlIdentityProvider { + externalIdentities(after: $cursor, first: 100) { + pageInfo { + hasNextPage + endCursor + } + edges { + node { + user { + login + } + samlIdentity { + nameId + } + } + } + } + } + } + } + } + `, +}; From deb80e82be9790a137148da2fd4b4164c7c20335 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 8 Jun 2023 09:30:25 -0700 Subject: [PATCH 05/69] Annotation updates --- api/client/index.ts | 8 +- api/client/organization/annotations.ts | 14 +- api/client/organizations.ts | 76 +++-- api/createRepo.ts | 12 +- business/operations/index.ts | 7 +- business/organization.ts | 52 +++- entities/organizationAnnotation.ts | 18 +- interfaces/github/repos.ts | 11 +- .../github/ensureOrganizationProfile.ts | 52 ++++ package-lock.json | 266 +++++++++--------- package.json | 17 +- 11 files changed, 343 insertions(+), 190 deletions(-) create mode 100644 middleware/github/ensureOrganizationProfile.ts diff --git a/api/client/index.ts b/api/client/index.ts index e1b4538b3..cf2f3d822 100644 --- a/api/client/index.ts +++ b/api/client/index.ts @@ -12,6 +12,7 @@ import { requireAccessTokenClient, setIdentity, jsonError, + requireAuthenticatedUserOrSignIn, } from '../../middleware'; import { getProviders } from '../../transitional'; @@ -36,7 +37,12 @@ const router: Router = Router(); router.use((req: ReposAppRequest, res, next) => { const { config } = getProviders(req); if (config?.features?.allowApiClient) { - return req.isAuthenticated() ? next() : next(jsonError('Session is not authenticated', 401)); + if (req.isAuthenticated()) { + return next(); + } else if (req.query.authenticate === 'session') { + return requireAuthenticatedUserOrSignIn(req, res, next); + } + return next(jsonError('Session is not authenticated', 401)); } return next(jsonError('Client API features unavailable', 403)); }); diff --git a/api/client/organization/annotations.ts b/api/client/organization/annotations.ts index 834e2c130..1f0156648 100644 --- a/api/client/organization/annotations.ts +++ b/api/client/organization/annotations.ts @@ -19,10 +19,12 @@ import { import { IOrganizationAnnotationChange, OrganizationAnnotation, + scrubOrganizationAnnotation, } from '../../../entities/organizationAnnotation'; import { ErrorHelper, getProviders } from '../../../transitional'; import { IndividualContext } from '../../../business/user'; import { IProviders } from '../../../interfaces'; +import { ensureOrganizationProfileMiddleware } from '../../../middleware/github/ensureOrganizationProfile'; const router: Router = Router(); @@ -57,19 +59,15 @@ router.get( const { annotations } = req; // Limited redaction const isSystemAdministrator = await getIsCorporateAdministrator(req); - if (!isSystemAdministrator && annotations.administratorNotes) { - annotations.administratorNotes = '*****'; - } - if (!isSystemAdministrator && annotations?.history?.length > 0) { - delete annotations.history; - } return res.json({ isSystemAdministrator, - annotations, + annotations: scrubOrganizationAnnotation(annotations, isSystemAdministrator), }); }) ); +router.use(ensureOrganizationProfileMiddleware); + async function ensureAnnotations(req: IRequestWithOrganizationAnnotations, res, next) { if (!req.annotations) { const { organizationAnnotationsProvider } = getProviders(req); @@ -80,7 +78,7 @@ async function ensureAnnotations(req: IRequestWithOrganizationAnnotations, res, await organizationAnnotationsProvider.insertAnnotations(annotations); req.annotations = annotations; } catch (error) { - return next(error); + return next(jsonError(error)); } } return next(); diff --git a/api/client/organizations.ts b/api/client/organizations.ts index fac7fcafc..153c7eb19 100644 --- a/api/client/organizations.ts +++ b/api/client/organizations.ts @@ -6,8 +6,6 @@ import { Router } from 'express'; import asyncHandler from 'express-async-handler'; -import memoryCache from 'memory-cache'; - import { jsonError } from '../../middleware'; import { CreateError, ErrorHelper, getProviders } from '../../transitional'; import { ReposAppRequest } from '../../interfaces'; @@ -18,13 +16,21 @@ import { OrganizationManagementType, } from '../../middleware/business/organization'; -import { IGitHubOrganizationResponse } from '../../business'; -import { OrganizationAnnotation } from '../../entities/organizationAnnotation'; +import type { GitHubOrganizationResponseSanitized } from '../../business'; +import { + OrganizationAnnotation, + OrganizationAnnotationProperty, + scrubOrganizationAnnotation, +} from '../../entities/organizationAnnotation'; +import { + getOrganizationProfileViaMemoryCache, + setOrganizationProfileForRequest, +} from '../../middleware/github/ensureOrganizationProfile'; const router: Router = Router(); type HighlightedOrganization = { - profile: IGitHubOrganizationResponse; + profile: GitHubOrganizationResponseSanitized; annotations: OrganizationAnnotation; }; @@ -47,33 +53,53 @@ router.get( router.get( '/annotations', asyncHandler(async (req: ReposAppRequest, res, next) => { - const { operations, organizationAnnotationsProvider } = getProviders(req); - const cacheTimeMs = 1000 * 60 * 60 * 24; + const providers = getProviders(req); + const { organizationAnnotationsProvider } = providers; + const projection = typeof req.query.projection === 'string' ? req.query.projection : undefined; + // governance filter: a specific value or unset cohort + const governance = + typeof req.query.governance === 'string' ? req.query.governance?.toLowerCase() : undefined; + const filterByGovernance = governance !== undefined; try { const highlights: HighlightedOrganization[] = []; - const annotations = await organizationAnnotationsProvider.getAllAnnotations(); + let annotations = await organizationAnnotationsProvider.getAllAnnotations(); + if (filterByGovernance) { + annotations = annotations.filter((annotation) => { + const value = annotation.getProperty(OrganizationAnnotationProperty.Governance); + return governance ? value === governance : !value; + }); + } for (const annotation of annotations) { try { - const key = `org:profile:${annotation.organizationId}`; - let profile = memoryCache.get(key) as IGitHubOrganizationResponse; - if (!profile) { - const details = await operations.getOrganizationProfileById(Number(annotation.organizationId)); - details.cost && delete details.cost; - details.headers && delete details.headers; - profile = details; - memoryCache.put(key, details, cacheTimeMs); - } - const scrubbedAnnotations = { ...annotation }; - delete scrubbedAnnotations.administratorNotes; - delete scrubbedAnnotations.history; + const profile = await getOrganizationProfileViaMemoryCache(providers, annotation.organizationId); highlights.push({ profile, - annotations: scrubbedAnnotations as OrganizationAnnotation, + annotations: scrubOrganizationAnnotation(annotation), }); } catch (error) { // we ignore any individual resolution error } } + if (projection) { + let projected = highlights.map((highlight) => { + const profile = highlight.profile; + const annotations = highlight.annotations; + if (profile[projection]) { + return profile[projection]; + } else if (annotations.getProperty(projection)) { + return annotations.getProperty(projection); + } else if (annotations.hasFeature(projection)) { + return true; + } + return null; + }); + if (projected.length >= 1 && typeof projected[0] === 'string') { + projected = projected.sort((a, b) => { + return a.localeCompare(b); + }); + } + return res.json(projected); + } return res.json({ highlights: highlights.sort((a, b) => { return a.profile.login.localeCompare(b.profile.login); @@ -122,10 +148,9 @@ router.use( } try { const org = operations.getUncontrolledOrganization(orgName); - const details = await org.getDetails(); - details.cost && delete details.cost; - details.headers && delete details.headers; - req.organizationProfile = details; + req.organizationManagementType = OrganizationManagementType.Unmanaged; + req.organization = org; + await setOrganizationProfileForRequest(req); } catch (orgProfileError) { if (ErrorHelper.IsNotFound(orgProfileError)) { return next(CreateError.NotFound(`The organization ${orgName} does not exist`)); @@ -133,7 +158,6 @@ router.use( return next(orgProfileError); } } - req.organizationManagementType = OrganizationManagementType.Unmanaged; return next(); }) ); diff --git a/api/createRepo.ts b/api/createRepo.ts index c986bc293..bb7b39f10 100644 --- a/api/createRepo.ts +++ b/api/createRepo.ts @@ -624,14 +624,22 @@ async function sendEmail( req.insights.trackException({ exception: renderError, properties: { - content: contentOptions, + correlationId, + existingRepoId, + orgName: repository.organization.name, + repoName: repository.name, + results: repoCreateResults, eventName: 'ApiRepoCreateMailRenderFailure', }, }); throw renderError; } const customData = { - content: contentOptions, + correlationId, + existingRepoId, + orgName: repository.organization.name, + repoName: repository.name, + results: repoCreateResults, receipt: null, eventName: undefined, }; diff --git a/business/operations/index.ts b/business/operations/index.ts index 69e1f4a99..482fcc4cd 100644 --- a/business/operations/index.ts +++ b/business/operations/index.ts @@ -8,7 +8,7 @@ import throat from 'throat'; import { Account } from '../account'; import { GraphManager } from '../graphManager'; -import { IGitHubOrganizationResponse, Organization } from '../organization'; +import { GitHubOrganizationResponse, Organization } from '../organization'; import { GitHubTokenManager } from '../githubApps/tokenManager'; import RenderHtmlMail from '../../lib/emailRender'; import { wrapError, sortByCaseInsensitive } from '../../utils'; @@ -906,10 +906,7 @@ export class Operations } } - async getOrganizationProfileById( - id: number, - options?: ICacheOptions - ): Promise { + async getOrganizationProfileById(id: number, options?: ICacheOptions): Promise { options = options || {}; if (!id) { throw new Error('Must provide a repository ID to retrieve the repository.'); diff --git a/business/organization.ts b/business/organization.ts index d16080155..0dbfa5fe9 100644 --- a/business/organization.ts +++ b/business/organization.ts @@ -101,7 +101,7 @@ export interface IGitHubOrganizationPlanResponse { space: number; } -export interface IGitHubOrganizationResponse { +export type GitHubOrganizationResponse = { avatar_url?: string; billing_email?: string; blog?: string; @@ -135,6 +135,50 @@ export interface IGitHubOrganizationResponse { type: string; updated_at: string; url: string; +}; + +// the only fields we want in this type based on GitHubOrganizationResponse are avatar_url, blog, company, created_at, description, email, id, location, login, name, updated_at +export type GitHubOrganizationResponseSanitized = Pick< + GitHubOrganizationResponse, + | 'avatar_url' + | 'blog' + | 'company' + | 'created_at' + | 'description' + | 'email' + | 'id' + | 'location' + | 'login' + | 'name' + | 'updated_at' +>; + +const sanitizedFields = [ + 'avatar_url', + 'blog', + 'company', + 'created_at', + 'description', + 'email', + 'id', + 'location', + 'login', + 'name', + 'updated_at', +]; + +export function getOrganizationDetailsSanitized( + details: GitHubOrganizationResponse +): GitHubOrganizationResponseSanitized { + if (details) { + const sanitized = {} as GitHubOrganizationResponseSanitized; + for (const field of sanitizedFields) { + if (details[field]) { + sanitized[field] = details[field]; + } + } + return sanitized; + } } export interface RunnerData { @@ -167,7 +211,7 @@ export class Organization { private _usesGitHubApp: boolean; private _settings: OrganizationSetting; - private _entity: IGitHubOrganizationResponse; + private _entity: GitHubOrganizationResponse; private _organizationSudo: IOrganizationSudo; @@ -715,7 +759,7 @@ export class Organization { } } - async getDetails(): Promise { + async getDetails(): Promise { const operations = throwIfNotGitHubCapable(this._operations); const parameters = { org: this.name, @@ -726,7 +770,7 @@ export class Organization { this.id = entity.id; } this._entity = entity; - return entity as IGitHubOrganizationResponse; + return entity as GitHubOrganizationResponse; } catch (error) { throw wrapError(error, `Could not get details about the ${this.name} organization: ${error.message}`); } diff --git a/entities/organizationAnnotation.ts b/entities/organizationAnnotation.ts index 0fe6daf74..c373ecc33 100644 --- a/entities/organizationAnnotation.ts +++ b/entities/organizationAnnotation.ts @@ -41,7 +41,10 @@ const defaultPostgresTableName = 'organizationannotations'; const organizationId = 'organizationId'; const primaryKeyFieldName = organizationId; -export enum OrganizationAnnotationProperty {} +export enum OrganizationAnnotationProperty { + Governance = 'governance', +} + export enum OrganizationAnnotationFeature {} export interface IOrganizationAnnotationChange { @@ -52,6 +55,19 @@ export interface IOrganizationAnnotationChange { text: string; } +export function scrubOrganizationAnnotation( + annotation: OrganizationAnnotation, + isSystemAdministrator?: boolean +): OrganizationAnnotation { + if (isSystemAdministrator === true || !annotation) { + return annotation; + } + const scrubbedAnnotations = { ...annotation }; + delete scrubbedAnnotations.administratorNotes; + delete scrubbedAnnotations.history; + return scrubbedAnnotations as OrganizationAnnotation; +} + interface IOrganizationAnnotationMetadataProperties { // organizationId: string; // primary ID diff --git a/interfaces/github/repos.ts b/interfaces/github/repos.ts index 976f42b00..37ceaf7c1 100644 --- a/interfaces/github/repos.ts +++ b/interfaces/github/repos.ts @@ -16,6 +16,7 @@ import { GitHubSortDirection, } from '../../lib/github/collections'; import type { IRequestTeamPermissions } from '../../middleware/github/teamPermissions'; +import { CreateError } from '../../transitional'; export enum GitHubRepositoryPermission { Pull = 'pull', @@ -219,7 +220,9 @@ export interface IRepositorySearchOptions { export enum GitHubCollaboratorPermissionLevel { Admin = 'admin', + Maintain = 'maintain', Write = 'write', + Triage = 'triage', Read = 'read', None = 'none', } @@ -232,13 +235,17 @@ export function ConvertGitHubCollaboratorPermissionLevelToGitHubRepositoryPermis return null; case GitHubCollaboratorPermissionLevel.Admin: return GitHubRepositoryPermission.Admin; + case GitHubCollaboratorPermissionLevel.Maintain: + return GitHubRepositoryPermission.Maintain; case GitHubCollaboratorPermissionLevel.Write: return GitHubRepositoryPermission.Push; + case GitHubCollaboratorPermissionLevel.Triage: + return GitHubRepositoryPermission.Triage; case GitHubCollaboratorPermissionLevel.Read: return GitHubRepositoryPermission.Pull; default: - throw new Error( - `ConvertGitHubCollaboratorPermissionLevelToGitHubRepositoryPermission unrecognized value ${level} cannot be translated` + throw CreateError.InvalidParameters( + `Unrecognized GitHub permission value ${level}, current value cannot be translated (ConvertGitHubCollaboratorPermissionLevelToGitHubRepositoryPermission)` ); } } diff --git a/middleware/github/ensureOrganizationProfile.ts b/middleware/github/ensureOrganizationProfile.ts new file mode 100644 index 000000000..d38c50f69 --- /dev/null +++ b/middleware/github/ensureOrganizationProfile.ts @@ -0,0 +1,52 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import asyncHandler from 'express-async-handler'; +import memoryCache from 'memory-cache'; + +import type { IReposAppRequestWithOrganizationManagementType } from '../business/organization'; +import { CreateError, getProviders } from '../../transitional'; +import { + getOrganizationDetailsSanitized, + type GitHubOrganizationResponseSanitized, +} from '../../business/organization'; +import type { IProviders } from '../../interfaces'; + +export async function setOrganizationProfileForRequest(req: IReposAppRequestWithOrganizationManagementType) { + const providers = getProviders(req); + const org = req.organization; + if (!org) { + throw CreateError.InvalidParameters('No organization instance available in the request'); + } + if (!req.organizationProfile && org?.id) { + req.organizationProfile = await getOrganizationProfileViaMemoryCache(providers, String(org.id)); + } + if (!req.organizationProfile && org) { + req.organizationProfile = getOrganizationDetailsSanitized(await org.getDetails()); + } +} + +export async function getOrganizationProfileViaMemoryCache(providers: IProviders, organizationId: string) { + const { operations } = providers; + const cacheTimeMs = 1000 * 60 * 60 * 24; + + const key = `org:profile:${organizationId}`; + let profile = memoryCache.get(key) as GitHubOrganizationResponseSanitized; + if (!profile) { + const details = getOrganizationDetailsSanitized( + await operations.getOrganizationProfileById(Number(organizationId)) + ); + profile = details; + memoryCache.put(key, details, cacheTimeMs); + } + return profile; +} + +async function ensureOrganizationProfile(req: IReposAppRequestWithOrganizationManagementType, res, next) { + await setOrganizationProfileForRequest(req); + return next(); +} + +export const ensureOrganizationProfileMiddleware = asyncHandler(ensureOrganizationProfile); diff --git a/package-lock.json b/package-lock.json index 654269566..fbc6674b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,11 +17,11 @@ "@azure/storage-blob": "12.14.0", "@azure/storage-queue": "12.13.0", "@octokit/auth-app": "4.0.13", - "@octokit/plugin-paginate-graphql": "2.0.1", + "@octokit/plugin-paginate-graphql": "2.0.3", "@octokit/request": "6.2.5", "@octokit/rest": "19.0.11", "app-root-path": "3.1.0", - "applicationinsights": "2.6.0", + "applicationinsights": "2.7.0", "async-prompt": "1.0.1", "axios": "1.4.0", "basic-auth": "2.0.1", @@ -32,7 +32,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.1.3", + "dotenv": "16.1.4", "express": "4.18.2", "express-async-handler": "1.1.4", "express-session": "1.17.3", @@ -86,16 +86,16 @@ "@types/passport": "1.0.12", "@types/passport-azure-ad": "4.3.1", "@types/passport-github": "1.1.7", - "@types/pg": "8.10.1", + "@types/pg": "8.10.2", "@types/pug": "2.0.6", "@types/recursive-readdir": "2.2.1", "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.8", - "@typescript-eslint/parser": "5.59.8", + "@typescript-eslint/eslint-plugin": "5.59.9", + "@typescript-eslint/parser": "5.59.9", "cspell": "6.31.1", - "eslint": "8.41.0", + "eslint": "8.42.0", "eslint-config-prettier": "8.8.0", "eslint-plugin-n": "16.0.0", "eslint-plugin-prettier": "4.2.1", @@ -1590,9 +1590,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1640,9 +1640,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2325,9 +2325,9 @@ "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" }, "node_modules/@octokit/plugin-paginate-graphql": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-2.0.1.tgz", - "integrity": "sha512-ZlhrWMlkGeK7qkWMKPKb6b7SP6lowN0lsOm+eyDssTBMoEZKSfwK+mrG4YtUhM66YNrJI22L32Vt+CcjteU0Vw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-2.0.3.tgz", + "integrity": "sha512-gMZN0bEksY1d67rN4oBdU9Jor682tGt7sbEiidDLHJtsKmhWYEPJgWmPG1e6omrxE5S52VZxSRm5UY/utYje5w==", "peerDependencies": { "@octokit/core": ">=4" } @@ -2990,9 +2990,9 @@ } }, "node_modules/@types/pg": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.1.tgz", - "integrity": "sha512-AmEHA/XxMxemQom5iDwP62FYNkv+gDDnetRG7v2N2dPtju7UKI7FknUimcZo7SodKTHtckYPzaTqUEvUKbVJEA==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.2.tgz", + "integrity": "sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==", "dev": true, "dependencies": { "@types/node": "*", @@ -3145,15 +3145,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", + "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/type-utils": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3179,14 +3179,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", + "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "debug": "^4.3.4" }, "engines": { @@ -3206,13 +3206,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3223,13 +3223,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", + "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3250,9 +3250,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3263,13 +3263,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3290,17 +3290,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", + "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3316,12 +3316,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3487,9 +3487,9 @@ } }, "node_modules/applicationinsights": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.6.0.tgz", - "integrity": "sha512-ldeFvbocbRoMxS361lOwmLL3ltWfgNxALrttge6BrpsPMTStGzevoiqaWieIjZ/3qNmljOd+xmwaNPpBoefdmA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.0.tgz", + "integrity": "sha512-/vV5X6M4TlRA5NxNZAdCE0gukzfK24mb3z18D5Kl/CyIfSVIkafsIji3mK+Zi5q+7dn6H1CkFazlcnLf40anHw==", "dependencies": { "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "1.10.1", @@ -4845,9 +4845,9 @@ } }, "node_modules/dotenv": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.3.tgz", - "integrity": "sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", "engines": { "node": ">=12" }, @@ -4979,16 +4979,16 @@ } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -12009,9 +12009,9 @@ } }, "@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true }, "@hapi/boom": { @@ -12058,9 +12058,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -12608,9 +12608,9 @@ "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" }, "@octokit/plugin-paginate-graphql": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-2.0.1.tgz", - "integrity": "sha512-ZlhrWMlkGeK7qkWMKPKb6b7SP6lowN0lsOm+eyDssTBMoEZKSfwK+mrG4YtUhM66YNrJI22L32Vt+CcjteU0Vw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-2.0.3.tgz", + "integrity": "sha512-gMZN0bEksY1d67rN4oBdU9Jor682tGt7sbEiidDLHJtsKmhWYEPJgWmPG1e6omrxE5S52VZxSRm5UY/utYje5w==", "requires": {} }, "@octokit/plugin-paginate-rest": { @@ -13209,9 +13209,9 @@ } }, "@types/pg": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.1.tgz", - "integrity": "sha512-AmEHA/XxMxemQom5iDwP62FYNkv+gDDnetRG7v2N2dPtju7UKI7FknUimcZo7SodKTHtckYPzaTqUEvUKbVJEA==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.2.tgz", + "integrity": "sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==", "dev": true, "requires": { "@types/node": "*", @@ -13351,15 +13351,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", + "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/type-utils": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -13369,53 +13369,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", + "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" } }, "@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", + "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13424,28 +13424,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", + "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" } }, @@ -13555,9 +13555,9 @@ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "applicationinsights": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.6.0.tgz", - "integrity": "sha512-ldeFvbocbRoMxS361lOwmLL3ltWfgNxALrttge6BrpsPMTStGzevoiqaWieIjZ/3qNmljOd+xmwaNPpBoefdmA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.0.tgz", + "integrity": "sha512-/vV5X6M4TlRA5NxNZAdCE0gukzfK24mb3z18D5Kl/CyIfSVIkafsIji3mK+Zi5q+7dn6H1CkFazlcnLf40anHw==", "requires": { "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "1.10.1", @@ -14584,9 +14584,9 @@ } }, "dotenv": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.3.tgz", - "integrity": "sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==" + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==" }, "dtrace-provider": { "version": "0.8.8", @@ -14684,16 +14684,16 @@ "dev": true }, "eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", diff --git a/package.json b/package.json index f9748d37c..313f25c97 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,10 @@ "fix:md": "markdownlint-cli2-fix \"**/*.md\"", "fix": "npm run fix:js && npm run fix:md", "lint:js": "eslint .", + "lint:json": "echo OK", "lint:md": "markdownlint-cli2 \"**/*.md\"", "lint:spell": "cspell --no-progress \"**\"", - "lint": "npm run lint:js && npm run lint:md && npm run lint:spell", + "lint": "npm run lint:json && npm run lint:js && npm run lint:md && npm run lint:spell", "prepare": "husky install", "start-4000": "PORT=4000 DEBUG=startup node ./dist/bin/www", "start-in-container": "node ./bin/www", @@ -72,12 +73,12 @@ "@azure/service-bus": "7.9.0", "@azure/storage-blob": "12.14.0", "@azure/storage-queue": "12.13.0", - "@octokit/plugin-paginate-graphql": "2.0.1", + "@octokit/plugin-paginate-graphql": "2.0.3", "@octokit/request": "6.2.5", "@octokit/auth-app": "4.0.13", "@octokit/rest": "19.0.11", "app-root-path": "3.1.0", - "applicationinsights": "2.6.0", + "applicationinsights": "2.7.0", "async-prompt": "1.0.1", "axios": "1.4.0", "basic-auth": "2.0.1", @@ -88,7 +89,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.1.3", + "dotenv": "16.1.4", "express": "4.18.2", "express-async-handler": "1.1.4", "express-session": "1.17.3", @@ -142,16 +143,16 @@ "@types/passport": "1.0.12", "@types/passport-azure-ad": "4.3.1", "@types/passport-github": "1.1.7", - "@types/pg": "8.10.1", + "@types/pg": "8.10.2", "@types/pug": "2.0.6", "@types/recursive-readdir": "2.2.1", "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.8", - "@typescript-eslint/parser": "5.59.8", + "@typescript-eslint/eslint-plugin": "5.59.9", + "@typescript-eslint/parser": "5.59.9", "cspell": "6.31.1", - "eslint": "8.41.0", + "eslint": "8.42.0", "eslint-config-prettier": "8.8.0", "eslint-plugin-n": "16.0.0", "eslint-plugin-prettier": "4.2.1", From 4ca3b70ae18fc4516d71e34463b7553a7d7c65a9 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sun, 11 Jun 2023 17:42:22 -0700 Subject: [PATCH 06/69] Type updates --- .cspell.json | 3 - .vscode/launch.json | 138 ++++---- Dockerfile | 2 +- api/client/banner.ts | 6 +- api/client/context/administration/index.ts | 13 +- .../administration/organization/index.ts | 7 +- .../administration/organization/settings.ts | 25 +- api/client/context/approvals.ts | 8 +- api/client/context/index.ts | 10 +- api/client/context/organization/index.ts | 15 +- api/client/context/organization/repo.ts | 6 +- .../context/organization/repoForkUnlock.ts | 8 +- api/client/context/organization/repos.ts | 9 +- api/client/context/organization/team.ts | 18 +- api/client/context/organization/teams.ts | 7 +- api/client/context/repos.ts | 3 +- api/client/context/sample.ts | 6 +- api/client/context/teams.ts | 3 +- api/client/index.ts | 6 +- api/client/linking.ts | 12 +- api/client/newOrgRepo.ts | 12 +- api/client/newRepo.ts | 4 +- api/client/news.ts | 4 +- api/client/organization/annotations.ts | 26 +- api/client/organization/index.ts | 24 +- api/client/organization/newRepoMetadata.ts | 8 +- api/client/organization/people.ts | 6 +- api/client/organization/repo.ts | 19 +- api/client/organization/repoPermissions.ts | 4 +- api/client/organization/repos.ts | 8 +- api/client/organization/team.ts | 12 +- api/client/organization/teams.ts | 16 +- api/client/organizations.ts | 66 ++-- api/client/people.ts | 20 +- api/client/person.ts | 4 +- api/client/repos.ts | 6 +- api/client/session.ts | 4 +- api/client/teams.ts | 6 +- api/extension.ts | 20 +- api/index.ts | 10 +- api/jsonErrorHandler.ts | 3 +- api/people/index.ts | 2 +- api/people/link.ts | 4 +- api/people/links.ts | 14 +- api/people/unlink.ts | 10 +- api/webhook.ts | 4 +- bin/www.ts | 6 +- business/githubApps/index.ts | 5 +- business/githubApps/tokenManager.ts | 3 +- business/operations/core.ts | 2 + business/operations/index.ts | 8 +- business/organization.ts | 9 +- business/repository.ts | 15 + business/repositoryActions.ts | 3 - docs/jobs.md | 43 ++- entities/repository.ts | 16 + .../repositoryMetadata/repositoryMetadata.ts | 6 +- index.ts | 91 +++++ interfaces/app.ts | 38 +- interfaces/companySpecific/administration.ts | 2 +- interfaces/companySpecific/passport.ts | 2 +- interfaces/companySpecific/routes/index.ts | 2 +- interfaces/github/orgs.ts | 25 +- interfaces/index.ts | 15 +- jest.config.ts | 5 + app.ts => job.ts | 150 ++++---- .../task.ts => cleanupBlobCache.ts} | 11 +- jobs/cleanupBlobCache/index.ts | 9 - .../task.ts => cleanupInvites.ts} | 45 +-- jobs/cleanupInvites/index.ts | 13 - jobs/cleanupKeys/index.ts | 9 - jobs/cleanupKeys/task.ts | 98 ------ jobs/cleanupTokens/index.ts | 9 - jobs/cleanupTokens/task.ts | 142 -------- ...itories.ts => deletedRepositoriesCache.ts} | 25 +- jobs/{firehose/task.ts => firehose.ts} | 52 +-- jobs/firehose/index.ts | 13 - jobs/permissions.ts | 214 ++++++++++++ jobs/permissions/index.ts | 14 - jobs/permissions/task.ts | 155 --------- .../task.ts => refreshQueryCache.ts} | 23 +- jobs/refreshQueryCache/index.ts | 15 - .../index.ts => refreshUsernames.ts} | 81 +++-- jobs/repositories.ts | 329 ++++++++++++++---- lib/caching/redis.ts | 2 +- .../entityMetadataProvider.ts | 4 +- lib/entityMetadataProvider/query.ts | 2 +- middleware/apiAad.ts | 7 +- middleware/apiReposAuth.ts | 3 +- middleware/apiVstsAuth.ts | 3 +- middleware/appInsights.ts | 26 +- middleware/business/administration.ts | 8 +- middleware/business/allLinks.ts | 4 +- middleware/business/authentication.ts | 11 +- .../business/corporateAdministrators.ts | 8 +- middleware/business/employeesOnly.ts | 8 +- middleware/business/organization.ts | 7 +- middleware/business/setContext.ts | 6 +- middleware/campaign.ts | 4 +- middleware/codespaces.ts | 4 +- middleware/correlationId.ts | 3 +- middleware/error-routes.ts | 9 +- middleware/errorHandler.ts | 10 +- .../github/blockEnterpriseManagedUsers.ts | 8 +- .../github/ensureOrganizationProfile.ts | 7 +- middleware/github/orgPermissions.ts | 8 +- middleware/github/repoPermissions.ts | 8 +- middleware/github/requireActiveSession.ts | 3 +- middleware/github/systemWidePermissions.ts | 8 +- middleware/github/teamPermissions.ts | 6 +- middleware/healthCheck.ts | 23 +- middleware/index.ts | 2 +- middleware/initialize.ts | 152 +++++--- middleware/jsonError.ts | 6 +- middleware/links/index.ts | 12 +- middleware/locals.ts | 5 +- middleware/lowercaser.ts | 6 +- middleware/officeHyperlinks.ts | 3 +- middleware/passport-config.ts | 4 +- middleware/passport-routes.ts | 4 +- middleware/passport/aadRoutes.ts | 4 +- middleware/rawBodyParser.ts | 3 +- middleware/react.ts | 4 +- middleware/scrubbedUrl.ts | 5 +- middleware/supportMultipleAuthProviders.ts | 4 +- package.json | 5 +- routes/administration/app.ts | 12 +- routes/administration/apps.ts | 6 +- routes/administration/index.ts | 6 +- routes/approvals.ts | 2 +- routes/explore.ts | 2 +- routes/index-authenticated.ts | 6 +- routes/index-linked.ts | 6 +- routes/index.ts | 2 +- routes/link-cleanup.ts | 6 +- routes/link.ts | 14 +- routes/org/2fa.ts | 4 +- routes/org/index.ts | 12 +- routes/org/join.ts | 2 +- routes/org/leave.ts | 6 +- routes/org/membership.ts | 6 +- routes/org/newRepoSpa.ts | 2 +- routes/org/people.ts | 4 +- routes/org/profileReview.ts | 4 +- routes/org/repoAdministrativeLock.ts | 10 +- routes/org/repoWorkflowEngine.ts | 4 +- routes/org/repos.ts | 26 +- routes/org/team/approval/index.ts | 4 +- routes/org/team/approvals.ts | 8 +- routes/org/team/delete.ts | 4 +- routes/org/team/index-maintainer.ts | 4 +- routes/org/team/index.ts | 92 ++--- routes/org/team/leave.ts | 4 +- routes/org/team/maintainers.ts | 10 +- routes/org/team/members.ts | 14 +- routes/org/team/properties.ts | 88 ++--- routes/org/team/teamAdminRequired.ts | 4 +- routes/org/teams.ts | 8 +- routes/orgAdmin.ts | 20 +- routes/orgs.ts | 8 +- routes/people.ts | 6 +- routes/peopleSearch.ts | 4 +- routes/placeholders.ts | 2 +- routes/releasesSpa.ts | 2 +- routes/repos.ts | 4 +- routes/settings/approvals.ts | 8 +- routes/settings/authorizations.ts | 6 +- routes/settings/campaigns.ts | 8 +- routes/settings/contributionData.ts | 6 +- routes/settings/index.ts | 2 +- routes/settings/personalAccessTokens.ts | 12 +- routes/teams.ts | 4 +- routes/undo.ts | 8 +- routes/unlink.ts | 8 +- scripts/configuration.ts | 19 +- scripts/localEnvironment.ts | 25 +- .../{migrateLinks/task.ts => migrateLinks.ts} | 11 +- scripts/migrateLinks/index.ts | 11 - tsconfig.json | 1 + views/org/pending.pug | 15 +- 180 files changed, 1823 insertions(+), 1492 deletions(-) create mode 100644 index.ts rename app.ts => job.ts (53%) rename jobs/{cleanupBlobCache/task.ts => cleanupBlobCache.ts} (81%) delete mode 100644 jobs/cleanupBlobCache/index.ts rename jobs/{cleanupInvites/task.ts => cleanupInvites.ts} (71%) delete mode 100644 jobs/cleanupInvites/index.ts delete mode 100644 jobs/cleanupKeys/index.ts delete mode 100644 jobs/cleanupKeys/task.ts delete mode 100644 jobs/cleanupTokens/index.ts delete mode 100644 jobs/cleanupTokens/task.ts rename jobs/{refreshQueryCache/deletedRepositories.ts => deletedRepositoriesCache.ts} (91%) rename jobs/{firehose/task.ts => firehose.ts} (90%) delete mode 100644 jobs/firehose/index.ts create mode 100644 jobs/permissions.ts delete mode 100644 jobs/permissions/index.ts delete mode 100644 jobs/permissions/task.ts rename jobs/{refreshQueryCache/task.ts => refreshQueryCache.ts} (98%) delete mode 100644 jobs/refreshQueryCache/index.ts rename jobs/{refreshUsernames/index.ts => refreshUsernames.ts} (67%) rename scripts/{migrateLinks/task.ts => migrateLinks.ts} (94%) delete mode 100644 scripts/migrateLinks/index.ts diff --git a/.cspell.json b/.cspell.json index 0d74fa353..4333fc71d 100644 --- a/.cspell.json +++ b/.cspell.json @@ -840,9 +840,6 @@ "Whois", "withmaintainers", "withservicetree", - "workboard", - "Workboard", - "workboarding", "xamarinhq", "Xcache", "xlink", diff --git a/.vscode/launch.json b/.vscode/launch.json index d1caa8213..4dc06f683 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,7 +4,7 @@ { "type": "node", "request": "launch", - "name": "Launch site 3000", + "name": "Launch site :4000 sudo", "program": "${workspaceFolder}/dist/bin/www.js", "cwd": "${workspaceFolder}/dist", "preLaunchTask": "tsbuild", @@ -12,26 +12,16 @@ "console": "integratedTerminal", "env": { "NODE_ENV": "development", - "DEBUG": "startup,g:server,context,github:tokens", - "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org,health" + "PORT": "4000", + "DEBUG_GITHUB_PORTAL_SUDO_FORCE": "1", + "DEBUG": "startup,cosmosdb,g:server,context,*simple-oauth2*,appinsights,insights", + "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org" } }, { "type": "node", "request": "launch", - "name": "Jest Tests", - "program": "${workspaceRoot}/node_modules/jest/bin/jest.js", - "args": ["-i"], - "preLaunchTask": "tsbuild", - "sourceMaps": true, - "internalConsoleOptions": "openOnSessionStart", - "console": "externalTerminal", - "outFiles": ["${workspaceRoot}/dist/**/*"] - }, - { - "type": "node", - "request": "launch", - "name": "Launch site 4000 sudo", + "name": "Launch site :4000 sudo OFF", "program": "${workspaceFolder}/dist/bin/www.js", "cwd": "${workspaceFolder}/dist", "preLaunchTask": "tsbuild", @@ -40,15 +30,16 @@ "env": { "NODE_ENV": "development", "PORT": "4000", - "DEBUG_GITHUB_PORTAL_SUDO_FORCE": "1", - "DEBUG": "startup,cosmosdb,g:server,context,*simple-oauth2*,appinsights,insights", + "DEBUG": "startup,cosmosdb,g:server,context", + "DEBUG_GITHUB_PORTAL_SUDO_OFF": "1", + "DEBUG_GITHUB_ORG_SUDO_OFF": "1", "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org" } }, { "type": "node", "request": "launch", - "name": "Launch site 4000 sudo OFF", + "name": "Launch server-rendered legacy site :3000", "program": "${workspaceFolder}/dist/bin/www.js", "cwd": "${workspaceFolder}/dist", "preLaunchTask": "tsbuild", @@ -56,18 +47,15 @@ "console": "integratedTerminal", "env": { "NODE_ENV": "development", - "PORT": "4000", - "DEBUG": "startup,cosmosdb,g:server,context", - "DEBUG_GITHUB_PORTAL_SUDO_OFF": "1", - "DEBUG_GITHUB_ORG_SUDO_OFF": "1", - "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org" + "DEBUG": "startup,g:server,context,github:tokens", + "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org,health" } }, { "type": "node", "request": "launch", - "name": "Background Job: Firehose", - "program": "${workspaceRoot}/dist/jobs/firehose/index.js", + "name": "Background Job: Event firehose", + "program": "${workspaceRoot}/dist/jobs/firehose.js", "preLaunchTask": "tsbuild", "sourceMaps": true, "console": "integratedTerminal", @@ -77,6 +65,18 @@ "DEBUG": "startup,querycache" } }, + { + "type": "node", + "request": "launch", + "name": "Jest Tests", + "program": "${workspaceRoot}/node_modules/jest/bin/jest.js", + "args": ["-i"], + "preLaunchTask": "tsbuild", + "sourceMaps": true, + "internalConsoleOptions": "openOnSessionStart", + "console": "externalTerminal", + "outFiles": ["${workspaceRoot}/dist/**/*"] + }, { "type": "node", "request": "launch", @@ -118,7 +118,7 @@ "sourceMaps": true, "env": { "NODE_ENV": "development", - "DEBUG": "appinsights,restapi,startup,redis-cross-org,appinsights", + "DEBUG": "appinsights,startup", "DEBUG_GITHUB_PORTAL_SUDO_OFF": "1", "DEBUG_GITHUB_ORG_SUDO_OFF": "1" } @@ -137,39 +137,11 @@ "DEBUG": "startup" } }, - { - "type": "node", - "request": "launch", - "name": "Job: Cleanup invitations", - "program": "${workspaceRoot}/dist/jobs/cleanupInvites/index.js", - "cwd": "${workspaceRoot}/dist", - "preLaunchTask": "tsbuild", - "sourceMaps": true, - "console": "integratedTerminal", - "env": { - "NODE_ENV": "development", - "DEBUG": "redis,restapi,startup,appinsights" - } - }, - { - "type": "node", - "request": "launch", - "name": "Job: Cleanup blob cache", - "program": "${workspaceRoot}/dist/jobs/cleanupBlobCache/index.js", - "cwd": "${workspaceRoot}/dist", - "preLaunchTask": "tsbuild", - "sourceMaps": true, - "console": "integratedTerminal", - "env": { - "NODE_ENV": "development", - "DEBUG": "startup" - } - }, { "type": "node", "request": "launch", "name": "Job: Backfill aliases (3)", - "program": "${workspaceRoot}/dist/jobs/refreshUsernames/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshUsernames.js", "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", "sourceMaps": true, @@ -184,21 +156,21 @@ "type": "node", "request": "launch", "name": "Job: User attributes hygiene (4)", - "program": "${workspaceRoot}/dist/jobs/refreshUsernames/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshUsernames.js", "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", "sourceMaps": true, "console": "integratedTerminal", "env": { "NODE_ENV": "development", - "DEBUG": "redis,restapi,startup,appinsights,cache" + "DEBUG": "startup,appinsights" } }, { "type": "node", "request": "launch", "name": "Job: Consistency: All (6)", - "program": "${workspaceRoot}/dist/jobs/refreshQueryCache/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshQueryCache.js", "args": ["all"], "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", @@ -213,7 +185,7 @@ "type": "node", "request": "launch", "name": "Job: Consistency: Deleted repos (7)", - "program": "${workspaceRoot}/dist/jobs/refreshQueryCache/deletedRepositories.js", + "program": "${workspaceRoot}/dist/jobs/deletedRepositoriesCache.js", "args": [], "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", @@ -228,7 +200,7 @@ "type": "node", "request": "launch", "name": "Job: Consistency: Teams (8)", - "program": "${workspaceRoot}/dist/jobs/refreshQueryCache/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshQueryCache.js", "args": ["teams"], "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", @@ -243,7 +215,7 @@ "type": "node", "request": "launch", "name": "Job: Consistency: Org members (9)", - "program": "${workspaceRoot}/dist/jobs/refreshQueryCache/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshQueryCache.js", "args": ["organizations"], "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", @@ -258,7 +230,7 @@ "type": "node", "request": "launch", "name": "Job: Consistency: Repo collaborators (10)", - "program": "${workspaceRoot}/dist/jobs/refreshQueryCache/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshQueryCache.js", "args": ["collaborators"], "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", @@ -273,7 +245,7 @@ "type": "node", "request": "launch", "name": "Job: Consistency: Team permissions (11)", - "program": "${workspaceRoot}/dist/jobs/refreshQueryCache/index.js", + "program": "${workspaceRoot}/dist/jobs/refreshQueryCache.js", "args": ["permissions"], "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", @@ -301,8 +273,8 @@ { "type": "node", "request": "launch", - "name": "Job: Migrate links", - "program": "${workspaceRoot}/dist/jobs/migrateLinks/index.js", + "name": "Job: Migrate links (14)", + "program": "${workspaceRoot}/dist/jobs/migrateLinks.js", "preLaunchTask": "tsbuild", "sourceMaps": true, "console": "integratedTerminal", @@ -315,8 +287,8 @@ { "type": "node", "request": "launch", - "name": "Job: System Team Permissions", - "program": "${workspaceRoot}/dist/jobs/permissions/index.js", + "name": "Job: System Team Permissions (15)", + "program": "${workspaceRoot}/dist/jobs/permissions.js", "cwd": "${workspaceRoot}/dist", "preLaunchTask": "tsbuild", "sourceMaps": true, @@ -326,6 +298,34 @@ "DEBUG": "startup,appinsights" } }, + { + "type": "node", + "request": "launch", + "name": "Job: Cleanup invitations (16)", + "program": "${workspaceRoot}/dist/jobs/cleanupInvites.js", + "cwd": "${workspaceRoot}/dist", + "preLaunchTask": "tsbuild", + "sourceMaps": true, + "console": "integratedTerminal", + "env": { + "NODE_ENV": "development", + "DEBUG": "redis,restapi,startup,appinsights" + } + }, + { + "type": "node", + "request": "launch", + "name": "Job: Cleanup blob cache (17)", + "program": "${workspaceRoot}/dist/jobs/cleanupBlobCache.js", + "cwd": "${workspaceRoot}/dist", + "preLaunchTask": "tsbuild", + "sourceMaps": true, + "console": "integratedTerminal", + "env": { + "NODE_ENV": "development", + "DEBUG": "startup" + } + }, { "type": "node", "request": "launch", @@ -345,7 +345,7 @@ "type": "node", "request": "launch", "name": "Script: Import audit CSV", - "program": "${workspaceRoot}/dist/jobs/importAuditLog/index.js", + "program": "${workspaceRoot}/dist/jobs/importAuditLog.js", "preLaunchTask": "tsbuild", "sourceMaps": true, "console": "integratedTerminal", diff --git a/Dockerfile b/Dockerfile index 53288e84b..43794ac39 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ # Licensed under the MIT license. See LICENSE file in the project root for full license information. # -ARG IMAGE_NAME=mcr.microsoft.com/cbl-mariner/base/nodejs:16 +ARG IMAGE_NAME=mcr.microsoft.com/cbl-mariner/base/nodejs:18 FROM $IMAGE_NAME AS build diff --git a/api/client/banner.ts b/api/client/banner.ts index 732a5cc68..4eeaa24da 100644 --- a/api/client/banner.ts +++ b/api/client/banner.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { ReposAppRequest } from '../../interfaces'; import { jsonError } from '../../middleware'; @@ -13,7 +13,7 @@ const router: Router = Router(); // TODO: move to modern w/administration experience, optionally -router.get('/', (req: ReposAppRequest, res, next) => { +router.get('/', (req: ReposAppRequest, res: Response, next: NextFunction) => { const { config } = getProviders(req); const text = config?.serviceMessage?.banner || null; const link = config.serviceMessage?.link; @@ -22,7 +22,7 @@ router.get('/', (req: ReposAppRequest, res, next) => { return res.json({ banner }); }); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this banner route', 404)); }); diff --git a/api/client/context/administration/index.ts b/api/client/context/administration/index.ts index 12889f5aa..b4fa59276 100644 --- a/api/client/context/administration/index.ts +++ b/api/client/context/administration/index.ts @@ -3,8 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; + import { Organization } from '../../../../business/organization'; import { ReposAppRequest } from '../../../../interfaces'; import { getIsCorporateAdministrator, jsonError } from '../../../../middleware'; @@ -20,7 +21,7 @@ interface IRequestWithAdministration extends ReposAppRequest { } router.use( - asyncHandler(async (req: IRequestWithAdministration, res, next) => { + asyncHandler(async (req: IRequestWithAdministration, res: Response, next: NextFunction) => { req.isSystemAdministrator = await getIsCorporateAdministrator(req); return next(); }) @@ -28,7 +29,7 @@ router.use( router.get( '/', - asyncHandler(async (req: IRequestWithAdministration, res, next) => { + asyncHandler(async (req: IRequestWithAdministration, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const isAdministrator = req.isSystemAdministrator; if (!isAdministrator) { @@ -44,13 +45,13 @@ router.get( }) ); -router.use((req: IRequestWithAdministration, res, next) => { +router.use((req: IRequestWithAdministration, res: Response, next: NextFunction) => { return req.isSystemAdministrator ? next() : next(jsonError('Not authorized', 403)); }); router.use( '/organization/:orgName', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { orgName } = req.params; const { operations } = getProviders(req); let organization: Organization = null; @@ -74,7 +75,7 @@ const deployment = getCompanySpecificDeployment(); deployment?.routes?.api?.context?.administration?.index && deployment?.routes?.api?.context.administration.index(router); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available: context/administration', 404)); }); diff --git a/api/client/context/administration/organization/index.ts b/api/client/context/administration/organization/index.ts index 45db6953e..fd4191f4f 100644 --- a/api/client/context/administration/organization/index.ts +++ b/api/client/context/administration/organization/index.ts @@ -3,8 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; + import { ReposAppRequest } from '../../../../../interfaces'; import { jsonError } from '../../../../../middleware'; @@ -16,7 +17,7 @@ router.use('/settings', routeSettings); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; return res.json({ organization: organization.asClientJson(), @@ -24,7 +25,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available in administration - organization', 404)); }); diff --git a/api/client/context/administration/organization/settings.ts b/api/client/context/administration/organization/settings.ts index a1c805df2..a8280c5f0 100644 --- a/api/client/context/administration/organization/settings.ts +++ b/api/client/context/administration/organization/settings.ts @@ -3,8 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; + import { OrganizationSetting } from '../../../../../entities/organizationSettings/organizationSetting'; import { ReposAppRequest } from '../../../../../interfaces'; import { jsonError } from '../../../../../middleware'; @@ -17,7 +18,7 @@ interface IOrganizationSettings extends ReposAppRequest { } router.use( - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { organization } = req; const { organizationSettingsProvider } = getProviders(req); try { @@ -34,7 +35,7 @@ router.use( router.get( '/', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { dynamicSettings } = req; return res.json({ dynamicSettings, @@ -46,7 +47,7 @@ router.get( router.get( '/features', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { dynamicSettings, organization } = req; const { features } = dynamicSettings; return res.json({ @@ -58,7 +59,7 @@ router.get( router.get( '/feature/:flag', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { dynamicSettings, organization } = req; const flag = req.params.flag as string; return res.json({ @@ -71,7 +72,7 @@ router.get( router.put( '/feature/:flag', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { dynamicSettings, organization } = req; const { insights, organizationSettingsProvider } = getProviders(req); const { features } = dynamicSettings; @@ -103,7 +104,7 @@ router.put( router.delete( '/feature/:flag', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { organization, dynamicSettings } = req; const { organizationSettingsProvider, insights } = getProviders(req); const { features } = dynamicSettings; @@ -137,7 +138,7 @@ router.delete( router.get( '/properties', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { dynamicSettings, organization } = req; const { properties } = dynamicSettings; return res.json({ @@ -149,7 +150,7 @@ router.get( router.get( '/property/:flag', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { dynamicSettings, organization } = req; const propertyName = req.params.propertyName as string; const { properties } = dynamicSettings; @@ -163,7 +164,7 @@ router.get( router.put( '/property/:propertyName', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { organization, dynamicSettings } = req; const { insights, organizationSettingsProvider } = getProviders(req); const { properties } = dynamicSettings; @@ -209,7 +210,7 @@ router.put( router.delete( '/property/:propertyName', - asyncHandler(async (req: IOrganizationSettings, res, next) => { + asyncHandler(async (req: IOrganizationSettings, res: Response, next: NextFunction) => { const { organization, dynamicSettings } = req; const { organizationSettingsProvider, insights } = getProviders(req); const { properties } = dynamicSettings; @@ -245,7 +246,7 @@ router.delete( // -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available in administration - organization', 404)); }); diff --git a/api/client/context/approvals.ts b/api/client/context/approvals.ts index 3e21e398b..3210c8197 100644 --- a/api/client/context/approvals.ts +++ b/api/client/context/approvals.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { Team, Organization } from '../../../business'; @@ -30,7 +30,7 @@ const approvalPairToJson = (pair: ApprovalPair) => { router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalProvider, operations } = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { @@ -65,7 +65,7 @@ router.get( router.get( '/:approvalId', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const approvalId = req.params.approvalId; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { @@ -112,7 +112,7 @@ router.get( }) ); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('Contextual API or route not found within approvals', 404)); }); diff --git a/api/client/context/index.ts b/api/client/context/index.ts index efc9530a7..f1b7117a1 100644 --- a/api/client/context/index.ts +++ b/api/client/context/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { Organization } from '../../../business'; @@ -48,7 +48,7 @@ router.get('/', (req: ReposAppRequest, res) => { router.get( '/specialized/multipleLinkGitHubIdentities', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const links = (activeContext?.link ? [activeContext.link, ...activeContext.additionalLinks] : []).map( @@ -79,7 +79,7 @@ router.get( router.get( '/accountDetails', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; try { @@ -107,7 +107,7 @@ router.use('/sample', routeSample); router.use( '/orgs/:orgName', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { orgName } = req.params; const providers = getProviders(req); const { operations } = providers; @@ -151,7 +151,7 @@ async function isUnmanagedOrganization(providers: IProviders, orgName: string): router.use('/orgs/:orgName', routeIndividualContextualOrganization); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('Contextual API or route not found', 404)); }); diff --git a/api/client/context/organization/index.ts b/api/client/context/organization/index.ts index 6bb56a540..a041f15af 100644 --- a/api/client/context/organization/index.ts +++ b/api/client/context/organization/index.ts @@ -3,8 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; + import { Organization, Team } from '../../../../business'; import { ReposAppRequest, @@ -23,7 +24,7 @@ const router: Router = Router(); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { @@ -46,7 +47,7 @@ router.get( router.get( '/sudo', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { @@ -60,7 +61,7 @@ router.get( router.get( '/isOwner', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { @@ -81,7 +82,7 @@ router.get( router.delete( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { // "Leave" / remove my context const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -104,7 +105,7 @@ router.delete( router.get( '/personalizedTeams', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { try { const organization = req.organization as Organization; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -145,7 +146,7 @@ const deployment = getCompanySpecificDeployment(); deployment?.routes?.api?.context?.organization?.index && deployment?.routes?.api?.context?.organization?.index(router); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available: client>organization', 404)); }); diff --git a/api/client/context/organization/repo.ts b/api/client/context/organization/repo.ts index e995886f8..dda230d2f 100644 --- a/api/client/context/organization/repo.ts +++ b/api/client/context/organization/repo.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { @@ -21,7 +21,7 @@ const router: Router = Router(); router.get( '/permissions', AddRepositoryPermissionsToRequest, - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const permissions = getContextualRepositoryPermissions(req); return res.json(permissions); }) @@ -33,7 +33,7 @@ const deployment = getCompanySpecificDeployment(); deployment?.routes?.api?.context?.organization?.repo && deployment?.routes?.api?.context?.organization?.repo(router); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError(`no API or ${req.method} function available for repo`, 404)); }); diff --git a/api/client/context/organization/repoForkUnlock.ts b/api/client/context/organization/repoForkUnlock.ts index 55fa0935e..9ddacef0d 100644 --- a/api/client/context/organization/repoForkUnlock.ts +++ b/api/client/context/organization/repoForkUnlock.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../../middleware'; @@ -20,7 +20,7 @@ import NewRepositoryLockdownSystem from '../../../../features/newRepositories/ne const router: Router = Router(); router.use( - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const organization = req.organization as Organization; if (!organization.isNewRepositoryLockdownSystemEnabled()) { return next(jsonError('This endpoint is not available as configured for the organization', 400)); @@ -42,7 +42,7 @@ router.use( router.post( '/approve', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const repository = getContextualRepository(req); const repositoryMetadataProvider = getRepositoryMetadataProvider(operations); @@ -70,7 +70,7 @@ router.post( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError(`no API or ${req.method} function available for repo fork unlock`, 404)); }); diff --git a/api/client/context/organization/repos.ts b/api/client/context/organization/repos.ts index 851aa48c2..200f50135 100644 --- a/api/client/context/organization/repos.ts +++ b/api/client/context/organization/repos.ts @@ -3,8 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; + import { Repository } from '../../../../business'; import { jsonError } from '../../../../middleware'; import { setContextualRepository } from '../../../../middleware/github/repoPermissions'; @@ -17,7 +18,7 @@ import RouteContextualRepo from './repo'; const router: Router = Router(); -async function validateActiveMembership(req: ReposAppRequest, res, next) { +async function validateActiveMembership(req: ReposAppRequest, res: Response, next: NextFunction) { const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { @@ -37,7 +38,7 @@ router.post('/', asyncHandler(validateActiveMembership), asyncHandler(createRepo router.use( '/:repoName', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const { repoName } = req.params; let repository: Repository = null; @@ -49,7 +50,7 @@ router.use( router.use('/:repoName', RouteContextualRepo); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available for repos', 404)); }); diff --git a/api/client/context/organization/team.ts b/api/client/context/organization/team.ts index 8574d37fb..ab930f47b 100644 --- a/api/client/context/organization/team.ts +++ b/api/client/context/organization/team.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { TeamJoinApprovalEntity } from '../../../../entities/teamJoinApproval/teamJoinApproval'; @@ -42,7 +42,7 @@ router.get( '/permissions', asyncHandler(AddTeamPermissionsToRequest), asyncHandler(AddTeamMembershipToRequest), - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const membership = getTeamMembershipFromRequest(req); const permissions = getTeamPermissionsFromRequest(req); return res.json({ permissions, membership }); @@ -51,7 +51,7 @@ router.get( router.get( '/join/request', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalProvider } = getProviders(req); const team = getContextualTeam(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -70,7 +70,7 @@ router.get( router.post( '/join', asyncHandler(AddTeamMembershipToRequest), - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { try { const providers = getProviders(req); const { approvalProvider } = providers; @@ -112,7 +112,7 @@ router.post( router.post( '/join/approvals/:approvalId', asyncHandler(AddTeamPermissionsToRequest), - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalId: id } = req.params; if (!id) { return next(jsonError('invalid approval', 400)); @@ -164,7 +164,7 @@ router.post( router.get( '/join/approvals/:approvalId', asyncHandler(AddTeamPermissionsToRequest), - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalId: id } = req.params; if (!id) { return next(jsonError('invalid approval', 400)); @@ -195,7 +195,7 @@ router.get( router.get( '/join/approvals', asyncHandler(AddTeamPermissionsToRequest), - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalProvider } = getProviders(req); const team = getContextualTeam(req); const permissions = getTeamPermissionsFromRequest(req); @@ -213,7 +213,7 @@ router.get( router.post( '/role/:login', asyncHandler(AddTeamPermissionsToRequest), - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { role } = req.body; const { login } = req.params; if (!login) { @@ -240,7 +240,7 @@ router.post( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available for contextual team', 404)); }); diff --git a/api/client/context/organization/teams.ts b/api/client/context/organization/teams.ts index 99781f31b..3cb9ffeea 100644 --- a/api/client/context/organization/teams.ts +++ b/api/client/context/organization/teams.ts @@ -3,8 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; + import { Team } from '../../../../business'; import { jsonError } from '../../../../middleware'; import { setContextualTeam } from '../../../../middleware/github/teamPermissions'; @@ -18,7 +19,7 @@ const router: Router = Router(); router.use( '/:teamSlug', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const { teamSlug } = req.params; let team: Team = null; @@ -35,7 +36,7 @@ router.use( router.use('/:teamSlug', RouteTeam); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available for repos', 404)); }); diff --git a/api/client/context/repos.ts b/api/client/context/repos.ts index e446dbda3..34a55050d 100644 --- a/api/client/context/repos.ts +++ b/api/client/context/repos.ts @@ -3,12 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import asyncHandler from 'express-async-handler'; import { GitHubRepositoryPermission, ReposAppRequest } from '../../../interfaces'; import { IndividualContext } from '../../../business/user'; -export default asyncHandler(async (req: ReposAppRequest, res, next) => { +export default asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { try { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { diff --git a/api/client/context/sample.ts b/api/client/context/sample.ts index e957ab121..434952a5e 100644 --- a/api/client/context/sample.ts +++ b/api/client/context/sample.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { sendLinkedAccountMail } from '../../../business/operations/link'; @@ -16,7 +16,7 @@ const router: Router = Router(); router.get( '/:templateName', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const templateName = req.params.templateName as string; @@ -43,7 +43,7 @@ router.get( }) ); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('Contextual API or route not found within samples', 404)); }); diff --git a/api/client/context/teams.ts b/api/client/context/teams.ts index 4ffc3405e..c1030b267 100644 --- a/api/client/context/teams.ts +++ b/api/client/context/teams.ts @@ -4,11 +4,12 @@ // import asyncHandler from 'express-async-handler'; +import { NextFunction, Response } from 'express'; import { ReposAppRequest, TeamJsonFormat } from '../../../interfaces'; import { IndividualContext } from '../../../business/user'; -export default asyncHandler(async (req: ReposAppRequest, res, next) => { +export default asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { return res.json({ diff --git a/api/client/index.ts b/api/client/index.ts index cf2f3d822..06efd5a70 100644 --- a/api/client/index.ts +++ b/api/client/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { @@ -34,7 +34,7 @@ import routeCrossOrganizationTeams from './teams'; const router: Router = Router(); -router.use((req: ReposAppRequest, res, next) => { +router.use((req: ReposAppRequest, res: Response, next: NextFunction) => { const { config } = getProviders(req); if (config?.features?.allowApiClient) { if (req.isAuthenticated()) { @@ -126,7 +126,7 @@ router.get('/', (req: ReposAppRequest, res) => { return res.send(JSON.stringify(data, null, 2)); }); -router.use((req, res, next) => { +router.use((req, res: Response, next: NextFunction) => { return next(jsonError('The resource or endpoint you are looking for is not there', 404)); }); diff --git a/api/client/linking.ts b/api/client/linking.ts index 918af1e7d..dca173a36 100644 --- a/api/client/linking.ts +++ b/api/client/linking.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { IndividualContext } from '../../business/user'; @@ -15,7 +15,7 @@ import { ReposAppRequest } from '../../interfaces'; const router: Router = Router(); -async function validateLinkOk(req: ReposAppRequest, res, next) { +async function validateLinkOk(req: ReposAppRequest, res: Response, next: NextFunction) { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const providers = getProviders(req); const insights = providers.insights; @@ -91,7 +91,7 @@ async function validateLinkOk(req: ReposAppRequest, res, next) { } } -router.get('/banner', (req: ReposAppRequest, res, next) => { +router.get('/banner', (req: ReposAppRequest, res: Response, next: NextFunction) => { const { config } = getProviders(req); const offline = config?.github?.links?.provider?.linkingOfflineMessage; return res.json({ offline }); @@ -99,7 +99,7 @@ router.get('/banner', (req: ReposAppRequest, res, next) => { router.delete( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; return unlinkInteractive(true, activeContext, req, res, next); }) @@ -108,13 +108,13 @@ router.delete( router.post( '/', validateLinkOk, - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; return interactiveLinkUser(true, activeContext, req, res, next); }) ); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('API or route not found', 404)); }); diff --git a/api/client/newOrgRepo.ts b/api/client/newOrgRepo.ts index 9f7317358..298317dfb 100644 --- a/api/client/newOrgRepo.ts +++ b/api/client/newOrgRepo.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -25,7 +25,7 @@ interface ILocalApiRequest extends ReposAppRequest { knownRequesterMailAddress?: string; } -router.get('/metadata', (req: ILocalApiRequest, res, next) => { +router.get('/metadata', (req: ILocalApiRequest, res: Response, next: NextFunction) => { try { const options = { projectType: req.query.projectType, @@ -40,7 +40,7 @@ router.get('/metadata', (req: ILocalApiRequest, res, next) => { router.get( '/personalizedTeams', - asyncHandler(async (req: ILocalApiRequest, res, next) => { + asyncHandler(async (req: ILocalApiRequest, res: Response, next: NextFunction) => { try { const organization = req.organization as Organization; const userAggregateContext = req.apiContext.aggregations; @@ -76,7 +76,7 @@ router.get( router.get( '/teams', - asyncHandler(async (req: ILocalApiRequest, res, next) => { + asyncHandler(async (req: ILocalApiRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const queryCache = providers.queryCache; const organization = req.organization as Organization; @@ -154,7 +154,7 @@ router.get( }) ); -export async function discoverUserIdentities(req: ReposAppRequest, res, next) { +export async function discoverUserIdentities(req: ReposAppRequest, res: Response, next: NextFunction) { const apiContext = req.apiContext as IndividualContext; const providers = getProviders(req); const mailAddressProvider = providers.mailAddressProvider; @@ -177,7 +177,7 @@ export async function discoverUserIdentities(req: ReposAppRequest, res, next) { router.post('/repo/:repo', asyncHandler(discoverUserIdentities), asyncHandler(createRepositoryFromClient)); -export async function createRepositoryFromClient(req: ILocalApiRequest, res, next) { +export async function createRepositoryFromClient(req: ILocalApiRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const { insights, diagnosticsDrop, customizedNewRepositoryLogic, graphProvider } = providers; const individualContext = req.watchdogContextOverride || req.individualContext || req.apiContext; diff --git a/api/client/newRepo.ts b/api/client/newRepo.ts index 26aca31e6..a81000e8d 100644 --- a/api/client/newRepo.ts +++ b/api/client/newRepo.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { getProviders } from '../../transitional'; @@ -12,7 +12,7 @@ import { jsonError } from '../../middleware/jsonError'; import newOrgRepo from './newOrgRepo'; import { ReposAppRequest } from '../../interfaces'; -router.use('/org/:org', (req: ReposAppRequest, res, next) => { +router.use('/org/:org', (req: ReposAppRequest, res: Response, next: NextFunction) => { const orgName = req.params.org; const { operations } = getProviders(req); try { diff --git a/api/client/news.ts b/api/client/news.ts index b33739fa7..3458b9e1f 100644 --- a/api/client/news.ts +++ b/api/client/news.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../middleware'; @@ -20,7 +20,7 @@ router.get( }) ); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('API or route not found within news', 404)); }); diff --git a/api/client/organization/annotations.ts b/api/client/organization/annotations.ts index 1f0156648..fc07b12d1 100644 --- a/api/client/organization/annotations.ts +++ b/api/client/organization/annotations.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware/jsonError'; @@ -35,7 +35,7 @@ type IRequestWithOrganizationAnnotations = IReposAppRequestWithOrganizationManag router.use( '/', checkIsCorporateAdministrator, - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { organizationAnnotationsProvider } = getProviders(req); const { organization, organizationManagementType, organizationProfile } = req; const organizationId = @@ -55,7 +55,7 @@ router.use( router.get( '/', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; // Limited redaction const isSystemAdministrator = await getIsCorporateAdministrator(req); @@ -68,7 +68,11 @@ router.get( router.use(ensureOrganizationProfileMiddleware); -async function ensureAnnotations(req: IRequestWithOrganizationAnnotations, res, next) { +async function ensureAnnotations( + req: IRequestWithOrganizationAnnotations, + res: Response, + next: NextFunction +) { if (!req.annotations) { const { organizationAnnotationsProvider } = getProviders(req); try { @@ -89,7 +93,7 @@ router.put('*', AuthorizeOnlyCorporateAdministrators, ensureAnnotations); router.put( '/', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { // No-op mostly, since ensureAnnotations precedes return res.json({ annotations: req.annotations, @@ -125,7 +129,7 @@ function addChangeNote( router.put( '/property/:propertyName', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; const providers = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -152,7 +156,7 @@ router.put( router.delete( '/property/:propertyName', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; const providers = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -183,7 +187,7 @@ router.delete( router.put( '/feature/:flag', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; const providers = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -211,7 +215,7 @@ router.put( router.delete( '/feature/:flag', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; const providers = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -241,7 +245,7 @@ router.delete( router.patch( '/', - asyncHandler(async (req: IRequestWithOrganizationAnnotations, res, next) => { + asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; const providers = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -288,7 +292,7 @@ async function applyPatch( // features, properties // flag -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within the organization annotations route', 404)); }); diff --git a/api/client/organization/index.ts b/api/client/organization/index.ts index 3acf46701..3336ce60e 100644 --- a/api/client/organization/index.ts +++ b/api/client/organization/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { ReposAppRequest } from '../../../interfaces'; @@ -63,19 +63,21 @@ asClientJson() { */ router.get( '/', - asyncHandler(async (req: IReposAppRequestWithOrganizationManagementType, res, next) => { - const { organization, organizationProfile, organizationManagementType } = req; - if (organizationManagementType === OrganizationManagementType.Unmanaged) { + asyncHandler( + async (req: IReposAppRequestWithOrganizationManagementType, res: Response, next: NextFunction) => { + const { organization, organizationProfile, organizationManagementType } = req; + if (organizationManagementType === OrganizationManagementType.Unmanaged) { + return res.json({ + managementType: req.organizationManagementType, + id: organizationProfile.id, + }); + } return res.json({ managementType: req.organizationManagementType, - id: organizationProfile.id, + ...organization.asClientJson(), }); } - return res.json({ - managementType: req.organizationManagementType, - ...organization.asClientJson(), - }); - }) + ) ); router.use('/annotations', routeAnnotations); @@ -93,7 +95,7 @@ router.get('/newRepoBanner', (req: ReposAppRequest, res) => { return res.json({ newRepositoriesOffline }); }); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available', 404)); }); diff --git a/api/client/organization/newRepoMetadata.ts b/api/client/organization/newRepoMetadata.ts index 4761fbb8e..4133cb2b5 100644 --- a/api/client/organization/newRepoMetadata.ts +++ b/api/client/organization/newRepoMetadata.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware/jsonError'; @@ -13,7 +13,7 @@ const router: Router = Router(); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const metadata = organization.getRepositoryCreateMetadata(); res.json(metadata); @@ -22,7 +22,7 @@ router.get( router.get( '/byProjectReleaseType', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const options = { projectType: req.query.projectType, @@ -32,7 +32,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this path', 404)); }); diff --git a/api/client/organization/people.ts b/api/client/organization/people.ts index f8f39743a..7784707bb 100644 --- a/api/client/organization/people.ts +++ b/api/client/organization/people.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware'; @@ -118,7 +118,7 @@ export async function equivalentLegacyPeopleSearch(req: ReposAppRequest, options router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const pager = new JsonPager(req, res); try { const searcher = await equivalentLegacyPeopleSearch(req); @@ -142,7 +142,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this people list', 404)); }); diff --git a/api/client/organization/repo.ts b/api/client/organization/repo.ts index 4ad38e634..1546565ab 100644 --- a/api/client/organization/repo.ts +++ b/api/client/organization/repo.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware'; @@ -44,7 +44,7 @@ router.use('/permissions', RouteRepoPermissions); router.get( '/', - asyncHandler(async (req: RequestWithRepo, res, next) => { + asyncHandler(async (req: RequestWithRepo, res: Response, next: NextFunction) => { const { repository } = req; try { await repository.getDetails({ backgroundRefresh: false }); @@ -64,7 +64,7 @@ router.get( router.get( '/exists', - asyncHandler(async (req: RequestWithRepo, res, next) => { + asyncHandler(async (req: RequestWithRepo, res: Response, next: NextFunction) => { let exists = false; let name: string = undefined; const { repository } = req; @@ -88,7 +88,7 @@ router.get( router.patch( '/renameDefaultBranch', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: RequestWithRepo, res, next) { + asyncHandler(async function (req: RequestWithRepo, res: Response, next: NextFunction) { const providers = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const repoPermissions = getContextualRepositoryPermissions(req); @@ -122,7 +122,12 @@ router.post( asyncHandler(archiveUnArchiveRepositoryHandler.bind(null, ArchivalAction.UnArchive)) ); -async function archiveUnArchiveRepositoryHandler(action: ArchivalAction, req: RequestWithRepo, res, next) { +async function archiveUnArchiveRepositoryHandler( + action: ArchivalAction, + req: RequestWithRepo, + res: Response, + next: NextFunction +) { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const providers = getProviders(req); const { insights } = providers; @@ -200,7 +205,7 @@ async function archiveUnArchiveRepositoryHandler(action: ArchivalAction, req: Re router.delete( '/', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: RequestWithRepo, res, next) { + asyncHandler(async function (req: RequestWithRepo, res: Response, next: NextFunction) { // NOTE: duplicated code from /routes/org/repos.ts const providers = getProviders(req); const { insights } = providers; @@ -310,7 +315,7 @@ router.delete( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { console.warn(req.baseUrl); return next(jsonError('no API or function available within this specific repo', 404)); }); diff --git a/api/client/organization/repoPermissions.ts b/api/client/organization/repoPermissions.ts index b479e8ab8..981043b3d 100644 --- a/api/client/organization/repoPermissions.ts +++ b/api/client/organization/repoPermissions.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware/jsonError'; @@ -19,7 +19,7 @@ const router: Router = Router(); router.get( '/', - asyncHandler(async (req: RequestWithRepo, res, next) => { + asyncHandler(async (req: RequestWithRepo, res: Response, next: NextFunction) => { const { repository, organization } = req; try { const teamPermissions = await repository.getTeamPermissions(); diff --git a/api/client/organization/repos.ts b/api/client/organization/repos.ts index 499ec7ac5..dfbeaef5b 100644 --- a/api/client/organization/repos.ts +++ b/api/client/organization/repos.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware'; @@ -19,7 +19,7 @@ const router: Router = Router(); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const providers = getProviders(req); const pager = new JsonPager(req, res); @@ -238,7 +238,7 @@ export async function searchRepos( router.use( '/:repoName', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const { repoName } = req.params; // does not confirm the name @@ -249,7 +249,7 @@ router.use( router.use('/:repoName', RouteRepo); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this repos endpoint', 404)); }); diff --git a/api/client/organization/team.ts b/api/client/organization/team.ts index 20d5925a3..8fe706369 100644 --- a/api/client/organization/team.ts +++ b/api/client/organization/team.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { getContextualTeam } from '../../../middleware/github/teamPermissions'; @@ -21,7 +21,7 @@ const router: Router = Router(); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const team = getContextualTeam(req); return res.json(team.asJson(TeamJsonFormat.Augmented /* includes corporateMetadata */)); }) @@ -29,7 +29,7 @@ router.get( router.get( '/repos', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { try { const forceRefresh = !!req.query.refresh; const pager = new JsonPager(req, res); @@ -56,7 +56,7 @@ router.get( router.get( '/members', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { try { const forceRefresh = !!req.query.refresh; const team = getContextualTeam(req); @@ -84,7 +84,7 @@ router.get( router.get( '/maintainers', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); try { const forceRefresh = !!req.query.refresh; @@ -115,7 +115,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available for this specific team', 404)); }); diff --git a/api/client/organization/teams.ts b/api/client/organization/teams.ts index eebde0d51..b69b82c84 100644 --- a/api/client/organization/teams.ts +++ b/api/client/organization/teams.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { Organization } from '../../../business/organization'; @@ -24,7 +24,7 @@ const leakyLocalCache = new LeakyLocalCache(); router.use( '/:teamSlug', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { organization } = req; const { teamSlug } = req.params; let team: Team = null; @@ -61,15 +61,19 @@ async function getTeamsForOrganization( router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { return await getClientApiOrganizationTeamsResponse(req, res, next); }) ); -export async function getClientApiOrganizationTeamsResponse(req: ReposAppRequest, res, next) { +export async function getClientApiOrganizationTeamsResponse( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { const organization = (req.organization || (req as any).aeOrganization) as Organization; if (!organization) { - return next(jsonError('No available organization'), 400); + return next(jsonError('No available organization', 400)); } const pager = new JsonPager(req, res); const q: string = (req.query.q ? (req.query.q as string) : null) || ''; @@ -101,7 +105,7 @@ export async function getClientApiOrganizationTeamsResponse(req: ReposAppRequest } } -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this team', 404)); }); diff --git a/api/client/organizations.ts b/api/client/organizations.ts index 153c7eb19..6cfbd4481 100644 --- a/api/client/organizations.ts +++ b/api/client/organizations.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../middleware'; @@ -36,7 +36,7 @@ type HighlightedOrganization = { router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); try { const orgs = operations.getOrganizations(); @@ -52,7 +52,7 @@ router.get( router.get( '/annotations', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const { organizationAnnotationsProvider } = providers; const projection = typeof req.query.projection === 'string' ? req.query.projection : undefined; @@ -113,7 +113,7 @@ router.get( router.get( '/list.txt', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); try { const orgs = operations.getOrganizations(); @@ -130,41 +130,43 @@ router.get( router.use( '/:orgName', - asyncHandler(async (req: IReposAppRequestWithOrganizationManagementType, res, next) => { - const { operations } = getProviders(req); - const { orgName } = req.params; - req.organizationName = orgName; - try { - const org = operations.getOrganization(orgName); - if (org) { - req.organizationManagementType = OrganizationManagementType.Managed; - req.organization = org; - return next(); - } - } catch (orgNotFoundError) { - if (!ErrorHelper.IsNotFound(orgNotFoundError)) { - return next(orgNotFoundError); + asyncHandler( + async (req: IReposAppRequestWithOrganizationManagementType, res: Response, next: NextFunction) => { + const { operations } = getProviders(req); + const { orgName } = req.params; + req.organizationName = orgName; + try { + const org = operations.getOrganization(orgName); + if (org) { + req.organizationManagementType = OrganizationManagementType.Managed; + req.organization = org; + return next(); + } + } catch (orgNotFoundError) { + if (!ErrorHelper.IsNotFound(orgNotFoundError)) { + return next(orgNotFoundError); + } } - } - try { - const org = operations.getUncontrolledOrganization(orgName); - req.organizationManagementType = OrganizationManagementType.Unmanaged; - req.organization = org; - await setOrganizationProfileForRequest(req); - } catch (orgProfileError) { - if (ErrorHelper.IsNotFound(orgProfileError)) { - return next(CreateError.NotFound(`The organization ${orgName} does not exist`)); - } else { - return next(orgProfileError); + try { + const org = operations.getUncontrolledOrganization(orgName); + req.organizationManagementType = OrganizationManagementType.Unmanaged; + req.organization = org; + await setOrganizationProfileForRequest(req); + } catch (orgProfileError) { + if (ErrorHelper.IsNotFound(orgProfileError)) { + return next(CreateError.NotFound(`The organization ${orgName} does not exist`)); + } else { + return next(orgProfileError); + } } + return next(); } - return next(); - }) + ) ); router.use('/:orgName', RouteOrganization); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('orgs API not found', 404)); }); diff --git a/api/client/people.ts b/api/client/people.ts index c0a2fc12c..8a71f2508 100644 --- a/api/client/people.ts +++ b/api/client/people.ts @@ -3,12 +3,12 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { corporateLinkToJson } from '../../business'; import { jsonError } from '../../middleware'; -import { ICorporateLink, ReposAppRequest } from '../../interfaces'; +import { type GitHubSimpleAccount, type ICorporateLink, ReposAppRequest } from '../../interfaces'; import JsonPager from './jsonPager'; import getCompanySpecificDeployment from '../../middleware/companySpecificDeployment'; @@ -20,34 +20,28 @@ const router: Router = Router(); const deployment = getCompanySpecificDeployment(); deployment?.routes?.api?.people && deployment.routes.api.people(router); -interface ISimpleAccount { - login: string; - avatar_url: string; - id: number; -} - export interface ICrossOrganizationMemberResponse { - account: ISimpleAccount; + account: GitHubSimpleAccount; link?: ICorporateLink; organizations: string[]; } export interface ICrossOrganizationSearchedMember { id: number; - account: ISimpleAccount; + account: GitHubSimpleAccount; link?: ICorporateLink; orgs: IOrganizationMembershipAccount; } interface IOrganizationMembershipAccount { - [id: string]: ISimpleAccount; + [id: string]: GitHubSimpleAccount; } router.get('/:login', RouteGetPerson); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const pager = new JsonPager(req, res); try { const searcher = await equivalentLegacyPeopleSearch(req); @@ -73,7 +67,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this cross-organization people list', 404)); }); diff --git a/api/client/person.ts b/api/client/person.ts index 913658945..95bdfc8ba 100644 --- a/api/client/person.ts +++ b/api/client/person.ts @@ -4,13 +4,15 @@ // import asyncHandler from 'express-async-handler'; +import { NextFunction, Response } from 'express'; + import { ReposAppRequest, AccountJsonFormat } from '../../interfaces'; import { IGraphEntry } from '../../lib/graphProvider'; import { jsonError } from '../../middleware'; import { getProviders } from '../../transitional'; -export default asyncHandler(async (req: ReposAppRequest, res, next) => { +export default asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const { operations, queryCache, graphProvider } = providers; const login = req.params.login as string; diff --git a/api/client/repos.ts b/api/client/repos.ts index ae426e7df..debe8cf02 100644 --- a/api/client/repos.ts +++ b/api/client/repos.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { Repository } from '../../business'; @@ -17,7 +17,7 @@ const router: Router = Router(); router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const pager = new JsonPager(req, res); const searchOptions = { @@ -39,7 +39,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this cross-organization repps list', 404)); }); diff --git a/api/client/session.ts b/api/client/session.ts index e0b128e99..201d4605b 100644 --- a/api/client/session.ts +++ b/api/client/session.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { jsonError } from '../../middleware/jsonError'; import { IAppSession, ReposAppRequest } from '../../interfaces'; @@ -42,7 +42,7 @@ router.post('/github', (req: ReposAppRequest, res) => { res.end(); }); -router.use('*', (req: ReposAppRequest, res, next) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('API or route not found', 404)); }); diff --git a/api/client/teams.ts b/api/client/teams.ts index b2c863291..93eac9dfc 100644 --- a/api/client/teams.ts +++ b/api/client/teams.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { Operations, Team } from '../../business'; @@ -40,7 +40,7 @@ async function getCrossOrganizationTeams(operations: Operations): Promise { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const pager = new JsonPager(req, res); const q: string = (req.query.q ? (req.query.q as string) : null) || ''; @@ -71,7 +71,7 @@ router.get( }) ); -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available within this cross-organization teams list', 404)); }); diff --git a/api/extension.ts b/api/extension.ts index c339ab89a..fefd43b91 100644 --- a/api/extension.ts +++ b/api/extension.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Response, Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -19,9 +19,9 @@ import { PersonalAccessToken } from '../entities/token/token'; const thisApiScopeName = 'extension'; -interface IExtensionResponse extends Response { +type ExtensionResponse = Response & { localKey?: any; -} +}; interface IConnectionInformation { link?: any; @@ -29,7 +29,7 @@ interface IConnectionInformation { auth?: any; } -router.use(function (req: IApiRequest, res, next) { +router.use(function (req: IApiRequest, res: Response, next: NextFunction) { const token = req.apiKeyToken; if (!token.scopes) { return next(jsonError('The key is not authorized for specific APIs', 403)); @@ -40,7 +40,7 @@ router.use(function (req: IApiRequest, res, next) { return next(); }); -function overwriteUserContext(req: IApiRequest, res, next) { +function overwriteUserContext(req: IApiRequest, res: Response, next: NextFunction) { const token = req.apiKeyToken; const corporateId = token.corporateId; if (!corporateId) { @@ -121,7 +121,7 @@ router.get('/', (req: IApiRequest, res) => { router.get( '/metadata', asyncHandler(getLocalEncryptionKeyMiddleware), - (req: IApiRequest, res: IExtensionResponse) => { + (req: IApiRequest, res: ExtensionResponse) => { const apiContext = req.apiContext; const localKey = res.localKey; @@ -186,7 +186,11 @@ function getSanitizedOrganizations(operations) { return value; } -async function getLocalEncryptionKeyMiddleware(req: IApiRequest, res, next): Promise { +async function getLocalEncryptionKeyMiddleware( + req: IApiRequest, + res: ExtensionResponse, + next: NextFunction +): Promise { const providers = getProviders(req); const localExtensionKeyProvider = providers.localExtensionKeyProvider; const apiKeyToken = req.apiKeyToken; @@ -250,7 +254,7 @@ async function getOrCreateLocalEncryptionKey( return await createLocalEncryptionKey(insights, localExtensionKeyProvider, corporateId); } -router.use('*', (req, res, next) => { +router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('API not found', 404)); }); diff --git a/api/index.ts b/api/index.ts index a90a53d73..5c0cfca86 100644 --- a/api/index.ts +++ b/api/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -36,7 +36,7 @@ function isClientRoute(req: ReposAppRequest) { router.use('/webhook', apiWebhook); -router.use((req: IApiRequest, res, next) => { +router.use((req: IApiRequest, res: Response, next: NextFunction) => { if (isClientRoute(req)) { // The frontend client routes are hooked into Express after // the session middleware. The client route does not require @@ -91,7 +91,7 @@ router.post('/:org/repos', aadAndCustomProviders); router.post( '/:org/repos', requireAadApiAuthorizedScope(['repo/create', 'createRepo']), - function (req: IApiRequest, res, next) { + function (req: IApiRequest, res: Response, next: NextFunction) { const orgName = req.params.org; if (!req.apiKeyToken.organizationScopes) { return next(jsonError('There is a problem with the key configuration (no organization scopes)', 412)); @@ -116,7 +116,7 @@ router.post( router.post( '/:org/repos', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const organization = req.organization; const convergedObject = Object.assign({}, req.headers); @@ -185,7 +185,7 @@ router.post( }) ); -router.use((req: IApiRequest, res, next) => { +router.use((req: IApiRequest, res: Response, next: NextFunction) => { if (isClientRoute(req)) { // The frontend client routes are hooked into Express after // the session middleware. The client route does not require diff --git a/api/jsonErrorHandler.ts b/api/jsonErrorHandler.ts index 50915b863..67e192cb0 100644 --- a/api/jsonErrorHandler.ts +++ b/api/jsonErrorHandler.ts @@ -3,9 +3,10 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import { getProviders } from '../transitional'; -export default function JsonErrorHandler(err, req, res, next) { +export default function JsonErrorHandler(err, req, res: Response, next: NextFunction) { if (err && err['json']) { // jsonError objects should bubble up like before return next(err); diff --git a/api/people/index.ts b/api/people/index.ts index a724df813..2a02f017e 100644 --- a/api/people/index.ts +++ b/api/people/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { json404 } from '../../middleware/jsonError'; diff --git a/api/people/link.ts b/api/people/link.ts index d92825a8a..04d171ccf 100644 --- a/api/people/link.ts +++ b/api/people/link.ts @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { getProviders } from '../../transitional'; import { jsonError } from '../../middleware'; import { IApiRequest } from '../../middleware/apiReposAuth'; @@ -15,7 +17,7 @@ const supportedApiVersions = new Set([ '2019-10-01', ]); -export default async function postLinkApi(req: IApiRequest, res, next) { +export default async function postLinkApi(req: IApiRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const { operations } = providers; const token = req.apiKeyToken; diff --git a/api/people/links.ts b/api/people/links.ts index 5332bab1a..e97a790f3 100644 --- a/api/people/links.ts +++ b/api/people/links.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../middleware'; @@ -26,7 +26,7 @@ const extendedLinkApiVersions = [ '2019-02-01', ]; -router.use(function (req: IApiRequest, res, next) { +router.use(function (req: IApiRequest, res: Response, next: NextFunction) { const token = req.apiKeyToken; if (!token.scopes) { return next(jsonError('The key is not authorized for specific APIs', 401)); @@ -41,7 +41,7 @@ router.post('/', asyncHandler(postLinkApi)); router.get( '/', - asyncHandler(async (req: IApiRequest, res, next) => { + asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const skipOrganizations = req.query.showOrganizations !== undefined && !!req.query.showOrganizations; const showTimestamps = req.query.showTimestamps !== undefined && req.query.showTimestamps === 'true'; @@ -54,7 +54,7 @@ router.get( router.get( '/:linkid', - asyncHandler(async (req: IApiRequest, res, next) => { + asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { if (unsupportedApiVersions.includes(req.apiVersion)) { return next(jsonError('This API is not supported by the API version you are using.', 400)); } @@ -103,7 +103,7 @@ router.get( router.get( '/github/:username', - asyncHandler(async (req: IApiRequest, res, next) => { + asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { if (unsupportedApiVersions.includes(req.apiVersion)) { return next(jsonError('This API is not supported by the API version you are using.', 400)); } @@ -150,7 +150,7 @@ router.get( router.get( '/aad/userPrincipalName/:upn', - asyncHandler(async (req: IApiRequest, res, next) => { + asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { const upn = req.params.upn; const { operations } = getProviders(req); const skipOrganizations = req.query.showOrganizations !== undefined && !!req.query.showOrganizations; @@ -212,7 +212,7 @@ router.get( router.get( '/aad/:id', - asyncHandler(async (req: IApiRequest, res, next) => { + asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { if (req.apiVersion == '2016-12-01') { return next(jsonError('This API is not supported by the API version you are using.', 400)); } diff --git a/api/people/unlink.ts b/api/people/unlink.ts index 3a7aea7d5..5d78020b0 100644 --- a/api/people/unlink.ts +++ b/api/people/unlink.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { ICorporateLink, UnlinkPurpose } from '../../interfaces'; @@ -17,7 +17,7 @@ interface ILinksApiRequestWithUnlink extends IApiRequest { unlink?: ICorporateLink; } -router.use(function (req: ILinksApiRequestWithUnlink, res, next) { +router.use(function (req: ILinksApiRequestWithUnlink, res: Response, next: NextFunction) { const token = req.apiKeyToken; if (!token.scopes) { return next(jsonError('The key is not authorized for specific APIs', 401)); @@ -30,7 +30,7 @@ router.use(function (req: ILinksApiRequestWithUnlink, res, next) { router.use( '/github/id/:id', - asyncHandler(async (req: ILinksApiRequestWithUnlink, res, next) => { + asyncHandler(async (req: ILinksApiRequestWithUnlink, res: Response, next: NextFunction) => { const { linkProvider } = getProviders(req); const id = req.params.id; try { @@ -46,11 +46,11 @@ router.use( }) ); -router.use('*', (req: ILinksApiRequestWithUnlink, res, next) => { +router.use('*', (req: ILinksApiRequestWithUnlink, res: Response, next: NextFunction) => { return next(req.unlink ? undefined : jsonError('No link available for operation', 404)); }); -router.delete('*', (req: ILinksApiRequestWithUnlink, res, next) => { +router.delete('*', (req: ILinksApiRequestWithUnlink, res: Response, next: NextFunction) => { const { config, operations } = getProviders(req); const link = req.unlink; let purpose: UnlinkPurpose = null; diff --git a/api/webhook.ts b/api/webhook.ts index a41104162..f93d09380 100644 --- a/api/webhook.ts +++ b/api/webhook.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import moment from 'moment'; @@ -21,7 +21,7 @@ interface IRequestWithRaw extends ReposAppRequest { } router.use( - asyncHandler(async (req: IRequestWithRaw, res, next) => { + asyncHandler(async (req: IRequestWithRaw, res: Response, next: NextFunction) => { if (!isWebhookIngestionEndpointEnabled(req)) { return next( jsonError( diff --git a/bin/www.ts b/bin/www.ts index 8fbd05f5c..af8fe7d7b 100644 --- a/bin/www.ts +++ b/bin/www.ts @@ -9,13 +9,15 @@ import Debug from 'debug'; const debug = Debug.debug('g:server'); const debugInitialization = Debug.debug('startup'); -import app from '../app'; - import http from 'http'; import https from 'https'; import fs from 'fs'; import path from 'path'; +import { createExpressApplication } from '..'; + +const app = createExpressApplication(); + function normalizePort(val) { const port = parseInt(val, 10); diff --git a/business/githubApps/index.ts b/business/githubApps/index.ts index 7f1ddfdec..2b7a077ac 100644 --- a/business/githubApps/index.ts +++ b/business/githubApps/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { IReposApplication } from '../../interfaces'; +import { ExecutionEnvironment } from '../../interfaces'; import { CreateError } from '../../transitional'; import Debug from 'debug'; @@ -146,6 +146,7 @@ export interface IGitHubAppConfiguration { } export interface IGitHubAppsOptions { - app: IReposApplication; + // app: IReposApplication; configurations: Map; + executionEnvironment: ExecutionEnvironment; } diff --git a/business/githubApps/tokenManager.ts b/business/githubApps/tokenManager.ts index 560ba6e7f..66233bcff 100644 --- a/business/githubApps/tokenManager.ts +++ b/business/githubApps/tokenManager.ts @@ -65,9 +65,10 @@ export class GitHubTokenManager { if (!options) { throw new Error('options required'); } + const executionEnvironment = options.executionEnvironment; this.#options = options; GitHubTokenManager._forceBackgroundTokens = - options.app.isBackgroundJob && !options.app.enableAllGitHubApps; + executionEnvironment.isJob && !executionEnvironment.enableAllGitHubApps; } private getFallbackList(input: AppPurposeTypes[]) { diff --git a/business/operations/core.ts b/business/operations/core.ts index 6b4e0fdd4..13f8dad5e 100644 --- a/business/operations/core.ts +++ b/business/operations/core.ts @@ -21,6 +21,7 @@ import { IOperationsCentralOperationsToken, IAuthorizationHeaderValue, SiteConfiguration, + ExecutionEnvironment, } from '../../interfaces'; import { RestLibrary } from '../../lib/github'; import { CreateError } from '../../transitional'; @@ -35,6 +36,7 @@ export interface IOperationsCoreOptions { github: RestLibrary; providers: IProviders; baseUrl?: string; + executionEnvironment: ExecutionEnvironment; } export enum CacheDefault { diff --git a/business/operations/index.ts b/business/operations/index.ts index 482fcc4cd..b88f3348e 100644 --- a/business/operations/index.ts +++ b/business/operations/index.ts @@ -86,13 +86,7 @@ export interface ICrossOrganizationMembersResult extends Map {} export interface IOperationsOptions extends IOperationsCoreOptions { - // cacheProvider: ICacheHelper; - // config: any; github: RestLibrary; - // insights: TelemetryClient; - // linkProvider: ILinkProvider; - // mailAddressProvider: IMailAddressProvider; - // mailProvider: IMailProvider; repositoryMetadataProvider: IRepositoryMetadataProvider; } @@ -179,7 +173,7 @@ export class Operations } this._tokenManager = new GitHubTokenManager({ configurations: purposesToConfigurations, - app: this.providers.app, + executionEnvironment: options.executionEnvironment, }); GitHubTokenManager.RegisterManagerForOperations(this, this._tokenManager); this._dynamicOrganizationIds = new Set(); diff --git a/business/organization.ts b/business/organization.ts index 0dbfa5fe9..8097a3fb3 100644 --- a/business/organization.ts +++ b/business/organization.ts @@ -24,6 +24,7 @@ import { CacheDefault, getMaxAgeSeconds, getPageSize, OperationsCore } from './o import { CoreCapability, GitHubAuditLogEntry, + GitHubOrganizationInvite, GitHubRepositoryVisibility, IAccountBasics, IAddOrganizationMembershipOptions, @@ -512,10 +513,6 @@ export class Organization { return this._settings.hasFeature(OrganizationFeature.Hidden) || false; } - get pilot_program() { - return this._settings.properties['1es']; - } - get createRepositoriesOnGitHub(): boolean { return this._settings.hasFeature(OrganizationFeature.CreateNativeRepositories) || false; } @@ -1331,7 +1328,7 @@ export class Organization { } } - async getMembershipInvitations(): Promise { + async getMembershipInvitations(): Promise { const operations = throwIfNotGitHubCapable(this._operations); const parameters = { org: this.name, @@ -1342,7 +1339,7 @@ export class Organization { 'orgs.listPendingInvitations', parameters ); - return invitations; + return invitations as GitHubOrganizationInvite[]; } catch (error) { if (error.status == /* loose */ 404) { return null; diff --git a/business/repository.ts b/business/repository.ts index 06ba5bd27..bb253ec18 100644 --- a/business/repository.ts +++ b/business/repository.ts @@ -47,6 +47,7 @@ import { IOperationsRepositoryMetadataProvider, IOperationsUrls, GitHubRepositoryPermission, + GitHubRepositoryVisibility, } from '../interfaces'; import { IListPullsParameters, GitHubPullRequestState } from '../lib/github/collections'; @@ -256,6 +257,9 @@ export class Repository { get private(): boolean { return this._entity ? this._entity.private : false; } + get visibility(): GitHubRepositoryVisibility { + return this._entity ? this._entity.visibility : null; + } get html_url(): string { return this._entity ? this._entity.html_url : null; } @@ -403,6 +407,17 @@ export class Repository { }; } + async getId(options?: ICacheOptions): Promise { + // Repositories by name may not actually have the ID; this ensures it's available + // and a number. Similar to previously checking "isDeleted" or "getDetails" first. + if (!this.id) { + await this.getDetails(options); + } + if (this.id) { + return typeof this.id === 'number' ? this.id : parseInt(this.id, 10); + } + } + async isDeleted(options?: ICacheOptions): Promise { try { await this.getDetails(options); diff --git a/business/repositoryActions.ts b/business/repositoryActions.ts index ec2d2b539..524a0559b 100644 --- a/business/repositoryActions.ts +++ b/business/repositoryActions.ts @@ -9,10 +9,7 @@ import { AppPurpose } from './githubApps'; import { IPurposefulGetAuthorizationHeader, IOperationsInstance, - IGetBranchesOptions, - IGitHubBranch, throwIfNotGitHubCapable, - IGetPullsOptions, ICacheOptions, IGetAuthorizationHeader, } from '../interfaces'; diff --git a/docs/jobs.md b/docs/jobs.md index 56173c8fc..80050e304 100644 --- a/docs/jobs.md +++ b/docs/jobs.md @@ -6,15 +6,34 @@ if you choose to use them. Jobs are an alternate entrypoint into the application, and have full use of the same set of [providers](./providers.md). -## list of cronjobs - -Several jobs are available in the container or the `jobs/` folder. These can -optionally provide useful operational and services support. Often a Kubernetes -CronJob can help. - -- `cleanupInvites`: if configured for an org, cleanup old unaccepted invites -- `firehose`: ongoing processing of GitHub events for keeping cache up-to-date -- `managers`: cache the last-known manager for links, to use in notifications after a departure may remove someone from the graph -- `permissions`: updating permissions for all-write/all-read/all-admin teams when configured -- `refreshUsernames`: keeping link data fresh with GitHub username renames, corporate username and display name updates, and removing links for deleted GitHub users who remove their accounts permanently from GitHub.com -- `reports`: processing the building of report data about use, abandoned repos, etc. **this job is broken** +## Webhook event firehose + +> The primary consistency and event processing loop for the entire app. [firehose](../jobs/firehose.ts) + +Ongoing processing of GitHub events for keeping cache up-to-date, locking down new repos, etc. + +## Cleanup organization invitations + +> [cleanupInvites](../jobs/cleanupInvites.ts) + +If configured for an org, cleanup old unaccepted invites. This predates +GitHub-native expiration of invites. + +## System Team permissions + +> [permissions](../jobs/permissions.ts) + +Updating permissions for all-write/all-read/all-admin teams when configured + +## Refresh usernames and other link attributes + +> [refreshUsernames](../jobs/refreshUsernames.ts) + +Keeps link data fresh with GitHub username renames, corporate username and display name updates, +and removing links for deleted GitHub users who remove their accounts permanently from GitHub.com. + +## Cleanup blob cache + +Removes expired cache entities from the blob cache. + +> [cleanupBlobCache](../jobs/cleanupBlobCache.ts) diff --git a/entities/repository.ts b/entities/repository.ts index c2ca9ce3c..04d3a17ef 100644 --- a/entities/repository.ts +++ b/entities/repository.ts @@ -16,6 +16,7 @@ import { QueryBase, } from '../lib/entityMetadataProvider'; import { PostgresConfiguration, PostgresSettings } from '../lib/entityMetadataProvider/postgres'; +import { ErrorHelper } from '../transitional'; const type = new EntityMetadataType('RepositoryDetails'); const typeColumnValue = 'repositorydetails'; @@ -312,6 +313,21 @@ for (let i = 0; i < fieldNames.length; i++) { } } +export async function tryGetRepositoryEntity( + repositoryProvider: IRepositoryProvider, + repositoryId: number +): Promise { + try { + const repositoryEntity = await repositoryProvider.get(repositoryId); + return repositoryEntity; + } catch (error) { + if (ErrorHelper.IsNotFound(error)) { + return null; + } + throw error; + } +} + export const EntityImplementation = { Type: type, EnsureDefinitions: () => {}, diff --git a/entities/repositoryMetadata/repositoryMetadata.ts b/entities/repositoryMetadata/repositoryMetadata.ts index c762557aa..791057a69 100644 --- a/entities/repositoryMetadata/repositoryMetadata.ts +++ b/entities/repositoryMetadata/repositoryMetadata.ts @@ -4,8 +4,8 @@ // import { EntityField } from '../../lib/entityMetadataProvider/entityMetadataProvider'; -import { IEntityMetadata } from '../../lib/entityMetadataProvider/entityMetadata'; -import { IEntityMetadataFixedQuery, FixedQueryType } from '../../lib/entityMetadataProvider/query'; +import type { IEntityMetadata } from '../../lib/entityMetadataProvider/entityMetadata'; +import { type IEntityMetadataFixedQuery, FixedQueryType } from '../../lib/entityMetadataProvider/query'; import { EntityMetadataMappings, MetadataMappingDefinition, @@ -17,7 +17,7 @@ import { PostgresSettings, PostgresConfiguration, } from '../../lib/entityMetadataProvider/postgres'; -import { TableConfiguration, TableSettings } from '../../lib/entityMetadataProvider/table'; +import { TableSettings } from '../../lib/entityMetadataProvider/table'; import { MemoryConfiguration, MemorySettings } from '../../lib/entityMetadataProvider/memory'; import { odata, TableEntityQueryOptions } from '@azure/data-tables'; import { diff --git a/index.ts b/index.ts new file mode 100644 index 000000000..4e5a3d423 --- /dev/null +++ b/index.ts @@ -0,0 +1,91 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import express from 'express'; +import Debug from 'debug'; + +import type { ExecutionEnvironment, IReposApplication, SiteConfiguration } from './interfaces'; +import configResolver from './lib/config'; +import initialize from './middleware/initialize'; + +// Library framework +export * from './interfaces'; + +// Application framework +type InitializeCall = ( + executionEnvironment: ExecutionEnvironment, + config: SiteConfiguration, + configurationError: Error +) => Promise; + +export function createExpressApplication(): IReposApplication { + Debug.debug('startup')('starting web framework...'); + const app = express() as any as IReposApplication; + + app.initializeApplication = initializeApp.bind(undefined, app, express, __dirname); + app.startupApplication = commonStartup.bind( + undefined, + app.initializeApplication, + false /* not a job */, + app + ); + + return app; +} + +function initializeApp( + app: IReposApplication, + express: any, + dirname: string, + executionEnvironment: ExecutionEnvironment, + config: SiteConfiguration, + configurationError: Error +) { + return initialize(executionEnvironment, app, express, dirname, config, configurationError); +} + +export async function commonStartup(call: InitializeCall, isJob: boolean, app?: IReposApplication) { + const executionEnvironment: ExecutionEnvironment = { + isJob, + enableAllGitHubApps: undefined, + // + expressApplication: app, + // + providers: undefined, + skipModules: new Set(), + // + started: new Date(), + }; + + let painlessConfigResolver = null; + try { + painlessConfigResolver = configResolver(); + } catch (error) { + console.warn('Painless config resolver initialization error:'); + console.error(error); + throw error; + } + let config: any = null; + let configurationError: Error = null; + try { + config = await painlessConfigResolver.resolve(); + } catch (error) { + configurationError = error; + } + if (isJob) { + executionEnvironment.skipModules.add('web'); + } + try { + await call(executionEnvironment, config, configurationError); + } catch (startupError) { + console.error(`Startup error: ${startupError}`); + if (startupError.stack) { + console.error(startupError.stack); + } + process.exit(1); + } + + return executionEnvironment; +} diff --git a/interfaces/app.ts b/interfaces/app.ts index 7520ed409..84a25968c 100644 --- a/interfaces/app.ts +++ b/interfaces/app.ts @@ -3,14 +3,21 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Application } from 'express'; +import { Application, Response, NextFunction } from 'express'; import { IProviders } from './providers'; import type { RuntimeConfiguration } from './config'; +import { ReposAppRequest } from './web'; export interface IApplicationProfile { applicationName: string; - customErrorHandlerRender?: (errorView: any, err: Error, req: any, res: any, next: any) => Promise; + customErrorHandlerRender?: ( + errorView: unknown, + err: Error, + req: ReposAppRequest, + res: Response, + next: NextFunction + ) => Promise; customRoutes?: () => Promise; logDependencies: boolean; serveClientAssets: boolean; @@ -32,24 +39,43 @@ export interface IReposApplication extends Application { enableAllGitHubApps: boolean; runtimeConfiguration: RuntimeConfiguration; + executionEnvironment: ExecutionEnvironment; + startServer: () => Promise; - initializeApplication: (config: any, configurationError: Error) => Promise; - initializeJob: (config: any, configurationError: Error) => Promise; + initializeApplication: ( + executionEnvironment: ExecutionEnvironment, + config: any, + configurationError: Error + ) => Promise; + startupApplication: () => Promise; - startupJob: () => Promise; runJob: ( job: (job: IReposJob) => Promise, options?: IReposJobOptions - ) => Promise; + ) => Promise; } +export type ExecutionEnvironment = { + isJob: boolean; + enableAllGitHubApps: boolean; + + expressApplication: IReposApplication | null; + + providers: IProviders; + skipModules: Set; + + started: Date; +}; + export interface IReposJob { app: IReposApplication; started: Date; providers: IProviders; parameters: any; args: string[]; + + executionEnvironment: ExecutionEnvironment; } export interface IReposJobResult { diff --git a/interfaces/companySpecific/administration.ts b/interfaces/companySpecific/administration.ts index 9d138e664..d404b5275 100644 --- a/interfaces/companySpecific/administration.ts +++ b/interfaces/companySpecific/administration.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { IDictionary } from '../../interfaces'; diff --git a/interfaces/companySpecific/passport.ts b/interfaces/companySpecific/passport.ts index 389e08065..478aa6c60 100644 --- a/interfaces/companySpecific/passport.ts +++ b/interfaces/companySpecific/passport.ts @@ -4,7 +4,7 @@ // import { PassportStatic } from 'passport'; -import { IAuthenticationHelperMethods } from '../../middleware/passport-routes'; +import type { IAuthenticationHelperMethods } from '../../middleware/passport-routes'; export interface ICompanySpecificPassportMiddleware { configure?: (app: any, config: any, passport: PassportStatic) => void; diff --git a/interfaces/companySpecific/routes/index.ts b/interfaces/companySpecific/routes/index.ts index 9e4560744..ddb835ff4 100644 --- a/interfaces/companySpecific/routes/index.ts +++ b/interfaces/companySpecific/routes/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { IAttachCompanySpecificRoutesApi } from './api'; export * from './api'; diff --git a/interfaces/github/orgs.ts b/interfaces/github/orgs.ts index 52092fda5..b815b973e 100644 --- a/interfaces/github/orgs.ts +++ b/interfaces/github/orgs.ts @@ -3,8 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { ICacheOptions, IPagedCacheOptions } from '.'; -import { ICorporateLink } from '..'; +import type { ICacheOptions, IPagedCacheOptions } from '.'; +import type { ICorporateLink } from '..'; import { OrganizationMember } from '../../business'; import { Repository } from '../../business/repository'; @@ -97,3 +97,24 @@ export interface IOrganizationMembership { organization: any; user: any; } + +export type GitHubSimpleAccount = { + login: string; + avatar_url: string; + id: number; +}; + +export type GitHubOrganizationInvite = { + created_at: string; + email: string; + failed_at: string; + failed_reason: string; + id: number; + invitation_source: string; // 'member' + invitation_teams_url: string; + inviter: GitHubSimpleAccount; + login: string; + node_id: string; + role: string; // 'direct_member' + team_count: number; +}; diff --git a/interfaces/index.ts b/interfaces/index.ts index 079d0b3d7..e06868081 100644 --- a/interfaces/index.ts +++ b/interfaces/index.ts @@ -16,7 +16,8 @@ export * from './providers'; export * from './web'; export * from './config'; -import { +import type { ExecutionEnvironment } from './app'; +import type { IAttachCompanySpecificRoutes, IAttachCompanySpecificMiddleware, ICorporationAdministrationSection, @@ -25,8 +26,9 @@ import { IAttachCompanySpecificViews, IAttachCompanySpecificUrls, } from './companySpecific'; -import { ICompanySpecificPassportMiddleware } from './companySpecific/passport'; -import { IProviders } from './providers'; +import type { ICompanySpecificPassportMiddleware } from './companySpecific/passport'; +import type { SiteConfiguration } from './config'; +import type { IProviders } from './providers'; // We're great at long variable names! @@ -42,6 +44,11 @@ export interface ICompanySpecificStartupProperties { urls?: IAttachCompanySpecificUrls; } -export type ICompanySpecificStartupFunction = (config: any, p: IProviders, rootdir: string) => Promise; +export type ICompanySpecificStartupFunction = ( + executionEnvironment: ExecutionEnvironment, + config: SiteConfiguration, + p: IProviders, + rootdir: string +) => Promise; export type ICompanySpecificStartup = ICompanySpecificStartupFunction & ICompanySpecificStartupProperties; diff --git a/jest.config.ts b/jest.config.ts index d71b5f019..ec96f57aa 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,3 +1,8 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + // eslint-disable-next-line n/no-unpublished-import import type { Config } from 'jest'; diff --git a/app.ts b/job.ts similarity index 53% rename from app.ts rename to job.ts index 6bcc8ce8c..ebf53e053 100644 --- a/app.ts +++ b/job.ts @@ -3,69 +3,27 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import express from 'express'; import { hostname } from 'os'; - -import { IReposApplication, IReposJob, IReposJobOptions, IReposJobResult } from './interfaces'; - -import configResolver from './lib/config'; -import initialize from './middleware/initialize'; -import { quitInTenSeconds } from './utils'; - -const app = express() as any as IReposApplication; - import Debug from 'debug'; -Debug.debug('startup')('starting...'); - -app.initializeApplication = initialize.bind(undefined, app, express, __dirname); - -app.initializeJob = function initializeJob(config, configurationError) { - if (config) { - config.isJobInternal = true; - config.skipModules = new Set(['web']); - } else { - console.warn(`Configuration did not resolve successfully`, configurationError); - } - return initialize(app, express, __dirname, config, configurationError); -}; - -async function startup(startupApplication: boolean) { - let painlessConfigResolver = null; - try { - painlessConfigResolver = configResolver(); - } catch (error) { - console.warn('Painless config resolver initialization error:'); - console.error(error); - throw error; - } - let config: any = null; - let configurationError: Error = null; - try { - config = await painlessConfigResolver.resolve(); - } catch (error) { - configurationError = error; - } - - try { - if (startupApplication) { - await app.initializeApplication(config, configurationError); - } else { - await app.initializeJob(config, configurationError); - } - } catch (startupError) { - console.error(`Startup error: ${startupError}`); - process.exit(1); // throw startupError; - } - return app; -} +import type { + ExecutionEnvironment, + IProviders, + IReposJob, + IReposJobOptions, + IReposJobResult, + SiteConfiguration, +} from './interfaces'; +import { commonStartup } from '.'; +import { quitInTenSeconds } from './utils'; +import initialize from './middleware/initialize'; -app.startupApplication = startup.bind(null, true); -app.startupJob = startup.bind(null, false); -app.runJob = async function ( +export async function runJob( job: (job: IReposJob) => Promise, options?: IReposJobOptions -): Promise { +): Promise { + Debug.debug('startup')('starting job...'); + options = options || {}; // TODO: automatically track elapsed job time const started = new Date(); @@ -79,20 +37,19 @@ app.runJob = async function ( if (options.defaultDebugOutput && !process.env.DEBUG) { process.env.DEBUG = options.defaultDebugOutput; } - app.isBackgroundJob = true; - if (options.enableAllGitHubApps) { - app.enableAllGitHubApps = true; - } + + let executionEnvironment: ExecutionEnvironment = null; try { - await app.startupJob(); + executionEnvironment = await commonStartup(initializeJob, true /* job */, null /* app */); } catch (startupError) { console.error(`Job startup error before runJob: ${startupError}`); quitInTenSeconds(false); - return app; + return; } - if (options.insightsPrefix && app.providers.insights) { + const providers = executionEnvironment?.providers; + if (options.insightsPrefix && providers?.insights) { try { - app.providers.insights.trackEvent({ + providers?.insights?.trackEvent({ name: `${options.insightsPrefix}Started`, properties: { hostname: hostname(), @@ -103,17 +60,19 @@ app.runJob = async function ( } } const jobObject = { - app, - providers: app.providers, + app: providers?.app, + executionEnvironment, + providers, started, parameters: options && options.parameters ? options.parameters : {}, args: process.argv.length > 2 ? process.argv.slice(2) : [], }; + let result: IReposJobResult = null; try { - const result = await job.call(null, jobObject); - if (result && result.successProperties && app.providers.insights && options.insightsPrefix) { + result = (await job.call(null, jobObject)) as IReposJobResult; + if (result?.successProperties && providers?.insights && options.insightsPrefix) { try { - app.providers.insights.trackEvent({ + providers?.insights?.trackEvent({ name: `${options.insightsPrefix}Success`, properties: Object.assign( { @@ -128,14 +87,17 @@ app.runJob = async function ( } } catch (jobError) { console.error(`The job failed: ${jobError}`); + if (jobError.stack) { + console.error(jobError.stack); + } // by default, let's not show the whole inner error const simpleError = { ...jobError }; simpleError?.cause && delete simpleError.cause; console.dir(simpleError); quitInTenSeconds(false); - if (options.insightsPrefix && app.providers.insights) { + if (options.insightsPrefix) { try { - app.providers.insights.trackException({ + providers?.insights?.trackException({ exception: jobError, properties: { name: `${options.insightsPrefix}Failure`, @@ -145,12 +107,50 @@ app.runJob = async function ( console.error(`insights error: ${ignoreInsightsError}`); } } - return app; + return result; } // CONSIDER: insights metric for job time + console.log(); console.log('The job was successful.'); quitInTenSeconds(true); - return app; + return result; +} + +function initializeJob( + executionEnvironment: ExecutionEnvironment, + config: SiteConfiguration, + configurationError: Error +) { + if (!config || configurationError) { + console.warn(`Configuration did not resolve successfully`, configurationError); + } + return initialize( + executionEnvironment, + null /* app */, + null /* express */, + __dirname, + config, + configurationError + ); +} + +const job = { + runBackgroundJob: async ( + script: (providers: IProviders, jobParameters?: IReposJob) => Promise, + options?: IReposJobOptions + ) => { + return runJob(async function (jobParameters: IReposJob) { + return (await script(jobParameters.providers, jobParameters)) || {}; + }, Object.assign({ enableAllGitHubApps: false }, options || {})); + }, + run: async ( + script: (providers: IProviders, jobParameters?: IReposJob) => Promise, + options?: IReposJobOptions + ) => { + return runJob(async function (jobParameters: IReposJob) { + return (await script(jobParameters.providers, jobParameters)) || {}; + }, Object.assign({ enableAllGitHubApps: true }, options || {})); + }, }; -export default app; +export default job; diff --git a/jobs/cleanupBlobCache/task.ts b/jobs/cleanupBlobCache.ts similarity index 81% rename from jobs/cleanupBlobCache/task.ts rename to jobs/cleanupBlobCache.ts index cccf1bd0d..295326351 100644 --- a/jobs/cleanupBlobCache/task.ts +++ b/jobs/cleanupBlobCache.ts @@ -3,10 +3,15 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import BlobCache from '../../lib/caching/blob'; -import { IReposJob } from '../../interfaces'; +// Job 17: Cleanup blob cache -export default async function go({ providers }: IReposJob): Promise { +import BlobCache from '../lib/caching/blob'; +import job from '../job'; +import { IProviders } from '../interfaces'; + +job.runBackgroundJob(cleanup); + +async function cleanup(providers: IProviders): Promise { for (const providerName in providers) { const provider = providers[providerName]; if (provider && provider['expiringBlobCache']) { diff --git a/jobs/cleanupBlobCache/index.ts b/jobs/cleanupBlobCache/index.ts deleted file mode 100644 index c359c26a1..000000000 --- a/jobs/cleanupBlobCache/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job); diff --git a/jobs/cleanupInvites/task.ts b/jobs/cleanupInvites.ts similarity index 71% rename from jobs/cleanupInvites/task.ts rename to jobs/cleanupInvites.ts index 6da64f9a4..e912ce399 100644 --- a/jobs/cleanupInvites/task.ts +++ b/jobs/cleanupInvites.ts @@ -3,48 +3,50 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import moment from 'moment'; - -import { IReposJob } from '../../interfaces'; +// Job 16: cleanup invites // Organization invitations cleanup: remove any invitations that are older than a // set period of time from the organization. +import { GitHubOrganizationInvite, IProviders } from '../interfaces'; +import job from '../job'; +import { daysInMilliseconds } from '../utils'; + const defaultMaximumInvitationAgeDays = 4; -export default async function cleanup({ providers }: IReposJob): Promise { +job.runBackgroundJob(cleanup, { + timeoutMinutes: 90, + insightsPrefix: 'JobOrganizationInvitationsCleanup', +}); + +async function cleanup(providers: IProviders) { const insights = providers.insights; let maximumInvitationAgeDays = defaultMaximumInvitationAgeDays; const { config, operations } = providers; - if ( - config.github && - config.github.jobs && - config.github.jobs.cleanup && - config.github.jobs.cleanup.maximumInvitationAgeDays - ) { + if (config?.github?.jobs?.cleanup?.maximumInvitationAgeDays) { maximumInvitationAgeDays = config.github.jobs.cleanup.maximumInvitationAgeDays; } - const maximumAgeMoment = moment().subtract(maximumInvitationAgeDays, 'days'); + const maximumAgeDate = new Date(new Date().getTime() - daysInMilliseconds(maximumInvitationAgeDays)); const organizations = operations.getOrganizations(); const removedInvitations = 0; for (const organization of organizations) { - let invitations: any[]; + let invitations: GitHubOrganizationInvite[]; try { invitations = await organization.getMembershipInvitations(); } catch (getInvitationsError) { - insights.trackException({ exception: getInvitationsError }); + insights?.trackException({ exception: getInvitationsError }); console.dir(getInvitationsError); continue; } if (!invitations || invitations.length === 0) { continue; } - const invitationsToRemove = []; + const invitationsToRemove: string[] = []; let emailInvitations = 0; for (let i = 0; i < invitations.length; i++) { const invite = invitations[i]; - const createdAt = moment(invite.created_at); - if (createdAt.isBefore(maximumAgeMoment)) { + const createdAt = new Date(invite.created_at); + if (createdAt < maximumAgeDate) { if (invite.login) { invitationsToRemove.push(invite.login); } else { @@ -52,8 +54,7 @@ export default async function cleanup({ providers }: IReposJob): Promise { console.warn(`An e-mail based invitation to ${invite.email} cannot be automatically canceled`); } const data = { - createdAt: createdAt.format(), - invitedAgo: createdAt.fromNow(), + createdAt: createdAt.toISOString(), login: invite.login, inviter: invite && invite.inviter && invite.inviter.login ? invite.inviter.login : undefined, role: invite.role, @@ -62,7 +63,7 @@ export default async function cleanup({ providers }: IReposJob): Promise { const eventName = invite.login ? 'JobOrganizationInviteCleanupInvitationNeeded' : 'JobOrganizationInviteCleanupInvitationNotUser'; - insights.trackEvent({ + insights?.trackEvent({ name: eventName, properties: data, }); @@ -80,8 +81,8 @@ export default async function cleanup({ providers }: IReposJob): Promise { try { await organization.removeMember(login); } catch (removeError) { - insights.trackException({ exception: removeError }); - insights.trackEvent({ + insights?.trackException({ exception: removeError }); + insights?.trackEvent({ name: 'JobOrganizationInvitationsCleanupInvitationFailed', properties: { login: login, @@ -92,5 +93,5 @@ export default async function cleanup({ providers }: IReposJob): Promise { } } console.log(`Job finishing. Removed ${removedInvitations} expired invitations.`); - insights.trackMetric({ name: 'JobOrganizationInvitationsExpired', value: removedInvitations }); + insights?.trackMetric({ name: 'JobOrganizationInvitationsExpired', value: removedInvitations }); } diff --git a/jobs/cleanupInvites/index.ts b/jobs/cleanupInvites/index.ts deleted file mode 100644 index 7d2e3f56d..000000000 --- a/jobs/cleanupInvites/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job, { - timeoutMinutes: 90, - defaultDebugOutput: 'restapi', - insightsPrefix: 'JobOrganizationInvitationsCleanup', -}); diff --git a/jobs/cleanupKeys/index.ts b/jobs/cleanupKeys/index.ts deleted file mode 100644 index 8380b468f..000000000 --- a/jobs/cleanupKeys/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job, { timeoutMinutes: 90, defaultDebugOutput: 'restapi', insightsPrefix: 'JobCleanupKeys' }); diff --git a/jobs/cleanupKeys/task.ts b/jobs/cleanupKeys/task.ts deleted file mode 100644 index 4e1d3b019..000000000 --- a/jobs/cleanupKeys/task.ts +++ /dev/null @@ -1,98 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import throat from 'throat'; - -import { IReposJob, IReposJobResult } from '../../interfaces'; -import { sleep } from '../../utils'; -import { IGraphProvider } from '../../lib/graphProvider'; -import { LocalExtensionKey } from '../../entities/localExtensionKey/localExtensionKey'; - -async function lookupCorporateId( - graphProvider: IGraphProvider, - knownUsers: Map, - corporateId: string -): Promise { - const entry = knownUsers.get(corporateId); - if (entry === false) { - return false; - } else if (entry) { - return true; - } - - try { - const userDetails = await graphProvider.getUserById(corporateId); - if (!userDetails || !userDetails.userPrincipalName) { - knownUsers.set(corporateId, false); - return false; - } - knownUsers.set(corporateId, userDetails); - return true; - } catch (otherUserError) { - console.dir(otherUserError); - throw otherUserError; - } -} - -export default async function cleanup({ providers }: IReposJob): Promise { - const graphProvider = providers.graphProvider; - const localExtensionKeyProvider = providers.localExtensionKeyProvider; - const insights = providers.insights; - - console.log('reading all keys'); - const allKeys = await localExtensionKeyProvider.getAllKeys(); - console.log(`read ${allKeys.length}`); - - insights.trackEvent({ name: 'JobCleanupTokensKeysTokens', properties: { tokens: String(allKeys.length) } }); - - let errors = 0; - - let deleted = 0; - let okUserTokens = 0; - - const parallelUsers = 2; - const secondsDelayAfterSuccess = 0.25; - - const knownUsers = new Map(); - - const throttle = throat(parallelUsers); - await Promise.all( - allKeys.map((key: LocalExtensionKey) => - throttle(async () => { - const corporateId = key.corporateId; - const userStatus = await lookupCorporateId(graphProvider, knownUsers, corporateId); - if (!userStatus) { - try { - ++deleted; - console.log(`${deleted}: Deleting key for ${corporateId} that could not be found`); - await localExtensionKeyProvider.delete(key); - } catch (tokenDeleteError) { - --deleted; - console.dir(tokenDeleteError); - ++errors; - insights.trackException({ exception: tokenDeleteError }); - } - } else { - ++okUserTokens; - console.log(`${okUserTokens}: valid`); - } - - await sleep(secondsDelayAfterSuccess * 1000); - }) - ) - ); - - console.log(`deleted: ${deleted}`); - console.log(`okUserTokens: ${okUserTokens}`); - console.log(); - - return { - successProperties: { - deleted, - okUserTokens, - errors, - }, - }; -} diff --git a/jobs/cleanupTokens/index.ts b/jobs/cleanupTokens/index.ts deleted file mode 100644 index 2b59c4a5d..000000000 --- a/jobs/cleanupTokens/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job, { timeoutMinutes: 90, defaultDebugOutput: 'restapi', insightsPrefix: 'JobCleanupTokens' }); diff --git a/jobs/cleanupTokens/task.ts b/jobs/cleanupTokens/task.ts deleted file mode 100644 index 2bcd443e9..000000000 --- a/jobs/cleanupTokens/task.ts +++ /dev/null @@ -1,142 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import throat from 'throat'; -import { IReposJob, IReposJobResult } from '../../interfaces'; - -// Revoke tokens of users that no longer resolve in the corporate graph and -// delete tokens that have been expired 30 days. - -const expiredTokenDeleteThresholdDays = 30; - -import { PersonalAccessToken } from '../../entities/token/token'; -import { sleep } from '../../utils'; -import { IGraphProvider } from '../../lib/graphProvider'; - -async function lookupCorporateId( - graphProvider: IGraphProvider, - knownUsers: Map, - corporateId: string -): Promise { - const entry = knownUsers.get(corporateId); - if (entry === false) { - return false; - } else if (entry) { - return true; - } - - try { - const userDetails = await graphProvider.getUserById(corporateId); - if (!userDetails || !userDetails.userPrincipalName) { - knownUsers.set(corporateId, false); - return false; - } - knownUsers.set(corporateId, userDetails); - return true; - } catch (otherUserError) { - console.dir(otherUserError); - throw otherUserError; - } -} - -export default async function cleanup({ providers }: IReposJob): Promise { - const insights = providers.insights; - const graphProvider = providers.graphProvider; - const tokenProvider = providers.tokenProvider; - - console.log('reading all tokens'); - const allTokens = await tokenProvider.getAllTokens(); - console.log(`read ${allTokens.length}`); - - insights.trackEvent({ - name: 'JobCleanupTokensReadTokens', - properties: { tokens: String(allTokens.length) }, - }); - - let errors = 0; - - let revokedUnresolved = 0; - let deleted = 0; - let serviceTokens = 0; - let okUserTokens = 0; - - const parallelUsers = 1; - const secondsDelayAfterSuccess = 0.25; - - const now = new Date(); - const monthAgo = new Date(now.getTime() - 1000 * 60 * 60 * 24 * expiredTokenDeleteThresholdDays); - - const knownUsers = new Map(); - - const throttle = throat(parallelUsers); - await Promise.all( - allTokens.map((pat: PersonalAccessToken) => - throttle(async () => { - const isGuidMeansADash = pat.corporateId && pat.corporateId.includes('-'); - let wasUser = false; - if (isGuidMeansADash) { - wasUser = true; - - const userStatus = await lookupCorporateId(graphProvider, knownUsers, pat.corporateId); - if (!userStatus && pat.active !== false) { - pat.active = false; - console.log( - `Revoking key for ${pat.getIdentifier()} - employee ${pat.corporateId} could not be found` - ); - try { - await tokenProvider.updateToken(pat); - ++revokedUnresolved; - } catch (tokenUpdateError) { - console.dir(tokenUpdateError); - ++errors; - insights.trackException({ exception: tokenUpdateError }); - } - } - } else { - ++serviceTokens; - } - - if (pat.isExpired()) { - const dateExpired = pat.expires; - if (dateExpired < monthAgo) { - console.log(`Deleting key for ${pat.getIdentifier()} that expired ${dateExpired}`); - try { - await tokenProvider.deleteToken(pat); - ++deleted; - } catch (tokenDeleteError) { - console.dir(tokenDeleteError); - ++errors; - insights.trackException({ exception: tokenDeleteError }); - } - } else { - console.log( - `Expired key, keeping around ${pat.getIdentifier()} that expired ${dateExpired} for user notification purposes` - ); - } - } else if (wasUser) { - ++okUserTokens; - } - - await sleep(secondsDelayAfterSuccess * 1000); - }) - ) - ); - - console.log(`deleted: ${deleted}`); - console.log(`revokedUnresolved: ${revokedUnresolved}`); - console.log(`okUserTokens: ${okUserTokens}`); - console.log(`serviceTokens: ${serviceTokens}`); - console.log(); - - return { - successProperties: { - deleted, - revokedUnresolved, - okUserTokens, - serviceTokens, - errors, - }, - }; -} diff --git a/jobs/refreshQueryCache/deletedRepositories.ts b/jobs/deletedRepositoriesCache.ts similarity index 91% rename from jobs/refreshQueryCache/deletedRepositories.ts rename to jobs/deletedRepositoriesCache.ts index 46eaac0ac..ca3e84496 100644 --- a/jobs/refreshQueryCache/deletedRepositories.ts +++ b/jobs/deletedRepositoriesCache.ts @@ -1,14 +1,21 @@ -import app from '../../app'; -import { Organization } from '../../business/organization'; -import { RepositoryCollaboratorCacheEntity } from '../../entities/repositoryCollaboratorCache/repositoryCollaboratorCache'; -import { RepositoryTeamCacheEntity } from '../../entities/repositoryTeamCache/repositoryTeamCache'; -import { IProviders, IReposJob, IReposJobResult } from '../../interfaces'; -import { ErrorHelper } from '../../transitional'; -import { sleep } from '../../utils'; +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +// Job: Consistency: Deleted repos (7) + +import job from '../job'; +import { Organization } from '../business/organization'; +import { RepositoryCollaboratorCacheEntity } from '../entities/repositoryCollaboratorCache/repositoryCollaboratorCache'; +import { RepositoryTeamCacheEntity } from '../entities/repositoryTeamCache/repositoryTeamCache'; +import { IProviders, IReposJobResult } from '../interfaces'; +import { ErrorHelper } from '../transitional'; +import { sleep } from '../utils'; const killBitHours = 8; -app.runJob(byUserJob, { +job.runBackgroundJob(byUserJob, { defaultDebugOutput: 'qcuser', timeoutMinutes: 60 * killBitHours, insightsPrefix: 'JobRefreshUserQC', @@ -202,7 +209,7 @@ async function processDeletedRepositories(providers: IProviders): Promise console.log(`removed collaborator repos: ${removedCollaboratorRepositories}`); } -export default async function byUserJob({ providers, args }: IReposJob): Promise { +async function byUserJob(providers: IProviders): Promise { const { config } = providers; if (config?.jobs?.refreshWrites !== true) { console.log('job is currently disabled to avoid metadata refresh/rewrites'); diff --git a/jobs/firehose/task.ts b/jobs/firehose.ts similarity index 90% rename from jobs/firehose/task.ts rename to jobs/firehose.ts index e4acde7e4..c9f562b0c 100644 --- a/jobs/firehose/task.ts +++ b/jobs/firehose.ts @@ -7,24 +7,29 @@ import os from 'os'; import { DateTime } from 'luxon'; -import App from '../../app'; -import ProcessOrganizationWebhook, { IGitHubWebhookProperties } from '../../webhooks/organizationProcessor'; + +import ProcessOrganizationWebhook, { IGitHubWebhookProperties } from '../webhooks/organizationProcessor'; import { IGitHubAppInstallation, IGitHubWebhookEnterprise, IProviders, IReposJob, IReposJobResult, -} from '../../interfaces'; -import { sleep } from '../../utils'; -import { IQueueMessage } from '../../lib/queues'; -import getCompanySpecificDeployment from '../../middleware/companySpecificDeployment'; +} from '../interfaces'; +import { sleep } from '../utils'; +import { IQueueMessage } from '../lib/queues'; +import getCompanySpecificDeployment from '../middleware/companySpecificDeployment'; +import job from '../job'; const runningAsOngoingDeployment = true; const hardAbortMs = 1000 * 60 * 5; // 5 minutes -export default async function firehose({ providers, started }: IReposJob): Promise { +job.run(firehose, { + insightsPrefix: 'JobFirehose', +}); + +async function firehose(providers: IProviders, { started }: IReposJob): Promise { const processedEventTypes = {}; const interestingEvents = 0; let processedEvents = 0; @@ -89,28 +94,24 @@ export default async function firehose({ providers, started }: IReposJob): Promi console.log( `Parallelism for this run will be ${parallelism} logical threads, offset by ${sliceDelayPerThread}s` ); - // const insights = app.settings.appInsightsClient; - if (insights) { - insights.trackEvent({ - name: 'JobFirehoseStarted', - properties: { - hostname: os.hostname(), - // queue: serviceBusConfig.queue, - // subscription: serviceBusConfig.subscriptionName, - // messagesInQueue: messagesInQueue.toString(), - // deadLetters: deadLetters.toString(), - }, - }); - // insights.trackMetric({ name: 'FirehoseMessagesInQueue', value: messagesInQueue }); - // insights.trackMetric({ name: 'FirehoseDeadLetters', value: deadLetters }); - } + insights?.trackEvent({ + name: 'JobFirehoseStarted', + properties: { + hostname: os.hostname(), + // queue: serviceBusConfig.queue, + // subscription: serviceBusConfig.subscriptionName, + // messagesInQueue: messagesInQueue.toString(), + // deadLetters: deadLetters.toString(), + }, + }); + // insights.trackMetric({ name: 'FirehoseMessagesInQueue', value: messagesInQueue }); + // insights.trackMetric({ name: 'FirehoseDeadLetters', value: deadLetters }); const threads: Promise[] = []; let delay = 0; for (let i = 0; i < parallelism; i++) { - threads.push(createThread(App, providers, i, delay)); + threads.push(createThread(providers, i, delay)); delay += sliceDelayPerThread; } - const ok = true; await Promise.all(threads); console.warn('Forever execution thread has completed.'); @@ -119,7 +120,6 @@ export default async function firehose({ providers, started }: IReposJob): Promi // -- end of job startup -- async function createThread( - app, providers: IProviders, threadNumber: number, startupDelay: number @@ -136,7 +136,7 @@ export default async function firehose({ providers, started }: IReposJob): Promi await iterate(providers, threadNumber); } } catch (error) { - const insights = app.settings.appInsightsClient; + const insights = providers.insights; insights.trackException({ exception: error }); insights.trackEvent({ name: 'JobFirehoseFatalError', diff --git a/jobs/firehose/index.ts b/jobs/firehose/index.ts deleted file mode 100644 index 9ac3820d6..000000000 --- a/jobs/firehose/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job, { - defaultDebugOutput: 'redis,restapi,querycache', - insightsPrefix: 'JobFirehose', - enableAllGitHubApps: true, -}); diff --git a/jobs/permissions.ts b/jobs/permissions.ts new file mode 100644 index 000000000..96b5865e3 --- /dev/null +++ b/jobs/permissions.ts @@ -0,0 +1,214 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +// Job 15: System Team Permissions + +import { shuffle } from 'lodash'; +import throat from 'throat'; + +import job from '../job'; +import { TeamPermission } from '../business/teamPermission'; +import { GitHubRepositoryPermission, IProviders, IReposJobResult } from '../interfaces'; +import AutomaticTeamsWebhookProcessor from '../webhooks/tasks/automaticTeams'; +import { sleep } from '../utils'; +import { ErrorHelper } from '../transitional'; +import { Organization } from '../business'; + +// Permissions processing: visit all repos and make sure that any designated read, write, admin +// teams for the organization are present on every repo. This job is designed to be run relatively +// regularly but is not looking to answer "the truth" - it will use the cache of repos and other +// assets to not abuse GitHub and its API exhaustively. Over time repos will converge to having +// the right permissions. +// +// If a repository is "compliance locked", the system teams are not enforced until the lock is removed. + +const maxParallelism = 3; +const delayBetweenSeconds = 1; + +let updatedPermissions = 0; +let updatedRepos = 0; + +const missingTeams = new Set(); + +job.runBackgroundJob(permissionsRun, { + insightsPrefix: 'JobPermissions', +}); + +async function permissionsRun(providers: IProviders): Promise { + const { config, insights, operations } = providers; + if (config?.jobs?.refreshWrites !== true) { + console.log('job is currently disabled to avoid metadata refresh/rewrites'); + return; + } + + const throttle = throat(maxParallelism); + + const organizations = shuffle(Array.from(operations.organizations.values())); + + await Promise.allSettled( + organizations.map((organization, index) => + throttle(async () => { + return reviewOrganizationSystemTeams(providers, organization, index, organizations.length); + }) + ) + ); + + console.log(`Updated ${updatedPermissions} permissions across ${organizations.length} organizations`); + insights?.trackMetric({ name: 'JobSystemTeamsUpdatedPermissions', value: updatedPermissions }); + + console.log(`Updated ${updatedRepos} repos across ${organizations.length} organizations`); + insights?.trackMetric({ name: 'JobSystemTeamsUpdatedRepos', value: updatedRepos }); + + return {}; +} + +async function reviewOrganizationSystemTeams( + providers: IProviders, + organization: Organization, + index: number, + count: number +) { + const { insights } = providers; + const prefix = `${index}/${count}: ${organization.name}: `; + + console.log(`${prefix} Reviewing permissions for all repos in ${organization.name}...`); + try { + const repos = await organization.getRepositories(); + console.log(`Repos in the ${organization.name} org: ${repos.length}`); + const automaticTeams = new AutomaticTeamsWebhookProcessor(); + for (const repo of repos) { + let thisRepoUpdated = false; + console.log(`${organization.name}/${repo.name}`); + sleep(1000 * delayBetweenSeconds); + const cacheOptions = { + maxAgeSeconds: 10 * 60 /* 10m */, + backgroundRefresh: false, + }; + const { specialTeamIds, specialTeamLevels } = automaticTeams.processOrgSpecialTeams(repo.organization); + let permissions: TeamPermission[] = null; + try { + permissions = await repo.getTeamPermissions(cacheOptions); + } catch (getError) { + if (ErrorHelper.IsNotFound(getError)) { + console.log(`Repo gone: ${repo.organization.name}/${repo.name}`); + } else { + console.log( + `There was a problem getting the permissions for the repo ${repo.name} from ${repo.organization.name}` + ); + console.dir(getError); + } + continue; + } + let shouldSkipEnforcement = false; + const { customizedTeamPermissionsWebhookLogic } = providers; + if (customizedTeamPermissionsWebhookLogic) { + shouldSkipEnforcement = await customizedTeamPermissionsWebhookLogic.shouldSkipEnforcement(repo); + } + const currentPermissions = new Map(); + permissions.forEach((entry) => { + currentPermissions.set(Number(entry.team.id), entry.permission); + }); + const teamsToSet = new Set(); + specialTeamIds.forEach((specialTeamId) => { + if (!currentPermissions.has(specialTeamId)) { + teamsToSet.add(specialTeamId); + } else if ( + isAtLeastPermissionLevel( + currentPermissions.get(specialTeamId), + specialTeamLevels.get(specialTeamId) + ) + ) { + // The team permission is already acceptable + } else { + console.log( + `Permission level for ${specialTeamId} is not good enough, expected ${specialTeamLevels.get( + specialTeamId + )} but currently ${currentPermissions.get(specialTeamId)}` + ); + teamsToSet.add(specialTeamId); + } + }); + const setArray = Array.from(teamsToSet.values()); + for (const teamId of setArray) { + const newPermission = specialTeamLevels.get(teamId); + if ( + shouldSkipEnforcement && + (newPermission as GitHubRepositoryPermission) !== GitHubRepositoryPermission.Pull + ) { + console.log( + `should add ${teamId} team with permission ${newPermission} to the repo ${repo.name}, but compliance lock prevents non-read system teams` + ); + insights?.trackEvent({ + name: 'JobSystemTeamsSkipped', + properties: { + org: organization.name, + repo: repo.name, + teamId, + reason: 'compliance lock', + newPermission, + }, + }); + } else { + try { + if (!missingTeams.has(teamId)) { + await repo.setTeamPermission(teamId, newPermission as GitHubRepositoryPermission); + ++updatedPermissions; + thisRepoUpdated = true; + insights?.trackEvent({ + name: 'JobSystemTeamsUpdated', + properties: { + org: organization.name, + repo: repo.name, + teamId, + newPermission, + }, + }); + } + } catch (error) { + if (ErrorHelper.IsNotFound(error)) { + missingTeams.add(teamId); + console.log( + `the team ID ${teamId} could not be found when setting to repo ${repo.name} in org ${organization.name} and should likely be removed from config...` + ); + } else { + console.log(`${repo.name}`); + console.dir(error); + throw error; + } + } + } + } + if (thisRepoUpdated) { + ++updatedRepos; + } + } + console.log(`Finished with repos in ${organization.name} organization`); + } catch (processOrganizationError) { + console.dir(processOrganizationError); + console.log(`moving past ${organization.name} processing due to error...`); + } +} + +function isAtLeastPermissionLevel(value, expected) { + if (value !== 'admin' && value !== 'push' && value !== 'pull') { + throw new Error(`The permission type ${value} is not understood by isAtLeastPermissionLevel`); + } + if (value === expected) { + return true; + } + // Admin always wins + if (value === 'admin') { + return true; + } else if (expected === 'admin') { + return false; + } + if (expected === 'write' && value === expected) { + return true; + } + if (expected === 'read') { + return true; + } + return false; +} diff --git a/jobs/permissions/index.ts b/jobs/permissions/index.ts deleted file mode 100644 index 40b4097e0..000000000 --- a/jobs/permissions/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -// Job: System Team Permissions - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job, { - insightsPrefix: 'JobPermissions', - defaultDebugOutput: 'cache,restapi', -}); diff --git a/jobs/permissions/task.ts b/jobs/permissions/task.ts deleted file mode 100644 index 311e60711..000000000 --- a/jobs/permissions/task.ts +++ /dev/null @@ -1,155 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -// Job: System Team Permissions - -import { shuffle } from 'lodash'; - -import { TeamPermission } from '../../business/teamPermission'; -import { GitHubRepositoryPermission, IReposJob, IReposJobResult } from '../../interfaces'; -import AutomaticTeamsWebhookProcessor from '../../webhooks/tasks/automaticTeams'; -import { sleep } from '../../utils'; -import { ErrorHelper } from '../../transitional'; - -// Permissions processing: visit all repos and make sure that any designated read, write, admin -// teams for the organization are present on every repo. This job is designed to be run relatively -// regularly but is not looking to answer "the truth" - it will use the cache of repos and other -// assets to not abuse GitHub and its API exhaustively. Over time repos will converge to having -// the right permissions. -// -// If a repository is "compliance locked", the system teams are not enforced until the lock is removed. - -const maxParallelism = 1; - -const delayBetweenSeconds = 1; - -export default async function permissionsRun({ providers }: IReposJob): Promise { - const { config, operations } = providers; - if (config?.jobs?.refreshWrites !== true) { - console.log('job is currently disabled to avoid metadata refresh/rewrites'); - return; - } - - for (const organization of shuffle(Array.from(operations.organizations.values()))) { - console.log(`Reviewing permissions for all repos in ${organization.name}...`); - try { - const repos = await organization.getRepositories(); - console.log(`Repos in the ${organization.name} org: ${repos.length}`); - let z = 0; - const automaticTeams = new AutomaticTeamsWebhookProcessor(); - for (const repo of repos) { - console.log(`${repo.organization.name}/${repo.name}`); - sleep(1000 * delayBetweenSeconds); - const cacheOptions = { - maxAgeSeconds: 10 * 60 /* 10m */, - backgroundRefresh: false, - }; - ++z; - if (z % 250 === 1) { - console.log('. ' + z); - } - const { specialTeamIds, specialTeamLevels } = automaticTeams.processOrgSpecialTeams( - repo.organization - ); - let permissions: TeamPermission[] = null; - try { - permissions = await repo.getTeamPermissions(cacheOptions); - } catch (getError) { - if (getError.status == /* loose */ 404) { - console.log(`Repo gone: ${repo.organization.name}/${repo.name}`); - } else { - console.log( - `There was a problem getting the permissions for the repo ${repo.name} from ${repo.organization.name}` - ); - console.dir(getError); - } - continue; - } - let shouldSkipEnforcement = false; - const { customizedTeamPermissionsWebhookLogic } = providers; - if (customizedTeamPermissionsWebhookLogic) { - shouldSkipEnforcement = await customizedTeamPermissionsWebhookLogic.shouldSkipEnforcement(repo); - } - const currentPermissions = new Map(); - permissions.forEach((entry) => { - currentPermissions.set(Number(entry.team.id), entry.permission); - }); - const teamsToSet = new Set(); - specialTeamIds.forEach((specialTeamId) => { - if (!currentPermissions.has(specialTeamId)) { - teamsToSet.add(specialTeamId); - } else if ( - isAtLeastPermissionLevel( - currentPermissions.get(specialTeamId), - specialTeamLevels.get(specialTeamId) - ) - ) { - // The team permission is already acceptable - } else { - console.log( - `Permission level for ${specialTeamId} is not good enough, expected ${specialTeamLevels.get( - specialTeamId - )} but currently ${currentPermissions.get(specialTeamId)}` - ); - teamsToSet.add(specialTeamId); - } - }); - const setArray = Array.from(teamsToSet.values()); - for (const teamId of setArray) { - const newPermission = specialTeamLevels.get(teamId); - if ( - shouldSkipEnforcement && - (newPermission as GitHubRepositoryPermission) !== GitHubRepositoryPermission.Pull - ) { - console.log( - `should add ${teamId} team with permission ${newPermission} to the repo ${repo.name}, but compliance lock prevents non-read system teams` - ); - } else { - try { - await repo.setTeamPermission(teamId, newPermission as GitHubRepositoryPermission); - } catch (error) { - if (ErrorHelper.IsNotFound(error)) { - console.log( - `the team ID ${teamId} could not be found when setting to repo ${repo.name} in org ${organization.name} and should likely be removed from config...` - ); - } else { - console.log(`${repo.name}`); - console.dir(error); - throw error; - } - } - } - } - } - console.log(`Finished with repos in ${organization.name} organization`); - } catch (processOrganizationError) { - console.dir(processOrganizationError); - console.log(`moving past ${organization.name} processing due to error...`); - } - } - return {}; -} - -function isAtLeastPermissionLevel(value, expected) { - if (value !== 'admin' && value !== 'push' && value !== 'pull') { - throw new Error(`The permission type ${value} is not understood by isAtLeastPermissionLevel`); - } - if (value === expected) { - return true; - } - // Admin always wins - if (value === 'admin') { - return true; - } else if (expected === 'admin') { - return false; - } - if (expected === 'write' && value === expected) { - return true; - } - if (expected === 'read') { - return true; - } - return false; -} diff --git a/jobs/refreshQueryCache/task.ts b/jobs/refreshQueryCache.ts similarity index 98% rename from jobs/refreshQueryCache/task.ts rename to jobs/refreshQueryCache.ts index 18baa46e8..d98af222c 100644 --- a/jobs/refreshQueryCache/task.ts +++ b/jobs/refreshQueryCache.ts @@ -6,7 +6,17 @@ import throat from 'throat'; import { shuffle } from 'lodash'; -import { permissionsObjectToValue } from '../../transitional'; +const killBitHours = 48; + +import job from '../job'; + +job.runBackgroundJob(refreshQueryCache, { + defaultDebugOutput: 'querycache', + timeoutMinutes: 60 * killBitHours, + insightsPrefix: 'JobRefreshQueryCache', +}); + +import { permissionsObjectToValue } from '../transitional'; import { Collaborator, Operations, @@ -16,9 +26,9 @@ import { Team, TeamMember, TeamPermission, -} from '../../business'; -import { sleep, addArrayToSet } from '../../utils'; -import QueryCache from '../../business/queryCache'; +} from '../business'; +import { sleep, addArrayToSet } from '../utils'; +import QueryCache from '../business/queryCache'; import { IPagedCacheOptions, ICacheOptions, @@ -37,7 +47,8 @@ import { QueryCacheOperation, IReposJob, IReposJobResult, -} from '../../interfaces'; + IProviders, +} from '../interfaces'; interface IConsistencyStats { new: number; @@ -628,7 +639,7 @@ async function cacheRepositoryCollaborators( return operations.filter((real) => real); } -export default async function refresh({ providers, args }: IReposJob): Promise { +async function refreshQueryCache(providers: IProviders, { args }: IReposJob): Promise { const { config } = providers; if (config?.jobs?.refreshWrites !== true) { console.log('job is currently disabled to avoid metadata refresh/rewrites'); diff --git a/jobs/refreshQueryCache/index.ts b/jobs/refreshQueryCache/index.ts deleted file mode 100644 index 714cb72d2..000000000 --- a/jobs/refreshQueryCache/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -const killBitHours = 48; - -app.runJob(Job, { - defaultDebugOutput: 'querycache', - timeoutMinutes: 60 * killBitHours, - insightsPrefix: 'JobRefreshQueryCache', -}); diff --git a/jobs/refreshUsernames/index.ts b/jobs/refreshUsernames.ts similarity index 67% rename from jobs/refreshUsernames/index.ts rename to jobs/refreshUsernames.ts index c36d7da88..fc3e3837f 100644 --- a/jobs/refreshUsernames/index.ts +++ b/jobs/refreshUsernames.ts @@ -6,28 +6,29 @@ // Job: Backfill aliases (3) // Job: User attributes hygiene - alias backfills (4) -import app from '../../app'; +import job from '../job'; import throat from 'throat'; import { shuffle } from 'lodash'; -import { sleep } from '../../utils'; -import { IReposJob, IReposJobResult, UnlinkPurpose } from '../../interfaces'; +import { sleep } from '../utils'; +import { IProviders, IReposJobResult, UnlinkPurpose } from '../interfaces'; +import { ErrorHelper } from '../transitional'; -const backfillAliasesOnly = process.env.BACKFILL_ALIASES === '1'; - -app.runJob(refresh, { - defaultDebugOutput: 'cache,restapi', +job.runBackgroundJob(refresh, { insightsPrefix: 'JobRefreshUsernames', }); -async function refresh({ providers }: IReposJob): Promise { +async function refresh(providers: IProviders): Promise { const { config, operations, insights, linkProvider, graphProvider } = providers; if (config?.jobs?.refreshWrites !== true) { console.log('job is currently disabled to avoid metadata refresh/rewrites'); return; } + const backfillAliasesOnly = config.process.get('BACKFILL_ALIASES') === '1'; + const terminateLinksAndMemberships = config.process.get('REFRESH_USERNAMES_TERMINATE_ACCOUNTS') === '1'; + console.log('reading all links'); let allLinks = shuffle(await linkProvider.getAll()); console.log(`READ: ${allLinks.length} links`); @@ -67,6 +68,9 @@ async function refresh({ providers }: IReposJob): Promise { allLinks.map((link) => throttle(async () => { ++i; + if (i % 100 === 0) { + console.log(`${i}/${allLinks.length}; total updates=${updates}, errors=${errors}`); + } // Refresh GitHub username for the ID const id = link.thirdPartyId; @@ -96,7 +100,19 @@ async function refresh({ providers }: IReposJob): Promise { ++updatedAvatars; } } catch (githubError) { - console.dir(githubError); + if (ErrorHelper.IsNotFound(githubError)) { + console.warn( + `Deleted GitHub account, id=${id}, username_was=${link.thirdPartyUsername}; https://api.github.com/users/${link.thirdPartyUsername}` + ); + insights.trackMetric({ name: 'JobRefreshUsernamesMissingGitHubAccounts', value: 1 }); + insights.trackEvent({ + name: 'JobRefreshUsernamesGitHubAccountNotFound', + properties: { githubid: id, error: githubError.message }, + }); + } else { + console.dir(githubError); + } + throw githubError; } try { @@ -129,7 +145,17 @@ async function refresh({ providers }: IReposJob): Promise { } } catch (graphLookupError) { // Ignore graph lookup issues, other jobs handle terminated employees - console.dir(graphLookupError); + if (ErrorHelper.IsNotFound(graphLookupError)) { + console.warn(`Deleted AAD account, id=${id}, username_was=${link.corporateUsername}`); + insights.trackMetric({ name: 'JobRefreshUsernamesMissingCorporateAccounts', value: 1 }); + insights.trackEvent({ + name: 'JobRefreshUsernamesCorporateAccountNotFound', + properties: { githubid: id, error: graphLookupError.message }, + }); + } else { + console.dir(graphLookupError); + } + throw graphLookupError; } if (changed) { @@ -138,28 +164,31 @@ async function refresh({ providers }: IReposJob): Promise { ++updates; } } catch (getDetailsError) { - if (getDetailsError.status == /* loose compare */ '404') { + if (ErrorHelper.IsNotFound(getDetailsError)) { ++notFoundErrors; insights.trackEvent({ name: 'JobRefreshUsernamesNotFound', - properties: { githubid: id, error: getDetailsError.message }, + properties: { githubid: id, aadId: link.corporateId, error: getDetailsError.message }, }); - try { - await operations.terminateLinkAndMemberships(id, { purpose: UnlinkPurpose.Deleted }); - insights.trackEvent({ - name: 'JobRefreshUsernamesUnlinkDelete', - properties: { githubid: id, error: getDetailsError.message }, - }); - } catch (unlinkDeletedAccountError) { - console.dir(unlinkDeletedAccountError); - insights.trackException({ - exception: unlinkDeletedAccountError, - properties: { githubid: id, event: 'JobRefreshUsernamesDeleteError' }, - }); + if (terminateLinksAndMemberships) { + try { + await operations.terminateLinkAndMemberships(id, { purpose: UnlinkPurpose.Deleted }); + insights.trackEvent({ + name: 'JobRefreshUsernamesUnlinkDelete', + properties: { githubid: id, error: getDetailsError.message }, + }); + } catch (unlinkDeletedAccountError) { + console.dir(unlinkDeletedAccountError); + insights.trackException({ + exception: unlinkDeletedAccountError, + properties: { githubid: id, event: 'JobRefreshUsernamesDeleteError' }, + }); + } } } else { console.dir(getDetailsError); ++errors; + insights.trackMetric({ name: 'JobRefreshUsernamesErrors', value: 1 }); insights.trackException({ exception: getDetailsError, properties: { name: 'JobRefreshUsernamesError' }, @@ -188,8 +217,8 @@ async function refresh({ providers }: IReposJob): Promise { console.log(`Updates: ${updates}`); console.log(`GitHub username changes: ${updatedUsernames}`); console.log(`GitHub avatar changes: ${updatedAvatars}`); - console.log(`AAD name changes: ${updatedAadNames}`); - console.log(`AAD username changes: ${updatedAadUpns}`); + console.log(`Corporate name changes: ${updatedAadNames}`); + console.log(`Corporate username changes: ${updatedAadUpns}`); console.log(`Updated corporate mails: ${updatedCorporateMails}`); return { diff --git a/jobs/repositories.ts b/jobs/repositories.ts index 6c2a306cc..6c71dc65e 100644 --- a/jobs/repositories.ts +++ b/jobs/repositories.ts @@ -3,20 +3,19 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -// JOB 13: refresh repository data -// This is very similar to the query cache, but using proper Postgres type entities, and -// not being used by the app today. +// Job 13: refresh repository data -// Implementation is initial and not as robust (will refresh everything, even things not touched -// since the last update; limited telemetry.) +// This is very similar to the query cache, but using proper Postgres type entities, and +// not being used by the app today at runtime. Possible optimizations include only +// targeting refreshes based on last-cached times. The act of refreshing these entities +// also helps keep the standard GitHub repository cache up to date. import throat from 'throat'; -import app from '../app'; +import job from '../job'; import { Organization, sortByRepositoryDate } from '../business'; -import { IRepositoryProvider, RepositoryEntity } from '../entities/repository'; -import { IProviders, IReposJob, IReposJobResult } from '../interfaces'; -import { ErrorHelper } from '../transitional'; +import { RepositoryEntity, tryGetRepositoryEntity } from '../entities/repository'; +import { IProviders, IReposJobResult } from '../interfaces'; import { sleep } from '../utils'; const sleepBetweenReposMs = 125; @@ -24,7 +23,7 @@ const maxParallel = 6; const shouldUpdateCached = true; -async function refreshRepositories({ providers }: IReposJob): Promise { +async function refreshRepositories(providers: IProviders): Promise { const { config, operations } = providers; if (config?.jobs?.refreshWrites !== true) { console.log('job is currently disabled to avoid metadata refresh/rewrites'); @@ -62,7 +61,11 @@ async function processOrganization( repos = repos.sort(sortByRepositoryDate); for (let i = 0; i < repos.length; i++) { const repo = repos[i]; - const prefix = `org ${orgIndex}/${orgsLength}: repo ${i}/${repos.length}: `; + const prefix = + 'org ' + `${orgIndex + 1}/${orgsLength}:`.padEnd(6) + ` repo ${i + 1}/${repos.length}: `.padEnd(17); + if (i % 100 === 0) { + console.log(`${prefix}(Processing ${organization.name}${i > 0 ? ' continues' : ''})`); + } try { let repositoryEntity = await tryGetRepositoryEntity(repositoryProvider, repo.id); if (await repo.isDeleted()) { @@ -73,28 +76,33 @@ async function processOrganization( continue; } const entity = repo.getEntity(); - let update = false; + let updatedFields: string[] = null; + let replace = false; if (!repositoryEntity) { repositoryEntity = new RepositoryEntity(); - setFields(repositoryProvider, repositoryEntity, entity); + setFields(repositoryEntity, entity, true); await repositoryProvider.insert(repositoryEntity); console.log(`${prefix}inserted ${organization.name}/${repositoryEntity.name}`); continue; } else { - setFields(repositoryProvider, repositoryEntity, entity); - // not detecting changes now - update = true; + updatedFields = setFields(repositoryEntity, entity, false /* not new */); + replace = !!updatedFields; } - if (!update && shouldUpdateCached) { - update = true; + if (updatedFields.length === 0 && shouldUpdateCached) { + replace = true; repositoryEntity.cached = new Date(); } - if (update) { + if (replace) { await repositoryProvider.replace(repositoryEntity); - console.log(`${prefix}Updated all fields for ${organization.name}/${repo.name}`); + updatedFields.length > 0 && + console.log( + `${prefix}Updated ${updatedFields.length} field${updatedFields.length === 1 ? '' : 's'} for ${ + organization.name + }/${repo.name} [${updatedFields.join(', ')}]` + ); } } catch (error) { - console.warn(`${prefix}repo error: ${repo.name} in organization ${organization.name}`); + console.warn(`${prefix}repo error: ${repo.name} in organization ${organization.name}: ${error}`); } await sleep(sleepBetweenReposMs); @@ -106,70 +114,237 @@ async function processOrganization( return {}; } -function setFields(repositoryProvider: IRepositoryProvider, repositoryEntity: RepositoryEntity, entity: any) { - repositoryEntity.repositoryId = entity.id; - repositoryEntity.archived = entity.archived; - repositoryEntity.cached = new Date(); +function setFields(repositoryEntity: RepositoryEntity, entity: any, isNew: boolean) { + const changed: string[] = []; + if ( + (repositoryEntity.repositoryId || entity.id) && + String(repositoryEntity.repositoryId) !== String(entity.id) + ) { + repositoryEntity.repositoryId = parseInt(entity.id, 10); + changed.push('id'); + } + if ((entity.archived || repositoryEntity.archived) && repositoryEntity.archived !== entity.archived) { + repositoryEntity.archived = entity.archived; + changed.push('archived'); + } if (entity.created_at) { - repositoryEntity.createdAt = new Date(entity.created_at); - } - repositoryEntity.defaultBranch = entity.default_branch; - repositoryEntity.description = entity.description; - repositoryEntity.disabled = entity.disabled; - repositoryEntity.fork = entity.fork; - repositoryEntity.forksCount = entity.forks_count; - repositoryEntity.hasDownloads = entity.has_downloads; - repositoryEntity.hasIssues = entity.has_issues; - repositoryEntity.hasPages = entity.has_pages; - repositoryEntity.hasProjects = entity.has_projects; - repositoryEntity.hasWiki = entity.has_wiki; - repositoryEntity.homepage = entity.homepage; - repositoryEntity.language = entity.language; - repositoryEntity.license = entity.license?.spdx_id; - repositoryEntity.fullName = entity.full_name; - repositoryEntity.organizationId = entity.organization?.id; - repositoryEntity.organizationLogin = entity.organization?.login; - repositoryEntity.name = entity.name; - repositoryEntity.networkCount = entity.network_count; - repositoryEntity.openIssuesCount = entity.open_issues_count; - repositoryEntity.organizationId = entity.organization?.id; - repositoryEntity.parentId = entity.parent?.id; - repositoryEntity.parentName = entity.parent?.login; - repositoryEntity.parentOrganizationId = entity.parent?.organization?.id; - repositoryEntity.parentOrganizationName = entity.parent?.organization?.login; - repositoryEntity.private = entity.private; + const createdAt = new Date(entity.created_at); + const currentCreatedAt = repositoryEntity.createdAt ? new Date(repositoryEntity.createdAt) : null; + if (currentCreatedAt && createdAt && currentCreatedAt.toISOString() !== createdAt.toISOString()) { + repositoryEntity.pushedAt = createdAt; + changed.push('created_at'); + } else if (!currentCreatedAt && createdAt) { + repositoryEntity.createdAt = createdAt; + changed.push('created_at'); + } + } + if ( + (entity.default_branch || repositoryEntity.defaultBranch) && + entity.default_branch !== repositoryEntity.defaultBranch + ) { + repositoryEntity.defaultBranch = entity.default_branch; + changed.push('default_branch'); + } + if ( + (entity.description || repositoryEntity.description) && + entity.description !== repositoryEntity.description + ) { + repositoryEntity.description = entity.description; + changed.push('description'); + } + if ((entity.disabled || repositoryEntity.disabled) && entity.disabled !== repositoryEntity.disabled) { + repositoryEntity.disabled = entity.disabled; + changed.push('disabled'); + } + if ((entity.fork || repositoryEntity.fork) && entity.fork !== repositoryEntity.fork) { + repositoryEntity.fork = entity.fork; + changed.push('fork'); + } + if ( + (entity.forks_count || repositoryEntity.forksCount) && + String(entity.forks_count) !== String(repositoryEntity.forksCount) + ) { + repositoryEntity.forksCount = parseInt(entity.forks_count, 10); + changed.push('forks_count'); + } + if ( + (entity.has_downloads || repositoryEntity.hasDownloads) && + entity.has_downloads !== repositoryEntity.hasDownloads + ) { + repositoryEntity.hasDownloads = entity.has_downloads; + changed.push('has_downloads'); + } + if ((entity.has_issues || repositoryEntity.hasIssues) && entity.has_issues !== repositoryEntity.hasIssues) { + repositoryEntity.hasIssues = entity.has_issues; + changed.push('has_issues'); + } + if ((entity.has_pages || repositoryEntity.hasPages) && entity.has_pages !== repositoryEntity.hasPages) { + repositoryEntity.hasPages = entity.has_pages; + changed.push('has_pages'); + } + if ( + (entity.has_projects || repositoryEntity.hasProjects) && + entity.has_projects !== repositoryEntity.hasProjects + ) { + repositoryEntity.hasProjects = entity.has_projects; + changed.push('has_projects'); + } + if ((entity.has_wiki || repositoryEntity.hasWiki) && entity.has_wiki !== repositoryEntity.hasWiki) { + repositoryEntity.hasWiki = entity.has_wiki; + changed.push('has_wiki'); + } + if ((entity.homepage || repositoryEntity.homepage) && entity.homepage !== repositoryEntity.homepage) { + repositoryEntity.homepage = entity.homepage; + changed.push('homepage'); + } + if ((entity.language || repositoryEntity.language) && entity.language !== repositoryEntity.language) { + repositoryEntity.language = entity.language; + changed.push('language'); + } + if (entity.license?.spdx_id !== repositoryEntity.license) { + repositoryEntity.license = entity.license?.spdx_id; + changed.push('license.spdx_id'); + } + if ((entity.full_name || repositoryEntity.fullName) && entity.full_name !== repositoryEntity.fullName) { + repositoryEntity.fullName = entity.full_name; + changed.push('full_name'); + } + if ( + (entity.organization?.id || repositoryEntity.organizationId) && + String(entity.organization?.id) !== String(repositoryEntity.organizationId) + ) { + repositoryEntity.organizationId = parseInt(entity.organization?.id, 10); + changed.push('organization.id'); + } + if (entity.organization?.login !== repositoryEntity.organizationLogin) { + repositoryEntity.organizationLogin = entity.organization?.login; + changed.push('organization.login'); + } + if ((entity.name || repositoryEntity.name) && entity.name !== repositoryEntity.name) { + repositoryEntity.name = entity.name; + changed.push('name'); + } + if ( + (entity.network_count || repositoryEntity.networkCount) && + String(entity.network_count) !== String(repositoryEntity.networkCount) + ) { + repositoryEntity.networkCount = parseInt(entity.network_count, 10); + changed.push('network_count'); + } + if ( + (entity.open_issues_count || repositoryEntity.openIssuesCount) && + String(entity.open_issues_count) !== String(repositoryEntity.openIssuesCount) + ) { + repositoryEntity.openIssuesCount = parseInt(entity.open_issues_count, 10); + changed.push('open_issues_count'); + } + if ( + (entity.parent?.id || repositoryEntity.parentId) && + String(entity.parent?.id) !== String(repositoryEntity.parentId) + ) { + repositoryEntity.parentId = parseInt(entity.parent?.id, 10); + changed.push('parent.id'); + } + if ( + (entity.parent?.login || repositoryEntity.parentName) && + entity.parent?.login !== repositoryEntity.parentName + ) { + repositoryEntity.parentName = entity.parent?.login; + changed.push('parent.login'); + } + if ( + (entity?.parent?.organization?.id || repositoryEntity.parentOrganizationId) && + String(entity?.parent?.organization?.id) !== String(repositoryEntity.parentOrganizationId) + ) { + repositoryEntity.parentOrganizationId = parseInt(entity.parent?.organization?.id, 10); + changed.push('parent.organization.id'); + } + if ( + (entity?.parent?.organization?.login || repositoryEntity.parentOrganizationName) && + entity?.parent?.organization?.login !== repositoryEntity.parentOrganizationName + ) { + repositoryEntity.parentOrganizationName = entity.parent?.organization?.login; + changed.push('parent.organization.login'); + } + if ((entity.private || repositoryEntity.private) && entity.private !== repositoryEntity.private) { + repositoryEntity.private = entity.private; + changed.push('private'); + } if (entity.pushed_at) { - repositoryEntity.pushedAt = new Date(entity.pushed_at); + const pushedAt = new Date(entity.pushed_at); + const currentPushedAt = repositoryEntity.pushedAt ? new Date(repositoryEntity.pushedAt) : null; + if (currentPushedAt && pushedAt && currentPushedAt.toISOString() !== pushedAt.toISOString()) { + repositoryEntity.pushedAt = pushedAt; + changed.push('pushed_at'); + } else if (!currentPushedAt && pushedAt) { + repositoryEntity.pushedAt = pushedAt; + changed.push('pushed_at'); + } } - repositoryEntity.size = entity.size; - repositoryEntity.stargazersCount = entity.stargazers_count; - repositoryEntity.subscribersCount = entity.subscribers_count; - repositoryEntity.topics = entity.topics; - if (entity.updated_at) { - repositoryEntity.updatedAt = new Date(entity.updated_at); + if ((entity.size || repositoryEntity.size) && String(entity.size) !== String(repositoryEntity.size)) { + repositoryEntity.size = parseInt(entity.size, 10); + changed.push('size'); } - repositoryEntity.visibility = entity.visibility; - repositoryEntity.watchersCount = entity.watchers_count; - return repositoryEntity; -} - -async function tryGetRepositoryEntity( - repositoryProvider: IRepositoryProvider, - repositoryId: number -): Promise { - try { - const repositoryEntity = await repositoryProvider.get(repositoryId); - return repositoryEntity; - } catch (error) { - if (ErrorHelper.IsNotFound(error)) { - return null; + if ( + (entity.stargazers_count || repositoryEntity.stargazersCount) && + String(entity.stargazers_count) !== String(repositoryEntity.stargazersCount) + ) { + repositoryEntity.stargazersCount = parseInt(entity.stargazers_count, 10); + changed.push('stargazers_count'); + } + if ( + (entity.subscribers_count || repositoryEntity.subscribersCount) && + String(entity.subscribers_count) !== String(repositoryEntity.subscribersCount) + ) { + repositoryEntity.subscribersCount = parseInt(entity.subscribers_count, 10); + changed.push('subscribers_count'); + } + if (entity.topics && !repositoryEntity.topics) { + repositoryEntity.topics = entity.topics; + changed.push('topics'); + } else if (!entity.topics && repositoryEntity.topics) { + repositoryEntity.topics = null; + changed.push('topics'); + } else { + const storedTopics = [...(repositoryEntity.topics || [])].sort(); + const entityTopics = [...(entity.topics || [])].sort(); + if (storedTopics.join(',') !== entityTopics.join(',')) { + repositoryEntity.topics = entity.topics; + changed.push('topics'); } - throw error; } + if (entity.updated_at) { + const updatedAt = new Date(entity.updated_at); + const currentUpdatedAt = repositoryEntity.updatedAt ? new Date(repositoryEntity.updatedAt) : null; + if (currentUpdatedAt && updatedAt && currentUpdatedAt.toISOString() !== updatedAt.toISOString()) { + repositoryEntity.pushedAt = updatedAt; + changed.push('updated_at'); + } else if (!currentUpdatedAt && updatedAt) { + repositoryEntity.updatedAt = updatedAt; + changed.push('updated_at'); + } + } + if ( + (entity.visibility || repositoryEntity.visibility) && + entity.visibility !== repositoryEntity.visibility + ) { + repositoryEntity.visibility = entity.visibility; + changed.push('visibility'); + } + if ( + (entity.watchers_count || repositoryEntity.watchersCount) && + String(entity.watchers_count) !== String(repositoryEntity.watchersCount) + ) { + repositoryEntity.watchersCount = parseInt(entity.watchers_count, 10); + changed.push('watchers_count'); + } + if (changed.length > 0 || isNew) { + repositoryEntity.cached = new Date(); + } + return changed; } -app.runJob(refreshRepositories, { +job.run(refreshRepositories, { timeoutMinutes: 320, - defaultDebugOutput: 'restapi', insightsPrefix: 'JobRefreshRepositories', }); diff --git a/lib/caching/redis.ts b/lib/caching/redis.ts index 53ed8fa55..f758c516a 100644 --- a/lib/caching/redis.ts +++ b/lib/caching/redis.ts @@ -10,7 +10,7 @@ import Debug from 'debug'; const debug = Debug.debug('redis'); const debugCrossOrganization = Debug.debug('redis-cross-org'); -import { ICacheHelper } from '.'; +import type { ICacheHelper } from '.'; import { gunzipBuffer, gzipString } from '../../utils'; export interface ISetCompressedOptions { diff --git a/lib/entityMetadataProvider/entityMetadataProvider.ts b/lib/entityMetadataProvider/entityMetadataProvider.ts index 190943c08..2a0c11cb1 100644 --- a/lib/entityMetadataProvider/entityMetadataProvider.ts +++ b/lib/entityMetadataProvider/entityMetadataProvider.ts @@ -3,8 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { IEntityMetadata, EntityMetadataType } from './entityMetadata'; -import { IEntityMetadataFixedQuery } from './query'; +import { type IEntityMetadata, EntityMetadataType } from './entityMetadata'; +import type { IEntityMetadataFixedQuery } from './query'; import { swapMap } from '../../utils'; export enum EntityField { diff --git a/lib/entityMetadataProvider/query.ts b/lib/entityMetadataProvider/query.ts index c902218e6..6c9af613a 100644 --- a/lib/entityMetadataProvider/query.ts +++ b/lib/entityMetadataProvider/query.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { IEntityMetadataProvider } from './entityMetadataProvider'; +import type { IEntityMetadataProvider } from './entityMetadataProvider'; import { EntityMetadataType, EntityMetadataBase } from './entityMetadata'; // Newer "entity" implementations have fully decoupled and no longer use this single query type. diff --git a/middleware/apiAad.ts b/middleware/apiAad.ts index d09203306..57ab4c3b5 100644 --- a/middleware/apiAad.ts +++ b/middleware/apiAad.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import jwt from 'jsonwebtoken'; import jwksClient from 'jwks-rsa'; @@ -15,7 +16,7 @@ import getCompanySpecificDeployment from './companySpecificDeployment'; // CONSIDER: Caching of signing keys export function requireAadApiAuthorizedScope(scope: string | string[]) { - return (req: IApiRequest, res, next) => { + return (req: IApiRequest, res: Response, next: NextFunction) => { const { apiKeyToken } = req; const scopes = typeof scope === 'string' ? [scope] : scope; if (!apiKeyToken.hasAnyScope(scopes)) { @@ -25,7 +26,7 @@ export function requireAadApiAuthorizedScope(scope: string | string[]) { }; } -export default function aadApiMiddleware(req: IApiRequest, res, next) { +export default function aadApiMiddleware(req: IApiRequest, res: Response, next: NextFunction) { return validateAadAuthorization(req) .then((ok) => { return next(); @@ -34,7 +35,7 @@ export default function aadApiMiddleware(req: IApiRequest, res, next) { if ((err as any).immediate === true) { console.warn(`AAD API authorization failed: ${err}`); } - return isJsonError(err) ? next(err) : jsonError(err, 500); + return isJsonError(err) ? next(err) : (jsonError(err, 500) as unknown); }); } diff --git a/middleware/apiReposAuth.ts b/middleware/apiReposAuth.ts index f6c17f786..d13f037f5 100644 --- a/middleware/apiReposAuth.ts +++ b/middleware/apiReposAuth.ts @@ -11,6 +11,7 @@ import basicAuth from 'basic-auth'; import crypto from 'crypto'; +import { NextFunction, Response } from 'express'; import { jsonError } from './jsonError'; import { getProviders } from '../transitional'; @@ -30,7 +31,7 @@ export interface IApiRequest extends ReposAppRequest { userContextOverwriteRequest?: any; // refactor? } -export default function ReposApiAuthentication(req: IApiRequest, res, next) { +export default function ReposApiAuthentication(req: IApiRequest, res: Response, next: NextFunction) { const user = basicAuth(req); const key = user ? user.pass || user.name : null; if (!key) { diff --git a/middleware/apiVstsAuth.ts b/middleware/apiVstsAuth.ts index 694e2af72..fa1d3cd9f 100644 --- a/middleware/apiVstsAuth.ts +++ b/middleware/apiVstsAuth.ts @@ -5,6 +5,7 @@ import axios from 'axios'; import asyncHandler from 'express-async-handler'; +import { NextFunction, Response } from 'express'; import { jsonError } from './jsonError'; import { IApiRequest } from './apiReposAuth'; @@ -14,7 +15,7 @@ import { getProviders } from '../transitional'; // TODO: consider better caching const localMemoryCacheVstsToAadId = new Map(); -const vstsAuth = asyncHandler(async (req: IApiRequest, res, next) => { +const vstsAuth = asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { const config = getProviders(req).config; if (!config) { return next(new Error('Missing configuration for the application')); diff --git a/middleware/appInsights.ts b/middleware/appInsights.ts index 11c01d0e8..f3c4051c0 100644 --- a/middleware/appInsights.ts +++ b/middleware/appInsights.ts @@ -3,13 +3,21 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import wrapOrCreateInsightsConsoleClient from '../lib/insights'; import Debug from 'debug'; const debug = Debug.debug('startup'); import { setup as appInsightsSetup, defaultClient } from 'applicationinsights'; -import { IReposApplication, IProviders, ReposAppRequest } from '../interfaces'; +import type { + IReposApplication, + IProviders, + ReposAppRequest, + SiteConfiguration, + ExecutionEnvironment, +} from '../interfaces'; function ignoreKubernetesProbes(envelope /* , context */) { if ('RequestData' === envelope.data.baseType) { @@ -42,20 +50,22 @@ function filterTelemetry(envelope, context): boolean { return true; } -export default function initializeAppInsights(app: IReposApplication, config) { +export default function initializeAppInsights( + providers: IProviders, + executionEnvironment: ExecutionEnvironment, + app: IReposApplication, + config: SiteConfiguration +) { let client = undefined; if (!config) { // Configuration failure happened ahead of this module return; } - const providers = app.settings.providers as IProviders; let cs: string = config?.telemetry?.applicationInsightsConnectionString || config?.telemetry?.applicationInsightsKey; // Override the key with a job-specific one if this is a job execution instead - const jobCs: string = - config?.telemetry?.jobsApplicationInsightsConnectionString || - config?.telemetry?.jobsApplicationInsightsKey; - if (jobCs && config.isJobInternal === true) { + const jobCs: string = config?.telemetry?.jobsApplicationInsightsConnectionString; + if (jobCs && executionEnvironment.isJob === true) { cs = jobCs; } if (cs) { @@ -78,7 +88,7 @@ export default function initializeAppInsights(app: IReposApplication, config) { debug('insights telemetry is not configured with a key or connection string'); } - app.use((req: ReposAppRequest, res, next) => { + app?.use((req: ReposAppRequest, res: Response, next: NextFunction) => { // Acknowledge synthetic tests immediately without spending time in more middleware if ( req.headers && diff --git a/middleware/business/administration.ts b/middleware/business/administration.ts index 38e11a052..b2ff44558 100644 --- a/middleware/business/administration.ts +++ b/middleware/business/administration.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest } from '../../interfaces'; @@ -20,7 +20,11 @@ function denyRoute(next) { ); } -export function requirePortalAdministrationPermission(req: ReposAppRequest, res, next) { +export function requirePortalAdministrationPermission( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { req.individualContext .isPortalAdministrator() .then((isAdmin) => { diff --git a/middleware/business/allLinks.ts b/middleware/business/allLinks.ts index c25f57df3..b1ab796f2 100644 --- a/middleware/business/allLinks.ts +++ b/middleware/business/allLinks.ts @@ -3,13 +3,15 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { ReposAppRequest } from '../../interfaces'; import { getProviders } from '../../transitional'; import { wrapError } from '../../utils'; const cachedLinksRequestKeyName = 'cachedLinks'; -export async function ensureAllLinksInMemory(req: ReposAppRequest, res, next) { +export async function ensureAllLinksInMemory(req: ReposAppRequest, res: Response, next: NextFunction) { if (req[cachedLinksRequestKeyName]) { return next(); } diff --git a/middleware/business/authentication.ts b/middleware/business/authentication.ts index 3d6aaa520..695897d17 100644 --- a/middleware/business/authentication.ts +++ b/middleware/business/authentication.ts @@ -17,6 +17,7 @@ import { } from '../../business/user'; import { storeOriginalUrlAsReferrer } from '../../utils'; import getCompanySpecificDeployment from '../companySpecificDeployment'; +import { Response, NextFunction } from 'express'; export async function requireAuthenticatedUserOrSignInExcluding( exclusionPaths: string[], @@ -34,7 +35,7 @@ export async function requireAuthenticatedUserOrSignInExcluding( return await requireAuthenticatedUserOrSignIn(req, res, next); } -export async function requireAccessTokenClient(req: ReposAppRequest, res, next) { +export async function requireAccessTokenClient(req: ReposAppRequest, res: Response, next: NextFunction) { if (req.oauthAccessToken) { return next(); } @@ -83,7 +84,11 @@ function redirectToSignIn(req, res) { ); } -export async function requireAuthenticatedUserOrSignIn(req: ReposAppRequest, res, next) { +export async function requireAuthenticatedUserOrSignIn( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { const companySpecific = getCompanySpecificDeployment(); const providers = getProviders(req); const { config } = providers; @@ -111,7 +116,7 @@ export async function requireAuthenticatedUserOrSignIn(req: ReposAppRequest, res return shouldRedirectToSignIn ? redirectToSignIn(req, res) : next(); } -export function setIdentity(req: ReposAppRequest, res, next) { +export function setIdentity(req: ReposAppRequest, res: Response, next: NextFunction) { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext) { return next(new Error('No context available')); diff --git a/middleware/business/corporateAdministrators.ts b/middleware/business/corporateAdministrators.ts index b36e9b391..99b985047 100644 --- a/middleware/business/corporateAdministrators.ts +++ b/middleware/business/corporateAdministrators.ts @@ -6,6 +6,8 @@ // This route does not use GitHub as a source of truth but instead falls back to // corporate assigned usernames or security group membership. +import { NextFunction, Response } from 'express'; + import { ReposAppRequest } from '../../interfaces'; import { getProviders } from '../../transitional'; import { IndividualContext } from '../../business/user'; @@ -29,7 +31,11 @@ function denyRoute(next, isApi: boolean) { ); } -export async function AuthorizeOnlyCorporateAdministrators(req: ReposAppRequest, res, next) { +export async function AuthorizeOnlyCorporateAdministrators( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { const { operations } = getProviders(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const corporateId = activeContext.corporateIdentity?.id; diff --git a/middleware/business/employeesOnly.ts b/middleware/business/employeesOnly.ts index ed6bb588f..3689147a4 100644 --- a/middleware/business/employeesOnly.ts +++ b/middleware/business/employeesOnly.ts @@ -5,9 +5,15 @@ // This is a Microsoft-specific piece of middleware. +import { NextFunction, Response } from 'express'; + import { ReposAppRequest } from '../../interfaces'; -export function AuthorizeOnlyFullTimeEmployeesAndInterns(req: ReposAppRequest, res, next) { +export function AuthorizeOnlyFullTimeEmployeesAndInterns( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { const individualContext = req.individualContext; if (!individualContext.corporateIdentity || !individualContext.corporateIdentity.username) { return next(new Error('This resource is only available to authenticated users.')); diff --git a/middleware/business/organization.ts b/middleware/business/organization.ts index 04ff3a199..1ac350421 100644 --- a/middleware/business/organization.ts +++ b/middleware/business/organization.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import { ReposAppRequest } from '../../interfaces/web'; import { jsonError } from '../jsonError'; @@ -21,7 +22,11 @@ export function getOrganizationManagementType(req: IReposAppRequestWithOrganizat return req.organizationManagementType; } -export function blockIfUnmanagedOrganization(req: IReposAppRequestWithOrganizationManagementType, res, next) { +export function blockIfUnmanagedOrganization( + req: IReposAppRequestWithOrganizationManagementType, + res: Response, + next: NextFunction +) { const managementType = getOrganizationManagementType(req); switch (managementType) { case OrganizationManagementType.Unmanaged: diff --git a/middleware/business/setContext.ts b/middleware/business/setContext.ts index 9b2d90794..8108cd1a4 100644 --- a/middleware/business/setContext.ts +++ b/middleware/business/setContext.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import { IndividualContext, IIndividualContextOptions, @@ -11,9 +12,10 @@ import { SessionUserProperties, WebApiContext, } from '../../business/user'; +import { ReposAppRequest } from '../../interfaces'; import { getProviders } from '../../transitional'; -export function webContextMiddleware(req, res, next) { +export function webContextMiddleware(req: ReposAppRequest, res: Response, next: NextFunction) { const { operations, insights } = getProviders(req); if (req.apiContext) { const msg = 'INVALID: API and web contexts should not be mixed'; @@ -46,7 +48,7 @@ export function webContextMiddleware(req, res, next) { return next(); } -export function apiContextMiddleware(req, res, next) { +export function apiContextMiddleware(req, res: Response, next: NextFunction) { const { operations, insights } = getProviders(req); if (req.individualContext) { const msg = 'INVALID: API and web contexts should not be mixed'; diff --git a/middleware/campaign.ts b/middleware/campaign.ts index f1278f930..cacab0244 100644 --- a/middleware/campaign.ts +++ b/middleware/campaign.ts @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { getProviders } from '../transitional'; interface ICampaignData { @@ -23,7 +25,7 @@ export default function initializeCampaigns(app) { // come through the app. app.use('*', campaignMiddleware); - function campaignMiddleware(req, res, next) { + function campaignMiddleware(req, res: Response, next: NextFunction) { process.nextTick(processCampaignTelemetry.bind(null, req)); // Immediate return to keep middleware going diff --git a/middleware/codespaces.ts b/middleware/codespaces.ts index 46e4e9c00..4a38fc2c1 100644 --- a/middleware/codespaces.ts +++ b/middleware/codespaces.ts @@ -3,13 +3,15 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { ReposAppRequest } from '../interfaces'; // Assistant for when using Visual Studio Code to connect to a Codespace // locally instead of the web. The default port forwarding experience is // to toast the user to browse to 127.0.0.1:3000, but since AAD does not // allow for IP-based callback URLs, the user must use localhost. -export function codespacesDevAssistant(req: ReposAppRequest, res, next) { +export function codespacesDevAssistant(req: ReposAppRequest, res: Response, next: NextFunction) { if (req.hostname === '127.0.0.1') { console.warn( `${req.method} ${req.url}: WARNING: You're trying to connect to ${req.hostname} from your codespace.` diff --git a/middleware/correlationId.ts b/middleware/correlationId.ts index df5b433a7..4ceaf7a50 100644 --- a/middleware/correlationId.ts +++ b/middleware/correlationId.ts @@ -3,10 +3,11 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import { randomUUID } from 'crypto'; // Generate a correlation ID -export default function (req, res, next) { +export default function (req, res: Response, next: NextFunction) { req.correlationId = randomUUID(); return next(); } diff --git a/middleware/error-routes.ts b/middleware/error-routes.ts index f5f621d02..a4bb9134f 100644 --- a/middleware/error-routes.ts +++ b/middleware/error-routes.ts @@ -3,10 +3,15 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { IReposApplication, IReposError } from '../interfaces'; import RouteErrorHandler from './errorHandler'; export default async function configureErrorRoutes(app: IReposApplication, initializationError: Error) { + if (!app) { + return; + } if (initializationError) { console.warn('Initialization Error Present: All app requests will fail!'); @@ -14,7 +19,7 @@ export default async function configureErrorRoutes(app: IReposApplication, initi // for any request. Should evaluate whether to hide for // production scenarios or if there is a risk of the // error message leaking sensitive data. - app.use((req, res, next) => { + app.use((req, res: Response, next: NextFunction) => { const error: IReposError = new Error('Application initialization error', { cause: initializationError, }); @@ -23,7 +28,7 @@ export default async function configureErrorRoutes(app: IReposApplication, initi }); } - app.use(function (req, res, next) { + app.use(function (req, res: Response, next: NextFunction) { const err: IReposError = new Error('Not Found'); err.status = 404; err.skipLog = true; diff --git a/middleware/errorHandler.ts b/middleware/errorHandler.ts index 7277cc666..293e6bc5f 100644 --- a/middleware/errorHandler.ts +++ b/middleware/errorHandler.ts @@ -9,6 +9,8 @@ import { AxiosError } from 'axios'; import { wrapError } from '../utils'; import { getProviders } from '../transitional'; import { isJsonError } from '.'; +import { NextFunction, Response } from 'express'; +import { ReposAppRequest } from '../interfaces'; function redactRootPathsFromString(string, path) { if (typeof string === 'string' && string.includes && string.split) { @@ -49,7 +51,13 @@ const exceptionFieldsOfInterest = [ 'innerMessage', ]; -export default function SiteErrorHandler(err, req, res, next) { +export default function SiteErrorHandler( + error: unknown, + req: ReposAppRequest, + res: Response, + next: NextFunction +) { + let err = error as any; // CONSIDER: Let's eventually decouple all of our error message improvements to another area to keep the error handler intact. const { applicationProfile, config } = getProviders(req); const correlationId = req.correlationId; diff --git a/middleware/github/blockEnterpriseManagedUsers.ts b/middleware/github/blockEnterpriseManagedUsers.ts index 740d11dad..7b2795677 100644 --- a/middleware/github/blockEnterpriseManagedUsers.ts +++ b/middleware/github/blockEnterpriseManagedUsers.ts @@ -3,10 +3,16 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { ReposAppRequest, IReposError } from '../../interfaces'; import { isEnterpriseManagedUserLogin } from '../../utils'; -export function blockEnterpriseManagedUsersAuthentication(req: ReposAppRequest, res, next) { +export function blockEnterpriseManagedUsersAuthentication( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { const context = req.individualContext; if (!context) { return next(new Error('Missing context')); diff --git a/middleware/github/ensureOrganizationProfile.ts b/middleware/github/ensureOrganizationProfile.ts index d38c50f69..974f2e206 100644 --- a/middleware/github/ensureOrganizationProfile.ts +++ b/middleware/github/ensureOrganizationProfile.ts @@ -5,6 +5,7 @@ import asyncHandler from 'express-async-handler'; import memoryCache from 'memory-cache'; +import { NextFunction, Response } from 'express'; import type { IReposAppRequestWithOrganizationManagementType } from '../business/organization'; import { CreateError, getProviders } from '../../transitional'; @@ -44,7 +45,11 @@ export async function getOrganizationProfileViaMemoryCache(providers: IProviders return profile; } -async function ensureOrganizationProfile(req: IReposAppRequestWithOrganizationManagementType, res, next) { +async function ensureOrganizationProfile( + req: IReposAppRequestWithOrganizationManagementType, + res: Response, + next: NextFunction +) { await setOrganizationProfileForRequest(req); return next(); } diff --git a/middleware/github/orgPermissions.ts b/middleware/github/orgPermissions.ts index 9a0626211..9e6942f04 100644 --- a/middleware/github/orgPermissions.ts +++ b/middleware/github/orgPermissions.ts @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { OrganizationMembershipState, ReposAppRequest } from '../../interfaces'; import { wrapError } from '../../utils'; @@ -21,7 +23,11 @@ export function GetOrganizationPermissionsFromRequest(req: ReposAppRequest) { return req[orgPermissionsCacheKeyName]; } -export async function AddOrganizationPermissionsToRequest(req: ReposAppRequest, res, next) { +export async function AddOrganizationPermissionsToRequest( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { // Only compute once per request if (req[orgPermissionsCacheKeyName]) { return next(); diff --git a/middleware/github/repoPermissions.ts b/middleware/github/repoPermissions.ts index 735f76bc1..d94bd9f47 100644 --- a/middleware/github/repoPermissions.ts +++ b/middleware/github/repoPermissions.ts @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { ErrorHelper, getProviders } from '../../transitional'; import { Repository } from '../../business/repository'; import { GitHubIdentitySource, IIndividualContextOptions, IndividualContext } from '../../business/user'; @@ -145,7 +147,11 @@ export async function getComputedRepositoryPermissions( return repoPermissions; } -export async function AddRepositoryPermissionsToRequest(req: ReposAppRequest, res, next) { +export async function AddRepositoryPermissionsToRequest( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { if (req[repoPermissionsCacheKeyName]) { return next(); } diff --git a/middleware/github/requireActiveSession.ts b/middleware/github/requireActiveSession.ts index f58ac23b6..ac099e1ba 100644 --- a/middleware/github/requireActiveSession.ts +++ b/middleware/github/requireActiveSession.ts @@ -3,11 +3,12 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import { ReposAppRequest } from '../../interfaces'; import { getProviders } from '../../transitional'; import { isCodespacesAuthenticating, storeOriginalUrlAsReferrer } from '../../utils'; -export default function RequireActiveGitHubSession(req: ReposAppRequest, res, next) { +export default function RequireActiveGitHubSession(req: ReposAppRequest, res: Response, next: NextFunction) { const { config } = getProviders(req); const identity = req.individualContext.getSessionBasedGitHubIdentity(); if (!identity) { diff --git a/middleware/github/systemWidePermissions.ts b/middleware/github/systemWidePermissions.ts index 16d6d95cf..8787fbdc1 100644 --- a/middleware/github/systemWidePermissions.ts +++ b/middleware/github/systemWidePermissions.ts @@ -3,11 +3,17 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { ReposAppRequest } from '../../interfaces'; const requestCachedKeyName = 'systemWidePermissions'; -export default function addSystemWidePermissionsToRequest(req: ReposAppRequest, res, next) { +export default function addSystemWidePermissionsToRequest( + req: ReposAppRequest, + res: Response, + next: NextFunction +) { // Only compute once per request if (req[requestCachedKeyName]) { return next(); diff --git a/middleware/github/teamPermissions.ts b/middleware/github/teamPermissions.ts index 16c7317f0..dcc44b67e 100644 --- a/middleware/github/teamPermissions.ts +++ b/middleware/github/teamPermissions.ts @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { Team } from '../../business'; import { GitHubTeamRole, @@ -40,7 +42,7 @@ export function getTeamMembershipFromRequest(req: ReposAppRequest) { return req[teamStatusCacheKeyName] as IRequestTeamMembershipStatus; } -export async function AddTeamMembershipToRequest(req: ReposAppRequest, res, next) { +export async function AddTeamMembershipToRequest(req: ReposAppRequest, res: Response, next: NextFunction) { if (req[teamStatusCacheKeyName]) { return next(); } @@ -94,7 +96,7 @@ export function getTeamPermissionsFromRequest(req: ReposAppRequest) { return req[teamPermissionsCacheKeyName] as IRequestTeamPermissions; } -export async function AddTeamPermissionsToRequest(req: ReposAppRequest, res, next) { +export async function AddTeamPermissionsToRequest(req: ReposAppRequest, res: Response, next: NextFunction) { if (req[teamPermissionsCacheKeyName]) { return next(); } diff --git a/middleware/healthCheck.ts b/middleware/healthCheck.ts index d8997c229..693121212 100644 --- a/middleware/healthCheck.ts +++ b/middleware/healthCheck.ts @@ -5,12 +5,14 @@ import Debug from 'debug'; import { IncomingHttpHeaders } from 'http'; +import { NextFunction, Response } from 'express'; + import type { ConfiguredHeaderProbe, ConfiguredGeneralProbe, ConfiguredProbeBase, } from '../config/webHealthProbes.types'; -import { ReposAppRequest, SiteConfiguration } from '../interfaces'; +import { IReposApplication, ReposAppRequest, SiteConfiguration } from '../interfaces'; import { CreateError } from '../transitional'; const dbg = Debug.debug('health'); @@ -29,7 +31,7 @@ enum ProbeType { } export default function initializeHealthCheck( - app, + app: IReposApplication, config: SiteConfiguration /* WebHealthProbeSubsetConfiguration */ ) { const { webHealthProbes: healthConfig } = config; @@ -84,8 +86,8 @@ export default function initializeHealthCheck( probeType: ProbeType, probeConfigs: ConfiguredHeaderProbe[], req: ReposAppRequest, - res, - next + res: Response, + next: NextFunction ) { for (const probeConfig of probeConfigs) { if (requestEligibleForCheck(checkType, probeType, probeConfig, req.headers)) { @@ -133,7 +135,12 @@ export default function initializeHealthCheck( return true; } - function returnExpressHealthCheck(checkType: HealthProbeType, req: ReposAppRequest, res, next) { + function returnExpressHealthCheck( + checkType: HealthProbeType, + req: ReposAppRequest, + res: Response, + next: NextFunction + ) { let result = null; try { result = checkHealth(checkType); @@ -149,7 +156,7 @@ export default function initializeHealthCheck( healthy: true, }; - if (enabledHeaderProbes.length > 0) { + if (enabledHeaderProbes.length > 0 && app) { dbg(`Configured header health probes: ${enabledHeaderProbes.length}`); app.get( '/health/readiness', @@ -160,7 +167,7 @@ export default function initializeHealthCheck( multipleHeaderHealthCheck.bind(null, HealthProbeType.Liveness, ProbeType.Header, enabledHeaderProbes) ); } - if (enabledGenericProbes.length > 0) { + if (enabledGenericProbes.length > 0 && app) { // General probes listen on their own type endpoint for (const genericProbeConfig of enabledGenericProbes) { const url = genericProbeConfig.endpoint || `/health/${genericProbeConfig.endpointSuffix}`; @@ -173,7 +180,7 @@ export default function initializeHealthCheck( ); } } - if (enabledGenericProbes.length + enabledGenericProbes.length > 0) { + if (app && enabledGenericProbes.length + enabledGenericProbes.length > 0) { dbg('Health probes listening'); // 404 on anything that was not handled by any active, allowed probe listeners app.use('/health/*', (req, res) => { diff --git a/middleware/index.ts b/middleware/index.ts index c45fdf0c3..f784b5f4b 100644 --- a/middleware/index.ts +++ b/middleware/index.ts @@ -41,6 +41,7 @@ import { codespacesDevAssistant } from './codespaces'; export default async function initMiddleware( app: IReposApplication, express, + providers: IProviders, config: SiteConfiguration, dirname: string, hasCustomRoutes: boolean, @@ -51,7 +52,6 @@ export default async function initMiddleware( config && config.typescript && config.typescript.appDirectory ? config.typescript.appDirectory : stripDistFolderName(dirname); - const providers = app.get('providers') as IProviders; const applicationProfile = providers.applicationProfile; if (initializationError) { providers.healthCheck.healthy = false; diff --git a/middleware/initialize.ts b/middleware/initialize.ts index 63f8c5340..0733a5fd0 100644 --- a/middleware/initialize.ts +++ b/middleware/initialize.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import path from 'path'; import CosmosSessionStore from '../lib/cosmosSession'; @@ -71,8 +72,14 @@ import routeHsts from './hsts'; import routeSslify from './sslify'; import middlewareIndex from '.'; -import { ICacheHelper } from '../lib/caching'; -import { IApplicationProfile, IProviders, IReposApplication, SiteConfiguration } from '../interfaces'; +import type { ICacheHelper } from '../lib/caching'; +import type { + ExecutionEnvironment, + IApplicationProfile, + IProviders, + IReposApplication, + SiteConfiguration, +} from '../interfaces'; import initializeRepositoryProvider from '../entities/repository'; import { tryGetImmutableStorageProvider } from '../lib/immutable'; @@ -92,12 +99,13 @@ type CompanyStartupEntrypoint = ( ) => Promise; async function initializeAsync( - app: IReposApplication, - express, + executionEnvironment: ExecutionEnvironment, + providers: IProviders, + // app: IReposApplication, + // express, rootdir: string, config: SiteConfiguration ): Promise { - const providers = app.get('providers') as IProviders; providers.postgresPool = await ConnectPostgresPool(config.data.postgres); providers.linkProvider = await createAndInitializeLinkProviderInstance(providers, config); if (config.github.cache.provider === 'cosmosdb') { @@ -124,10 +132,7 @@ async function initializeAsync( } providers.graphProvider = await createGraphProvider(providers, config); - app.set('graphProvider', providers.graphProvider); - providers.mailAddressProvider = await createMailAddressProvider(config, providers); - app.set('mailAddressProvider', providers.mailAddressProvider); const mailProvider = createMailProviderInstance(config); if (mailProvider) { @@ -139,7 +144,6 @@ async function initializeAsync( } providers.github = configureGitHubLibrary(providers.cacheProvider, config); - app.set('github', providers.github); // always check if config exists to prevent crashing because of trying to access an undefined object const emOptions: IEntityMetadataProvidersOptions = { @@ -268,7 +272,7 @@ async function initializeAsync( providers.corporateAdministrationProfile = getCompanySpecificDeployment()?.administrationSection; providers.corporateViews = await initializeCorporateViews(providers, rootdir); - await dynamicStartup(config, providers, rootdir); + await dynamicStartup(executionEnvironment, config, providers, rootdir); const webhooksConfig = config.github.webhooks; if (webhooksConfig && webhooksConfig.provider) { @@ -290,16 +294,20 @@ async function initializeAsync( const repositoryMetadataProvider = await createAndInitializeRepositoryMetadataProviderInstance({ entityMetadataProvider: providerNameToInstance(config.entityProviders.repositorymetadata), }); - const operations = new Operations({ providers, repositoryMetadataProvider, github: providers.github }); + const operations = new Operations({ + executionEnvironment, + providers, + repositoryMetadataProvider, + github: providers.github, + }); await operations.initialize(); - app.set('operations', operations); providers.operations = operations; } catch (ignoredError2) { console.dir(ignoredError2); throw ignoredError2; } - await dynamicStartup(config, providers, rootdir, 'secondary'); + await dynamicStartup(executionEnvironment, config, providers, rootdir, 'secondary'); if (providers.applicationProfile.startup) { debug('Application provider-specific startup...'); @@ -327,31 +335,35 @@ function configureGitHubLibrary(cacheProvider: ICacheHelper, config): RestLibrar // Asynchronous initialization for the Express app, configuration and data stores. export default async function initialize( + executionEnvironment: ExecutionEnvironment, app: IReposApplication, express, rootdir: string, - config: any, + config: SiteConfiguration, exception: Error -): Promise { +): Promise { if (exception) { console.warn(`Startup exception: ${exception}`, exception?.stack); } if (!config || Object.getOwnPropertyNames(config).length === 0) { throw new Error('Empty configuration object'); } - if (!app.runtimeConfiguration) { + if (app && !app.runtimeConfiguration) { app.runtimeConfiguration = {}; } const applicationProfile = config?.web?.app && config.web.app !== 'repos' ? await alternateRoutes(config, app, config.web.app) : DefaultApplicationProfile; - const web = !(config?.skipModules && config.skipModules.has('web')); + const web = false === executionEnvironment.skipModules.has('web'); if (applicationProfile.webServer && !web) { applicationProfile.webServer = false; } - const containerPurpose = - config && config.isJobInternal ? 'job' : applicationProfile.webServer ? 'web application' : 'application'; + const containerPurpose = executionEnvironment.isJob + ? 'job' + : applicationProfile.webServer + ? 'web application' + : 'application'; debug(`${containerPurpose} name: ${applicationProfile.applicationName}`); debug(`environment: ${config?.debug?.environmentName || 'Unknown'}`); @@ -377,54 +389,69 @@ export default async function initialize( exception = error; } } - app.set('started', new Date()); - app.config = config; + if (app) { + app.set('started', executionEnvironment.started); + app.config = config; + } if (exception) { // Once app insights is available, will try to log this exception; display for now. console.dir(exception); } - app.set('basedir', rootdir); + if (app) { + app.set('basedir', rootdir); + } const providers: IProviders = { app, basedir: rootdir, applicationProfile, }; - app.set('providers', providers); - app.providers = providers; - app.set('runtimeConfig', config); + executionEnvironment.providers = providers; + if (app) { + app.set('providers', providers); + app.providers = providers; + app.set('runtimeConfig', config); + } providers.healthCheck = healthCheck(app, config); if (applicationProfile.webServer) { - if (!app.startServer) { + if (!app) { + throw new Error('app (Express) is required for web applications'); + } else if (!app.startServer) { throw new Error(`app.startServer is required for web applications`); } await app.startServer(); } - app.use(routeCorrelationId); - providers.insights = appInsights(app, config); - app.set('appInsightsClient', providers.insights); + if (app) { + app.use(routeCorrelationId); + } + const insights = appInsights(providers, executionEnvironment, app, config); + providers.insights = insights; if (!exception && (!config || !config.activeDirectory)) { exception = new Error( `config.activeDirectory.clientId and config.activeDirectory.clientSecret are required to initialize KeyVault` ); } - app.use('*', (req, res, next) => { - if (providers.healthCheck.ready) { - return next(); - } - return res.send('Service not ready.'); - }); + if (app) { + app.use('*', (req, res: Response, next: NextFunction) => { + if (providers.healthCheck.ready) { + return next(); + } + return res.send('Service not ready.'); + }); + } // See docs/configuration.md for all this - if (config?.containers?.deployment) { - debug('Container deployment: HTTP: listening, HSTS: on'); - app.use(routeHsts); - } else if (config?.containers?.docker) { - debug('Docker image: HTTP: listening, HSTS: off'); - } else if (config.webServer.allowHttp) { - debug('development mode: HTTP: listening, HSTS: off'); - } else { - debug('non-container production mode: HTTP: redirect to HTTPS, HSTS: on'); - const sslifyRouter = routeSslify(config.webServer); - sslifyRouter && app.use(sslifyRouter); + if (app) { + if (config?.containers?.deployment) { + debug('Container deployment: HTTP: listening, HSTS: on'); + app.use(routeHsts); + } else if (config?.containers?.docker) { + debug('Docker image: HTTP: listening, HSTS: off'); + } else if (config.webServer.allowHttp) { + debug('development mode: HTTP: listening, HSTS: off'); + } else { + debug('non-container production mode: HTTP: redirect to HTTPS, HSTS: on'); + const sslifyRouter = routeSslify(config.webServer); + sslifyRouter && app.use(sslifyRouter); + } } if (!exception) { const kvConfig = { @@ -437,7 +464,7 @@ export default async function initialize( try { const keyVaultClient = keyVault(kvConfig); keyEncryptionKeyResolver = keyVaultResolver(keyVaultClient); - app.set('keyEncryptionKeyResolver', keyEncryptionKeyResolver); + app && app.set('keyEncryptionKeyResolver', keyEncryptionKeyResolver); providers.keyEncryptionKeyResolver = keyEncryptionKeyResolver; debug('configuration secrets resolved'); } catch (noKeyVault) { @@ -449,7 +476,7 @@ export default async function initialize( } } try { - await initializeAsync(app, express, rootdir, config); + await initializeAsync(executionEnvironment, providers, rootdir, config); } catch (initializeError) { console.dir(initializeError); debug(`Initialization failure: ${initializeError}`); @@ -458,7 +485,9 @@ export default async function initialize( } const hasCustomRoutes = !!applicationProfile.customRoutes; try { - await middlewareIndex(app, express, config, rootdir, hasCustomRoutes, exception); + if (app) { + await middlewareIndex(app, express, providers, config, rootdir, hasCustomRoutes, exception); + } } catch (middlewareError) { exception = middlewareError; } @@ -466,13 +495,12 @@ export default async function initialize( if (!exception) { if (hasCustomRoutes) { await applicationProfile.customRoutes(); - } else { + } else if (app) { app.use('/', expressRoutes); } } else { console.error(exception); - const appInsightsClient = providers.insights; - const crash = (error) => { + const crash = (error: Error) => { return () => { debug('App crashed because of an initialization error.'); console.log(error.message); @@ -482,15 +510,15 @@ export default async function initialize( process.exit(1); }; }; - if (appInsightsClient) { - appInsightsClient.trackException({ + if (insights) { + insights.trackException({ exception, properties: { info: 'App crashed while initializing', }, }); try { - appInsightsClient.flush({ isAppCrashing: true, callback: crash(exception) }); + insights.flush({ isAppCrashing: true, callback: crash(exception) }); } catch (sendError) { console.dir(sendError); crash(exception)(); @@ -500,7 +528,7 @@ export default async function initialize( } } await ErrorRoutes(app, exception); - return app; + return executionEnvironment; } function createGraphProvider(providers: IProviders, config: any): Promise { @@ -612,7 +640,13 @@ async function createMailAddressProvider(config: any, providers: IProviders): Pr return createMailAddressProviderInstance(options); } -async function dynamicStartup(config: any, providers: IProviders, rootdir: string, stage?: string) { +async function dynamicStartup( + executionEnvironment: ExecutionEnvironment, + config: SiteConfiguration, + providers: IProviders, + rootdir: string, + stage?: string +) { const p = config?.startup?.path; if (p) { try { @@ -628,6 +662,7 @@ async function dynamicStartup(config: any, providers: IProviders, rootdir: strin } const promise = (entrypoint as CompanyStartupEntrypoint).call( null, + executionEnvironment, config, providers, rootdir @@ -635,6 +670,9 @@ async function dynamicStartup(config: any, providers: IProviders, rootdir: strin await promise; debug(`company-specific ${stage || 'startup'} complete (${p})`); } catch (dynamicLoadError) { + if (dynamicLoadError.stack) { + console.error(dynamicLoadError.stack); + } throw new Error(`config.startup.path=${p} could not successfully load: ${dynamicLoadError}`); } } diff --git a/middleware/jsonError.ts b/middleware/jsonError.ts index 48cdd1bc9..eaee733ac 100644 --- a/middleware/jsonError.ts +++ b/middleware/jsonError.ts @@ -3,12 +3,16 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + +import { ReposAppRequest } from '../interfaces'; + interface IErrorJson extends Error { json?: boolean; statusCode?: string | number; } -export function json404(req, res, next) { +export function json404(req: ReposAppRequest, res: Response, next: NextFunction) { return next(jsonError('Endpoint not found', 404)); } diff --git a/middleware/links/index.ts b/middleware/links/index.ts index b0f24d8e1..61993b94d 100644 --- a/middleware/links/index.ts +++ b/middleware/links/index.ts @@ -9,16 +9,22 @@ import { IndividualContext } from '../../business/user'; import { getProviders } from '../../transitional'; import { wrapError } from '../../utils'; import { ReposAppRequest, IReposError } from '../../interfaces'; +import { NextFunction, Response } from 'express'; export function RequireLinkMatchesGitHubSessionExceptPrefixedRoute(prefix: string) { return requireLinkMatchesGitHubSession.bind(null, prefix); } -export function RequireLinkMatchesGitHubSession(req: ReposAppRequest, res, next) { +export function RequireLinkMatchesGitHubSession(req: ReposAppRequest, res: Response, next: NextFunction) { return requireLinkMatchesGitHubSession(null, req, res, next); } -function requireLinkMatchesGitHubSession(allowedPrefix: string, req: ReposAppRequest, res, next) { +function requireLinkMatchesGitHubSession( + allowedPrefix: string, + req: ReposAppRequest, + res: Response, + next: NextFunction +) { // trying to be equivalent to legacy code in ./usernameConsistency (lightweight) const context = req.individualContext; if (!context) { @@ -67,7 +73,7 @@ function requireLinkMatchesGitHubSession(allowedPrefix: string, req: ReposAppReq return next(securityError); } -export async function AddLinkToRequest(req, res, next) { +export async function AddLinkToRequest(req, res: Response, next: NextFunction) { const activeContext = (req.individualContext || req.apiContext) as IndividualContext; const contextName = req.individualContext ? 'Individual User Context' : 'API Context'; if (!activeContext) { diff --git a/middleware/locals.ts b/middleware/locals.ts index 2fbe3c770..8c6372e54 100644 --- a/middleware/locals.ts +++ b/middleware/locals.ts @@ -4,11 +4,12 @@ // import os from 'os'; -import { ReposAppRequest } from '../interfaces'; +import { NextFunction, Response } from 'express'; +import { ReposAppRequest } from '../interfaces'; import { getProviders } from '../transitional'; -export default function (req: ReposAppRequest, res, next) { +export default function (req: ReposAppRequest, res: Response, next: NextFunction) { const { config, viewServices } = getProviders(req); req.app.locals.correlationId = req.correlationId; req.app.locals.scrubbedUrl = req.scrubbedUrl; diff --git a/middleware/lowercaser.ts b/middleware/lowercaser.ts index 7248e5427..d4eecec20 100644 --- a/middleware/lowercaser.ts +++ b/middleware/lowercaser.ts @@ -3,8 +3,12 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + +import { ReposAppRequest } from '../interfaces'; + export default function (params) { - return function (req, res, next) { + return function (req: ReposAppRequest, res: Response, next: NextFunction) { // lowercase parameters Object.getOwnPropertyNames(req.params).forEach((param) => { if (params.indexOf(param) > -1) { diff --git a/middleware/officeHyperlinks.ts b/middleware/officeHyperlinks.ts index e3e83bd96..aec69eb3f 100644 --- a/middleware/officeHyperlinks.ts +++ b/middleware/officeHyperlinks.ts @@ -5,6 +5,7 @@ // I no longer believe this file FYI... I don't think we need this any longer. +import { NextFunction, Response } from 'express'; import { getProviders } from '../transitional'; // Office uses a specialized pre-fetch to learn more about hyperlinks before @@ -17,7 +18,7 @@ import { getProviders } from '../transitional'; const GenericOfficeUserAgent = 'ms-office'; const WordUserAgent = 'Microsoft Office Word'; -export default function supportOfficeHyperlinks(req, res, next) { +export default function supportOfficeHyperlinks(req, res: Response, next: NextFunction) { const { insights } = getProviders(req); const userAgent = req.headers['user-agent']; const isAuthenticated = req.isAuthenticated ? req.isAuthenticated() : false; diff --git a/middleware/passport-config.ts b/middleware/passport-config.ts index 064eb605e..3f52f94a8 100644 --- a/middleware/passport-config.ts +++ b/middleware/passport-config.ts @@ -3,7 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import passport from 'passport'; + import { IKeyVaultSecretResolver } from '../lib/keyVaultResolver'; import getCompanySpecificDeployment from './companySpecificDeployment'; @@ -73,7 +75,7 @@ export default function (app: IReposApplication, config: SiteConfiguration) { passport.deserializeUser(serializer.deserialize(serializerOptions)); serializer.initialize(serializerOptions, app); - app.use((req: ReposAppRequest, res, next) => { + app.use((req: ReposAppRequest, res: Response, next: NextFunction) => { if (req?.insights?.commonProperties && config.authentication.scheme === 'aad' && req?.user?.azure?.oid) { req.insights.commonProperties.aadId = req.user.azure.oid; } diff --git a/middleware/passport-routes.ts b/middleware/passport-routes.ts index 642e332cc..574faa3db 100644 --- a/middleware/passport-routes.ts +++ b/middleware/passport-routes.ts @@ -3,11 +3,11 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Response, NextFunction } from 'express'; +import type { Response, NextFunction } from 'express'; import { redirectToReferrer, storeReferrer } from '../utils'; import { getProviders } from '../transitional'; -import { ReposAppRequest, IAppSession } from '../interfaces'; +import type { ReposAppRequest, IAppSession } from '../interfaces'; import getCompanySpecificDeployment from './companySpecificDeployment'; import { attachAadPassportRoutes } from './passport/aadRoutes'; import { attachGitHubPassportRoutes } from './passport/githubRoutes'; diff --git a/middleware/passport/aadRoutes.ts b/middleware/passport/aadRoutes.ts index 59780a355..b8969a0a2 100644 --- a/middleware/passport/aadRoutes.ts +++ b/middleware/passport/aadRoutes.ts @@ -20,7 +20,7 @@ export function attachAadPassportRoutes( helpers: IPrimaryAuthenticationHelperMethods ) { const signinPath = isCodespacesAuthenticating(config, 'aad') ? 'sign-in' : 'signin'; - app.get(`/${signinPath}`, function (req: ReposAppRequest, res, next) { + app.get(`/${signinPath}`, function (req: ReposAppRequest, res: Response, next: NextFunction) { if (req.isAuthenticated()) { const username = req.user?.azure?.username; if (username) { @@ -81,7 +81,7 @@ export function attachAadPassportRoutes( // links from apps that temporarily prevent sessions. Technically this seems to // impact Windows users who use Word to open links to the site. Collecting // telemetry for now. - app.get('/auth/azure/callback', (req: ReposAppRequest, res, next) => { + app.get('/auth/azure/callback', (req: ReposAppRequest, res: Response, next: NextFunction) => { const { insights } = getProviders(req); const isAuthenticated = req.isAuthenticated(); insights?.trackEvent({ diff --git a/middleware/rawBodyParser.ts b/middleware/rawBodyParser.ts index 984f9852e..b90e7ff7c 100644 --- a/middleware/rawBodyParser.ts +++ b/middleware/rawBodyParser.ts @@ -3,10 +3,11 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import { ReposAppRequest } from '../interfaces'; import { isWebhookIngestionEndpointEnabled } from '../transitional'; -export default function rawBodyParser(req: ReposAppRequest, res, next) { +export default function rawBodyParser(req: ReposAppRequest, res: Response, next: NextFunction) { if (!isWebhookIngestionEndpointEnabled(req)) { return next(); } diff --git a/middleware/react.ts b/middleware/react.ts index b797e1d76..7c7a8934d 100644 --- a/middleware/react.ts +++ b/middleware/react.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Response } from 'express'; +import { NextFunction, Response } from 'express'; import fs from 'fs'; import path from 'path'; @@ -46,7 +46,7 @@ type FlightingOptions = ContentOptions & { export function injectReactClient() { const standardContent = getReactScriptsIndex(staticClientPackageName); let flightingOptions: FlightingOptions = null; - return function injectedRoute(req: ReposAppRequest, res, next) { + return function injectedRoute(req: ReposAppRequest, res: Response, next: NextFunction) { const { config } = getProviders(req); // special passthrough if (req.path.includes('/byClient')) { diff --git a/middleware/scrubbedUrl.ts b/middleware/scrubbedUrl.ts index 0ed6f9496..d498a6cdd 100644 --- a/middleware/scrubbedUrl.ts +++ b/middleware/scrubbedUrl.ts @@ -3,9 +3,12 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; +import { ReposAppRequest } from '../interfaces'; + // Scrub the incoming URL value(s) in the request, replacing tokens and other // secrets. -export default function (req, res, next) { +export default function (req: ReposAppRequest, res: Response, next: NextFunction) { let url = req.originalUrl || req.url; const secretKeys = ['code', 'token']; for (let i = 0; i < secretKeys.length; i++) { diff --git a/middleware/supportMultipleAuthProviders.ts b/middleware/supportMultipleAuthProviders.ts index 4cdb353a8..cf0a8278f 100644 --- a/middleware/supportMultipleAuthProviders.ts +++ b/middleware/supportMultipleAuthProviders.ts @@ -3,6 +3,8 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { jsonError } from './jsonError'; import { IApiRequest } from './apiReposAuth'; import { getProviders } from '../transitional'; @@ -24,7 +26,7 @@ export default function returnCombinedMiddleware(supportedProviders) { if (totalProviders <= 0) { throw new Error('supportedProviders must provide at least one provider to use for auth'); } - return function middleware(req: IApiRequest, res, next) { + return function middleware(req: IApiRequest, res: Response, next: NextFunction) { const { insights } = getProviders(req); let i = 0; let currentProvider = supportedProviders[i]; diff --git a/package.json b/package.json index 313f25c97..cf697a243 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "management", "organization" ], + "_ignore_main": "dist/index.js", + "_ignore_types": "dist/index.d.ts", "tags": [ "github", "node", @@ -21,6 +23,7 @@ "scripts": { "build": "tsc", "find-deadcode": "ts-prune", + "find-circular-dependencies": "npx madge --circular --extensions ts .", "fix:js": "eslint --fix .", "fix:md": "markdownlint-cli2-fix \"**/*.md\"", "fix": "npm run fix:js && npm run fix:md", @@ -29,7 +32,7 @@ "lint:md": "markdownlint-cli2 \"**/*.md\"", "lint:spell": "cspell --no-progress \"**\"", "lint": "npm run lint:json && npm run lint:js && npm run lint:md && npm run lint:spell", - "prepare": "husky install", + "prepare": "husky install || echo No Husky.", "start-4000": "PORT=4000 DEBUG=startup node ./dist/bin/www", "start-in-container": "node ./bin/www", "start": "node ./dist/bin/www", diff --git a/routes/administration/app.ts b/routes/administration/app.ts index ea3419bb3..dba21f843 100644 --- a/routes/administration/app.ts +++ b/routes/administration/app.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -27,7 +27,7 @@ import { router.use( '/:appId', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const appId = Number(req.params.appId); const app = providers.operations.getApplicationById(appId); @@ -43,7 +43,7 @@ router.use( router.get( '/:appId', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const githubApplication = req['githubApplication'] as GitHubApplication; const installationIdString = req.query.installation_id; const setupAction = req.query.setup_action; @@ -71,7 +71,7 @@ router.get( router.use( '/:appId/installations/:installationId', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const githubApplication = req['githubApplication'] as GitHubApplication; const installationIdString = req.params.installationId; const { operations, organizationSettingsProvider } = getProviders(req); @@ -166,7 +166,7 @@ async function getDynamicSettingsFromLegacySettings( router.post( '/:appId/installations/:installationId', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const hasBurnButtonClicked = req.body['burn-org-app']; const hasImportButtonClicked = req.body['adopt-import-settings']; const hasCreateButtonClicked = req.body['adopt-new-org']; @@ -375,7 +375,7 @@ router.post( router.get( '/:appId/installations/:installationId', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const githubApplication = req['githubApplication'] as GitHubApplication; const providers = getProviders(req); const individualContext = req.individualContext; diff --git a/routes/administration/apps.ts b/routes/administration/apps.ts index bec5cb2bc..3c7f5bc89 100644 --- a/routes/administration/apps.ts +++ b/routes/administration/apps.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -35,7 +35,7 @@ interface IByOrgView { router.post( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const { deletesettingsorgname } = req.body; if (!deletesettingsorgname) { @@ -69,7 +69,7 @@ router.post( router.get( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const operations = providers.operations; const apps = providers.operations.getApplications(); diff --git a/routes/administration/index.ts b/routes/administration/index.ts index 3e117bfea..aa5a4f33a 100644 --- a/routes/administration/index.ts +++ b/routes/administration/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -17,7 +17,7 @@ import RouteApps from './apps'; router.use( '*', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const { corporateAdministrationProfile } = getProviders(req); if (corporateAdministrationProfile && corporateAdministrationProfile.urls) { req.individualContext.setInitialViewProperty('_corpAdminUrls', corporateAdministrationProfile.urls); @@ -38,7 +38,7 @@ try { router.use('/app', RouteApp); router.use('/apps', RouteApps); -router.get('/', (req: ReposAppRequest, res, next) => { +router.get('/', (req: ReposAppRequest, res: Response, next: NextFunction) => { const individualContext = req.individualContext; individualContext.webContext.render({ view: 'administration', diff --git a/routes/approvals.ts b/routes/approvals.ts index d00d69b50..15ea37dcf 100644 --- a/routes/approvals.ts +++ b/routes/approvals.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); router.get('/', (req, res) => { diff --git a/routes/explore.ts b/routes/explore.ts index b912b71cb..2b29f5dea 100644 --- a/routes/explore.ts +++ b/routes/explore.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest } from '../interfaces'; diff --git a/routes/index-authenticated.ts b/routes/index-authenticated.ts index 688be52f5..924018915 100644 --- a/routes/index-authenticated.ts +++ b/routes/index-authenticated.ts @@ -5,7 +5,7 @@ import _ from 'lodash'; -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -69,7 +69,7 @@ dynamicStartupInstance?.routes?.connectAuthenticatedRoutes && router.use('/settings', SettingsRoute); -router.get('/news', (req: ReposAppRequest, res, next) => { +router.get('/news', (req: ReposAppRequest, res: Response, next: NextFunction) => { const config = getProviders(req).config; if (config && config.news && config.news.all && config.news.all.length) { return req.individualContext.webContext.render({ @@ -88,7 +88,7 @@ router.use(RequireLinkMatchesGitHubSessionExceptPrefixedRoute('/unlink')); router.get( '/', reactRoute || - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const onboarding = req.query.onboarding !== undefined; const individualContext = req.individualContext; const link = individualContext.link; diff --git a/routes/index-linked.ts b/routes/index-linked.ts index fef788ced..c70002cb6 100644 --- a/routes/index-linked.ts +++ b/routes/index-linked.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -38,7 +38,7 @@ const reactRoute = hasReactApp ? injectReactClient() : undefined; // * only for the traditional app. The React app does not require a link to browse orgs. //----------------------------------------------------------------------------- if (!hasReactApp) { - router.use(function (req: ReposAppRequest, res, next) { + router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { const individualContext = req.individualContext as IndividualContext; const link = individualContext.link; if (link && link.thirdPartyId) { @@ -65,7 +65,7 @@ router.use('/administration', asyncHandler(AuthorizeOnlyCorporateAdministrators) router.use( '/https?*github.com/:org/:repo', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { // Helper method to allow pasting a GitHub URL into the app to go to a repo const { org, repo } = req.params; const { operations } = getProviders(req); diff --git a/routes/index.ts b/routes/index.ts index 84d7d2fd0..eb122d2a3 100644 --- a/routes/index.ts +++ b/routes/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { webContextMiddleware } from '../middleware/business/setContext'; diff --git a/routes/link-cleanup.ts b/routes/link-cleanup.ts index ff7156a32..d8ba92b7e 100644 --- a/routes/link-cleanup.ts +++ b/routes/link-cleanup.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest } from '../interfaces'; @@ -17,7 +17,7 @@ import { ReposAppRequest } from '../interfaces'; // linksForCleanup?: any; // } -router.use((req: ReposAppRequest, res, next) => { +router.use((req: ReposAppRequest, res: Response, next: NextFunction) => { // TODO: revisit implementation return next(); @@ -104,7 +104,7 @@ router.use((req: ReposAppRequest, res, next) => { // renderCleanupPage(req, res, null, null); // }); -// router.post('/', (req: IRequestWithSessionPlus, res, next) => { +// router.post('/', (req: IRequestWithSessionPlus, res: Response, next: NextFunction) => { // let action = 'unlink'; // let id = req.body.unlink; // if (!req.body.unlink && req.session && req.session.enableMultipleAccounts === true && req.body.select) { diff --git a/routes/link.ts b/routes/link.ts index 312325395..7a3535aec 100644 --- a/routes/link.ts +++ b/routes/link.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -31,7 +31,7 @@ interface IRequestHacked extends ReposAppRequest { overrideLinkUserPrincipalName?: any; } -router.use((req: IRequestHacked, res, next) => { +router.use((req: IRequestHacked, res: Response, next: NextFunction) => { const config = getProviders(req).config; if ( config && @@ -50,7 +50,7 @@ router.use((req: IRequestHacked, res, next) => { router.use( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { // Make sure both account types are authenticated before showing the link pg [wi 12690] const individualContext = req.individualContext; if (!individualContext.corporateIdentity || !individualContext.getGitHubIdentity()) { @@ -64,7 +64,7 @@ router.use( // TODO: graph provider non-guest check should be middleware and in the link business process router.use( - asyncHandler(async (req: IRequestHacked, res, next) => { + asyncHandler(async (req: IRequestHacked, res: Response, next: NextFunction) => { const individualContext = req.individualContext as IndividualContext; const providers = getProviders(req); const insights = providers.insights; @@ -155,7 +155,7 @@ router.use( router.get( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const { config } = getProviders(req); const individualContext = req.individualContext; const link = individualContext.link; @@ -233,7 +233,7 @@ router.get('/enableMultipleAccounts', function (req: IRequestWithSession, res) { router.post( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const individualContext = req.individualContext as IndividualContext; try { await interactiveLinkUser(false, individualContext, req, res, next); @@ -291,7 +291,7 @@ export async function interactiveLinkUser( router.use('/remove', unlinkRoute); -router.get('/reconnect', function (req: ReposAppRequest, res, next) { +router.get('/reconnect', function (req: ReposAppRequest, res: Response, next: NextFunction) { const config = getProviders(req).config; if (config.authentication.scheme !== 'aad') { return next( diff --git a/routes/org/2fa.ts b/routes/org/2fa.ts index aa1fd3a7a..230a31087 100644 --- a/routes/org/2fa.ts +++ b/routes/org/2fa.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -14,7 +14,7 @@ import { wrapError } from '../../utils'; router.get( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const organization = req.organization; const onboarding = req.query.onboarding; const joining = req.query.joining; diff --git a/routes/org/index.ts b/routes/org/index.ts index cff5edcd7..7f3af60da 100644 --- a/routes/org/index.ts +++ b/routes/org/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import express, { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -32,7 +32,7 @@ interface ILocalOrgRequest extends ReposAppRequest { orgPermissions?: IRequestOrganizationPermissions; } -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { const onboarding = req.query.onboarding; const organization = req.organization; req.individualContext.webContext.pushBreadcrumb(organization.name, onboarding ? false : undefined); @@ -44,7 +44,7 @@ router.use(function (req: ReposAppRequest, res, next) { }); // Campaign-related redirect to take the user to GitHub -router.get('/', (req: ReposAppRequest, res, next) => { +router.get('/', (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); if (!providers || !providers.campaign) { return next(); @@ -64,7 +64,7 @@ router.use('/teams', RouteTeams); router.use(asyncHandler(AddOrganizationPermissionsToRequest)); router.use( - asyncHandler(async (req: ILocalOrgRequest, res, next) => { + asyncHandler(async (req: ILocalOrgRequest, res: Response, next: NextFunction) => { const organization = req.organization; const orgPermissions = req.orgPermissions; if (!orgPermissions) { @@ -91,7 +91,7 @@ router.use( router.get( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const approvalProvider = providers.approvalProvider; const organization = req.organization; @@ -146,7 +146,7 @@ router.use('/wizard', RouteNewRepoSpa); router.use( '/:repoName', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const repoName = req.params.repoName; const organization = req.organization; const attemptedRepository = organization.repository(repoName); diff --git a/routes/org/join.ts b/routes/org/join.ts index 6645af58c..4bc22c2fa 100644 --- a/routes/org/join.ts +++ b/routes/org/join.ts @@ -31,7 +31,7 @@ import getCompanySpecificDeployment from '../../middleware/companySpecificDeploy //------------- // Join checks //------------- -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { const organization = req.organization; let err = null; if (organization.locked) { diff --git a/routes/org/leave.ts b/routes/org/leave.ts index 2ee5b6cff..d38c394fd 100644 --- a/routes/org/leave.ts +++ b/routes/org/leave.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -25,7 +25,7 @@ interface ILocalLeaveRequest extends ReposAppRequest { } router.use( - asyncHandler(async (req: ILocalLeaveRequest, res, next) => { + asyncHandler(async (req: ILocalLeaveRequest, res: Response, next: NextFunction) => { const organization = req.organization as Organization; req.orgLeave = { state: null, @@ -58,7 +58,7 @@ router.get('/', function (req: ILocalLeaveRequest, res) { router.post( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const organization = req.organization; const providers = getProviders(req); const operations = providers.operations; diff --git a/routes/org/membership.ts b/routes/org/membership.ts index 1e5614ce6..83003c8e6 100644 --- a/routes/org/membership.ts +++ b/routes/org/membership.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { ReposAppRequest, UserAlertType } from '../../interfaces'; @@ -14,7 +14,7 @@ const router: Router = Router(); router.get( '/', RequireActiveGitHubSession, - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const organization = req.organization; if (!organization) { // TODO: Was this ever a possible situation? What's going on here? Probably was v1 (single-org) @@ -56,7 +56,7 @@ router.get( router.post( '/', RequireActiveGitHubSession, - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const username = req.individualContext.getGitHubIdentity().username; const organization = req.organization; if (!organization) { diff --git a/routes/org/newRepoSpa.ts b/routes/org/newRepoSpa.ts index 3adafdcb5..a2047d54a 100644 --- a/routes/org/newRepoSpa.ts +++ b/routes/org/newRepoSpa.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); diff --git a/routes/org/people.ts b/routes/org/people.ts index 5fefb4fba..ceabce61c 100644 --- a/routes/org/people.ts +++ b/routes/org/people.ts @@ -3,14 +3,14 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest } from '../../interfaces'; import RoutePeopleSearch from '../peopleSearch'; -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('People'); req.reposContext = { section: 'people', diff --git a/routes/org/profileReview.ts b/routes/org/profileReview.ts index 0faf21174..b0cde768c 100644 --- a/routes/org/profileReview.ts +++ b/routes/org/profileReview.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import asyncHandler from 'express-async-handler'; @@ -17,7 +17,7 @@ interface IUserProfileWarnings { router.get( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const organization = req.organization; const { operations } = getProviders(req); const config = operations.config; diff --git a/routes/org/repoAdministrativeLock.ts b/routes/org/repoAdministrativeLock.ts index 94323057d..3a7edc74b 100644 --- a/routes/org/repoAdministrativeLock.ts +++ b/routes/org/repoAdministrativeLock.ts @@ -4,7 +4,7 @@ // import asyncHandler from 'express-async-handler'; -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { getProviders } from '../../transitional'; @@ -16,7 +16,7 @@ import { getRepositoryMetadataProvider, ReposAppRequest, UserAlertType } from '. router.use( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const organization = req.organization as Organization; if (!organization.isNewRepositoryLockdownSystemEnabled()) { return next(new Error('This endpoint is not available as configured')); @@ -27,7 +27,7 @@ router.use( router.use( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const individualContext = req.individualContext; const isPortalAdministrator = await individualContext.isPortalAdministrator(); if (!isPortalAdministrator) { @@ -42,7 +42,7 @@ router.use( router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const repository = req['repository'] as Repository; const repositoryMetadata = req['repositoryMetadata'] as RepositoryMetadataEntity; return renderPage(req, repositoryMetadata, repository); @@ -51,7 +51,7 @@ router.get( router.post( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const operations = providers.operations; const repository = req['repository'] as Repository; diff --git a/routes/org/repoWorkflowEngine.ts b/routes/org/repoWorkflowEngine.ts index e1979b26c..cf46c217d 100644 --- a/routes/org/repoWorkflowEngine.ts +++ b/routes/org/repoWorkflowEngine.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; import fs from 'fs'; import path from 'path'; import recursiveReadDirectory from 'recursive-readdir'; @@ -20,6 +21,7 @@ import { IAlternateTokenOption, IOperationsRepositoryMetadataProvider, IProviders, + IReposAppWithTeam, throwIfNotCapable, } from '../../interfaces'; import { ErrorHelper } from '../../transitional'; @@ -185,7 +187,7 @@ export class RepoWorkflowEngine { }); } - editPost(req, res, next) { + editPost(req: IReposAppWithTeam, res: Response, next: NextFunction) { const { operations } = this.providers; const ops = throwIfNotCapable( operations, diff --git a/routes/org/repos.ts b/routes/org/repos.ts index 1dda07093..d32f6e2f6 100644 --- a/routes/org/repos.ts +++ b/routes/org/repos.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -60,7 +60,7 @@ const teamsFilterType = { systemTeamsOnly: 'systemTeamsOnly', }; -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('Repositories'); req.reposContext = { section: 'repos', @@ -160,7 +160,7 @@ export async function findRepoCollaboratorsExcludingOwners( router.use( '/:repoName', - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const repoName = req.params.repoName; const organization = req.organization; const repository = organization.repository(repoName); @@ -175,7 +175,7 @@ router.use('/:repoName/administrativeLock', routeAdministrativeLock); router.use( '/:repoName/delete', - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const individualContext = req.individualContext; const repository = req.repository; const organization = req.organization; @@ -205,7 +205,7 @@ router.use( router.get( '/:repoName/delete', - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { return req.individualContext.webContext.render({ title: 'Delete the repo you created', view: 'repos/delete', @@ -218,7 +218,7 @@ router.get( router.post( '/:repoName/delete', - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { // NOTE: this code is also duplicated for now in the client/internal/* folder // CONSIDER: de-duplicate const { operations } = getProviders(req); @@ -251,7 +251,7 @@ export interface IRenameOutput { router.post( '/:repoName/defaultBranch', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { try { const targetBranchName = req.body.targetBranchName || 'main'; const providers = getProviders(req); @@ -345,7 +345,7 @@ export async function renameRepositoryDefaultBranchEndToEnd( router.post( '/:repoName', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const repoPermissions = req.repoPermissions; if (!repoPermissions.allowAdministration) { return next(new Error('You do not have administrative permission on this repository')); @@ -370,7 +370,7 @@ router.post( router.get( '/:repoName', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const { linkProvider, config, graphProvider } = getProviders(req); const repoPermissions = req.repoPermissions; const referer = req.headers.referer as string; @@ -474,7 +474,7 @@ router.get( router.get( '/:repoName/defaultBranch', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const referer = req.headers.referer as string; const fromReposPage = referer && (referer.endsWith('repos') || referer.endsWith('repos/')); const organization = req.organization; @@ -555,7 +555,7 @@ export async function calculateGroupedPermissionsViewForRepository(repository: R router.get( '/:repoName/permissions', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const referer = req.headers.referer as string; const fromReposPage = referer && (referer.endsWith('repos') || referer.endsWith('repos/')); const organization = req.organization; @@ -605,7 +605,7 @@ router.get( router.get( '/:repoName/history', - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const { auditLogRecordProvider } = getProviders(req); const referer = req.headers.referer as string; const fromReposPage = referer && (referer.endsWith('repos') || referer.endsWith('repos/')); @@ -760,7 +760,7 @@ function teamsToSet(teams) { return set; } -// function requireAdministration(req, res, next) { +// function requireAdministration(req, res: Response, next: NextFunction) { // const repoPermissions = req.repoPermissions; // if (!repoPermissions) { // return next(new Error('Not configured for repo permissions')); diff --git a/routes/org/team/approval/index.ts b/routes/org/team/approval/index.ts index ffe17b298..b7bc3d285 100644 --- a/routes/org/team/approval/index.ts +++ b/routes/org/team/approval/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -62,7 +62,7 @@ router.get('/setNote/:action', function (req: ILocalRequest, res) { router.post( '/', - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const { individualContext } = req; const engine = req.approvalEngine as PermissionWorkflowEngine; diff --git a/routes/org/team/approvals.ts b/routes/org/team/approvals.ts index 88108ed18..184b3ad36 100644 --- a/routes/org/team/approvals.ts +++ b/routes/org/team/approvals.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -91,14 +91,14 @@ export class PermissionWorkflowEngine { // Find the request and assign the workflow engine -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('Approvals'); next(); }); router.get( '/', - asyncHandler(async (req: IRequestTeams, res, next) => { + asyncHandler(async (req: IRequestTeams, res: Response, next: NextFunction) => { const team = req.team2 as Team; const approvals = await team.getApprovals(); req.individualContext.webContext.render({ @@ -119,7 +119,7 @@ interface IRequestPlusApprovalEngine extends IRequestTeams { router.use( '/:requestid', - asyncHandler(async function (req: IRequestPlusApprovalEngine, res, next) { + asyncHandler(async function (req: IRequestPlusApprovalEngine, res: Response, next: NextFunction) { const team = req.team2 as Team; const requestid = req.params.requestid; const { approvalProvider, operations } = getProviders(req); diff --git a/routes/org/team/delete.ts b/routes/org/team/delete.ts index 92b05e2d6..9bd26af19 100644 --- a/routes/org/team/delete.ts +++ b/routes/org/team/delete.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest, UserAlertType } from '../../../interfaces'; @@ -14,7 +14,7 @@ interface ILocalRequest extends ReposAppRequest { team2?: any; } -router.post('/', MiddlewareTeamAdminRequired, (req: ILocalRequest, res, next) => { +router.post('/', MiddlewareTeamAdminRequired, (req: ILocalRequest, res: Response, next: NextFunction) => { const organization = req.organization; const team2 = req.team2; team2.delete((error) => { diff --git a/routes/org/team/index-maintainer.ts b/routes/org/team/index-maintainer.ts index dba129c53..2b0ef2a45 100644 --- a/routes/org/team/index-maintainer.ts +++ b/routes/org/team/index-maintainer.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { ReposAppRequest } from '../../../interfaces'; import { wrapError } from '../../../utils'; @@ -16,7 +16,7 @@ interface ILocalRequest extends ReposAppRequest { teamPermissions?: any; } -router.use(function (req: ILocalRequest, res, next) { +router.use(function (req: ILocalRequest, res: Response, next: NextFunction) { const teamPermissions = req.teamPermissions; if (!teamPermissions.allowAdministration) { const err = wrapError(null, 'You do not have permission to maintain this team.', true); diff --git a/routes/org/team/index.ts b/routes/org/team/index.ts index 5e199bb35..abc44a640 100644 --- a/routes/org/team/index.ts +++ b/routes/org/team/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -65,7 +65,7 @@ interface ILocalRequest extends ReposAppRequest { } router.use( - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const login = req.individualContext.getGitHubIdentity().username; const team2 = req.team2 as Team; @@ -93,7 +93,7 @@ router.use( ); router.use( - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { const { approvalProvider } = getProviders(req); const team2 = req.team2 as Team; if (!approvalProvider) { @@ -113,42 +113,46 @@ router.use( }) ); -router.use('/join', asyncHandler(AddOrganizationPermissionsToRequest), (req: ILocalRequest, res, next) => { - const organization = req.organization; - const team2 = req.team2; - const orgPermissions = req.orgPermissions; - - // Are they already a team member? - const currentMembershipStatus = req.membershipStatus; - if (currentMembershipStatus) { - return next( - wrapError(null, `You are already a ${currentMembershipStatus} of the ${team2.name} team`, true) - ); - } +router.use( + '/join', + asyncHandler(AddOrganizationPermissionsToRequest), + (req: ILocalRequest, res: Response, next: NextFunction) => { + const organization = req.organization; + const team2 = req.team2; + const orgPermissions = req.orgPermissions; + + // Are they already a team member? + const currentMembershipStatus = req.membershipStatus; + if (currentMembershipStatus) { + return next( + wrapError(null, `You are already a ${currentMembershipStatus} of the ${team2.name} team`, true) + ); + } - // Have they joined the organization yet? - const membershipStatus = orgPermissions.membershipStatus; - let error = null; - if (membershipStatus !== 'active') { - error = new Error(`You are not a member of the ${organization.name} GitHub organization.`); - error.title = 'Please join the organization before joining this team'; - error.detailed = - membershipStatus === 'pending' - ? 'You have not accepted your membership yet, or do not have two-factor authentication enabled.' - : 'After you join the organization, you can join this team.'; - error.skipOops = true; - error.skipLog = true; - error.fancyLink = { - link: `/${organization.name}`, - title: `Join the ${organization.name} organization`, - }; + // Have they joined the organization yet? + const membershipStatus = orgPermissions.membershipStatus; + let error = null; + if (membershipStatus !== 'active') { + error = new Error(`You are not a member of the ${organization.name} GitHub organization.`); + error.title = 'Please join the organization before joining this team'; + error.detailed = + membershipStatus === 'pending' + ? 'You have not accepted your membership yet, or do not have two-factor authentication enabled.' + : 'After you join the organization, you can join this team.'; + error.skipOops = true; + error.skipLog = true; + error.fancyLink = { + link: `/${organization.name}`, + title: `Join the ${organization.name} organization`, + }; + } + return next(error); } - return next(error); -}); +); router.get( '/join', - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const team2 = req.team2 as Team; const organization = req.organization as Organization; // The broad access "all members" team is always open for automatic joining without @@ -181,7 +185,7 @@ router.get( router.post( '/selfServiceMaintainerUpgrade', - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { const { selfServiceTeamMemberToMaintainerUpgrades } = req; if (!selfServiceTeamMemberToMaintainerUpgrades) { throw new Error('System not available'); @@ -214,7 +218,7 @@ export interface ITeamJoinRequestSubmitOutcome { router.post( '/join', - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { if (req.existingRequest) { throw new Error('You have already created a team join request that is pending a decision.'); } @@ -502,7 +506,7 @@ export async function submitTeamJoinRequest( router.use(asyncHandler(AddTeamPermissionsToRequest)); // The view uses this information today to show the sudo banner -router.use((req: ILocalRequest, res, next) => { +router.use((req: ILocalRequest, res: Response, next: NextFunction) => { if (req.teamPermissions.sudo === true) { req.sudoMode = true; } @@ -692,14 +696,18 @@ async function basicTeamsView(req: ILocalRequest, display: BasicTeamViewPage) { }); } -router.get('/', asyncHandler(AddOrganizationPermissionsToRequest), async (req: ILocalRequest, res, next) => { - await basicTeamsView(req, BasicTeamViewPage.Default); -}); +router.get( + '/', + asyncHandler(AddOrganizationPermissionsToRequest), + async (req: ILocalRequest, res: Response, next: NextFunction) => { + await basicTeamsView(req, BasicTeamViewPage.Default); + } +); router.get( '/history', asyncHandler(AddOrganizationPermissionsToRequest), - async (req: ILocalRequest, res, next) => { + async (req: ILocalRequest, res: Response, next: NextFunction) => { await basicTeamsView(req, BasicTeamViewPage.History); } ); @@ -707,7 +715,7 @@ router.get( router.get( '/repositories', asyncHandler(AddOrganizationPermissionsToRequest), - async (req: ILocalRequest, res, next) => { + async (req: ILocalRequest, res: Response, next: NextFunction) => { await basicTeamsView(req, BasicTeamViewPage.Repositories); } ); diff --git a/routes/org/team/leave.ts b/routes/org/team/leave.ts index 2c4f9eb67..1b6e20366 100644 --- a/routes/org/team/leave.ts +++ b/routes/org/team/leave.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -17,7 +17,7 @@ interface ILocalRequest extends ReposAppRequest { router.post( '/', - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { const organization = req.organization as Organization; const team2 = req.team2 as Team; const username = req.individualContext.link.thirdPartyUsername; diff --git a/routes/org/team/maintainers.ts b/routes/org/team/maintainers.ts index d8ea7ff44..c52996020 100644 --- a/routes/org/team/maintainers.ts +++ b/routes/org/team/maintainers.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -28,7 +28,7 @@ interface ILocalRequest extends ReposAppRequest { } router.use( - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { // Get the latest maintainers, forced, with every request const team2 = req.team2 as Team; const maintainers = await refreshMaintainers(team2); @@ -51,7 +51,7 @@ router.get('/refresh', (req: ILocalRequest, res) => { router.post( '/:id/downgrade', MiddlewareTeamAdminRequired, - asyncHandler(async (req: ILocalRequest, res, next) => { + asyncHandler(async (req: ILocalRequest, res: Response, next: NextFunction) => { const team2 = req.team2 as Team; const id = req.params.id; const verifiedCurrentMaintainers = req.verifiedCurrentMaintainers; @@ -82,7 +82,7 @@ router.post( }) ); -router.use('/add', MiddlewareTeamAdminRequired, (req: ILocalRequest, res, next) => { +router.use('/add', MiddlewareTeamAdminRequired, (req: ILocalRequest, res: Response, next: NextFunction) => { req.team2AddType = RequestTeamMemberAddType.Maintainer; return next(); }); @@ -90,7 +90,7 @@ router.use('/add', MiddlewareTeamAdminRequired, (req: ILocalRequest, res, next) router.post( '/add', MiddlewareTeamAdminRequired, - asyncHandler(async function (req: ILocalRequest, res, next) { + asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const { operations } = getProviders(req); const login = validateGitHubLogin(req.body.username); const team2 = req.team2 as Team; diff --git a/routes/org/team/members.ts b/routes/org/team/members.ts index d9d911ca4..6268c3647 100644 --- a/routes/org/team/members.ts +++ b/routes/org/team/members.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -55,7 +55,7 @@ async function refreshMembersAndSummary(team2: Team, when): Promise { } router.use( - asyncHandler(async (req: ILocalTeamRequest, res, next) => { + asyncHandler(async (req: ILocalTeamRequest, res: Response, next: NextFunction) => { // Always make sure to have a relatively up-to-date membership cache available const team2 = req.team2 as Team; req.refreshedMembers = await refreshMembers( @@ -70,7 +70,7 @@ router.use( router.get( '/refresh', - asyncHandler(async (req: ILocalTeamRequest, res, next) => { + asyncHandler(async (req: ILocalTeamRequest, res: Response, next: NextFunction) => { // Refresh all the pages and also the cached single-page view shown on the team page const team2 = req.team2 as Team; await refreshMembersAndSummary(team2, 'whenever'); @@ -81,7 +81,7 @@ router.get( // Browse members router.use( '/browse', - (req: ILocalTeamRequest, res, next) => { + (req: ILocalTeamRequest, res: Response, next: NextFunction) => { req.team2RemoveType = 'member'; return next(); }, @@ -92,7 +92,7 @@ router.use( router.use( '/add', MiddlewareTeamAdminRequired, - (req: ILocalTeamRequest, res, next) => { + (req: ILocalTeamRequest, res: Response, next: NextFunction) => { req.team2AddType = RequestTeamMemberAddType.Member; return next(); }, @@ -102,7 +102,7 @@ router.use( router.post( '/remove', MiddlewareTeamAdminRequired, - asyncHandler(async (req: ILocalTeamRequest, res, next) => { + asyncHandler(async (req: ILocalTeamRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const username = validateGitHubLogin(req.body.username); const team2 = req.team2 as Team; @@ -120,7 +120,7 @@ router.post( router.post( '/add', MiddlewareTeamAdminRequired, - asyncHandler(async (req: ILocalTeamRequest, res, next) => { + asyncHandler(async (req: ILocalTeamRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const username = validateGitHubLogin(req.body.username); const organization = req.organization; diff --git a/routes/org/team/properties.ts b/routes/org/team/properties.ts index 0843c67ed..bb7d8686c 100644 --- a/routes/org/team/properties.ts +++ b/routes/org/team/properties.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest, UserAlertType } from '../../../interfaces'; @@ -16,48 +16,56 @@ interface IRequestWithTeamAndLegacy extends ReposAppRequest { teamUrl?: string; } -router.get('/', MiddlewareTeamAdminRequired, (req: IRequestWithTeamAndLegacy, res, next) => { - const team2 = req.team2; - team2.getDetails((error) => { - if (error) { - return next(wrapError(error, 'Had trouble getting the detailed properties for this team.')); - } - req.individualContext.webContext.pushBreadcrumb('Properties'); - req.individualContext.webContext.render({ - view: 'org/team/properties', - title: team2.name + ' - Properties', - state: { - team: team2, - teamUrl: req.teamUrl, - }, +router.get( + '/', + MiddlewareTeamAdminRequired, + (req: IRequestWithTeamAndLegacy, res: Response, next: NextFunction) => { + const team2 = req.team2; + team2.getDetails((error) => { + if (error) { + return next(wrapError(error, 'Had trouble getting the detailed properties for this team.')); + } + req.individualContext.webContext.pushBreadcrumb('Properties'); + req.individualContext.webContext.render({ + view: 'org/team/properties', + title: team2.name + ' - Properties', + state: { + team: team2, + teamUrl: req.teamUrl, + }, + }); }); - }); -}); + } +); -router.post('/', MiddlewareTeamAdminRequired, (req: IRequestWithTeamAndLegacy, res, next) => { - const team2 = req.team2; - const organization = req.organization; - const patch = { - name: req.body.ghname, - description: req.body.description, - }; - team2.edit(patch, (error) => { - if (error) { - return next(error); - } - req.individualContext.webContext.saveUserAlert( - 'Team properties updated on GitHub', - 'Properties Saved', - UserAlertType.Success - ); - team2.getDetails((getDetailsError) => { - if (getDetailsError) { - return next(getDetailsError); +router.post( + '/', + MiddlewareTeamAdminRequired, + (req: IRequestWithTeamAndLegacy, res: Response, next: NextFunction) => { + const team2 = req.team2; + const organization = req.organization; + const patch = { + name: req.body.ghname, + description: req.body.description, + }; + team2.edit(patch, (error) => { + if (error) { + return next(error); } - const slug = team2.slug; - return res.redirect('/' + organization.name + '/teams/' + slug); + req.individualContext.webContext.saveUserAlert( + 'Team properties updated on GitHub', + 'Properties Saved', + UserAlertType.Success + ); + team2.getDetails((getDetailsError) => { + if (getDetailsError) { + return next(getDetailsError); + } + const slug = team2.slug; + return res.redirect('/' + organization.name + '/teams/' + slug); + }); }); - }); -}); + } +); export default router; diff --git a/routes/org/team/teamAdminRequired.ts b/routes/org/team/teamAdminRequired.ts index 748ca8d51..6c40a9667 100644 --- a/routes/org/team/teamAdminRequired.ts +++ b/routes/org/team/teamAdminRequired.ts @@ -3,9 +3,11 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { NextFunction, Response } from 'express'; + import { IReposError } from '../../../interfaces'; -export default function middlewareTeamAdminRequired(req, res, next) { +export default function middlewareTeamAdminRequired(req, res: Response, next: NextFunction) { const teamPermissions = req.teamPermissions; if (!teamPermissions) { return next(new Error('No team permissions information available')); diff --git a/routes/org/teams.ts b/routes/org/teams.ts index 74fc0bfd0..ef1212d09 100644 --- a/routes/org/teams.ts +++ b/routes/org/teams.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -19,7 +19,7 @@ interface ITeamsRequest extends ReposAppRequest { teamUrl?: any; } -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('Teams'); req.reposContext = { section: 'teams', @@ -28,7 +28,7 @@ router.use(function (req: ReposAppRequest, res, next) { next(); }); -router.get('/', function (req, res, next) { +router.get('/', function (req, res: Response, next: NextFunction) { const beforeLinkReferrer = popSessionVariable(req, res, 'beforeLinkReferrer'); if (beforeLinkReferrer !== undefined) { return res.redirect(beforeLinkReferrer); @@ -40,7 +40,7 @@ router.get('/', lowercaser(['sort', 'set']), RouteTeamsPager); router.use( '/:teamSlug', - asyncHandler(async (req: ITeamsRequest, res, next) => { + asyncHandler(async (req: ITeamsRequest, res: Response, next: NextFunction) => { const organization = req.organization; const orgBaseUrl = organization.baseUrl; const slug = req.params.teamSlug as string; diff --git a/routes/orgAdmin.ts b/routes/orgAdmin.ts index f947ea224..ef938f00b 100644 --- a/routes/orgAdmin.ts +++ b/routes/orgAdmin.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -264,7 +264,7 @@ async function getGitHubAccountInformationById(operations: Operations, id: strin return account; } -router.get('/whois/id/:githubid', function (req: ReposAppRequest, res, next) { +router.get('/whois/id/:githubid', function (req: ReposAppRequest, res: Response, next: NextFunction) { const thirdPartyId = req.params.githubid; const providers = getProviders(req); queryByGitHubId(providers, thirdPartyId) @@ -296,7 +296,7 @@ interface IIDValue { router.get( '/whois/link/:linkid', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const linkId = req.params.linkid; const { linkProvider: lp } = getProviders(req); const linkProvider = lp as PostgresLinkProvider; @@ -315,7 +315,7 @@ router.get( router.post( '/whois/link/:linkid', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const { config } = getProviders(req); const linkId = req.params.linkid; const isLinkDelete = req.body['delete-link']; @@ -383,7 +383,7 @@ router.post( router.post( '/whois/link/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const { config, operations } = getProviders(req); const allowAdministratorManualLinking = operations?.config?.features?.allowAdministratorManualLinking; if (!allowAdministratorManualLinking) { @@ -436,7 +436,7 @@ router.post( }) ); -router.post('/whois/id/:githubid', function (req: ReposAppRequest, res, next) { +router.post('/whois/id/:githubid', function (req: ReposAppRequest, res: Response, next: NextFunction) { const thirdPartyId = req.params.githubid; const markAsServiceAccount = req.body['mark-as-service-account']; const unmarkServiceAccount = req.body['unmark-service-account']; @@ -467,7 +467,7 @@ router.post('/whois/id/:githubid', function (req: ReposAppRequest, res, next) { }); }); -router.get('/whois/aad/:upn', function (req: ReposAppRequest, res, next) { +router.get('/whois/aad/:upn', function (req: ReposAppRequest, res: Response, next: NextFunction) { const upn = req.params.upn; const providers = getProviders(req); queryByCorporateUsername(providers, upn) @@ -488,7 +488,7 @@ router.get('/whois/aad/:upn', function (req: ReposAppRequest, res, next) { .catch(next); }); -router.get('/whois/github/:username', function (req: ReposAppRequest, res, next) { +router.get('/whois/github/:username', function (req: ReposAppRequest, res: Response, next: NextFunction) { const login = req.params.username; const providers = getProviders(req); queryByGitHubLogin(providers, login) @@ -507,7 +507,7 @@ router.get('/whois/github/:username', function (req: ReposAppRequest, res, next) .catch(next); }); -router.post('/whois/github/:username', function (req: ReposAppRequest, res, next) { +router.post('/whois/github/:username', function (req: ReposAppRequest, res: Response, next: NextFunction) { const username = req.params.username; const markAsServiceAccount = req.body['mark-as-service-account']; const unmarkServiceAccount = req.body['unmark-service-account']; @@ -672,7 +672,7 @@ router.get('/bulkRepoDelete', (req: ReposAppRequest, res) => { router.post( '/bulkRepoDelete', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { operations } = getProviders(req); let repositories = req.body.repositories; // TODO: FEATURE FLAG: add a feature flag whether this API is available. diff --git a/routes/orgs.ts b/routes/orgs.ts index 3a0750280..5d8bfc6fb 100644 --- a/routes/orgs.ts +++ b/routes/orgs.ts @@ -5,7 +5,7 @@ import querystring from 'querystring'; -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -26,7 +26,11 @@ if (hasReactApp) { router.use('/:orgName', asyncHandler(forwardToOrganizationRoutes)); -async function forwardToOrganizationRoutes(req: IReposRequestWithOrganization, res, next) { +async function forwardToOrganizationRoutes( + req: IReposRequestWithOrganization, + res: Response, + next: NextFunction +) { // This middleware contains both the original GitHub operations types // as well as the newer implementation. In time this will peel apart. const orgName = req.params.orgName; diff --git a/routes/people.ts b/routes/people.ts index 1f9e82ce4..7ca1b99c6 100644 --- a/routes/people.ts +++ b/routes/people.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { getProviders } from '../transitional'; @@ -12,7 +12,7 @@ import { ReposAppRequest } from '../interfaces'; import RoutePeopleSearch from './peopleSearch'; import MiddlewareSystemWidePermissions from '../middleware/github/systemWidePermissions'; -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('People'); req.reposContext = { section: 'people', @@ -22,7 +22,7 @@ router.use(function (req: ReposAppRequest, res, next) { }); // Campaign-related redirect to take the user to GitHub -router.get('/github/:login', (req: ReposAppRequest, res, next) => { +router.get('/github/:login', (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); if (!providers || !providers.campaign) { return next(); diff --git a/routes/peopleSearch.ts b/routes/peopleSearch.ts index 51c2746e7..f18016415 100644 --- a/routes/peopleSearch.ts +++ b/routes/peopleSearch.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -75,7 +75,7 @@ async function getPeopleAcrossOrganizations( router.get( '/', lowercaser(['sort']), - asyncHandler(async (req: IPeopleSearchRequest, res, next) => { + asyncHandler(async (req: IPeopleSearchRequest, res: Response, next: NextFunction) => { const linksFromMiddleware = getAllLinksFromRequest(req); const { operations } = getProviders(req); const org = req.organization ? req.organization.name : null; diff --git a/routes/placeholders.ts b/routes/placeholders.ts index cf28a6626..4dc23b940 100644 --- a/routes/placeholders.ts +++ b/routes/placeholders.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest } from '../interfaces'; diff --git a/routes/releasesSpa.ts b/routes/releasesSpa.ts index fb683135f..a80cee5f5 100644 --- a/routes/releasesSpa.ts +++ b/routes/releasesSpa.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import { ReposAppRequest } from '../interfaces'; const router: Router = Router(); diff --git a/routes/repos.ts b/routes/repos.ts index 8d0daffb5..a8a0f7c2c 100644 --- a/routes/repos.ts +++ b/routes/repos.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import { ReposAppRequest } from '../interfaces'; @@ -11,7 +11,7 @@ import lowercaser from '../middleware/lowercaser'; import RouteReposPager from './reposPager'; -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('Repositories'); req.reposContext = { section: 'repos', diff --git a/routes/settings/approvals.ts b/routes/settings/approvals.ts index aa150ee3c..6dfd2a2e7 100644 --- a/routes/settings/approvals.ts +++ b/routes/settings/approvals.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -82,7 +82,7 @@ export async function Approvals_getUserRequests( router.get( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const { approvalProvider, operations } = getProviders(req); if (!approvalProvider) { return next(new Error('No approval provider instance available')); @@ -107,7 +107,7 @@ router.get( }) ); -router.post('/:requestid/cancel', function (req: ReposAppRequest, res, next) { +router.post('/:requestid/cancel', function (req: ReposAppRequest, res: Response, next: NextFunction) { const { approvalProvider } = getProviders(req); if (!approvalProvider) { return next(new Error('No approval provider instance available')); @@ -143,7 +143,7 @@ router.post('/:requestid/cancel', function (req: ReposAppRequest, res, next) { router.get( '/:requestid', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const requestid = req.params.requestid; const { approvalProvider, operations } = getProviders(req); req.individualContext.webContext.pushBreadcrumb('Your Request'); diff --git a/routes/settings/authorizations.ts b/routes/settings/authorizations.ts index 1cd16c480..74cce7977 100644 --- a/routes/settings/authorizations.ts +++ b/routes/settings/authorizations.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -54,7 +54,7 @@ function createValidator(operations: Operations, link: ICorporateLink, token: st }; } -router.use((req: IRequestWithAuthorizations, res, next) => { +router.use((req: IRequestWithAuthorizations, res: Response, next: NextFunction) => { // This is a lightweight, temporary implementation of authorization management to help clear // stored session tokens for apps like GitHub, VSTS, etc. const { operations } = getProviders(req); @@ -113,7 +113,7 @@ router.get('/', (req: IRequestWithAuthorizations, res) => { router.get( '/validate', - asyncHandler(async (req: IRequestWithAuthorizations, res, next) => { + asyncHandler(async (req: IRequestWithAuthorizations, res: Response, next: NextFunction) => { const authorizations = req.authorizations; for (const authorization of authorizations) { const validator = authorization.validator; diff --git a/routes/settings/campaigns.ts b/routes/settings/campaigns.ts index a5c7b5ef3..6169bfe4f 100644 --- a/routes/settings/campaigns.ts +++ b/routes/settings/campaigns.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -25,21 +25,21 @@ router.use('/:campaignGroupId', (req: ReposAppRequest, res: any, next) => { router.get( '/:campaignGroupId/unsubscribe', - asyncHandler(async (req: ReposAppRequest, res: any, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { return await modifySubscription(true, req, res, next); }) ); router.get( '/:campaignGroupId/subscribe', - asyncHandler(async (req: ReposAppRequest, res: any, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { return await modifySubscription(false, req, res, next); }) ); router.get( '/:campaignGroupId', - asyncHandler(async (req: ReposAppRequest, res: any, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { campaignStateProvider } = getProviders(req); if (!campaignStateProvider) { return next(new Error('This app is not configured for campaign management')); diff --git a/routes/settings/contributionData.ts b/routes/settings/contributionData.ts index 7e32f98f6..6e5e4aad4 100644 --- a/routes/settings/contributionData.ts +++ b/routes/settings/contributionData.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -15,7 +15,7 @@ export interface IRequestWithUserSettings extends ReposAppRequest { userSettings?: UserSettings; } -async function getSettings(req: IRequestWithUserSettings, res, next) { +async function getSettings(req: IRequestWithUserSettings, res: Response, next: NextFunction) { const corporateId = req.individualContext.corporateIdentity.id; const { userSettingsProvider } = getProviders(req); if (!req.userSettings) { @@ -56,7 +56,7 @@ router.get('/', view); router.post( '/', - asyncHandler(async function (req: IRequestWithUserSettings, res, next) { + asyncHandler(async function (req: IRequestWithUserSettings, res: Response, next: NextFunction) { const isOptIn = !!(req.body.optIn === '1'); const currentSetting = req.userSettings.contributionShareOptIn; req.userSettings.contributionShareOptIn = isOptIn; diff --git a/routes/settings/index.ts b/routes/settings/index.ts index 37ea8f92b..8b25be30a 100644 --- a/routes/settings/index.ts +++ b/routes/settings/index.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); diff --git a/routes/settings/personalAccessTokens.ts b/routes/settings/personalAccessTokens.ts index 9aafe0077..eac9a8b54 100644 --- a/routes/settings/personalAccessTokens.ts +++ b/routes/settings/personalAccessTokens.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -11,6 +11,10 @@ import { getProviders } from '../../transitional'; import { PersonalAccessToken } from '../../entities/token/token'; import { ReposAppRequest } from '../../interfaces'; +type ResponseWithNewKey = Response & { + newKey: string; +}; + interface IPersonalAccessTokenForDisplay { active: boolean; expired: boolean; @@ -48,7 +52,7 @@ function translateTableToEntities( }); } -function getPersonalAccessTokens(req: ReposAppRequest, res, next) { +function getPersonalAccessTokens(req: ReposAppRequest, res: Response, next: NextFunction) { const providers = getProviders(req); const tokenProvider = providers.tokenProvider; const corporateId = req.individualContext.corporateIdentity.id; @@ -80,7 +84,7 @@ router.use(getPersonalAccessTokens); router.get('/', view); -function createToken(req: ReposAppRequest, res, next) { +function createToken(req: ReposAppRequest, res: ResponseWithNewKey, next: NextFunction) { const providers = getProviders(req); const tokenProvider = providers.tokenProvider; const insights = req.insights; @@ -136,7 +140,7 @@ router.post('/extension', createToken); router.post( '/delete', - asyncHandler(async (req: IRequestForSettingsPersonalAccessTokens, res, next) => { + asyncHandler(async (req: IRequestForSettingsPersonalAccessTokens, res: Response, next: NextFunction) => { const providers = getProviders(req); const tokenProvider = providers.tokenProvider; const revokeAll = req.body.revokeAll === '1'; diff --git a/routes/teams.ts b/routes/teams.ts index c1220135a..edf5c45ca 100644 --- a/routes/teams.ts +++ b/routes/teams.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; const router: Router = Router(); import lowercaser from '../middleware/lowercaser'; @@ -11,7 +11,7 @@ import { ReposAppRequest } from '../interfaces'; import RouteTeamsPager from './teamsPager'; -router.use(function (req: ReposAppRequest, res, next) { +router.use(function (req: ReposAppRequest, res: Response, next: NextFunction) { req.individualContext.webContext.pushBreadcrumb('Teams'); req.reposContext = { section: 'teams', diff --git a/routes/undo.ts b/routes/undo.ts index f0e61823e..148191e16 100644 --- a/routes/undo.ts +++ b/routes/undo.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -291,7 +291,7 @@ async function undoTeamAdminRepoPermissionAsync( } router.use( - asyncHandler(async function (req: IHaveUndoCandidates, res, next) { + asyncHandler(async function (req: IHaveUndoCandidates, res: Response, next: NextFunction) { const { operations } = getProviders(req); if (!operations.allowUndoSystem) { res.status(404); @@ -322,7 +322,7 @@ router.use( router.post( '/', - asyncHandler(async (req: IHaveUndoCandidates, res, next) => { + asyncHandler(async (req: IHaveUndoCandidates, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const insights = operations.insights; const link = req.individualContext.link; @@ -394,7 +394,7 @@ router.post( router.get( '/', - asyncHandler(async (req: IHaveUndoCandidates, res, next) => { + asyncHandler(async (req: IHaveUndoCandidates, res: Response, next: NextFunction) => { const { operations } = getProviders(req); const insights = operations.insights; insights?.trackMetric({ name: 'UndoPageViews', value: 1 }); diff --git a/routes/unlink.ts b/routes/unlink.ts index af5a7e0a6..e16b38c8b 100644 --- a/routes/unlink.ts +++ b/routes/unlink.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Router } from 'express'; +import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); @@ -14,7 +14,7 @@ import { jsonError } from '../middleware'; import { ReposAppRequest, OrganizationMembershipState, UnlinkPurpose } from '../interfaces'; router.use( - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const memberOfOrganizations = []; const { operations } = getProviders(req); const ghi = req.individualContext.getGitHubIdentity(); @@ -44,7 +44,7 @@ router.use( router.get( '/', - asyncHandler(async (req: ReposAppRequest, res, next) => { + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const link = req.individualContext.link; const id = req.individualContext.getGitHubIdentity().id; const { operations } = getProviders(req); @@ -110,7 +110,7 @@ export async function unlinkInteractive( router.post( '/', - asyncHandler(async function (req: ReposAppRequest, res, next) { + asyncHandler(async function (req: ReposAppRequest, res: Response, next: NextFunction) { const individualContext = req.individualContext; // TODO: validate return unlinkInteractive(false, individualContext, req, res, next); diff --git a/scripts/configuration.ts b/scripts/configuration.ts index 28f80acdc..5ad017e22 100644 --- a/scripts/configuration.ts +++ b/scripts/configuration.ts @@ -3,24 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -async function go(providers: IProviders): Promise { +import job from '../job'; + +job.run(async (providers) => { const { config } = providers; for (const key of Object.getOwnPropertyNames(config)) { console.log(`${key}\n`); console.dir(config[key]); console.log(); } -} - -import app from '../app'; -import { IProviders, IReposJob } from '../interfaces'; - -app.runJob( - async function ({ providers }: IReposJob) { - await go(providers); - return {}; - }, - { - enableAllGitHubApps: true, - } -); +}); diff --git a/scripts/localEnvironment.ts b/scripts/localEnvironment.ts index a3fad71cd..a342f12cc 100644 --- a/scripts/localEnvironment.ts +++ b/scripts/localEnvironment.ts @@ -3,25 +3,10 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -// The local environment script is designed to allow for local debugging, test and -// development scenarios. The go method is called with resolved configuration. +import job from '../job'; -async function go(providers: IProviders): Promise { - // --------------------------------------------------------------------------- -} +// The local environment script allows for local inner-loop development. -// ----------------------------------------------------------------------------- -// Local script initialization -// ----------------------------------------------------------------------------- -import app from '../app'; -import { IProviders, IReposJob } from '../interfaces'; - -app.runJob( - async function ({ providers }: IReposJob) { - await go(providers); - return {}; - }, - { - enableAllGitHubApps: true, - } -); +job.run(async (providers) => { + // +}); diff --git a/scripts/migrateLinks/task.ts b/scripts/migrateLinks.ts similarity index 94% rename from scripts/migrateLinks/task.ts rename to scripts/migrateLinks.ts index f7aaa3b02..249cc175d 100644 --- a/scripts/migrateLinks/task.ts +++ b/scripts/migrateLinks.ts @@ -14,14 +14,17 @@ // LINK_MIGRATION_OVERWRITE values : 'overwrite', 'skip' import throat from 'throat'; -import { IReposJob, ICorporateLink } from '../../interfaces'; -import { createAndInitializeLinkProviderInstance, ILinkProvider } from '../../lib/linkProviders'; -import { ErrorHelper } from '../../transitional'; +import job from '../job'; +import { ICorporateLink, IProviders } from '../interfaces'; +import { createAndInitializeLinkProviderInstance, ILinkProvider } from '../lib/linkProviders'; +import { ErrorHelper } from '../transitional'; const parallelWorkLimit = 5; -export default async function migration({ providers }: IReposJob): Promise { +job.run(migration); + +async function migration(providers: IProviders): Promise { // const sourceLinkProvider = providers.linkProvider; const config = providers.config; const sourceLinkProviderName = 'table'; diff --git a/scripts/migrateLinks/index.ts b/scripts/migrateLinks/index.ts deleted file mode 100644 index 6c6856b80..000000000 --- a/scripts/migrateLinks/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import Job from './task'; -import app from '../../app'; - -app.runJob(Job, { - defaultDebugOutput: 'cache,restapi', -}); diff --git a/tsconfig.json b/tsconfig.json index 7edc1ea63..192dd361d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "outDir": "./dist", "incremental": true, "allowJs": true, + "declaration": true, "moduleResolution": "node", "resolveJsonModule": true, "esModuleInterop": true, diff --git a/views/org/pending.pug b/views/org/pending.pug index 0e29de88a..348bbcaa9 100644 --- a/views/org/pending.pug +++ b/views/org/pending.pug @@ -78,20 +78,7 @@ block content div.row div.col-md-8.col-lg-8 h1 Want to join #{organization.name}? - if organization && organization.pilot_program && organization.pilot_program === 'pilot' - //- Pilot program - //- Due to SAML, auto-invite and accept does not work - p.lead 1ES Engineering Pilot - ul - li An invitation will be sent to your GitHub account. - li You accept the invitation in on GitHub.com. Due to SAML (single Microsoft sign-on), you may need to authenticate again with Microsoft AAD. - li You come back to this site and continue onboarding. - p   - form(method='post') - p - input.btn.btn-primary.btn-lg(type='submit', value='Join ' + organization.name) - - else if hasIncreasedScope && supportsExpressJoinExperience + if hasIncreasedScope && supportsExpressJoinExperience form(method='post') p(style='margin-top:24px') input.btn.btn-primary.btn-huge(type='submit', value='Join ' + organization.name) From d5a28ed738143480b02b61ddfc10d1575b121513 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 14 Jun 2023 13:56:07 -0700 Subject: [PATCH 07/69] Octicons, express: major type updates --- api/client/context/administration/index.ts | 9 +- .../administration/organization/index.ts | 2 +- .../administration/organization/settings.ts | 18 +- api/client/context/approvals.ts | 4 +- api/client/context/index.ts | 8 +- api/client/context/organization/index.ts | 40 +- api/client/context/organization/repo.ts | 2 +- .../context/organization/repoForkUnlock.ts | 7 +- api/client/context/organization/repos.ts | 12 +- api/client/context/organization/team.ts | 48 +- api/client/context/orgs.ts | 4 +- api/client/context/repos.ts | 4 +- api/client/context/sample.ts | 2 +- api/client/context/teams.ts | 4 +- api/client/newOrgRepo.ts | 21 +- api/client/news.ts | 2 +- api/client/organization/annotations.ts | 26 +- api/client/organization/index.ts | 10 +- api/client/organization/repo.ts | 10 +- api/client/organization/repoPermissions.ts | 2 +- api/client/organization/team.ts | 6 +- api/client/organizations.ts | 6 +- api/client/person.ts | 2 +- api/index.ts | 2 +- api/people/links.ts | 51 +- business/operations/unlinkMail.ts | 2 +- index.ts | 10 +- interfaces/web.ts | 5 +- job.ts | 7 +- lib/pugViewServices.ts | 2 +- package-lock.json | 612 ++++++++++++------ package.json | 16 +- routes/administration/app.ts | 4 +- routes/orgAdmin.ts | 2 +- routes/settings/campaigns.ts | 2 +- views/contributions/eligible.pug | 4 +- views/contributions/popular.pug | 2 - views/contributions/voting/elections.pug | 8 - views/contributions/voting/vote.pug | 2 - views/includes/corporateRepoMetadata.pug | 1 - views/org/team/index.pug | 8 +- views/repos/defaultBranch.pug | 5 - views/repos/delete.pug | 5 - views/repos/history.pug | 3 - views/repos/permissions.pug | 2 - views/repos/repo.pug | 21 - views/teams/index.pug | 1 - 47 files changed, 602 insertions(+), 424 deletions(-) diff --git a/api/client/context/administration/index.ts b/api/client/context/administration/index.ts index b4fa59276..27c7ec5a4 100644 --- a/api/client/context/administration/index.ts +++ b/api/client/context/administration/index.ts @@ -29,19 +29,19 @@ router.use( router.get( '/', - asyncHandler(async (req: IRequestWithAdministration, res: Response, next: NextFunction) => { + asyncHandler(async (req: IRequestWithAdministration, res: Response) => { const { operations } = getProviders(req); const isAdministrator = req.isSystemAdministrator; if (!isAdministrator) { return res.json({ isAdministrator, - }); + }) as unknown as void; } const organizations = operations.getOrganizations().map((org) => org.asClientJson()); return res.json({ isAdministrator, organizations, - }); + }) as unknown as void; }) ); @@ -62,7 +62,8 @@ router.use( } catch (noOrgError) { if (ErrorHelper.IsNotFound(noOrgError)) { res.status(404); - return res.end(); + res.end(); + return; } return next(jsonError(noOrgError, 500)); } diff --git a/api/client/context/administration/organization/index.ts b/api/client/context/administration/organization/index.ts index fd4191f4f..5ed533872 100644 --- a/api/client/context/administration/organization/index.ts +++ b/api/client/context/administration/organization/index.ts @@ -21,7 +21,7 @@ router.get( const { organization } = req; return res.json({ organization: organization.asClientJson(), - }); + }) as unknown as void; }) ); diff --git a/api/client/context/administration/organization/settings.ts b/api/client/context/administration/organization/settings.ts index a8280c5f0..f749e588b 100644 --- a/api/client/context/administration/organization/settings.ts +++ b/api/client/context/administration/organization/settings.ts @@ -39,7 +39,7 @@ router.get( const { dynamicSettings } = req; return res.json({ dynamicSettings, - }); + }) as unknown as void; }) ); @@ -53,7 +53,7 @@ router.get( return res.json({ features, organizationName: organization.name, - }); + }) as unknown as void; }) ); @@ -66,7 +66,7 @@ router.get( flag, value: dynamicSettings.features.includes(flag) ? flag : null, organizationName: organization.name, - }); + }) as unknown as void; }) ); @@ -98,7 +98,7 @@ router.put( flag, value: dynamicSettings.features.includes(flag) ? flag : null, organizationName: organization.name, - }); + }) as unknown as void; }) ); @@ -130,7 +130,7 @@ router.delete( flag, value: dynamicSettings.features.includes(flag) ? flag : null, organizationName: organization.name, - }); + }) as unknown as void; }) ); @@ -144,7 +144,7 @@ router.get( return res.json({ properties, organizationName: organization.name, - }); + }) as unknown as void; }) ); @@ -158,7 +158,7 @@ router.get( property: propertyName, value: properties[propertyName] || null, organizationName: organization.name, - }); + }) as unknown as void; }) ); @@ -204,7 +204,7 @@ router.put( organizationName: organization.name, dynamicSettings, updateDescription, - }); + }) as unknown as void; }) ); @@ -240,7 +240,7 @@ router.delete( property: propertyName, value: properties[propertyName] || null, organizationName: organization.name, - }); + }) as unknown as void; }) ); diff --git a/api/client/context/approvals.ts b/api/client/context/approvals.ts index 3210c8197..493d666e3 100644 --- a/api/client/context/approvals.ts +++ b/api/client/context/approvals.ts @@ -38,7 +38,7 @@ router.get( teamResponsibilities: [], usersRequests: [], isLinked: false, - }); + }) as unknown as void; } try { // const username = activeContext.getGitHubIdentity().username; @@ -54,7 +54,7 @@ router.get( teamResponsibilities: teamResponsibilities.map(approvalPairToJson), usersRequests: usersRequests.map(approvalPairToJson), }; - return res.json(state); + return res.json(state) as unknown as void; } catch (error) { return next(jsonError(error)); } diff --git a/api/client/context/index.ts b/api/client/context/index.ts index f1b7117a1..13a1b4b7d 100644 --- a/api/client/context/index.ts +++ b/api/client/context/index.ts @@ -73,7 +73,7 @@ router.get( response.deletedOrChangedUsernames.push(username); } } - return res.json(response); + return res.json(response) as unknown as void; }) ); @@ -125,10 +125,12 @@ router.use( if (ErrorHelper.IsNotFound(noOrgError)) { if (await isUnmanagedOrganization(providers, orgName)) { res.status(204); - return res.end(); + res.end(); + return; } res.status(404); - return res.end(); + res.end(); + return; } return next(jsonError(noOrgError, 500)); } diff --git a/api/client/context/organization/index.ts b/api/client/context/organization/index.ts index a041f15af..3d39a1e77 100644 --- a/api/client/context/organization/index.ts +++ b/api/client/context/organization/index.ts @@ -17,8 +17,9 @@ import { jsonError } from '../../../../middleware'; import getCompanySpecificDeployment from '../../../../middleware/companySpecificDeployment'; import { IndividualContext } from '../../../../business/user'; -import RouteRepos from './repos'; -import RouteTeams from './teams'; +import routeRepos from './repos'; +import routeTeams from './teams'; +import { CreateError } from '../../../../transitional'; const router: Router = Router(); @@ -28,20 +29,20 @@ router.get( const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { - return res.json(false); + return res.json(false) as unknown as void; } const membership = await organization.getOperationalMembership( activeContext.getGitHubIdentity().username ); if (!membership) { - return res.json(false); + return res.json(false) as unknown as void; } return res.json({ user: toSanitizedUser(membership.user), organization: toSanitizedOrg(membership.organization), role: membership.role, state: membership.state, - }); + }) as unknown as void; }) ); @@ -51,11 +52,11 @@ router.get( const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { - return res.json({ isSudoer: false }); + return res.json({ isSudoer: false }) as unknown as void; } return res.json({ isSudoer: await organization.isSudoer(activeContext.getGitHubIdentity().username, activeContext.link), - }); + }) as unknown as void; }) ); @@ -65,7 +66,7 @@ router.get( const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { - return res.json({ isOrganizationOwner: false }); + return res.json({ isOrganizationOwner: false }) as unknown as void; } try { const username = activeContext.getGitHubIdentity().username; @@ -73,9 +74,9 @@ router.get( const isOrganizationOwner = membership?.role === OrganizationMembershipRole.Admin; return res.json({ isOrganizationOwner, - }); + }) as unknown as void; } catch (error) { - return jsonError(error, 400); + return next(CreateError.InvalidParameters(error)); } }) ); @@ -87,7 +88,7 @@ router.delete( const { organization } = req; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { - return next(jsonError('You are not linked', 400)); + return next(CreateError.InvalidParameters('You are not linked')); } const login = activeContext.getGitHubIdentity().username; const id = activeContext.getGitHubIdentity().id; @@ -95,10 +96,10 @@ router.delete( await organization.removeMember(login, id); return res.json({ message: `Your ${login} account has been removed from ${organization.name}.`, - }); + }) as unknown as void; } catch (error) { console.warn(error); - return next(jsonError(error, 400)); + return next(CreateError.InvalidParameters(error)); } }) ); @@ -110,7 +111,7 @@ router.get( const organization = req.organization as Organization; const activeContext = (req.individualContext || req.apiContext) as IndividualContext; if (!activeContext.link) { - return res.json({ personalizedTeams: [] }); + return res.json({ personalizedTeams: [] }) as unknown as void; } const userAggregateContext = activeContext.aggregations; const maintainedTeams = new Set(); @@ -132,21 +133,21 @@ router.get( }); return res.json({ personalizedTeams, - }); + }) as unknown as void; } catch (error) { - return next(jsonError(error, 400)); + return next(CreateError.InvalidParameters(error)); } }) ); -router.use('/repos', RouteRepos); -router.use('/teams', RouteTeams); +router.use('/repos', routeRepos); +router.use('/teams', routeTeams); const deployment = getCompanySpecificDeployment(); deployment?.routes?.api?.context?.organization?.index && deployment?.routes?.api?.context?.organization?.index(router); -router.use('*', (req, res: Response, next: NextFunction) => { +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { return next(jsonError('no API or function available: client>organization', 404)); }); @@ -160,6 +161,7 @@ const toSanitizedUser = (user) => { avatar_url: user.avatar_url, }; }; + const toSanitizedOrg = (org) => { if (!org || !org.login) { return undefined; diff --git a/api/client/context/organization/repo.ts b/api/client/context/organization/repo.ts index dda230d2f..14c337022 100644 --- a/api/client/context/organization/repo.ts +++ b/api/client/context/organization/repo.ts @@ -23,7 +23,7 @@ router.get( AddRepositoryPermissionsToRequest, asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const permissions = getContextualRepositoryPermissions(req); - return res.json(permissions); + return res.json(permissions) as unknown as void; }) ); diff --git a/api/client/context/organization/repoForkUnlock.ts b/api/client/context/organization/repoForkUnlock.ts index 9ddacef0d..aa0428ba1 100644 --- a/api/client/context/organization/repoForkUnlock.ts +++ b/api/client/context/organization/repoForkUnlock.ts @@ -9,10 +9,7 @@ import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../../middleware'; import { getRepositoryMetadataProvider, ReposAppRequest } from '../../../../interfaces'; import { Organization } from '../../../../business'; -import { - getContextualRepository, - getContextualRepositoryPermissions, -} from '../../../../middleware/github/repoPermissions'; +import { getContextualRepository } from '../../../../middleware/github/repoPermissions'; import { IndividualContext } from '../../../../business/user'; import { ErrorHelper, getProviders } from '../../../../transitional'; import NewRepositoryLockdownSystem from '../../../../features/newRepositories/newRepositoryLockdown'; @@ -58,7 +55,7 @@ router.post( return res.json({ message: `Unlocked the ${repository.name} repo in the ${organization.name} org`, unlocked: true, - }); + }) as unknown as void; } catch (error) { return next( jsonError( diff --git a/api/client/context/organization/repos.ts b/api/client/context/organization/repos.ts index 200f50135..c124647a3 100644 --- a/api/client/context/organization/repos.ts +++ b/api/client/context/organization/repos.ts @@ -10,11 +10,11 @@ import { Repository } from '../../../../business'; import { jsonError } from '../../../../middleware'; import { setContextualRepository } from '../../../../middleware/github/repoPermissions'; -import { OrganizationMembershipState, ReposAppRequest } from '../../../../interfaces'; +import { OrganizationMembershipState, ReposAppRequest, VoidedExpressRoute } from '../../../../interfaces'; import { IndividualContext } from '../../../../business/user'; import { createRepositoryFromClient } from '../../newOrgRepo'; -import RouteContextualRepo from './repo'; +import routeContextualRepo from './repo'; const router: Router = Router(); @@ -34,7 +34,11 @@ async function validateActiveMembership(req: ReposAppRequest, res: Response, nex return next(); } -router.post('/', asyncHandler(validateActiveMembership), asyncHandler(createRepositoryFromClient)); +router.post( + '/', + asyncHandler(validateActiveMembership), + asyncHandler(createRepositoryFromClient as VoidedExpressRoute) +); router.use( '/:repoName', @@ -48,7 +52,7 @@ router.use( }) ); -router.use('/:repoName', RouteContextualRepo); +router.use('/:repoName', routeContextualRepo); router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available for repos', 404)); diff --git a/api/client/context/organization/team.ts b/api/client/context/organization/team.ts index ab930f47b..e110e4727 100644 --- a/api/client/context/organization/team.ts +++ b/api/client/context/organization/team.ts @@ -24,7 +24,7 @@ import { import { submitTeamJoinRequest } from '../../../../routes/org/team'; import { postActionDecision, TeamApprovalDecision } from '../../../../routes/org/team/approval'; import { PermissionWorkflowEngine } from '../../../../routes/org/team/approvals'; -import { getProviders } from '../../../../transitional'; +import { CreateError, getProviders } from '../../../../transitional'; import { IndividualContext } from '../../../../business/user'; const router: Router = Router(); @@ -45,7 +45,7 @@ router.get( asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const membership = getTeamMembershipFromRequest(req); const permissions = getTeamPermissionsFromRequest(req); - return res.json({ permissions, membership }); + return res.json({ permissions, membership }) as unknown as void; }) ); @@ -63,7 +63,7 @@ router.get( request = approvals.length > 0 ? approvals[0] : null; } const response: ITeamRequestJsonResponse = { request }; - return res.json(response); + return res.json(response) as unknown as void; }) ); @@ -76,10 +76,12 @@ router.post( const { approvalProvider } = providers; const membership = getTeamMembershipFromRequest(req); if (!membership.isLinked) { - return res.json({ error: 'You have not linked your GitHub account to your corporate identity yet' }); + return res.json({ + error: 'You have not linked your GitHub account to your corporate identity yet', + }) as unknown as void; } if (membership.membershipState === OrganizationMembershipState.Active) { - return res.json({ error: 'You already have an active team membership' }); + return res.json({ error: 'You already have an active team membership' }) as unknown as void; } const team = getContextualTeam(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; @@ -88,7 +90,7 @@ router.post( approvals = approvals.filter((approval) => approval.corporateId === activeContext.corporateIdentity.id); const request = approvals.length > 0 ? approvals[0] : null; if (request) { - return res.json({ error: 'You already have a pending team join request' }); + return res.json({ error: 'You already have a pending team join request' }) as unknown as void; } // const justification = (req.body.justification || '') as string; @@ -102,7 +104,7 @@ router.post( correlationId, hostname ); - return res.json(outcome); + return res.json(outcome) as unknown as void; } catch (error) { return next(jsonError(error)); } @@ -115,18 +117,18 @@ router.post( asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalId: id } = req.params; if (!id) { - return next(jsonError('invalid approval', 400)); + return next(CreateError.InvalidParameters('invalid approval')); } const permissions = getTeamPermissionsFromRequest(req); if (!permissions.allowAdministration) { - return next(jsonError('you do not have permission to administer this team', 401)); + return next(CreateError.NotAuthorized('you do not have permission to administer this team')); } const providers = getProviders(req); const { approvalProvider, operations } = providers; const team = getContextualTeam(req); const request = await approvalProvider.getApprovalEntity(id); if (String(request.teamId) !== String(team.id)) { - return next(jsonError('mismatch on team', 400)); + return next(CreateError.InvalidParameters('mismatch on team')); } const requestingUser = await operations.getAccountWithDetailsAndLink(request.thirdPartyId); const approvalPackage = { request, requestingUser, id }; @@ -146,7 +148,7 @@ router.post( decision = TeamApprovalDecision.Reopen; break; default: - return next(jsonError('invalid or no decision type', 400)); + return next(CreateError.InvalidParameters('invalid or no decision type')); } const teamBaseUrl = `/orgs/${team.organization.name}/teams/${team.slug}/`; // trailing? try { @@ -154,9 +156,9 @@ router.post( if (outcome.error) { throw outcome.error; } - return res.json(outcome); + return res.json(outcome) as unknown as void; } catch (outcomeError) { - return next(jsonError(outcomeError, 500)); + return next(CreateError.ServerError(outcomeError)); } }) ); @@ -167,18 +169,18 @@ router.get( asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const { approvalId: id } = req.params; if (!id) { - return next(jsonError('invalid approval', 400)); + return next(CreateError.InvalidParameters('invalid approval')); } const permissions = getTeamPermissionsFromRequest(req); if (!permissions.allowAdministration) { - return next(jsonError('you do not have permission to administer this team', 401)); + return next(CreateError.NotAuthorized('you do not have permission to administer this team')); } const providers = getProviders(req); const { approvalProvider, graphProvider } = providers; const team = getContextualTeam(req); const request = await approvalProvider.getApprovalEntity(id); if (String(request.teamId) !== String(team.id)) { - return next(jsonError('mismatch on team', 400)); + return next(CreateError.InvalidParameters('mismatch on team')); } let management: IGraphEntry[] = null; if (request?.corporateId) { @@ -188,7 +190,7 @@ router.get( // we ignore any failure here, this is an optional value-add for now } } - return res.json({ approval: request, management }); + return res.json({ approval: request, management }) as unknown as void; }) ); @@ -206,7 +208,7 @@ router.get( response.allowAdministration = permissions.allowAdministration; response.approvals = await approvalProvider.queryPendingApprovalsForTeam(String(team.id)); } - return res.json(response); + return res.json(response) as unknown as void; }) ); @@ -217,11 +219,11 @@ router.post( const { role } = req.body; const { login } = req.params; if (!login) { - return next(jsonError('invalid login', 400)); + return next(CreateError.InvalidParameters('invalid login')); } const permissions = getTeamPermissionsFromRequest(req); if (!permissions.allowAdministration) { - return next(jsonError('you do not have permission to administer this team', 401)); + return next(CreateError.NotAuthorized('you do not have permission to administer this team')); } const team = getContextualTeam(req); try { @@ -230,12 +232,12 @@ router.post( !currentRole || (currentRole as ITeamMembershipRoleState).state !== OrganizationMembershipState.Active ) { - return next(jsonError(`${login} is not currently a member of the team`, 400)); + return next(CreateError.InvalidParameters(`${login} is not currently a member of the team`)); } const response = await team.addMembership(login, { role }); - return res.json(response); + return res.json(response) as unknown as void; } catch (outcomeError) { - return next(jsonError(outcomeError, 500)); + return next(CreateError.ServerError(outcomeError)); } }) ); diff --git a/api/client/context/orgs.ts b/api/client/context/orgs.ts index fd242331f..962e43f44 100644 --- a/api/client/context/orgs.ts +++ b/api/client/context/orgs.ts @@ -15,7 +15,7 @@ export default asyncHandler(async (req: ReposAppRequest, res) => { member: [], admin: [], isLinked: false, - }); + }) as unknown as void; } const orgs = await activeContext.aggregations.getQueryCacheOrganizations(); const data = { @@ -33,5 +33,5 @@ export default asyncHandler(async (req: ReposAppRequest, res) => { }; }), }; - return res.json(data); + return res.json(data) as unknown as void; }); diff --git a/api/client/context/repos.ts b/api/client/context/repos.ts index 34a55050d..2af5ab598 100644 --- a/api/client/context/repos.ts +++ b/api/client/context/repos.ts @@ -16,7 +16,7 @@ export default asyncHandler(async (req: ReposAppRequest, res: Response, next: Ne return res.json({ isLinked: false, repositories: [], - }); + }) as unknown as void; } let permissions = await activeContext.aggregations.getQueryCacheRepositoryPermissions(); permissions = permissions.filter((perm) => { @@ -48,7 +48,7 @@ export default asyncHandler(async (req: ReposAppRequest, res: Response, next: Ne // TODO: would be nice for team permission for repos to also store the team slug in the query cache! }; }), - }); + }) as unknown as void; } catch (error) { return next(error); } diff --git a/api/client/context/sample.ts b/api/client/context/sample.ts index 434952a5e..42821ae26 100644 --- a/api/client/context/sample.ts +++ b/api/client/context/sample.ts @@ -39,7 +39,7 @@ router.get( } catch (error) { return next(error); } - return res.json({ templateName }); + return res.json({ templateName }) as unknown as void; }) ); diff --git a/api/client/context/teams.ts b/api/client/context/teams.ts index c1030b267..ad45b7a43 100644 --- a/api/client/context/teams.ts +++ b/api/client/context/teams.ts @@ -16,12 +16,12 @@ export default asyncHandler(async (req: ReposAppRequest, res: Response, next: Ne isLinked: false, member: [], maintainer: [], - }); + }) as unknown as void; } const permissions = await activeContext.aggregations.getQueryCacheTeams(); return res.json({ isLinked: true, member: permissions.member.map((t) => t.asJson(TeamJsonFormat.Augmented)), maintainer: permissions.maintainer.map((t) => t.asJson(TeamJsonFormat.Augmented)), - }); + }) as unknown as void; }); diff --git a/api/client/newOrgRepo.ts b/api/client/newOrgRepo.ts index 298317dfb..cde490050 100644 --- a/api/client/newOrgRepo.ts +++ b/api/client/newOrgRepo.ts @@ -3,19 +3,24 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import _ from 'lodash'; + import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; const router: Router = Router(); -import _ from 'lodash'; - import { getProviders } from '../../transitional'; import { jsonError } from '../../middleware/jsonError'; import { IndividualContext } from '../../business/user'; import { Organization } from '../../business/organization'; import { CreateRepository, ICreateRepositoryApiResult, CreateRepositoryEntrypoint } from '../createRepo'; import { Team } from '../../business/team'; -import { GitHubRepositoryVisibility, GitHubTeamRole, ReposAppRequest } from '../../interfaces'; +import { + GitHubRepositoryVisibility, + GitHubTeamRole, + ReposAppRequest, + VoidedExpressRoute, +} from '../../interfaces'; // This file supports the client apps for creating repos. @@ -67,7 +72,7 @@ router.get( }); return res.json({ personalizedTeams, - }); + }) as unknown as void; } catch (error) { return next(jsonError(error, 400)); } @@ -93,7 +98,7 @@ router.get( } return t; }), - }); + }) as unknown as void; } // By default, allow a 30-second old list of teams. If the cached @@ -175,7 +180,11 @@ export async function discoverUserIdentities(req: ReposAppRequest, res: Response return next(); } -router.post('/repo/:repo', asyncHandler(discoverUserIdentities), asyncHandler(createRepositoryFromClient)); +router.post( + '/repo/:repo', + asyncHandler(discoverUserIdentities), + asyncHandler(createRepositoryFromClient as VoidedExpressRoute) +); export async function createRepositoryFromClient(req: ILocalApiRequest, res: Response, next: NextFunction) { const providers = getProviders(req); diff --git a/api/client/news.ts b/api/client/news.ts index 3458b9e1f..0253c49b0 100644 --- a/api/client/news.ts +++ b/api/client/news.ts @@ -16,7 +16,7 @@ router.get( '/', asyncHandler(async (req: ReposAppRequest, res) => { const { config } = getProviders(req); - return res.json({ articles: config?.news?.all || [] }); + return res.json({ articles: config?.news?.all || [] }) as unknown as void; }) ); diff --git a/api/client/organization/annotations.ts b/api/client/organization/annotations.ts index fc07b12d1..c534a86a2 100644 --- a/api/client/organization/annotations.ts +++ b/api/client/organization/annotations.ts @@ -21,7 +21,7 @@ import { OrganizationAnnotation, scrubOrganizationAnnotation, } from '../../../entities/organizationAnnotation'; -import { ErrorHelper, getProviders } from '../../../transitional'; +import { CreateError, ErrorHelper, getProviders } from '../../../transitional'; import { IndividualContext } from '../../../business/user'; import { IProviders } from '../../../interfaces'; import { ensureOrganizationProfileMiddleware } from '../../../middleware/github/ensureOrganizationProfile'; @@ -62,7 +62,7 @@ router.get( return res.json({ isSystemAdministrator, annotations: scrubOrganizationAnnotation(annotations, isSystemAdministrator), - }); + }) as unknown as void; }) ); @@ -97,7 +97,7 @@ router.put( // No-op mostly, since ensureAnnotations precedes return res.json({ annotations: req.annotations, - }); + }) as unknown as void; }) ); @@ -136,10 +136,10 @@ router.put( const changes: IOrganizationAnnotationChange[] = []; const newValue = req.body.value as string; if (!newValue) { - return next(jsonError('body.value required', 400)); + return next(CreateError.InvalidParameters('body.value required')); } if (typeof newValue !== 'string') { - return next(jsonError('body.value must be a string value', 400)); + return next(CreateError.InvalidParameters('body.value must be a string value')); } const propertyName = req.params.propertyName as string; const currentPropertyValue = annotations.properties[propertyName] || null; @@ -150,7 +150,7 @@ router.put( return res.json({ annotations, updated, - }); + }) as unknown as void; }) ); @@ -164,7 +164,7 @@ router.delete( const propertyName = req.params.propertyName as string; const currentPropertyValue = annotations.properties[propertyName] || null; if (annotations.properties[propertyName] === undefined) { - return next(jsonError(`property ${propertyName} is not set`, 400)); + return next(CreateError.InvalidParameters(`property ${propertyName} is not set`)); } delete annotations.properties[propertyName]; addChangeNote( @@ -179,7 +179,7 @@ router.delete( return res.json({ annotations, updated, - }); + }) as unknown as void; }) ); @@ -194,7 +194,7 @@ router.put( const changes: IOrganizationAnnotationChange[] = []; const flag = req.params.flag as string; if (annotations.features.includes(flag)) { - return next(jsonError(`The feature flag ${flag} is already present`, 400)); + return next(CreateError.InvalidParameters(`The feature flag ${flag} is already present`)); } annotations.features.push(flag); addChangeNote( @@ -209,7 +209,7 @@ router.put( return res.json({ annotations, updated, - }); + }) as unknown as void; }) ); @@ -222,7 +222,7 @@ router.delete( const changes: IOrganizationAnnotationChange[] = []; const flag = req.params.flag as string; if (!annotations.features.includes(flag)) { - return next(jsonError(`The feature flag ${flag} is not set`, 400)); + return next(CreateError.InvalidParameters(`The feature flag ${flag} is not set`)); } annotations.features = annotations.features.filter((f) => f !== flag); addChangeNote( @@ -237,7 +237,7 @@ router.delete( return res.json({ annotations, updated, - }); + }) as unknown as void; }) ); @@ -269,7 +269,7 @@ router.patch( return res.json({ annotations, updated, - }); + }) as unknown as void; }) ); diff --git a/api/client/organization/index.ts b/api/client/organization/index.ts index 3336ce60e..6b662cac2 100644 --- a/api/client/organization/index.ts +++ b/api/client/organization/index.ts @@ -32,14 +32,14 @@ router.get( asyncHandler(async (req: IReposAppRequestWithOrganizationManagementType, res) => { const { organization, organizationProfile, organizationManagementType } = req; if (organizationManagementType === OrganizationManagementType.Unmanaged) { - return res.json(organizationProfile); + return res.json(organizationProfile) as unknown as void; } const entity = organization.getEntity(); if (entity) { - return res.json(entity); + return res.json(entity) as unknown as void; } const details = await organization.getDetails(); - return res.json(details); + return res.json(details) as unknown as void; }) ); @@ -70,12 +70,12 @@ router.get( return res.json({ managementType: req.organizationManagementType, id: organizationProfile.id, - }); + }) as unknown as void; } return res.json({ managementType: req.organizationManagementType, ...organization.asClientJson(), - }); + }) as unknown as void; } ) ); diff --git a/api/client/organization/repo.ts b/api/client/organization/repo.ts index 1546565ab..464921fe0 100644 --- a/api/client/organization/repo.ts +++ b/api/client/organization/repo.ts @@ -52,7 +52,7 @@ router.get( delete clone.temp_clone_token; // never share this back delete clone.cost; - return res.json(repository.getEntity()); + return res.json(repository.getEntity()) as unknown as void; } catch (repoError) { if (ErrorHelper.IsNotFound(repoError)) { // // Attempt fallback by ID (?) @@ -81,7 +81,7 @@ router.get( } } } catch (repoError) {} - return res.json({ exists, name }); + return res.json({ exists, name }) as unknown as void; }) ); @@ -103,7 +103,7 @@ router.patch( targetBranchName, true /* wait for refresh before sending response */ ); - return res.json(result); + return res.json(result) as unknown as void; } catch (error) { return next(jsonError(error)); } @@ -255,7 +255,7 @@ router.delete( }); return res.json({ message: `You deleted: ${repository.full_name}`, - }); + }) as unknown as void; } catch (error) { insights?.trackException({ exception: error }); insights?.trackEvent({ @@ -311,7 +311,7 @@ router.delete( ); return res.json({ message: `You deleted your repo, ${repository.full_name}.`, - }); + }) as unknown as void; }) ); diff --git a/api/client/organization/repoPermissions.ts b/api/client/organization/repoPermissions.ts index 981043b3d..f5eefaba7 100644 --- a/api/client/organization/repoPermissions.ts +++ b/api/client/organization/repoPermissions.ts @@ -38,7 +38,7 @@ router.get( collaborators: collaborators.map((c) => c.asJson()), outsideCollaborators: outsideCollaborators.map((oc) => oc.asJson()), memberCollaborators: memberCollaborators.map((oc) => oc.asJson()), - }); + }) as unknown as void; } catch (error) { return next(jsonError(error)); } diff --git a/api/client/organization/team.ts b/api/client/organization/team.ts index 8fe706369..da5a65cff 100644 --- a/api/client/organization/team.ts +++ b/api/client/organization/team.ts @@ -23,7 +23,9 @@ router.get( '/', asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const team = getContextualTeam(req); - return res.json(team.asJson(TeamJsonFormat.Augmented /* includes corporateMetadata */)); + return res.json( + team.asJson(TeamJsonFormat.Augmented /* includes corporateMetadata */) + ) as unknown as void; }) ); @@ -108,7 +110,7 @@ router.get( link: corporateLinkToJson(ls.get(Number(maintainer.id))), }; }) - ); + ) as unknown as void; } catch (error) { return next(error); } diff --git a/api/client/organizations.ts b/api/client/organizations.ts index 6cfbd4481..48a963e50 100644 --- a/api/client/organizations.ts +++ b/api/client/organizations.ts @@ -43,7 +43,7 @@ router.get( const dd = orgs.map((org) => { return org.asClientJson(); }); - return res.json(dd); + return res.json(dd) as unknown as void; } catch (error) { throw jsonError(error, 400); } @@ -98,13 +98,13 @@ router.get( return a.localeCompare(b); }); } - return res.json(projected); + return res.json(projected) as unknown as void; } return res.json({ highlights: highlights.sort((a, b) => { return a.profile.login.localeCompare(b.profile.login); }), - }); + }) as unknown as void; } catch (error) { throw jsonError(error, 400); } diff --git a/api/client/person.ts b/api/client/person.ts index 95bdfc8ba..c82a54a50 100644 --- a/api/client/person.ts +++ b/api/client/person.ts @@ -72,7 +72,7 @@ export default asyncHandler(async (req: ReposAppRequest, res: Response, next: Ne json, { corporateEntry } ); - return res.json(combined); + return res.json(combined) as unknown as void; } catch (error) { return next(jsonError(`login ${login} error: ${error}`, 500)); } diff --git a/api/index.ts b/api/index.ts index 5c0cfca86..2a1195463 100644 --- a/api/index.ts +++ b/api/index.ts @@ -174,7 +174,7 @@ router.post( response: JSON.stringify(repoCreateResponse), }, }); - return res.json(repoCreateResponse); + return res.json(repoCreateResponse) as unknown as void; } catch (error) { const data = { ...convergedObject }; data.error = error.message; diff --git a/api/people/links.ts b/api/people/links.ts index e97a790f3..9e6d8d315 100644 --- a/api/people/links.ts +++ b/api/people/links.ts @@ -8,10 +8,10 @@ import asyncHandler from 'express-async-handler'; import { jsonError } from '../../middleware'; import { ICrossOrganizationMembersResult, MemberSearch, Operations } from '../../business'; -import { ICorporateLink } from '../../interfaces'; +import { ICorporateLink, VoidedExpressRoute } from '../../interfaces'; import { IApiRequest } from '../../middleware/apiReposAuth'; import postLinkApi from './link'; -import { ErrorHelper, getProviders } from '../../transitional'; +import { CreateError, ErrorHelper, getProviders } from '../../transitional'; import { wrapError } from '../../utils'; const router: Router = Router(); @@ -37,7 +37,7 @@ router.use(function (req: IApiRequest, res: Response, next: NextFunction) { return next(); }); -router.post('/', asyncHandler(postLinkApi)); +router.post('/', asyncHandler(postLinkApi as VoidedExpressRoute)); router.get( '/', @@ -56,7 +56,9 @@ router.get( '/:linkid', asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { if (unsupportedApiVersions.includes(req.apiVersion)) { - return next(jsonError('This API is not supported by the API version you are using.', 400)); + return next( + CreateError.InvalidParameters('This API is not supported by the API version you are using.') + ); } const linkid = req.params.linkid.toLowerCase(); const { operations } = getProviders(req); @@ -81,23 +83,23 @@ router.get( ); } catch (error) { if (ErrorHelper.IsNotFound(error)) { - return next(jsonError('Could not find the link', 404)); + return next(CreateError.NotFound('Could not find the link')); } else { - return next(jsonError(error, 500)); + return next(CreateError.ServerError(error)); } } req.insights.trackMetric({ name: 'ApiRequestLinkByLinkId', value: 1 }); - return res.json(entry); + return res.json(entry) as unknown as void; } const results = await getAllUsers(req.apiVersion, operations, skipOrganizations, showTimestamps, true); for (let i = 0; i < results.length; i++) { const entry = results[i]; if (entry && entry.id === linkid) { req.insights.trackMetric({ name: 'ApiRequestLinkByLinkId', value: 1 }); - return res.json(entry); + return res.json(entry) as unknown as void; } } - return next(jsonError('Could not find the link', 404)); + return next(CreateError.NotFound('Could not find the link')); }) ); @@ -105,7 +107,9 @@ router.get( '/github/:username', asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { if (unsupportedApiVersions.includes(req.apiVersion)) { - return next(jsonError('This API is not supported by the API version you are using.', 400)); + return next( + CreateError.InvalidParameters('This API is not supported by the API version you are using.') + ); } const username = req.params.username.toLowerCase(); const { operations } = getProviders(req); @@ -118,9 +122,9 @@ router.get( account = await operations.getAccountByUsername(username); } catch (getAccountError) { if (ErrorHelper.IsNotFound(account)) { - return next(jsonError('Could not find a link for the user', 404)); + return next(CreateError.NotFound('Could not find a link for the user')); } - return next(jsonError(getAccountError, 500)); + return next(CreateError.ServerError(getAccountError)); } try { const entry = await getByThirdPartyId( @@ -131,7 +135,7 @@ router.get( showTimestamps ); req.insights.trackMetric({ name: 'ApiRequestLinkByGitHubUsername', value: 1 }); - return res.json(entry); + return res.json(entry) as unknown as void; } catch (entryError) { return next(jsonError(entryError, ErrorHelper.GetStatus(entryError) || 500)); } @@ -141,10 +145,10 @@ router.get( const entry = results[i]; if (entry && entry.github && entry.github.login.toLowerCase() === username) { req.insights.trackMetric({ name: 'ApiRequestLinkByGitHubUsername', value: 1 }); - return res.json(entry); + return res.json(entry) as unknown as void; } } - return next(jsonError('Could not find a link for the user', 404)); + return next(CreateError.NotFound('Could not find a link for the user')); }) ); @@ -185,7 +189,7 @@ router.get( userPrincipalName: upn, }, }); - return res.json(r); + return res.json(r) as unknown as void; } const results = await getAllUsers(req.apiVersion, operations, skipOrganizations, showTimestamps); const r = []; @@ -203,10 +207,10 @@ router.get( }, }); if (r.length === 0) { - return next(jsonError('Could not find a link for the user', 404)); + return next(CreateError.NotFound('Could not find a link for the user')); } req.insights.trackMetric({ name: 'ApiRequestLinkByAadUpn', value: 1 }); - return res.json(r); + return res.json(r) as unknown as void; }) ); @@ -214,7 +218,9 @@ router.get( '/aad/:id', asyncHandler(async (req: IApiRequest, res: Response, next: NextFunction) => { if (req.apiVersion == '2016-12-01') { - return next(jsonError('This API is not supported by the API version you are using.', 400)); + return next( + CreateError.InvalidParameters('This API is not supported by the API version you are using.') + ); } const id = req.params.id; const skipOrganizations = req.query.showOrganizations !== undefined && !!req.query.showOrganizations; @@ -244,7 +250,7 @@ router.get( } } req.insights.trackMetric({ name: 'ApiRequestLinkByAadId', value: 1 }); - return res.json(r); + return res.json(r) as unknown as void; } const results = await getAllUsers(req.apiVersion, operations, skipOrganizations, showTimestamps); const r = []; @@ -258,7 +264,7 @@ router.get( return next(jsonError('Could not find a link for the user', 404)); } req.insights.trackMetric({ name: 'ApiRequestLinkByAadId', value: 1 }); - return res.json(r); + return res.json(r) as unknown as void; }) ); @@ -271,7 +277,6 @@ async function getByThirdPartyId( showLinkIds?: boolean ): Promise { const providers = operations.providers; - const { graphProvider } = providers; let link: ICorporateLink = null; try { link = await providers.linkProvider.getByThirdPartyId(thirdPartyId); @@ -346,7 +351,7 @@ async function getByThirdPartyId( } async function getAllUsers( - apiVersion, + apiVersion: string, operations: Operations, skipOrganizations: boolean, showTimestamps: boolean, diff --git a/business/operations/unlinkMail.ts b/business/operations/unlinkMail.ts index 78d4601d9..e21709858 100644 --- a/business/operations/unlinkMail.ts +++ b/business/operations/unlinkMail.ts @@ -64,7 +64,7 @@ export async function sendTerminatedAccountMail( break; case UnlinkPurpose.Termination: subjectPrefix = '[UNLINKED] '; - headline = `${displayName} is not an active employee`; + headline = `${displayName} has had their GitHub access offboarded`; break; case UnlinkPurpose.Unknown: default: diff --git a/index.ts b/index.ts index 4e5a3d423..2162b6bbb 100644 --- a/index.ts +++ b/index.ts @@ -29,6 +29,7 @@ export function createExpressApplication(): IReposApplication { undefined, app.initializeApplication, false /* not a job */, + true /* enable all apps */, app ); @@ -46,10 +47,15 @@ function initializeApp( return initialize(executionEnvironment, app, express, dirname, config, configurationError); } -export async function commonStartup(call: InitializeCall, isJob: boolean, app?: IReposApplication) { +export async function commonStartup( + call: InitializeCall, + isJob: boolean, + enableAllGitHubApps: boolean, + app?: IReposApplication +) { const executionEnvironment: ExecutionEnvironment = { isJob, - enableAllGitHubApps: undefined, + enableAllGitHubApps, // expressApplication: app, // diff --git a/interfaces/web.ts b/interfaces/web.ts index f9cc224e5..fe0b4dacc 100644 --- a/interfaces/web.ts +++ b/interfaces/web.ts @@ -4,7 +4,7 @@ // import { Session } from 'express-session'; -import { Request, Response } from 'express'; +import { NextFunction, Request, Response } from 'express'; import { AccessToken } from 'simple-oauth2'; import type { TelemetryClient } from 'applicationinsights'; @@ -38,6 +38,9 @@ export enum LocalApiRepoAction { UnArchive = 'unarchive', } +export type VoidedExpressRoute = (req: ReposAppRequest, res: Response, next: NextFunction) => Promise; +// req: Request>, res: Response, number>, next: NextFunction) => void | Promise<...> + export interface ReposAppRequest extends Request { // passport isAuthenticated(): boolean; diff --git a/job.ts b/job.ts index ebf53e053..e08a52332 100644 --- a/job.ts +++ b/job.ts @@ -40,7 +40,12 @@ export async function runJob( let executionEnvironment: ExecutionEnvironment = null; try { - executionEnvironment = await commonStartup(initializeJob, true /* job */, null /* app */); + executionEnvironment = await commonStartup( + initializeJob, + true /* job */, + options.enableAllGitHubApps, + null /* app */ + ); } catch (startupError) { console.error(`Job startup error before runJob: ${startupError}`); quitInTenSeconds(false); diff --git a/lib/pugViewServices.ts b/lib/pugViewServices.ts index 2fcd7a98b..cf91bb7c9 100644 --- a/lib/pugViewServices.ts +++ b/lib/pugViewServices.ts @@ -5,7 +5,7 @@ import _ from 'lodash'; import moment from 'moment'; -import octicons from 'octicons'; //const octicons = require('octicons'); +import octicons from '@primer/octicons'; import fileSize from 'file-size'; import languageMap from 'language-map'; import validator from 'validator'; diff --git a/package-lock.json b/package-lock.json index 2082090c5..1efe9afa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,10 +16,11 @@ "@azure/service-bus": "7.9.0", "@azure/storage-blob": "12.14.0", "@azure/storage-queue": "12.13.0", - "@octokit/auth-app": "4.0.13", + "@octokit/auth-app": "5.0.3", "@octokit/plugin-paginate-graphql": "2.0.3", - "@octokit/request": "6.2.5", + "@octokit/request": "6.2.6", "@octokit/rest": "19.0.11", + "@primer/octicons": "19.2.0", "app-root-path": "3.1.0", "applicationinsights": "2.7.0", "async-prompt": "1.0.1", @@ -34,7 +35,7 @@ "deepmerge": "4.3.1", "dotenv": "16.1.4", "express": "4.18.2", - "express-async-handler": "1.1.4", + "express-async-handler": "1.2.0", "express-session": "1.17.3", "express-sslify": "1.2.0", "file-size": "1.0.0", @@ -52,7 +53,6 @@ "node-jose": "2.2.0", "nodemailer": "6.9.3", "object-path": "0.11.8", - "octicons": "5.0.1", "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", @@ -80,7 +80,7 @@ "@types/luxon": "3.3.0", "@types/memory-cache": "0.2.2", "@types/morgan": "1.9.4", - "@types/node": "20.2.5", + "@types/node": "20.3.1", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -92,8 +92,8 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.9", - "@typescript-eslint/parser": "5.59.9", + "@typescript-eslint/eslint-plugin": "5.59.11", + "@typescript-eslint/parser": "5.59.11", "cspell": "6.31.1", "eslint": "8.42.0", "eslint-config-prettier": "8.8.0", @@ -103,7 +103,7 @@ "jest": "29.5.0", "jest-junit": "16.0.0", "lint-staged": "13.2.2", - "markdownlint-cli2": "0.7.1", + "markdownlint-cli2": "0.8.1", "prettier": "2.8.8", "ts-jest": "29.1.0", "ts-node": "10.9.1", @@ -2143,14 +2143,14 @@ } }, "node_modules/@octokit/auth-app": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-4.0.13.tgz", - "integrity": "sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.3.tgz", + "integrity": "sha512-rZQImcsEODkGd3Phy+do5X1qTxV0iPlScsFO4yvfyVCWdODpwXf5m3Jw8ZzIDYBtFuNyudBtrWTQSQ/baWcJpA==", "dependencies": { - "@octokit/auth-oauth-app": "^5.0.0", - "@octokit/auth-oauth-user": "^2.0.0", + "@octokit/auth-oauth-app": "^6.0.0", + "@octokit/auth-oauth-user": "^3.0.0", "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", + "@octokit/request-error": "^4.0.0", "@octokit/types": "^9.0.0", "deprecation": "^2.3.1", "lru-cache": "^9.0.0", @@ -2158,7 +2158,7 @@ "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { @@ -2166,6 +2166,19 @@ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" }, + "node_modules/@octokit/auth-app/node_modules/@octokit/request-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.1.tgz", + "integrity": "sha512-DBTkqzs0K6SlK1gRaQ6A6yOnKKkbVy8n/A9E7Es5qYONIxBghqiETPqWhG9l7qvWgp8v3sDkB8vlV2AAX1N6gw==", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@octokit/auth-app/node_modules/@octokit/types": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", @@ -2183,50 +2196,105 @@ } }, "node_modules/@octokit/auth-oauth-app": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.3.tgz", - "integrity": "sha512-qnETfWn58nNQG8An8PbYDaGfNfPfLSSwjfRk5lCBuB2r/Lt+uLYhf6vyIL/NMRxCykDQBguGJISSXT6UpfV3cA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.0.tgz", + "integrity": "sha512-ihIanzc2dX/FQJwTDeKR2xT2K+5IFV33yjkn4zhJ7HL7FPJjw0ynNcGkEJMzrFEsgIn7Qfjd+MA4jTay0rrbLQ==", "dependencies": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/auth-oauth-user": "^2.0.0", "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/auth-oauth-user": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz", + "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==", + "dependencies": { + "@octokit/auth-oauth-device": "^4.0.0", + "@octokit/oauth-methods": "^2.0.0", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + }, "engines": { "node": ">= 14" } }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@octokit/auth-oauth-device": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.2.tgz", - "integrity": "sha512-h5Ir0q5c6dHZwWMrSWMvgu3JyuH7qCPJ0kB9jNYDugsAob69N65ebA3E5FWPUN6hGJguZpy3CRmqejTx7aSobQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz", + "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==", "dependencies": { "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 14" } }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@octokit/auth-oauth-user": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.0.3.tgz", - "integrity": "sha512-NMGTTGa1j6JVtlpZUOrhi1RxBjHaogS0p59qV8HtFOx3Rgq503xfjjA8npyVbRuAf30iW/K5YueZKivMkhBITA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.0.tgz", + "integrity": "sha512-qEyN6j4m72MFyTuOZZUqhJyNye1FKBJlu1JtkkiCG6dWN/iHB21uSsUM0qRQ6XpsS+dgG74JyncRHY3W9Nwz0Q==", "dependencies": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" + } + }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/auth-token": { @@ -2305,20 +2373,33 @@ } }, "node_modules/@octokit/oauth-methods": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.3.tgz", - "integrity": "sha512-XM+pPsj6TB9zXHfGszZmIp2zRShjQuwGLEKbkOQ7mZBHBPpx0TRzSYwUbwiAJsWefkPUXgr7i0qFsxLr/Uciyg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz", + "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==", "dependencies": { "@octokit/oauth-authorization-url": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", + "@octokit/request": "^6.2.3", + "@octokit/request-error": "^3.0.3", + "@octokit/types": "^9.0.0", "btoa-lite": "^1.0.0" }, "engines": { "node": ">= 14" } }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@octokit/openapi-types": { "version": "13.13.1", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", @@ -2397,9 +2478,9 @@ } }, "node_modules/@octokit/request": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", - "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.6.tgz", + "integrity": "sha512-T/waXf/xjie8Qn5IyFYAcI/HXvw9SPkcQWErGP9H471IWRDRCN+Gn/QOptPMAZRT4lJb2bLHxQfCXjU0mJRyng==", "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", @@ -2413,11 +2494,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", - "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dependencies": { - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -2425,6 +2506,19 @@ "node": ">= 14" } }, + "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/request-error/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", @@ -2542,6 +2636,14 @@ "node": ">=14" } }, + "node_modules/@primer/octicons": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.2.0.tgz", + "integrity": "sha512-9mJOwvXu4tL7pc94N8Uh+N4eSlEztcVKrU0RIp3c1NnxiKsr9FsPUOSoG5IRet4uAEDWdehUuIy11qLuBUH9+Q==", + "dependencies": { + "object-assign": "^4.1.1" + } + }, "node_modules/@redis/bloom": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", @@ -2892,9 +2994,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -3145,15 +3247,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3179,14 +3281,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" }, "engines": { @@ -3206,13 +3308,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3223,13 +3325,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3250,9 +3352,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3263,13 +3365,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3290,17 +3392,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3316,12 +3418,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5357,9 +5459,9 @@ } }, "node_modules/express-async-handler": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", - "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.2.0.tgz", + "integrity": "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w==" }, "node_modules/express-session": { "version": "1.17.3", @@ -7907,30 +8009,30 @@ } }, "node_modules/markdownlint": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.28.2.tgz", - "integrity": "sha512-yYaQXoKKPV1zgrFsyAuZPEQoe+JrY9GDag9ObKpk09twx4OCU5lut+0/kZPrQ3W7w82SmgKhd7D8m34aG1unVw==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz", + "integrity": "sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==", "dev": true, "dependencies": { "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.2" + "markdownlint-micromark": "0.1.5" }, "engines": { - "node": ">=14.18.0" + "node": ">=16" } }, "node_modules/markdownlint-cli2": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.7.1.tgz", - "integrity": "sha512-N58lw50Ws0WOfCc07B9dPKMnPMbIj6ZCMlszZLVfxBwKN/M+WZqXLdOHyRL2BWCZ3APBxQN9qDEw7Vf1PRqFkg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.8.1.tgz", + "integrity": "sha512-y0Siwt+RApKxSSb0CT9p7z1DcAO+ncjrB9IpC/jflJRIet4namCFmxLTbfBBQdPF6EntPk5yyXKe7vcoPGlnXw==", "dev": true, "dependencies": { "globby": "13.1.4", - "markdownlint": "0.28.2", + "markdownlint": "0.29.0", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.0", - "yaml": "2.2.2" + "yaml": "2.3.1" }, "bin": { "markdownlint-cli2": "markdownlint-cli2.js", @@ -7938,7 +8040,7 @@ "markdownlint-cli2-fix": "markdownlint-cli2-fix.js" }, "engines": { - "node": ">=14.18.0" + "node": ">=16" } }, "node_modules/markdownlint-cli2-formatter-default": { @@ -7994,12 +8096,12 @@ } }, "node_modules/markdownlint-micromark": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz", - "integrity": "sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz", + "integrity": "sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16" } }, "node_modules/mdurl": { @@ -8407,11 +8509,6 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "node_modules/octicons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/octicons/-/octicons-5.0.1.tgz", - "integrity": "sha512-YiFCnBO83gYGmgt366au4snhS3PlOqtnN4yuuyr1atl2FbJAYoxzKrCM7fYc9H/ON3l3R9IMz6hActTegw/gPg==" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -10708,9 +10805,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "engines": { "node": ">= 14" @@ -12461,14 +12558,14 @@ } }, "@octokit/auth-app": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-4.0.13.tgz", - "integrity": "sha512-NBQkmR/Zsc+8fWcVIFrwDgNXS7f4XDrkd9LHdi9DPQw1NdGHLviLzRO2ZBwTtepnwHXW5VTrVU9eFGijMUqllg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.3.tgz", + "integrity": "sha512-rZQImcsEODkGd3Phy+do5X1qTxV0iPlScsFO4yvfyVCWdODpwXf5m3Jw8ZzIDYBtFuNyudBtrWTQSQ/baWcJpA==", "requires": { - "@octokit/auth-oauth-app": "^5.0.0", - "@octokit/auth-oauth-user": "^2.0.0", + "@octokit/auth-oauth-app": "^6.0.0", + "@octokit/auth-oauth-user": "^3.0.0", "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", + "@octokit/request-error": "^4.0.0", "@octokit/types": "^9.0.0", "deprecation": "^2.3.1", "lru-cache": "^9.0.0", @@ -12481,6 +12578,16 @@ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" }, + "@octokit/request-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.1.tgz", + "integrity": "sha512-DBTkqzs0K6SlK1gRaQ6A6yOnKKkbVy8n/A9E7Es5qYONIxBghqiETPqWhG9l7qvWgp8v3sDkB8vlV2AAX1N6gw==", + "requires": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, "@octokit/types": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", @@ -12497,41 +12604,99 @@ } }, "@octokit/auth-oauth-app": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-5.0.3.tgz", - "integrity": "sha512-qnETfWn58nNQG8An8PbYDaGfNfPfLSSwjfRk5lCBuB2r/Lt+uLYhf6vyIL/NMRxCykDQBguGJISSXT6UpfV3cA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.0.tgz", + "integrity": "sha512-ihIanzc2dX/FQJwTDeKR2xT2K+5IFV33yjkn4zhJ7HL7FPJjw0ynNcGkEJMzrFEsgIn7Qfjd+MA4jTay0rrbLQ==", "requires": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/auth-oauth-user": "^2.0.0", "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/auth-oauth-user": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz", + "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==", + "requires": { + "@octokit/auth-oauth-device": "^4.0.0", + "@octokit/oauth-methods": "^2.0.0", + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "btoa-lite": "^1.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/auth-oauth-device": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.2.tgz", - "integrity": "sha512-h5Ir0q5c6dHZwWMrSWMvgu3JyuH7qCPJ0kB9jNYDugsAob69N65ebA3E5FWPUN6hGJguZpy3CRmqejTx7aSobQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz", + "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==", "requires": { "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/auth-oauth-user": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.0.3.tgz", - "integrity": "sha512-NMGTTGa1j6JVtlpZUOrhi1RxBjHaogS0p59qV8HtFOx3Rgq503xfjjA8npyVbRuAf30iW/K5YueZKivMkhBITA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.0.tgz", + "integrity": "sha512-qEyN6j4m72MFyTuOZZUqhJyNye1FKBJlu1JtkkiCG6dWN/iHB21uSsUM0qRQ6XpsS+dgG74JyncRHY3W9Nwz0Q==", "requires": { "@octokit/auth-oauth-device": "^4.0.0", "@octokit/oauth-methods": "^2.0.0", "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/auth-token": { @@ -12597,15 +12762,30 @@ "integrity": "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==" }, "@octokit/oauth-methods": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.3.tgz", - "integrity": "sha512-XM+pPsj6TB9zXHfGszZmIp2zRShjQuwGLEKbkOQ7mZBHBPpx0TRzSYwUbwiAJsWefkPUXgr7i0qFsxLr/Uciyg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz", + "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==", "requires": { "@octokit/oauth-authorization-url": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^7.0.0", + "@octokit/request": "^6.2.3", + "@octokit/request-error": "^3.0.3", + "@octokit/types": "^9.0.0", "btoa-lite": "^1.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/openapi-types": { @@ -12674,9 +12854,9 @@ } }, "@octokit/request": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", - "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.6.tgz", + "integrity": "sha512-T/waXf/xjie8Qn5IyFYAcI/HXvw9SPkcQWErGP9H471IWRDRCN+Gn/QOptPMAZRT4lJb2bLHxQfCXjU0mJRyng==", "requires": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", @@ -12702,13 +12882,28 @@ } }, "@octokit/request-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.1.tgz", - "integrity": "sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "requires": { - "@octokit/types": "^7.0.0", + "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/rest": { @@ -12782,6 +12977,14 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz", "integrity": "sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA==" }, + "@primer/octicons": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.2.0.tgz", + "integrity": "sha512-9mJOwvXu4tL7pc94N8Uh+N4eSlEztcVKrU0RIp3c1NnxiKsr9FsPUOSoG5IRet4uAEDWdehUuIy11qLuBUH9+Q==", + "requires": { + "object-assign": "^4.1.1" + } + }, "@redis/bloom": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", @@ -13118,9 +13321,9 @@ "dev": true }, "@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" }, "@types/node-fetch": { "version": "2.6.2", @@ -13357,15 +13560,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -13375,53 +13578,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" } }, "@typescript-eslint/type-utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13430,28 +13633,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" } }, @@ -15010,9 +15213,9 @@ } }, "express-async-handler": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.1.4.tgz", - "integrity": "sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/express-async-handler/-/express-async-handler-1.2.0.tgz", + "integrity": "sha512-rCSVtPXRmQSW8rmik/AIb2P0op6l7r1fMW538yyvTMltCO4xQEWMmobfrIxN2V1/mVrgxB8Az3reYF6yUZw37w==" }, "express-session": { "version": "1.17.3", @@ -16845,27 +17048,27 @@ } }, "markdownlint": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.28.2.tgz", - "integrity": "sha512-yYaQXoKKPV1zgrFsyAuZPEQoe+JrY9GDag9ObKpk09twx4OCU5lut+0/kZPrQ3W7w82SmgKhd7D8m34aG1unVw==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz", + "integrity": "sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==", "dev": true, "requires": { "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.2" + "markdownlint-micromark": "0.1.5" } }, "markdownlint-cli2": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.7.1.tgz", - "integrity": "sha512-N58lw50Ws0WOfCc07B9dPKMnPMbIj6ZCMlszZLVfxBwKN/M+WZqXLdOHyRL2BWCZ3APBxQN9qDEw7Vf1PRqFkg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.8.1.tgz", + "integrity": "sha512-y0Siwt+RApKxSSb0CT9p7z1DcAO+ncjrB9IpC/jflJRIet4namCFmxLTbfBBQdPF6EntPk5yyXKe7vcoPGlnXw==", "dev": true, "requires": { "globby": "13.1.4", - "markdownlint": "0.28.2", + "markdownlint": "0.29.0", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.0", - "yaml": "2.2.2" + "yaml": "2.3.1" }, "dependencies": { "globby": { @@ -16903,9 +17106,9 @@ "requires": {} }, "markdownlint-micromark": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz", - "integrity": "sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz", + "integrity": "sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==", "dev": true }, "mdurl": { @@ -17221,11 +17424,6 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "octicons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/octicons/-/octicons-5.0.1.tgz", - "integrity": "sha512-YiFCnBO83gYGmgt366au4snhS3PlOqtnN4yuuyr1atl2FbJAYoxzKrCM7fYc9H/ON3l3R9IMz6hActTegw/gPg==" - }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -18945,9 +19143,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index cf697a243..df2eb6ce0 100644 --- a/package.json +++ b/package.json @@ -77,9 +77,10 @@ "@azure/storage-blob": "12.14.0", "@azure/storage-queue": "12.13.0", "@octokit/plugin-paginate-graphql": "2.0.3", - "@octokit/request": "6.2.5", - "@octokit/auth-app": "4.0.13", + "@octokit/request": "6.2.6", + "@octokit/auth-app": "5.0.3", "@octokit/rest": "19.0.11", + "@primer/octicons": "19.2.0", "app-root-path": "3.1.0", "applicationinsights": "2.7.0", "async-prompt": "1.0.1", @@ -94,7 +95,7 @@ "deepmerge": "4.3.1", "dotenv": "16.1.4", "express": "4.18.2", - "express-async-handler": "1.1.4", + "express-async-handler": "1.2.0", "express-session": "1.17.3", "express-sslify": "1.2.0", "file-size": "1.0.0", @@ -112,7 +113,6 @@ "node-jose": "2.2.0", "nodemailer": "6.9.3", "object-path": "0.11.8", - "octicons": "5.0.1", "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", @@ -140,7 +140,7 @@ "@types/luxon": "3.3.0", "@types/memory-cache": "0.2.2", "@types/morgan": "1.9.4", - "@types/node": "20.2.5", + "@types/node": "20.3.1", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -152,8 +152,8 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.9", - "@typescript-eslint/parser": "5.59.9", + "@typescript-eslint/eslint-plugin": "5.59.11", + "@typescript-eslint/parser": "5.59.11", "cspell": "6.31.1", "eslint": "8.42.0", "eslint-config-prettier": "8.8.0", @@ -163,7 +163,7 @@ "jest": "29.5.0", "jest-junit": "16.0.0", "lint-staged": "13.2.2", - "markdownlint-cli2": "0.7.1", + "markdownlint-cli2": "0.8.1", "prettier": "2.8.8", "ts-jest": "29.1.0", "ts-node": "10.9.1", diff --git a/routes/administration/app.ts b/routes/administration/app.ts index dba21f843..864d78316 100644 --- a/routes/administration/app.ts +++ b/routes/administration/app.ts @@ -229,9 +229,9 @@ router.post( if (result?.state === OrganizationMembershipState.Pending) { return res.send( `You need to accept the membership now at: https://github.com/${unconfiguredOrganization.name}` - ); + ) as unknown as void; } else { - return res.send('OK. Elevation should be all set.'); + return res.send('OK. Elevation should be all set.') as unknown as void; } } catch (error) { return next(error); diff --git a/routes/orgAdmin.ts b/routes/orgAdmin.ts index ef938f00b..6310fbf24 100644 --- a/routes/orgAdmin.ts +++ b/routes/orgAdmin.ts @@ -708,7 +708,7 @@ router.post( log.push(`Skipping, does not appear to be a GitHub repo URL: ${repositoryName}`); } } - return res.json(log); + return res.json(log) as unknown as void; }) ); diff --git a/routes/settings/campaigns.ts b/routes/settings/campaigns.ts index 6169bfe4f..116bd0920 100644 --- a/routes/settings/campaigns.ts +++ b/routes/settings/campaigns.ts @@ -53,7 +53,7 @@ router.get( return next(new Error('Corporate authentication and identity required')); } const currentState = await campaignStateProvider.getState(corporateId, campaignGroupId); - return res.json(currentState); + return res.json(currentState) as unknown as void; }) ); diff --git a/views/contributions/eligible.pug b/views/contributions/eligible.pug index e1dd04859..3cad0a75f 100644 --- a/views/contributions/eligible.pug +++ b/views/contributions/eligible.pug @@ -6,10 +6,8 @@ extends ../layout block content - - var octicon = viewServices.octicon - .container - h5 CONFIDENTIAL - ADMINISTRATOR ACCESS ONLY + h5 ADMINISTRATOR ACCESS ONLY p Currently eligible corporate users to vote in the contribution system are listed below. p diff --git a/views/contributions/popular.pug b/views/contributions/popular.pug index 2ccd9f7c6..dacadaad8 100644 --- a/views/contributions/popular.pug +++ b/views/contributions/popular.pug @@ -6,8 +6,6 @@ extends ../layout block content - - var octicon = viewServices.octicon - .container p Popular repos people contribute to. diff --git a/views/contributions/voting/elections.pug b/views/contributions/voting/elections.pug index 0021a5886..206373832 100644 --- a/views/contributions/voting/elections.pug +++ b/views/contributions/voting/elections.pug @@ -6,13 +6,6 @@ extends ../../layout block content - - var fileSize = viewServices.fileSize - - var moment = viewServices.moment - - var octicon = viewServices.octicon - - //- var startMonthName = moment(start).format('MMMM') - //- var previousMonthName = moment(start).subtract(1, 'months').format('MMMM') - .container h2 Active Elections @@ -23,4 +16,3 @@ block content p= election.description else p No active voting opportunities. - diff --git a/views/contributions/voting/vote.pug b/views/contributions/voting/vote.pug index 1049fa3cc..546359c0d 100644 --- a/views/contributions/voting/vote.pug +++ b/views/contributions/voting/vote.pug @@ -24,9 +24,7 @@ mixin showNominee(election, nominee, iitemp, stripJsSingleQuote) p: small: em= nominee.justification block content - - var fileSize = viewServices.fileSize - var moment = viewServices.moment - - var octicon = viewServices.octicon - var stripJsSingleQuote = viewServices.stripJsSingleQuote //- var startMonthName = moment(start).format('MMMM') diff --git a/views/includes/corporateRepoMetadata.pug b/views/includes/corporateRepoMetadata.pug index 1ecb0cbf3..1b9db91d6 100644 --- a/views/includes/corporateRepoMetadata.pug +++ b/views/includes/corporateRepoMetadata.pug @@ -7,7 +7,6 @@ //- Optional inputs: createdUserLink //- Services -- var octicon = viewServices ? viewServices.octicon : null - var moment = viewServices ? viewServices.moment : null //- isBootstrap is currently being used to differentiate this include for whether it is diff --git a/views/org/team/index.pug b/views/org/team/index.pug index f807d7042..8d1c1b683 100644 --- a/views/org/team/index.pug +++ b/views/org/team/index.pug @@ -87,13 +87,6 @@ mixin membersList(typeOfList, membersList, isAdmin, moreMembersToShow) p.lead.text-primary.text-center: small … and others block content - - //- Services - - var languageColor = viewServices.languageColor - - var octicon = viewServices.octicon - - var fileSize = viewServices.fileSize - - var moment = viewServices.moment - //- Variables - var maximumMembersToShow = (4 * 3) - 1 - var maximumRepositoriesToShow = 5 @@ -101,6 +94,7 @@ block content //- View services - var languageColor = viewServices.languageColor - var octicon = viewServices.octicon + - var moment = viewServices.moment //- Mode variables - var admin = teamPermissions.allowAdministration diff --git a/views/repos/defaultBranch.pug b/views/repos/defaultBranch.pug index f05e585db..a44fc9e34 100644 --- a/views/repos/defaultBranch.pug +++ b/views/repos/defaultBranch.pug @@ -7,11 +7,6 @@ extends ../layout block content - //- Services - - var languageColor = viewServices.languageColor - - var octicon = viewServices.octicon - - var fileSize = viewServices.fileSize - //- Variables - var githubUrl = 'https://github.com/' + repo.full_name - var cloneUrl = repo.clone_url diff --git a/views/repos/delete.pug b/views/repos/delete.pug index f8886d855..57f420726 100644 --- a/views/repos/delete.pug +++ b/views/repos/delete.pug @@ -7,11 +7,6 @@ extends ../layout block content - //- Services - - var languageColor = viewServices.languageColor - - var octicon = viewServices.octicon - - var fileSize = viewServices.fileSize - //- View constants - var maxReaders = 10 diff --git a/views/repos/history.pug b/views/repos/history.pug index 2c36be2b5..d7100cbf6 100644 --- a/views/repos/history.pug +++ b/views/repos/history.pug @@ -8,9 +8,6 @@ extends ../layout block content //- Services - - var languageColor = viewServices.languageColor - - var octicon = viewServices.octicon - - var fileSize = viewServices.fileSize - var moment = viewServices.moment //- Variables diff --git a/views/repos/permissions.pug b/views/repos/permissions.pug index 1cbc9e9de..5168fc4b3 100644 --- a/views/repos/permissions.pug +++ b/views/repos/permissions.pug @@ -66,9 +66,7 @@ mixin teamsList(teams, hideJoinOption) block content //- Services - - var languageColor = viewServices.languageColor - var octicon = viewServices.octicon - - var fileSize = viewServices.fileSize //- View constants - var maxReaders = 10 diff --git a/views/repos/repo.pug b/views/repos/repo.pug index 71650c15b..552ff847d 100644 --- a/views/repos/repo.pug +++ b/views/repos/repo.pug @@ -13,27 +13,6 @@ mixin simplePersonView(account) div(style='display:block;vertical-align:middle') h4 a(href='/people?q=' + account.login)= shorthandName - //-ul.list-inline - if shorthandName && shorthandName !== account.login - li - span(title=account.login + ' is the GitHub username for ' + shorthandName)= account.login - if corporateIdentity - if link && !corporate - li.text-warning!= octicon('link', 16) - li - span(title=link.aadoid)= link.aadupn - else - li!= octicon('link', 16) - li - span(title=corporateIdentity + ' is the corporate identity for ' + shorthandName)= corporateIdentity - //- just corporate e-mails here, not user emails - if email - li - a(href='mailto:' + email, title='Send corporate email to ' + email) - != octicon('mail', 16) - if serviceAccount - li!= octicon('hubot', 16) - li Service account mixin teamsList(teams, hideJoinOption) if teams && teams.length > 0 diff --git a/views/teams/index.pug b/views/teams/index.pug index 4f9b585a7..c1c3b23f5 100644 --- a/views/teams/index.pug +++ b/views/teams/index.pug @@ -9,7 +9,6 @@ block append js_doc_ready include ../js/search.js block content - - var languageColor = viewServices.languageColor - var octicon = viewServices.octicon .container From 06e6515a102c8c8a99273392150a8ca4f41da43d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 8 Jul 2023 07:53:43 +0000 Subject: [PATCH 08/69] chore(deps): bump tough-cookie and less in /default-assets-package Removes [tough-cookie](https://github.com/salesforce/tough-cookie). It's no longer used after updating ancestor dependency [less](https://github.com/less/less.js). These dependencies need to be updated together. Removes `tough-cookie` Updates `less` from 3.9.0 to 3.13.1 - [Release notes](https://github.com/less/less.js/releases) - [Changelog](https://github.com/less/less.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/less/less.js/compare/v3.9.0...v3.13.1) --- updated-dependencies: - dependency-name: tough-cookie dependency-type: indirect - dependency-name: less dependency-type: indirect ... Signed-off-by: dependabot[bot] --- default-assets-package/package-lock.json | 1144 +++------------------- 1 file changed, 128 insertions(+), 1016 deletions(-) diff --git a/default-assets-package/package-lock.json b/default-assets-package/package-lock.json index 35d2a3b52..1306cdac6 100644 --- a/default-assets-package/package-lock.json +++ b/default-assets-package/package-lock.json @@ -36,23 +36,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -149,79 +132,18 @@ "node": ">=0.10.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true, - "optional": true - }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/blockui": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/blockui/-/blockui-1.0.0.tgz", @@ -276,13 +198,6 @@ "d3": "~3.5.0" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, "node_modules/chalk": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", @@ -299,15 +214,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -335,19 +241,6 @@ "node": ">=0.1.90" } }, - "node_modules/combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/components-font-awesome": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/components-font-awesome/-/components-font-awesome-4.2.0.tgz", @@ -359,12 +252,17 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "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": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, - "optional": true + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } }, "node_modules/d3": { "version": "3.5.17", @@ -372,19 +270,6 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -394,16 +279,6 @@ "node": "*" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -418,17 +293,6 @@ "resolved": "https://registry.npmjs.org/dom/-/dom-0.0.2.tgz", "integrity": "sha1-4V+3WV4ym9Enj8yFjQ97jPOOS1E=" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -497,30 +361,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "optional": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true, - "optional": true - }, "node_modules/file-sync-cmp": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", @@ -613,31 +453,6 @@ "node": ">=0.10.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -659,16 +474,6 @@ "node": ">=10" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -1076,31 +881,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "deprecated": "this library is no longer supported", - "dev": true, - "optional": true, - "dependencies": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1155,22 +935,6 @@ "node": "*" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1303,13 +1067,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -1322,6 +1079,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -1346,13 +1109,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, "node_modules/jquery": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", @@ -1371,50 +1127,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "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==", - "dev": true, - "optional": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "optional": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -1425,27 +1137,27 @@ } }, "node_modules/less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", + "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", "dev": true, "dependencies": { - "clone": "^2.1.2" + "copy-anything": "^2.0.1", + "tslib": "^1.10.0" }, "bin": { "lessc": "bin/lessc" }, "engines": { - "node": ">=4" + "node": ">=6" }, "optionalDependencies": { "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", + "make-dir": "^2.1.0", "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", + "native-request": "^1.0.5", "source-map": "~0.6.0" } }, @@ -1539,6 +1251,20 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -1586,29 +1312,6 @@ "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "dev": true, - "optional": true, - "dependencies": { - "mime-db": "~1.38.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", @@ -1621,26 +1324,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true, - "optional": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", @@ -1656,6 +1339,13 @@ "node": ">=0.10.0" } }, + "node_modules/native-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", + "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", + "dev": true, + "optional": true + }, "node_modules/nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -1668,16 +1358,6 @@ "nopt": "bin/nopt.js" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -1853,13 +1533,6 @@ "node": ">=0.10.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true, - "optional": true - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1872,6 +1545,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", @@ -1896,16 +1579,6 @@ "node": ">=4" } }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "dependencies": { - "asap": "~2.0.3" - } - }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -1913,33 +1586,6 @@ "dev": true, "optional": true }, - "node_modules/psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true, - "optional": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", @@ -1952,39 +1598,6 @@ "node": ">= 0.10" } }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "optional": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -2048,19 +1661,22 @@ "rimraf": "bin.js" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -2076,32 +1692,6 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "optional": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -2159,46 +1749,11 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "optional": true, - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/typeahead": { "version": "0.2.2", @@ -2239,33 +1794,12 @@ "node": "*" } }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "optional": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "node_modules/uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -2278,21 +1812,6 @@ "node": ">= 0.10" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2327,19 +1846,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -2411,73 +1917,18 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - }, "async": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true, - "optional": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "blockui": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/blockui/-/blockui-1.0.0.tgz", @@ -2523,13 +1974,6 @@ "d3": "~3.5.0" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, "chalk": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", @@ -2540,12 +1984,6 @@ "supports-color": "^7.1.0" } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2567,16 +2005,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "components-font-awesome": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/components-font-awesome/-/components-font-awesome-4.2.0.tgz", @@ -2588,12 +2016,14 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, - "optional": true + "requires": { + "is-what": "^3.14.1" + } }, "d3": { "version": "3.5.17", @@ -2601,29 +2031,12 @@ "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true - }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -2635,17 +2048,6 @@ "resolved": "https://registry.npmjs.org/dom/-/dom-0.0.2.tgz", "integrity": "sha1-4V+3WV4ym9Enj8yFjQ97jPOOS1E=" }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -2695,27 +2097,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "optional": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "optional": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true, - "optional": true - }, "file-sync-cmp": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", @@ -2789,25 +2170,6 @@ "for-in": "^1.0.1" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2826,16 +2188,6 @@ "integrity": "sha512-tj18lLe+917AACr6BdVoUuHnBPTVd9BEJp1vxnMZ58ztNvuxz9Ufa+wf3g37tlGITH35jggwZ2d9lcgHJJgXfQ==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -3150,24 +2502,6 @@ } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "optional": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -3207,18 +2541,6 @@ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -3321,13 +2643,6 @@ "is-unc-path": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -3337,6 +2652,12 @@ "unc-path-regex": "^0.1.2" } }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3355,13 +2676,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, "jquery": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.0.tgz", @@ -3377,47 +2691,6 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "optional": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3425,20 +2698,20 @@ "dev": true }, "less": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", - "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.13.1.tgz", + "integrity": "sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==", "dev": true, "requires": { - "clone": "^2.1.2", + "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", + "make-dir": "^2.1.0", "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" + "native-request": "^1.0.5", + "source-map": "~0.6.0", + "tslib": "^1.10.0" }, "dependencies": { "source-map": { @@ -3516,6 +2789,17 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -3548,23 +2832,6 @@ "dev": true, "optional": true }, - "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", - "dev": true, - "optional": true, - "requires": { - "mime-db": "~1.38.0" - } - }, "minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", @@ -3574,23 +2841,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.6" - } - }, "multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", @@ -3603,6 +2853,13 @@ "minimatch": "^3.0.0" } }, + "native-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", + "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", + "dev": true, + "optional": true + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -3612,13 +2869,6 @@ "abbrev": "1" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "optional": true - }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -3755,19 +3005,19 @@ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true, - "optional": true - }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, "pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", @@ -3788,16 +3038,6 @@ } } }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -3805,27 +3045,6 @@ "dev": true, "optional": true }, - "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", - "dev": true, - "optional": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "optional": true - }, "rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", @@ -3835,35 +3054,6 @@ "resolve": "^1.9.0" } }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, "resolve": { "version": "1.22.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", @@ -3909,19 +3099,19 @@ "glob": "^7.1.3" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3934,24 +3124,6 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3994,42 +3166,11 @@ "is-number": "^7.0.0" } }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "optional": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "typeahead": { "version": "0.2.2", @@ -4064,29 +3205,12 @@ "util-deprecate": "^1.0.2" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "optional": true, - "requires": { - "punycode": "^2.1.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true, - "optional": true - }, "v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -4096,18 +3220,6 @@ "homedir-polyfill": "^1.0.1" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", From 682553ab0ec9fcf84d52d4fa3813ccd7a92837f0 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 12 Jul 2023 21:00:23 -0700 Subject: [PATCH 09/69] Syncing updates --- .eslintrc.js | 7 +- .prettierrc.json | 1 + .vscode/launch.json | 4 +- api/client/index.ts | 2 +- api/client/organization/repo.ts | 13 +- api/client/organization/repos.ts | 21 +- api/client/organizations.ts | 53 +- business/collaborator.ts | 26 +- business/enterprise.ts | 6 +- business/githubApps/index.ts | 17 +- business/queryCache.ts | 4 +- business/repositoryPermission.ts | 83 +- config/continuousDeployment.types.ts | 3 + config/npm.publishing.json | 6 - config/npm.publishing.types.ts | 17 - config/npm.types.ts | 4 +- config/webServer.json | 13 +- config/webServer.types.ts | 11 + entities/repository.ts | 5 +- entities/teamMemberCache/index.ts | 5 +- entities/userSettings.ts | 5 +- features/sudo/index.ts | 5 +- features/sudo/noop.ts | 5 +- interfaces/github/collaborators.ts | 5 +- job.ts | 31 +- jobs/refreshQueryCache.ts | 6 +- lib/entityMetadataProvider/postgres.ts | 64 +- lib/github/core.ts | 5 +- middleware/apiAad.ts | 2 +- middleware/business/corporateMail.ts | 25 +- middleware/business/organization.ts | 38 + middleware/business/repository.ts | 34 + middleware/errorHandler.ts | 22 +- middleware/jsonError.ts | 5 +- middleware/passport/aadRoutes.ts | 4 +- middleware/passport/aadStrategy.ts | 6 +- package-lock.json | 3246 ++++++++++++++---------- package.json | 46 +- routes/diagnostics.ts | 14 +- routes/org/repoWorkflowEngine.ts | 6 +- routes/orgAdmin.ts | 26 +- scripts/migrateLinks.ts | 15 +- transitional.ts | 47 +- views/organization/whois/result.pug | 3 + webhooks/tasks/member.ts | 3 +- webhooks/tasks/team.ts | 10 +- 46 files changed, 2461 insertions(+), 1518 deletions(-) delete mode 100644 config/npm.publishing.json delete mode 100644 config/npm.publishing.types.ts create mode 100644 middleware/business/repository.ts diff --git a/.eslintrc.js b/.eslintrc.js index cf1525756..3c5d9899b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -41,5 +41,10 @@ module.exports = { }, }, ], - ignorePatterns: ['default-assets-package/thirdparty/**/*.js', 'dist/**/*.js', '**/vendor/**'], + ignorePatterns: [ + 'default-assets-package/thirdparty/**/*.js', + 'dist/**/*.js', + 'dist/**/*.d.ts', + '**/vendor/**', + ], }; diff --git a/.prettierrc.json b/.prettierrc.json index 32e9fdbd7..f7aa09f41 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,4 +1,5 @@ { "singleQuote": true, + "trailingComma": "es5", "printWidth": 110 } diff --git a/.vscode/launch.json b/.vscode/launch.json index 4dc06f683..3cf2ea3bf 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -47,8 +47,8 @@ "console": "integratedTerminal", "env": { "NODE_ENV": "development", - "DEBUG": "startup,g:server,context,github:tokens", - "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org,health" + "DEBUG": "startup,g:server,context", + "MORE_DEBUG": "appinsights,cache,restapi,pg,querycache,user,redis-cross-org,health,github:tokens" } }, { diff --git a/api/client/index.ts b/api/client/index.ts index 06efd5a70..6cc9bc95c 100644 --- a/api/client/index.ts +++ b/api/client/index.ts @@ -87,7 +87,7 @@ router.get('/', (req: ReposAppRequest, res) => { appService: config?.webServer?.appService?.name ? { name: config?.webServer?.appService?.name, - slot: config?.webServer?.appService?.slot, + slot: config?.webServer?.appService?.advanced?.slotType || config?.webServer?.appService?.slot, region: config?.webServer?.appService?.region, } : undefined, diff --git a/api/client/organization/repo.ts b/api/client/organization/repo.ts index 464921fe0..80ec440eb 100644 --- a/api/client/organization/repo.ts +++ b/api/client/organization/repo.ts @@ -8,7 +8,6 @@ import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware'; import { ErrorHelper, getProviders } from '../../../transitional'; -import { Repository } from '../../../business'; import { IndividualContext } from '../../../business/user'; import NewRepositoryLockdownSystem from '../../../features/newRepositories/newRepositoryLockdown'; import { @@ -19,16 +18,8 @@ import { renameRepositoryDefaultBranchEndToEnd } from '../../../routes/org/repos import getCompanySpecificDeployment from '../../../middleware/companySpecificDeployment'; import RouteRepoPermissions from './repoPermissions'; -import { - ReposAppRequest, - LocalApiRepoAction, - getRepositoryMetadataProvider, - NoCacheNoBackground, -} from '../../../interfaces'; - -type RequestWithRepo = ReposAppRequest & { - repository: Repository; -}; +import { LocalApiRepoAction, getRepositoryMetadataProvider, NoCacheNoBackground } from '../../../interfaces'; +import { RequestWithRepo } from '../../../middleware/business/repository'; enum ArchivalAction { Archive, diff --git a/api/client/organization/repos.ts b/api/client/organization/repos.ts index dfbeaef5b..24efe5ae3 100644 --- a/api/client/organization/repos.ts +++ b/api/client/organization/repos.ts @@ -7,13 +7,15 @@ import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware'; -import { getProviders } from '../../../transitional'; +import { CreateError, getProviders } from '../../../transitional'; import { Repository } from '../../../business'; -import RouteRepo from './repo'; import JsonPager from '../jsonPager'; import { ReposAppRequest, IProviders } from '../../../interfaces'; import { sortRepositoriesByNameCaseInsensitive } from '../../../utils'; +import { apiMiddlewareRepositoriesToRepository } from '../../../middleware/business/repository'; + +import routeRepo from './repo'; const router: Router = Router(); @@ -236,21 +238,10 @@ export async function searchRepos( // --- End of search reimplementation --- -router.use( - '/:repoName', - asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { - const { organization } = req; - const { repoName } = req.params; - // does not confirm the name - (req as any).repository = organization.repository(repoName); - return next(); - }) -); - -router.use('/:repoName', RouteRepo); +router.use('/:repoName', asyncHandler(apiMiddlewareRepositoriesToRepository), routeRepo); router.use('*', (req, res: Response, next: NextFunction) => { - return next(jsonError('no API or function available within this repos endpoint', 404)); + return next(CreateError.NotFound('no API or function available within org/repos endpoint')); }); export default router; diff --git a/api/client/organizations.ts b/api/client/organizations.ts index 48a963e50..bf923d2d2 100644 --- a/api/client/organizations.ts +++ b/api/client/organizations.ts @@ -7,25 +7,18 @@ import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../middleware'; -import { CreateError, ErrorHelper, getProviders } from '../../transitional'; +import { CreateError, getProviders } from '../../transitional'; import { ReposAppRequest } from '../../interfaces'; import RouteOrganization from './organization'; -import { - IReposAppRequestWithOrganizationManagementType, - OrganizationManagementType, -} from '../../middleware/business/organization'; - +import { apiMiddlewareOrganizationsToOrganization } from '../../middleware/business/organization'; import type { GitHubOrganizationResponseSanitized } from '../../business'; import { OrganizationAnnotation, OrganizationAnnotationProperty, scrubOrganizationAnnotation, } from '../../entities/organizationAnnotation'; -import { - getOrganizationProfileViaMemoryCache, - setOrganizationProfileForRequest, -} from '../../middleware/github/ensureOrganizationProfile'; +import { getOrganizationProfileViaMemoryCache } from '../../middleware/github/ensureOrganizationProfile'; const router: Router = Router(); @@ -128,46 +121,10 @@ router.get( }) ); -router.use( - '/:orgName', - asyncHandler( - async (req: IReposAppRequestWithOrganizationManagementType, res: Response, next: NextFunction) => { - const { operations } = getProviders(req); - const { orgName } = req.params; - req.organizationName = orgName; - try { - const org = operations.getOrganization(orgName); - if (org) { - req.organizationManagementType = OrganizationManagementType.Managed; - req.organization = org; - return next(); - } - } catch (orgNotFoundError) { - if (!ErrorHelper.IsNotFound(orgNotFoundError)) { - return next(orgNotFoundError); - } - } - try { - const org = operations.getUncontrolledOrganization(orgName); - req.organizationManagementType = OrganizationManagementType.Unmanaged; - req.organization = org; - await setOrganizationProfileForRequest(req); - } catch (orgProfileError) { - if (ErrorHelper.IsNotFound(orgProfileError)) { - return next(CreateError.NotFound(`The organization ${orgName} does not exist`)); - } else { - return next(orgProfileError); - } - } - return next(); - } - ) -); - -router.use('/:orgName', RouteOrganization); +router.use('/:orgName', asyncHandler(apiMiddlewareOrganizationsToOrganization), RouteOrganization); router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { - return next(jsonError('orgs API not found', 404)); + return next(CreateError.NotFound('orgs API not found')); }); export default router; diff --git a/business/collaborator.ts b/business/collaborator.ts index c40bc6f67..cd389c34b 100644 --- a/business/collaborator.ts +++ b/business/collaborator.ts @@ -4,6 +4,7 @@ // import { GitHubRepositoryPermission, IGitHubCollaboratorPermissions } from '../interfaces'; +import { projectCollaboratorPermissionsObjectToGitHubRepositoryPermission } from '../transitional'; import * as common from './common'; // prettier-ignore @@ -14,6 +15,19 @@ const memberPrimaryProperties = [ 'avatar_url', ]; +export type CollaboratorJson = { + avatar_url: string; + id: number; + login: string; + permissions: IGitHubCollaboratorPermissions; +}; + +export type CollaboratorAccount = Collaborator | { id: number; login: string }; + +export function compareCollaborators(a: Collaborator, b: Collaborator) { + return a?.login.localeCompare(b?.login, 'en', { sensitivity: 'base' }); +} + export class Collaborator { public static PrimaryProperties = memberPrimaryProperties; @@ -28,7 +42,7 @@ export class Collaborator { } } - asJson() { + asJson(): CollaboratorJson { return { avatar_url: this.avatar_url, id: this._id, @@ -45,15 +59,7 @@ export class Collaborator { if (!this._permissions) { return GitHubRepositoryPermission.None; } - const permissions = this._permissions; - if (permissions.admin) { - return GitHubRepositoryPermission.Admin; - } else if (permissions.push) { - return GitHubRepositoryPermission.Push; - } else if (permissions.pull) { - return GitHubRepositoryPermission.Pull; - } - throw new Error(`Unsupported permission type by getHighestPermission`); + return projectCollaboratorPermissionsObjectToGitHubRepositoryPermission(this._permissions); } get id(): number { diff --git a/business/enterprise.ts b/business/enterprise.ts index 1f2966bb3..8c60aa5ae 100644 --- a/business/enterprise.ts +++ b/business/enterprise.ts @@ -22,7 +22,11 @@ export type EnterpriseSamlExternalIdentityNode = { }; export default class GitHubEnterprise { - constructor(private providers: IProviders, public slug: string, private administrativeToken: string) {} + constructor( + private providers: IProviders, + public slug: string, + private administrativeToken: string + ) {} async getGitHubLoginForUserPrincipalName(userPrincipalName: string): Promise { const node = await this.getSamlNodeFromUserPrincipalName(userPrincipalName); diff --git a/business/githubApps/index.ts b/business/githubApps/index.ts index 2b7a077ac..fed0d3a1b 100644 --- a/business/githubApps/index.ts +++ b/business/githubApps/index.ts @@ -33,12 +33,19 @@ export abstract class CustomAppPurpose implements ICustomAppPurpose { get isCustomAppPurpose() { return true; } - constructor(public id: string, public name: string) {} + constructor( + public id: string, + public name: string + ) {} } export class CustomAppPurposeOrganizationVariance extends CustomAppPurpose { fallbackIfNotConfiguredOrganizationName = false; - constructor(public id: string, public name: string, private configurations: IGitHubAppConfiguration[]) { + constructor( + public id: string, + public name: string, + private configurations: IGitHubAppConfiguration[] + ) { super(id, name); } getForOrganizationName(organizationName: string) { @@ -53,7 +60,11 @@ export class CustomAppPurposeOrganizationVariance extends CustomAppPurpose { } export class CustomAppPurposeSingleConfiguration extends CustomAppPurpose { - constructor(public id: string, public name: string, private configuration: IGitHubAppConfiguration) { + constructor( + public id: string, + public name: string, + private configuration: IGitHubAppConfiguration + ) { super(id, name); } diff --git a/business/queryCache.ts b/business/queryCache.ts index 03c586097..9a26e6776 100644 --- a/business/queryCache.ts +++ b/business/queryCache.ts @@ -16,7 +16,7 @@ import Debug from 'debug'; -import { MassagePermissionsToGitHubRepositoryPermission } from '../transitional'; +import { projectCollaboratorPermissionToGitHubRepositoryPermission } from '../transitional'; import { OrganizationMemberCacheEntity } from '../entities/organizationMemberCache/organizationMemberCache'; import { Operations } from './operations'; import { TeamMemberCacheEntity } from '../entities/teamMemberCache/teamMemberCache'; @@ -904,7 +904,7 @@ export default class QueryCache { affiliation: cacheEntity.collaboratorType, cacheEntity, userId: cacheEntity.userId, - permission: MassagePermissionsToGitHubRepositoryPermission(cacheEntity.permission), + permission: projectCollaboratorPermissionToGitHubRepositoryPermission(cacheEntity.permission), }; } diff --git a/business/repositoryPermission.ts b/business/repositoryPermission.ts index daea8021f..a0dbcca24 100644 --- a/business/repositoryPermission.ts +++ b/business/repositoryPermission.ts @@ -9,17 +9,21 @@ import { GitHubCollaboratorPermissionLevel, ConvertGitHubCollaboratorPermissionLevelToGitHubRepositoryPermission, GitHubRepositoryPermission, + IGitHubCollaboratorPermissions, } from '../interfaces'; +import type { CollaboratorAccount, CollaboratorJson } from './collaborator'; // prettier-ignore const repoPermissionProperties = [ 'permission', 'user', + 'role_name', ]; export class RepositoryPermission { - private _id: string; - private _user: any; + private _id: number; + private _user: CollaboratorAccount; + private _role_name: string; private _permission: GitHubCollaboratorPermissionLevel; @@ -32,17 +36,86 @@ export class RepositoryPermission { } } - get id(): string { + get id(): number { return this._id; } + + get roleName(): string { + return this._role_name; + } + get permission(): GitHubCollaboratorPermissionLevel { return this._permission; } - get user(): any { + + get user(): CollaboratorAccount { return this._user; } - public asGitHubRepositoryPermission(): GitHubRepositoryPermission { + asCollaboratorJson(): CollaboratorJson { + return { + avatar_url: null, + id: this._id, + login: this._user?.login, + permissions: this.asCollaboratorPermissions(), + }; + } + + asCollaboratorPermissions(): IGitHubCollaboratorPermissions { + return repositoryPermissionToPermissionsObject(this.asGitHubLegacyRepositoryPermission()); + } + + asGitHubLegacyRepositoryPermission(): GitHubRepositoryPermission { + // GitHub's API will only return "admin", "read", "write"; while the function + // implements recognition of maintain, etc., it isn't a thing. return ConvertGitHubCollaboratorPermissionLevelToGitHubRepositoryPermission(this._permission); } + + hasCustomRolePermission() { + switch (this._role_name) { + case GitHubRepositoryPermission.Admin: + case GitHubRepositoryPermission.Maintain: + case GitHubRepositoryPermission.Triage: + case GitHubRepositoryPermission.Push: + case GitHubRepositoryPermission.Pull: + return false; + default: + return true; + } + } + + interpretRoleAsDetailedPermission(): GitHubRepositoryPermission { + if (!this.hasCustomRolePermission()) { + return this._role_name as GitHubRepositoryPermission; + } + return this.asGitHubLegacyRepositoryPermission(); + } +} + +export function repositoryPermissionToPermissionsObject( + permission: GitHubRepositoryPermission +): IGitHubCollaboratorPermissions { + const permissions: IGitHubCollaboratorPermissions = { + admin: false, + maintain: false, + push: false, + triage: false, + pull: false, + }; + if (permission === GitHubRepositoryPermission.Admin) { + permissions.admin = true; + } + if (permission === GitHubRepositoryPermission.Maintain || permissions.admin === true) { + permissions.maintain = true; + } + if (permission === GitHubRepositoryPermission.Push || permissions.maintain === true) { + permissions.push = true; + } + if (permission === GitHubRepositoryPermission.Triage || permissions.push === true) { + permissions.triage = true; + } + if (permission === GitHubRepositoryPermission.Pull || permissions.triage === true) { + permissions.pull = true; + } + return permissions; } diff --git a/config/continuousDeployment.types.ts b/config/continuousDeployment.types.ts index 4c7d22560..52602db41 100644 --- a/config/continuousDeployment.types.ts +++ b/config/continuousDeployment.types.ts @@ -8,6 +8,9 @@ export type ConfigRootContinuousDeployment = { }; export type ConfigContinuousDeployment = { + branchName: string; + build: string; + commitId: string; version: string; name: string; }; diff --git a/config/npm.publishing.json b/config/npm.publishing.json deleted file mode 100644 index a6b728dac..000000000 --- a/config/npm.publishing.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "former_token": "env://NPM_PUBLISHING_TOKEN", - "token": "", - "notify": "env://NPM_PUBLISHING_NOTIFICATION_EMAIL", - "notifyFrom": "env://NPM_PUBLISHING_NOTIFICATION_FROM" -} diff --git a/config/npm.publishing.types.ts b/config/npm.publishing.types.ts deleted file mode 100644 index 6eccf0230..000000000 --- a/config/npm.publishing.types.ts +++ /dev/null @@ -1,17 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -export type ConfigNpmRootPublishing = { - publishing: ConfigNpmPublishing; -}; - -// NOTE: this config and associated concept is no longer part of this application - -export type ConfigNpmPublishing = { - former_token: string; - token: string; - notify: string; - notifyFrom: string; -}; diff --git a/config/npm.types.ts b/config/npm.types.ts index 1299e552a..e3e943afa 100644 --- a/config/npm.types.ts +++ b/config/npm.types.ts @@ -3,12 +3,10 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import type { ConfigNpmRootPublishing } from './npm.publishing.types'; - export type ConfigRootNpm = { npm: ConfigNpm; }; -export type ConfigNpm = ConfigNpmRootPublishing & { +export type ConfigNpm = { privateFeedScope: string; }; diff --git a/config/webServer.json b/config/webServer.json index 5ad274329..f5f9bf26f 100644 --- a/config/webServer.json +++ b/config/webServer.json @@ -4,7 +4,18 @@ "appService": { "slot": "env://WEBSITE_SLOT_NAME", "name": "env://WEBSITE_SITE_NAME", - "region": "env://REGION_NAME" + "region": "env://REGION_NAME", + "advanced": { + "resourceGroup": "env://WEBSITE_RESOURCE_GROUP", + "warmup": "env://WEBSITE_WARMUP_PATH", + "swapWarmup": "env://WEBSITE_SWAP_WARMUP_PING_PATH", + "containerName": "env://WEBSITES_WEB_CONTAINER_NAME", + "instanceId": "env://WEBSITE_INSTANCE_ID", + "sku": "env://WEBSITE_SKU", + "hostname": "env://WEBSITE_HOSTNAME", + "alwaysOn": "env://WEBSITE_SCM_ALWAYS_ON_ENABLED", + "slotType": "env://SITE_SLOT_TYPE" + } }, "baseUrl": "env://SITE_BASE_URL", "sslify": { diff --git a/config/webServer.types.ts b/config/webServer.types.ts index b531fe90b..c716230d7 100644 --- a/config/webServer.types.ts +++ b/config/webServer.types.ts @@ -14,6 +14,17 @@ export type ConfigWebServer = { slot: string; name: string; region: string; + advanced?: { + resourceGroup: string; + warmup: string; + swapWarmup: string; + containerName: string; + instanceId: string; + sku: string; + hostname: string; + alwaysOn: string; + slotType: 'production' | 'staging' | undefined; + }; }; baseUrl: string; sslify: { diff --git a/entities/repository.ts b/entities/repository.ts index 04d3a17ef..5d5ca8535 100644 --- a/entities/repository.ts +++ b/entities/repository.ts @@ -35,7 +35,10 @@ class ThisQueryBase extends QueryBase { } class ThisQuery extends ThisQueryBase { - constructor(query: Query, public parameters: T) { + constructor( + query: Query, + public parameters: T + ) { super(query); if (!this.parameters) { this.parameters = {} as T; diff --git a/entities/teamMemberCache/index.ts b/entities/teamMemberCache/index.ts index 652f1b78a..ebd0efadd 100644 --- a/entities/teamMemberCache/index.ts +++ b/entities/teamMemberCache/index.ts @@ -64,7 +64,10 @@ export class TeamMemberCacheFixedQueryByUserId implements IEntityMetadataFixedQu export class TeamMemberCacheFixedQueryByOrganizationIdAndUserId implements IEntityMetadataFixedQuery { public readonly fixedQueryType: FixedQueryType = FixedQueryType.TeamMemberCacheGetByOrganizationIdAndUserId; - constructor(public organizationId: string, public userId: string) { + constructor( + public organizationId: string, + public userId: string + ) { if (typeof this.userId !== 'string') { throw new Error(`userId ${userId} must be a string`); } diff --git a/entities/userSettings.ts b/entities/userSettings.ts index 10a12a7a0..503809745 100644 --- a/entities/userSettings.ts +++ b/entities/userSettings.ts @@ -33,7 +33,10 @@ class UserSettingsQueryBase extends QueryBase { } class UserSettingsQuery extends UserSettingsQueryBase { - constructor(query: Query, public parameters: T) { + constructor( + query: Query, + public parameters: T + ) { super(query); if (!this.parameters) { this.parameters = {} as T; diff --git a/features/sudo/index.ts b/features/sudo/index.ts index 8d8791024..839434bf5 100644 --- a/features/sudo/index.ts +++ b/features/sudo/index.ts @@ -16,7 +16,10 @@ export interface IPortalSudo { } export abstract class OrganizationSudo implements IOrganizationSudo { - constructor(protected providers: IProviders, protected organization: Organization) {} + constructor( + protected providers: IProviders, + protected organization: Organization + ) {} abstract isSudoer(githubLogin: string, link?: ICorporateLink): Promise; protected isSudoEnvironmentOff() { diff --git a/features/sudo/noop.ts b/features/sudo/noop.ts index 88df28d77..f81adeea2 100644 --- a/features/sudo/noop.ts +++ b/features/sudo/noop.ts @@ -8,7 +8,10 @@ import { Organization } from '../../business'; import { ICorporateLink, IProviders } from '../../interfaces'; export class OrganizationSudoNoop extends OrganizationSudo { - constructor(protected providers: IProviders, protected organization: Organization) { + constructor( + protected providers: IProviders, + protected organization: Organization + ) { super(providers, organization); } diff --git a/interfaces/github/collaborators.ts b/interfaces/github/collaborators.ts index 7e9fcf2c7..5ab70be9c 100644 --- a/interfaces/github/collaborators.ts +++ b/interfaces/github/collaborators.ts @@ -5,7 +5,8 @@ export interface IGitHubCollaboratorPermissions { admin: boolean; - pull: boolean; + maintain: boolean; push: boolean; - // triage and maintain do not appear today by the GitHub API (sigh), it's in V4 GraphQL but not in V3 REST + triage: boolean; + pull: boolean; } diff --git a/job.ts b/job.ts index e08a52332..1e996b990 100644 --- a/job.ts +++ b/job.ts @@ -28,11 +28,14 @@ export async function runJob( // TODO: automatically track elapsed job time const started = new Date(); if (options.timeoutMinutes) { - setTimeout(() => { - // TODO: insights metric and event, if a prefix exists - console.log(`Kill bit at ${options.timeoutMinutes}m`); - process.exit(1); - }, 1000 * 60 * options.timeoutMinutes); + setTimeout( + () => { + // TODO: insights metric and event, if a prefix exists + console.log(`Kill bit at ${options.timeoutMinutes}m`); + process.exit(1); + }, + 1000 * 60 * options.timeoutMinutes + ); } if (options.defaultDebugOutput && !process.env.DEBUG) { process.env.DEBUG = options.defaultDebugOutput; @@ -144,17 +147,23 @@ const job = { script: (providers: IProviders, jobParameters?: IReposJob) => Promise, options?: IReposJobOptions ) => { - return runJob(async function (jobParameters: IReposJob) { - return (await script(jobParameters.providers, jobParameters)) || {}; - }, Object.assign({ enableAllGitHubApps: false }, options || {})); + return runJob( + async function (jobParameters: IReposJob) { + return (await script(jobParameters.providers, jobParameters)) || {}; + }, + Object.assign({ enableAllGitHubApps: false }, options || {}) + ); }, run: async ( script: (providers: IProviders, jobParameters?: IReposJob) => Promise, options?: IReposJobOptions ) => { - return runJob(async function (jobParameters: IReposJob) { - return (await script(jobParameters.providers, jobParameters)) || {}; - }, Object.assign({ enableAllGitHubApps: true }, options || {})); + return runJob( + async function (jobParameters: IReposJob) { + return (await script(jobParameters.providers, jobParameters)) || {}; + }, + Object.assign({ enableAllGitHubApps: true }, options || {}) + ); }, }; diff --git a/jobs/refreshQueryCache.ts b/jobs/refreshQueryCache.ts index d98af222c..e44ee970d 100644 --- a/jobs/refreshQueryCache.ts +++ b/jobs/refreshQueryCache.ts @@ -16,7 +16,7 @@ job.runBackgroundJob(refreshQueryCache, { insightsPrefix: 'JobRefreshQueryCache', }); -import { permissionsObjectToValue } from '../transitional'; +import { projectCollaboratorPermissionsObjectToGitHubRepositoryPermission } from '../transitional'; import { Collaborator, Operations, @@ -621,7 +621,9 @@ async function cacheRepositoryCollaborators( const operations = []; const repositoryId = repository.id.toString(); for (const collaborator of repoCollaborators) { - const permission = permissionsObjectToValue(collaborator.permissions); + const permission = projectCollaboratorPermissionsObjectToGitHubRepositoryPermission( + collaborator.permissions + ); operations.push( await queryCache.addOrUpdateCollaborator( organizationId, diff --git a/lib/entityMetadataProvider/postgres.ts b/lib/entityMetadataProvider/postgres.ts index 9928d9153..22ab16add 100644 --- a/lib/entityMetadataProvider/postgres.ts +++ b/lib/entityMetadataProvider/postgres.ts @@ -34,6 +34,12 @@ const MapMetadataPropertiesToFields: any = { entityType: 'entitytype', }; +export enum PostgresColumnTranslations { + None = 'none', + Lowercase = 'lowercase', + LowercaseUnderscores = 'lowercase_underscores', +} + class PostgresMetadataDefinition extends MetadataMappingDefinitionBase { constructor(name: string) { super(name); @@ -194,6 +200,23 @@ class PostgresInternals { } } +function translateName(key: string, translations: PostgresColumnTranslations) { + switch (translations) { + case PostgresColumnTranslations.None: { + return key; + } + case PostgresColumnTranslations.Lowercase: { + return key.toLowerCase(); + } + case PostgresColumnTranslations.LowercaseUnderscores: { + return key.replace(/([A-Z])/g, '_$1').toLowerCase(); + } + default: { + throw CreateError.InvalidParameters(`Invalid column translation type: ${translations}`); + } + } +} + export class PostgresConfiguration { static IdentifyNativeFields(type: EntityMetadataType, fieldNames: string[]) { PostgresInternals.instance(type).nativeFieldNames = fieldNames; @@ -206,11 +229,12 @@ export class PostgresConfiguration { static MapFieldsToColumnNames( type: EntityMetadataType, map: Map, - lowercaseColumnNamesAutomatically?: boolean + columnTranslations: PostgresColumnTranslations = PostgresColumnTranslations.None ) { const dest = PostgresInternals.instance(type).mapFieldsToColumnNames; for (const [key, value] of map.entries()) { - dest.set(key, lowercaseColumnNamesAutomatically ? value.toLowerCase() : value); + const translatedValue = translateName(value, columnTranslations); + dest.set(key, translatedValue); } } @@ -230,7 +254,19 @@ export class PostgresConfiguration { return [fieldName, fieldName]; }) ), - true + PostgresColumnTranslations.Lowercase + ); + } + + static MapFieldsToColumnNamesFromListUnderscoreLowercased(type: EntityMetadataType, fieldNames: string[]) { + PostgresConfiguration.MapFieldsToColumnNames( + type, + new Map( + fieldNames.map((fieldName) => { + return [fieldName, fieldName]; + }) + ), + PostgresColumnTranslations.LowercaseUnderscores ); } @@ -652,18 +688,18 @@ export class PostgresEntityMetadataProvider implements IEntityMetadataProvider { } } - private metadataToRowMetadata(metadata: IEntityMetadata): any { - const shallowClone = Object.assign({}, metadata); - delete shallowClone.entityCreated; - delete shallowClone.entityFieldNames; - delete shallowClone.entityId; - delete shallowClone.entityType; - return shallowClone; - } + // private metadataToRowMetadata(metadata: IEntityMetadata): any { + // const shallowClone = Object.assign({}, metadata); + // delete shallowClone.entityCreated; + // delete shallowClone.entityFieldNames; + // delete shallowClone.entityId; + // delete shallowClone.entityType; + // return shallowClone; + // } - private stripEntityIdentities(type: EntityMetadataType, entity: any) { - return stripEntityIdentities(type, entity); - } + // private stripEntityIdentities(type: EntityMetadataType, entity: any) { + // return stripEntityIdentities(type, entity); + // } private rowToMetadataObject(type: EntityMetadataType, row: any): IEntityMetadata { return rowToMetadataObject(type, row); diff --git a/lib/github/core.ts b/lib/github/core.ts index 94acc778f..99e3f875b 100644 --- a/lib/github/core.ts +++ b/lib/github/core.ts @@ -122,7 +122,10 @@ export abstract class ApiContext { return this._cost; } - constructor(public api: any, public options: any) { + constructor( + public api: any, + public options: any + ) { this._log = []; if (!this._calledTime) { this._calledTime = new Date(); diff --git a/middleware/apiAad.ts b/middleware/apiAad.ts index 57ab4c3b5..9231ca083 100644 --- a/middleware/apiAad.ts +++ b/middleware/apiAad.ts @@ -35,7 +35,7 @@ export default function aadApiMiddleware(req: IApiRequest, res: Response, next: if ((err as any).immediate === true) { console.warn(`AAD API authorization failed: ${err}`); } - return isJsonError(err) ? next(err) : (jsonError(err, 500) as unknown); + return isJsonError(err, req.url) ? next(err) : (jsonError(err, 500) as unknown); }); } diff --git a/middleware/business/corporateMail.ts b/middleware/business/corporateMail.ts index fd6a2a5ab..2c93d198e 100644 --- a/middleware/business/corporateMail.ts +++ b/middleware/business/corporateMail.ts @@ -5,7 +5,7 @@ import { jsonError } from '..'; import { IProviders, ReposAppRequest } from '../../interfaces'; -import { getProviders } from '../../transitional'; +import { ErrorHelper, getProviders } from '../../transitional'; import { IndividualContext } from '../../business/user'; const cachedCorporateMailRequestKey = '__corporateMail'; @@ -25,18 +25,31 @@ export async function getCorporateMailFromActiveContext( providers: IProviders, activeContext: IndividualContext ): Promise { - const { graphProvider } = providers; if (!activeContext.corporateIdentity || !activeContext.corporateIdentity.id) { throw jsonError('No corporate identity', 401); } let corporateMail = activeContext?.link?.corporateMailAddress; if (!corporateMail) { - const id = activeContext.corporateIdentity.id; - const entry = await graphProvider.getUserById(id); - if (!entry || !entry.mailNickname) { + const mail = await tryGetCorporateMailFromId(providers, activeContext.corporateIdentity.id); + if (!mail) { throw jsonError('Invalid corporate identity', 401); } - corporateMail = entry.mail; + corporateMail = mail; } return corporateMail; } + +export async function tryGetCorporateMailFromId(providers: IProviders, corporateId: string): Promise { + const { graphProvider } = providers; + try { + const info = await graphProvider.getUserById(corporateId); + if (info?.mail) { + return info.mail; + } + } catch (error) { + if (!ErrorHelper.IsNotFound(error)) { + throw error; + } + } + return null; +} diff --git a/middleware/business/organization.ts b/middleware/business/organization.ts index 1ac350421..5f0889ad7 100644 --- a/middleware/business/organization.ts +++ b/middleware/business/organization.ts @@ -4,8 +4,11 @@ // import { NextFunction, Response } from 'express'; + import { ReposAppRequest } from '../../interfaces/web'; import { jsonError } from '../jsonError'; +import { CreateError, ErrorHelper, getProviders } from '../../transitional'; +import { setOrganizationProfileForRequest } from '../github/ensureOrganizationProfile'; export enum OrganizationManagementType { Managed = 'managed', @@ -37,3 +40,38 @@ export function blockIfUnmanagedOrganization( return next(jsonError('unknown organization management type', 500)); } } + +export async function apiMiddlewareOrganizationsToOrganization( + req: IReposAppRequestWithOrganizationManagementType, + res: Response, + next: NextFunction +) { + const { operations } = getProviders(req); + const { orgName } = req.params; + req.organizationName = orgName; + try { + const org = operations.getOrganization(orgName); + if (org) { + req.organizationManagementType = OrganizationManagementType.Managed; + req.organization = org; + return next(); + } + } catch (orgNotFoundError) { + if (!ErrorHelper.IsNotFound(orgNotFoundError)) { + return next(orgNotFoundError); + } + } + try { + const org = operations.getUncontrolledOrganization(orgName); + req.organizationManagementType = OrganizationManagementType.Unmanaged; + req.organization = org; + await setOrganizationProfileForRequest(req); + } catch (orgProfileError) { + if (ErrorHelper.IsNotFound(orgProfileError)) { + return next(CreateError.NotFound(`The organization ${orgName} does not exist`)); + } else { + return next(orgProfileError); + } + } + return next(); +} diff --git a/middleware/business/repository.ts b/middleware/business/repository.ts new file mode 100644 index 000000000..387f298f8 --- /dev/null +++ b/middleware/business/repository.ts @@ -0,0 +1,34 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { NextFunction, Response } from 'express'; + +import { Repository } from '../../business/repository'; +import type { ReposAppRequest } from '../../interfaces/web'; +import { CreateError } from '../../transitional'; + +export type RequestWithRepo = ReposAppRequest & { + repository: Repository; +}; + +export async function apiMiddlewareRepositoriesToRepository( + req: RequestWithRepo, + res: Response, + next: NextFunction +) { + const { organization } = req; + if (!organization) { + return next(CreateError.InvalidParameters('No organization instance available')); + } + + const { repoName } = req.params; + if (!repoName) { + return next(CreateError.InvalidParameters('No repository name provided')); + } + + // does not confirm the name + req.repository = organization.repository(repoName); + return next(); +} diff --git a/middleware/errorHandler.ts b/middleware/errorHandler.ts index 293e6bc5f..0fc57a33d 100644 --- a/middleware/errorHandler.ts +++ b/middleware/errorHandler.ts @@ -58,8 +58,9 @@ export default function SiteErrorHandler( next: NextFunction ) { let err = error as any; + const isJson = isJsonError(err, req.url); // CONSIDER: Let's eventually decouple all of our error message improvements to another area to keep the error handler intact. - const { applicationProfile, config } = getProviders(req); + const { applicationProfile, config, insights } = getProviders(req); const correlationId = req.correlationId; const errorStatus = err ? err.status || err.statusCode : undefined; // Per GitHub: https://developer.github.com/v3/oauth/#bad-verification-code @@ -71,8 +72,8 @@ export default function SiteErrorHandler( err.oauthError.message === 'The code passed is incorrect or expired.')) && req.scrubbedUrl.startsWith('/auth/github/') ) { - req.insights.trackMetric({ name: 'GitHubInvalidExpiredCodeRedirect', value: 1 }); - req.insights.trackEvent({ name: 'GitHubInvalidExpiredCodeRetry' }); + insights?.trackMetric({ name: 'GitHubInvalidExpiredCodeRedirect', value: 1 }); + insights?.trackEvent({ name: 'GitHubInvalidExpiredCodeRetry' }); return res.redirect( req.scrubbedUrl === '/auth/github/callback/increased-scope?code=*****' ? '/auth/github/increased-scope' @@ -82,7 +83,7 @@ export default function SiteErrorHandler( const isGitHubAbuseRateLimit = err && err.message && err.message.includes && err.message.includes('#abuse-rate-limits'); if (isGitHubAbuseRateLimit) { - req.insights.trackMetric({ name: 'GitHubAbuseRateLimit', value: 1 }); + insights?.trackMetric({ name: 'GitHubAbuseRateLimit', value: 1 }); } if ( err.message && @@ -90,8 +91,8 @@ export default function SiteErrorHandler( err.message.includes('ETIMEDOUT') && (err.message.includes('192.30.253.116') || err.message.includes('192.30.253.117')) ) { - req.insights.trackMetric({ name: 'GitHubApiTimeout', value: 1 }); - req.insights.trackEvent({ name: 'GitHubApiTimeout' }); + insights?.trackMetric({ name: 'GitHubApiTimeout', value: 1 }); + insights?.trackEvent({ name: 'GitHubApiTimeout' }); err = wrapError(err, 'The GitHub API is temporarily down. Please try again soon.', false); } let primaryUserInstance = req.user ? req.user.github : null; @@ -111,7 +112,7 @@ export default function SiteErrorHandler( stk: undefined, message: undefined, }; - if (req.insights && req.insights.trackException) { + if (insights?.trackException) { for (let i = 0; err && i < exceptionFieldsOfInterest.length; i++) { const key = exceptionFieldsOfInterest[i]; const value = err[key]; @@ -133,7 +134,7 @@ export default function SiteErrorHandler( } if (isGitHubAbuseRateLimit) { insightsProperties.message = err.message; - req.insights.trackEvent({ + insights?.trackEvent({ name: 'GitHubAbuseRateLimitError', properties: insightsProperties, }); @@ -141,7 +142,7 @@ export default function SiteErrorHandler( if (err && err['json']) { // not tracking jsonErrors for now, they pollute app insights } else { - req.insights.trackException({ exception: err, properties: insightsProperties }); + insights?.trackException({ exception: err, properties: insightsProperties }); } } } @@ -149,7 +150,6 @@ export default function SiteErrorHandler( } if (err !== undefined && err.skipLog !== true) { console.log('Error: ' + (err && err.message ? err.message : 'Error is undefined.')); - const isJson = isJsonError(err); if (err.stack && !isJson) { console.error(err.stack); } @@ -242,7 +242,7 @@ export default function SiteErrorHandler( // Support JSON-based error display for the API route, showing just a small // subset of typical view properties to share from the error instance. - if (err && err.json === true) { + if (isJson) { const safeError = { message: safeMessage, correlationId: correlationId, diff --git a/middleware/jsonError.ts b/middleware/jsonError.ts index eaee733ac..a8f40058d 100644 --- a/middleware/jsonError.ts +++ b/middleware/jsonError.ts @@ -16,8 +16,9 @@ export function json404(req: ReposAppRequest, res: Response, next: NextFunction) return next(jsonError('Endpoint not found', 404)); } -export function isJsonError(error: IErrorJson | string | Error) { - return error && error['json'] === true; +export function isJsonError(error: IErrorJson | string | Error, url: string) { + const errorAsAny = error as any; + return errorAsAny?.json === true || url?.startsWith('/api/'); } export function jsonError(error: IErrorJson | string | Error, statusCode?: number): IErrorJson { diff --git a/middleware/passport/aadRoutes.ts b/middleware/passport/aadRoutes.ts index b8969a0a2..2c0e3b845 100644 --- a/middleware/passport/aadRoutes.ts +++ b/middleware/passport/aadRoutes.ts @@ -5,7 +5,7 @@ import { NextFunction, Response } from 'express'; import { PassportStatic } from 'passport'; -import { IReposError, ReposAppRequest } from '../../interfaces'; +import { type IReposApplication, type IReposError, ReposAppRequest } from '../../interfaces'; import { getProviders } from '../../transitional'; import { isCodespacesAuthenticating } from '../../utils'; import { IPrimaryAuthenticationHelperMethods } from '../passport-routes'; @@ -14,7 +14,7 @@ import { aadStrategyUserPropertyName } from './aadStrategy'; const aadPassportStrategyName = 'azure-active-directory'; export function attachAadPassportRoutes( - app, + app: IReposApplication, config: any, passport: PassportStatic, helpers: IPrimaryAuthenticationHelperMethods diff --git a/middleware/passport/aadStrategy.ts b/middleware/passport/aadStrategy.ts index 25e894238..38227767a 100644 --- a/middleware/passport/aadStrategy.ts +++ b/middleware/passport/aadStrategy.ts @@ -9,7 +9,7 @@ const debug = Debug.debug('startup'); import { AuthorizationCode } from 'simple-oauth2'; import { OIDCStrategy } from 'passport-azure-ad'; -import { IProviders } from '../../interfaces'; +import type { IProviders, IReposApplication, SiteConfiguration } from '../../interfaces'; import { GraphUserType } from '../../lib/graphProvider'; import { getCodespacesHostname, isCodespacesAuthenticating } from '../../utils'; @@ -101,9 +101,9 @@ function activeDirectorySubset( }); } -export default function createAADStrategy(app, config) { +export default function createAADStrategy(app: IReposApplication, config: SiteConfiguration) { const { redirectUrl, tenantId, clientId, clientSecret } = config.activeDirectory; - const codespaces = config?.github?.codespaces || {}; + const codespaces = config?.github?.codespaces; if (!clientId) { debug('No Azure Active Directory clientID configured, corporate authentication will be unavailable.'); return {}; diff --git a/package-lock.json b/package-lock.json index 1efe9afa5..6b90433b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,16 +11,16 @@ "dependencies": { "@azure/cosmos": "3.17.3", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.2.2", + "@azure/identity": "3.2.3", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.0", "@azure/storage-blob": "12.14.0", "@azure/storage-queue": "12.13.0", - "@octokit/auth-app": "5.0.3", - "@octokit/plugin-paginate-graphql": "2.0.3", - "@octokit/request": "6.2.6", - "@octokit/rest": "19.0.11", - "@primer/octicons": "19.2.0", + "@octokit/auth-app": "5.0.6", + "@octokit/plugin-paginate-graphql": "3.0.0", + "@octokit/request": "7.0.1", + "@octokit/rest": "19.0.13", + "@primer/octicons": "19.4.0", "app-root-path": "3.1.0", "applicationinsights": "2.7.0", "async-prompt": "1.0.1", @@ -33,7 +33,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.1.4", + "dotenv": "16.3.1", "express": "4.18.2", "express-async-handler": "1.2.0", "express-session": "1.17.3", @@ -42,7 +42,7 @@ "github-username-regex": "1.0.0", "hsts": "2.2.0", "jsonc": "2.0.0", - "jsonwebtoken": "9.0.0", + "jsonwebtoken": "9.0.1", "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", @@ -56,14 +56,14 @@ "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", - "pg": "8.11.0", + "pg": "8.11.1", "pg-escape": "0.2.0", "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", "redis": "4.6.7", "secure-compare": "3.0.1", - "semver": "7.5.1", + "semver": "7.5.4", "serve-favicon": "2.5.0", "simple-oauth2": "5.0.0", "throat": "6.0.2", @@ -75,12 +75,12 @@ "@types/debug": "4.1.8", "@types/express": "4.17.17", "@types/express-session": "1.17.7", - "@types/jest": "29.5.2", + "@types/jest": "29.5.3", "@types/lodash": "4.14.195", "@types/luxon": "3.3.0", - "@types/memory-cache": "0.2.2", + "@types/memory-cache": "0.2.3", "@types/morgan": "1.9.4", - "@types/node": "20.3.1", + "@types/node": "20.4.1", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -92,28 +92,37 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.11", - "@typescript-eslint/parser": "5.59.11", + "@typescript-eslint/eslint-plugin": "6.0.0", + "@typescript-eslint/parser": "6.0.0", "cspell": "6.31.1", - "eslint": "8.42.0", + "eslint": "8.44.0", "eslint-config-prettier": "8.8.0", - "eslint-plugin-n": "16.0.0", - "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-n": "16.0.1", + "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.5.0", + "jest": "29.6.1", "jest-junit": "16.0.0", - "lint-staged": "13.2.2", + "lint-staged": "13.2.3", "markdownlint-cli2": "0.8.1", - "prettier": "2.8.8", - "ts-jest": "29.1.0", + "prettier": "3.0.0", + "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.1.3" + "typescript": "5.1.6" }, "engines": { "node": ">=16" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -360,9 +369,9 @@ } }, "node_modules/@azure/identity": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.2.tgz", - "integrity": "sha512-1xspoCfluAQUZmmWdPUNuiweIjE/ckZtR4gcnDbB2NMr36fk9MwXWaVJ7m1NKhOSz2RgMMLVUvZ2AISGcaAOTA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.3.tgz", + "integrity": "sha512-knIbl7p2i8r3qPsLW2W84esmDPr36RqieLC72OeuqYk4+0TRNthUhWTs655P9S9Pm3TVVxcFsS3Le9SXIWBIFA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -371,9 +380,9 @@ "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.0.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.32.2", - "@azure/msal-common": "^9.0.2", - "@azure/msal-node": "^1.14.6", + "@azure/msal-browser": "^2.37.1", + "@azure/msal-common": "^13.1.0", + "@azure/msal-node": "^1.17.3", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -418,30 +427,30 @@ } }, "node_modules/@azure/msal-browser": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.2.tgz", - "integrity": "sha512-1YqGzXtPG3QrZPFBKaMWr2WQdukDj+PelqUCv351+p+hlw/AhdRrb8haY73/iqkhT6Cdrbnh7sL4gikVsF4O1g==", + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.0.tgz", + "integrity": "sha512-gxBh83IumHgEP9uMCm9pJLKLRwICMQTxG9TX3AytdNt3oLUI3tytm/szYD5u5zKJgSkhHvwFSM+NPnM04hYw3w==", "dependencies": { - "@azure/msal-common": "^9.0.2" + "@azure/msal-common": "13.2.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.2.tgz", - "integrity": "sha512-qzwxuF8kZAp+rNUactMCgJh8fblq9D4lSqrrIxMDzLjgSZtjN32ix7r/HBe8QdOr76II9SVVPcMkX4sPzPfQ7w==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.0.tgz", + "integrity": "sha512-rnstQ7Zgn3fSTKNQO+/YNV34/QXJs0vni7IA0/3QB1EEyrJg14xyRmTqlw9ta+pdSuT5OJwUP8kI3D/rBwUIBw==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.6.tgz", - "integrity": "sha512-em/qqFL5tLMxMPl9vormAs13OgZpmQoJbiQ/GlWr+BA77eCLoL+Ehr5xRHowYo+LFe5b+p+PJVkRvT+mLvOkwA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.0.tgz", + "integrity": "sha512-N6GX1Twxw524e7gaJvj7hKtrPRmZl9qGY7U4pmUdx4XzoWYRFfYk4H1ZjVhQ7pwb5Ks88NNhbXVCagsuYPTEFg==", "dependencies": { - "@azure/msal-common": "^9.0.2", + "@azure/msal-common": "13.2.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -732,9 +741,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -960,12 +969,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1062,12 +1071,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1567,14 +1576,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1590,9 +1599,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1772,16 +1781,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -1789,16 +1798,16 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -1806,20 +1815,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1836,37 +1845,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -1876,49 +1885,49 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -1930,9 +1939,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1951,24 +1960,24 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -1977,13 +1986,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -1992,14 +2001,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -2007,22 +2016,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2039,12 +2048,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -2093,9 +2102,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", @@ -2143,17 +2152,17 @@ } }, "node_modules/@octokit/auth-app": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.3.tgz", - "integrity": "sha512-rZQImcsEODkGd3Phy+do5X1qTxV0iPlScsFO4yvfyVCWdODpwXf5m3Jw8ZzIDYBtFuNyudBtrWTQSQ/baWcJpA==", - "dependencies": { - "@octokit/auth-oauth-app": "^6.0.0", - "@octokit/auth-oauth-user": "^3.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^4.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.6.tgz", + "integrity": "sha512-zWqWTn88LcOUBALRMKl6yA0PqXWZLI2OXN9EaYK63f4E84SeW7dNefFx1P13XnQceTnc8O3Z9B537foUbjmG+A==", + "dependencies": { + "@octokit/auth-oauth-app": "^6.0.1", + "@octokit/auth-oauth-user": "^3.0.1", + "@octokit/request": "^7.0.0", + "@octokit/request-error": "^4.0.2", + "@octokit/types": "^10.0.0", "deprecation": "^2.3.1", - "lru-cache": "^9.0.0", + "lru-cache": "^10.0.0", "universal-github-app-jwt": "^1.1.1", "universal-user-agent": "^6.0.0" }, @@ -2162,16 +2171,16 @@ } }, "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "node_modules/@octokit/auth-app/node_modules/@octokit/request-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.1.tgz", - "integrity": "sha512-DBTkqzs0K6SlK1gRaQ6A6yOnKKkbVy8n/A9E7Es5qYONIxBghqiETPqWhG9l7qvWgp8v3sDkB8vlV2AAX1N6gw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", + "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^10.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -2180,30 +2189,30 @@ } }, "node_modules/@octokit/auth-app/node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/auth-app/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "engines": { "node": "14 || >=16.14" } }, "node_modules/@octokit/auth-oauth-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.0.tgz", - "integrity": "sha512-ihIanzc2dX/FQJwTDeKR2xT2K+5IFV33yjkn4zhJ7HL7FPJjw0ynNcGkEJMzrFEsgIn7Qfjd+MA4jTay0rrbLQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.1.tgz", + "integrity": "sha512-+1j7vRLHXHD4f0p2l/EXUmxGOLOtOZdg5vkW/UapeeNs17f4GRVcgeKBcNkViLDvjk85iRZ/CcIM9lizo4k8ew==", "dependencies": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/auth-oauth-user": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/auth-oauth-device": "^5.0.0", + "@octokit/auth-oauth-user": "^3.0.0", + "@octokit/request": "^7.0.0", + "@octokit/types": "^10.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" @@ -2212,47 +2221,31 @@ "node": ">= 18" } }, - "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/auth-oauth-user": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz", - "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==", - "dependencies": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "btoa-lite": "^1.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/auth-oauth-device": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz", - "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-5.0.2.tgz", + "integrity": "sha512-XC7Bveiu0d0ywx4wtIezD86g+67xeOkmiM3Wjod27K+B46OslP86bb6nhdd07gFAaReybgBzSyDORl1DVJuXGQ==", "dependencies": { - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/oauth-methods": "^3.0.1", + "@octokit/request": "^7.0.0", + "@octokit/types": "^10.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { @@ -2261,22 +2254,22 @@ "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dependencies": { "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/auth-oauth-user": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.0.tgz", - "integrity": "sha512-qEyN6j4m72MFyTuOZZUqhJyNye1FKBJlu1JtkkiCG6dWN/iHB21uSsUM0qRQ6XpsS+dgG74JyncRHY3W9Nwz0Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.1.tgz", + "integrity": "sha512-LURRNgEXTlVKyXgm7PUjflww1QH4o9hdd/niCJxMw0blFLURZ/Ado9r5VEDPi0SigsKmCH92eaMoN2CAzIeA/g==", "dependencies": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/auth-oauth-device": "^5.0.2", + "@octokit/oauth-methods": "^3.0.1", + "@octokit/request": "^7.0.0", + "@octokit/types": "^10.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" }, @@ -2290,9 +2283,9 @@ "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dependencies": { "@octokit/openapi-types": "^18.0.0" } @@ -2325,11 +2318,40 @@ "node": ">= 14" } }, + "node_modules/@octokit/core/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { "version": "17.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" }, + "node_modules/@octokit/core/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/@octokit/core/node_modules/@octokit/types": { "version": "9.2.3", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", @@ -2339,16 +2361,29 @@ } }, "node_modules/@octokit/endpoint": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.2.tgz", - "integrity": "sha512-8/AUACfE9vpRpehE6ZLfEtzkibe5nfsSwFZVMsG8qabqRt1M81qZYUFRZa1B8w8lP6cdfDJfRq9HWS+MbmR7tw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-8.0.1.tgz", + "integrity": "sha512-tVviBdPuf3kcCiIvXYDJg7NAJrkTh8QEnc+UCybknKdEBCjIi7uQbFX3liQrpk1m5PjwC7fUJg08DYZ4F+l1RQ==", "dependencies": { - "@octokit/types": "^7.0.0", + "@octokit/types": "^10.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/graphql": { @@ -2364,38 +2399,101 @@ "node": ">= 14" } }, - "node_modules/@octokit/oauth-authorization-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz", - "integrity": "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==", + "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, "engines": { "node": ">= 14" } }, - "node_modules/@octokit/oauth-methods": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz", - "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==", + "node_modules/@octokit/graphql/node_modules/@octokit/endpoint/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", "dependencies": { - "@octokit/oauth-authorization-url": "^5.0.0", - "@octokit/request": "^6.2.3", - "@octokit/request-error": "^3.0.3", + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/graphql/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", "@octokit/types": "^9.0.0", - "btoa-lite": "^1.0.0" + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 14" } }, + "node_modules/@octokit/graphql/node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/oauth-authorization-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz", + "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/oauth-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-3.0.2.tgz", + "integrity": "sha512-BrPZAz8goFkToeZCcw+uoNCt+j0wA7DHwPN69y71Ov6VE5kaHtn5576ZTjLTzkTcxoWqxKcPGoGyBE4n5FLbdQ==", + "dependencies": { + "@octokit/oauth-authorization-url": "^6.0.2", + "@octokit/request": "^7.0.0", + "@octokit/request-error": "^4.0.1", + "@octokit/types": "^10.0.0", + "btoa-lite": "^1.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, + "node_modules/@octokit/oauth-methods/node_modules/@octokit/request-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", + "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", + "dependencies": { + "@octokit/types": "^10.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dependencies": { "@octokit/openapi-types": "^18.0.0" } @@ -2406,9 +2504,12 @@ "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" }, "node_modules/@octokit/plugin-paginate-graphql": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-2.0.3.tgz", - "integrity": "sha512-gMZN0bEksY1d67rN4oBdU9Jor682tGt7sbEiidDLHJtsKmhWYEPJgWmPG1e6omrxE5S52VZxSRm5UY/utYje5w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-3.0.0.tgz", + "integrity": "sha512-iDx9ubpdt/Bmf+IUR+W3nzoeAYFU+uFlbJdoEP4UaBtME4jeNlBRfwk+LXbDieNKkP75rFJ0XaOBWxY/r/6+hw==", + "engines": { + "node": ">= 18" + }, "peerDependencies": { "@octokit/core": ">=4" } @@ -2478,19 +2579,18 @@ } }, "node_modules/@octokit/request": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.6.tgz", - "integrity": "sha512-T/waXf/xjie8Qn5IyFYAcI/HXvw9SPkcQWErGP9H471IWRDRCN+Gn/QOptPMAZRT4lJb2bLHxQfCXjU0mJRyng==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-7.0.1.tgz", + "integrity": "sha512-R227pDk1fuQXuX17LU8ChzFyTOe/myHvvceBF3C/fFath+NlsVkHICOlvEbx+9EgYUl4uDH7VqTby00menlM8Q==", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "@octokit/endpoint": "^8.0.1", + "@octokit/request-error": "^4.0.1", + "@octokit/types": "^10.0.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error": { @@ -2520,22 +2620,35 @@ } }, "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "node_modules/@octokit/request/node_modules/@octokit/request-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", + "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", + "dependencies": { + "@octokit/types": "^10.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } }, "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@octokit/rest": { - "version": "19.0.11", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", - "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "version": "19.0.13", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", + "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", "dependencies": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^6.1.2", @@ -2636,10 +2749,60 @@ "node": ">=14" } }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@primer/octicons": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.2.0.tgz", - "integrity": "sha512-9mJOwvXu4tL7pc94N8Uh+N4eSlEztcVKrU0RIp3c1NnxiKsr9FsPUOSoG5IRet4uAEDWdehUuIy11qLuBUH9+Q==", + "version": "19.4.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.4.0.tgz", + "integrity": "sha512-92eXALm3ucZkzqpJmJbC+fR9ldiuNd4W4s2MZQNQIBahpg14emJ+I9fdHqCummFlfgyohLzXn++7rz0NlkqAJA==", "dependencies": { "object-assign": "^4.1.1" } @@ -2721,27 +2884,27 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@tootallnate/once": { @@ -2932,9 +3095,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2968,9 +3131,9 @@ "dev": true }, "node_modules/@types/memory-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.2.tgz", - "integrity": "sha512-xNnm6EkmYYhTnLiOHC2bdKgcYY5qjjrq5vl9KXD2nh0em0koZoFS500EL4Q4V/eW+A3P7NC7P7GIYzNOSQp7jQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.3.tgz", + "integrity": "sha512-nDojhELFCY9qk4WR0m/vYyiHLQ1JDA+/Fv4xL9oHRgQ1kkdAaRTqOyLRnTVark9fwo6ohHg/gx3CMg44Fbu2pw==", "dev": true }, "node_modules/@types/mime": { @@ -2994,9 +3157,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz", + "integrity": "sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -3160,9 +3323,9 @@ } }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/pug": { @@ -3247,32 +3410,35 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", - "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz", + "integrity": "sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/type-utils": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@eslint-community/regexpp": "^4.5.0", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/type-utils": "6.0.0", + "@typescript-eslint/utils": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3281,25 +3447,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", - "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz", + "integrity": "sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3308,16 +3475,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", - "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz", + "integrity": "sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3325,25 +3492,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", - "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz", + "integrity": "sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/utils": "6.0.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3352,12 +3519,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", - "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz", + "integrity": "sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3365,21 +3532,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", - "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz", + "integrity": "sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3392,42 +3559,42 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", - "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz", + "integrity": "sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", + "@eslint-community/eslint-utils": "^4.3.0", + "@types/json-schema": "^7.0.11", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "semver": "^7.5.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", - "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz", + "integrity": "sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.11", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.0.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3447,9 +3614,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -3739,12 +3906,12 @@ } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -3888,6 +4055,15 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -3924,6 +4100,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4050,6 +4238,21 @@ "semver": "^7.0.0" } }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -4176,9 +4379,9 @@ "dev": true }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/clean-stack": { @@ -4323,9 +4526,9 @@ "dev": true }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-contrast-checker": { @@ -4813,7 +5016,151 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-lazy-prop": { @@ -4947,9 +5294,9 @@ } }, "node_modules/dotenv": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", - "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" }, @@ -5081,15 +5428,15 @@ } }, "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5101,7 +5448,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5121,7 +5468,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -5149,9 +5496,9 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-6.1.0.tgz", - "integrity": "sha512-f6dHOuVDDYHOCu3w+EledZnUkDdCa71GGHxZ0DMNfalM/2Upl0t/ks0+d5W5YDQJEQmvthE3WYv7RI/9Fl+csQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.1.0.tgz", + "integrity": "sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", @@ -5168,19 +5515,19 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.0.tgz", - "integrity": "sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es-x": "^6.1.0", - "ignore": "^5.1.1", - "is-core-module": "^2.12.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", "resolve": "^1.22.2", - "semver": "^7.5.0" + "semver": "^7.5.3" }, "engines": { "node": ">=16.0.0" @@ -5193,21 +5540,29 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=12.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } @@ -5264,12 +5619,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -5402,16 +5757,17 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5614,9 +5970,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6228,9 +6584,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -6502,6 +6858,39 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6686,15 +7075,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" }, "bin": { "jest": "bin/jest.js" @@ -6725,28 +7114,28 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -6756,21 +7145,21 @@ } }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -6790,31 +7179,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -6835,15 +7224,15 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6862,33 +7251,33 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6904,20 +7293,20 @@ } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -6944,46 +7333,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -6992,14 +7381,14 @@ } }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7032,17 +7421,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -7052,43 +7441,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -7097,31 +7486,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -7130,46 +7519,44 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -7181,17 +7568,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7210,18 +7597,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" }, "engines": { @@ -7229,13 +7616,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7398,9 +7785,9 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", "dependencies": { "jws": "^3.2.2", "lodash": "^4.17.21", @@ -7554,9 +7941,9 @@ } }, "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -8568,17 +8955,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -8843,14 +9230,14 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "node_modules/pg": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", - "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", + "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.0", - "pg-pool": "^3.6.0", + "pg-connection-string": "^2.6.1", + "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -8859,7 +9246,7 @@ "node": ">= 8.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.1.0" + "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -8871,15 +9258,15 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", - "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", + "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" }, "node_modules/pg-escape": { "version": "0.2.0", @@ -8904,9 +9291,9 @@ } }, "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "peerDependencies": { "pg": ">=8.0" } @@ -9093,15 +9480,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -9120,12 +9507,12 @@ } }, "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -9323,9 +9710,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true, "funding": [ { @@ -9513,9 +9900,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -9590,6 +9977,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9657,9 +10059,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10064,6 +10466,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -10095,6 +10513,18 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -10167,10 +10597,22 @@ "node": "10.* || >= 12.*" } }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -10179,7 +10621,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { @@ -10315,30 +10757,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/tunnel": { "version": "0.0.6", @@ -10403,9 +10824,9 @@ } }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -10471,6 +10892,15 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -10674,15 +11104,6 @@ "node": ">= 10.0.0" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -10814,9 +11235,9 @@ } }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -10892,6 +11313,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -11092,9 +11519,9 @@ } }, "@azure/identity": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.2.tgz", - "integrity": "sha512-1xspoCfluAQUZmmWdPUNuiweIjE/ckZtR4gcnDbB2NMr36fk9MwXWaVJ7m1NKhOSz2RgMMLVUvZ2AISGcaAOTA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.3.tgz", + "integrity": "sha512-knIbl7p2i8r3qPsLW2W84esmDPr36RqieLC72OeuqYk4+0TRNthUhWTs655P9S9Pm3TVVxcFsS3Le9SXIWBIFA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -11103,9 +11530,9 @@ "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.0.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.32.2", - "@azure/msal-common": "^9.0.2", - "@azure/msal-node": "^1.14.6", + "@azure/msal-browser": "^2.37.1", + "@azure/msal-common": "^13.1.0", + "@azure/msal-node": "^1.17.3", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -11141,24 +11568,24 @@ } }, "@azure/msal-browser": { - "version": "2.32.2", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.32.2.tgz", - "integrity": "sha512-1YqGzXtPG3QrZPFBKaMWr2WQdukDj+PelqUCv351+p+hlw/AhdRrb8haY73/iqkhT6Cdrbnh7sL4gikVsF4O1g==", + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.0.tgz", + "integrity": "sha512-gxBh83IumHgEP9uMCm9pJLKLRwICMQTxG9TX3AytdNt3oLUI3tytm/szYD5u5zKJgSkhHvwFSM+NPnM04hYw3w==", "requires": { - "@azure/msal-common": "^9.0.2" + "@azure/msal-common": "13.2.0" } }, "@azure/msal-common": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.0.2.tgz", - "integrity": "sha512-qzwxuF8kZAp+rNUactMCgJh8fblq9D4lSqrrIxMDzLjgSZtjN32ix7r/HBe8QdOr76II9SVVPcMkX4sPzPfQ7w==" + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.0.tgz", + "integrity": "sha512-rnstQ7Zgn3fSTKNQO+/YNV34/QXJs0vni7IA0/3QB1EEyrJg14xyRmTqlw9ta+pdSuT5OJwUP8kI3D/rBwUIBw==" }, "@azure/msal-node": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.6.tgz", - "integrity": "sha512-em/qqFL5tLMxMPl9vormAs13OgZpmQoJbiQ/GlWr+BA77eCLoL+Ehr5xRHowYo+LFe5b+p+PJVkRvT+mLvOkwA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.0.tgz", + "integrity": "sha512-N6GX1Twxw524e7gaJvj7hKtrPRmZl9qGY7U4pmUdx4XzoWYRFfYk4H1ZjVhQ7pwb5Ks88NNhbXVCagsuYPTEFg==", "requires": { - "@azure/msal-common": "^9.0.2", + "@azure/msal-common": "13.2.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } @@ -11392,9 +11819,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-simple-access": { @@ -11562,12 +11989,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -11634,12 +12061,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/template": { @@ -12095,14 +12522,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -12112,9 +12539,9 @@ } }, "@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true }, "@hapi/boom": { @@ -12261,30 +12688,30 @@ "dev": true }, "@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -12292,93 +12719,93 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "requires": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" } }, "@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "requires": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" } }, "@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "requires": { "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" } }, "@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -12390,9 +12817,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -12400,66 +12827,66 @@ } }, "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "requires": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "requires": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -12475,12 +12902,12 @@ } }, "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -12517,9 +12944,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", @@ -12558,87 +12985,74 @@ } }, "@octokit/auth-app": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.3.tgz", - "integrity": "sha512-rZQImcsEODkGd3Phy+do5X1qTxV0iPlScsFO4yvfyVCWdODpwXf5m3Jw8ZzIDYBtFuNyudBtrWTQSQ/baWcJpA==", - "requires": { - "@octokit/auth-oauth-app": "^6.0.0", - "@octokit/auth-oauth-user": "^3.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^4.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.6.tgz", + "integrity": "sha512-zWqWTn88LcOUBALRMKl6yA0PqXWZLI2OXN9EaYK63f4E84SeW7dNefFx1P13XnQceTnc8O3Z9B537foUbjmG+A==", + "requires": { + "@octokit/auth-oauth-app": "^6.0.1", + "@octokit/auth-oauth-user": "^3.0.1", + "@octokit/request": "^7.0.0", + "@octokit/request-error": "^4.0.2", + "@octokit/types": "^10.0.0", "deprecation": "^2.3.1", - "lru-cache": "^9.0.0", + "lru-cache": "^10.0.0", "universal-github-app-jwt": "^1.1.1", "universal-user-agent": "^6.0.0" }, "dependencies": { "@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "@octokit/request-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.1.tgz", - "integrity": "sha512-DBTkqzs0K6SlK1gRaQ6A6yOnKKkbVy8n/A9E7Es5qYONIxBghqiETPqWhG9l7qvWgp8v3sDkB8vlV2AAX1N6gw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", + "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", "requires": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^10.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "requires": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^18.0.0" } }, "lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==" } } }, "@octokit/auth-oauth-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.0.tgz", - "integrity": "sha512-ihIanzc2dX/FQJwTDeKR2xT2K+5IFV33yjkn4zhJ7HL7FPJjw0ynNcGkEJMzrFEsgIn7Qfjd+MA4jTay0rrbLQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.1.tgz", + "integrity": "sha512-+1j7vRLHXHD4f0p2l/EXUmxGOLOtOZdg5vkW/UapeeNs17f4GRVcgeKBcNkViLDvjk85iRZ/CcIM9lizo4k8ew==", "requires": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/auth-oauth-user": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/auth-oauth-device": "^5.0.0", + "@octokit/auth-oauth-user": "^3.0.0", + "@octokit/request": "^7.0.0", + "@octokit/types": "^10.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" }, "dependencies": { - "@octokit/auth-oauth-user": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-2.1.2.tgz", - "integrity": "sha512-kkRqNmFe7s5GQcojE3nSlF+AzYPpPv7kvP/xYEnE57584pixaFBH8Vovt+w5Y3E4zWUEOxjdLItmBTFAWECPAg==", - "requires": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "btoa-lite": "^1.0.0", - "universal-user-agent": "^6.0.0" - } - }, "@octokit/openapi-types": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "requires": { "@octokit/openapi-types": "^18.0.0" } @@ -12646,13 +13060,13 @@ } }, "@octokit/auth-oauth-device": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-4.0.5.tgz", - "integrity": "sha512-XyhoWRTzf2ZX0aZ52a6Ew5S5VBAfwwx1QnC2Np6Et3MWQpZjlREIcbcvVZtkNuXp6Z9EeiSLSDUqm3C+aMEHzQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-5.0.2.tgz", + "integrity": "sha512-XC7Bveiu0d0ywx4wtIezD86g+67xeOkmiM3Wjod27K+B46OslP86bb6nhdd07gFAaReybgBzSyDORl1DVJuXGQ==", "requires": { - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/oauth-methods": "^3.0.1", + "@octokit/request": "^7.0.0", + "@octokit/types": "^10.0.0", "universal-user-agent": "^6.0.0" }, "dependencies": { @@ -12662,9 +13076,9 @@ "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "requires": { "@octokit/openapi-types": "^18.0.0" } @@ -12672,14 +13086,14 @@ } }, "@octokit/auth-oauth-user": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.0.tgz", - "integrity": "sha512-qEyN6j4m72MFyTuOZZUqhJyNye1FKBJlu1JtkkiCG6dWN/iHB21uSsUM0qRQ6XpsS+dgG74JyncRHY3W9Nwz0Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.1.tgz", + "integrity": "sha512-LURRNgEXTlVKyXgm7PUjflww1QH4o9hdd/niCJxMw0blFLURZ/Ado9r5VEDPi0SigsKmCH92eaMoN2CAzIeA/g==", "requires": { - "@octokit/auth-oauth-device": "^4.0.0", - "@octokit/oauth-methods": "^2.0.0", - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/auth-oauth-device": "^5.0.2", + "@octokit/oauth-methods": "^3.0.1", + "@octokit/request": "^7.0.0", + "@octokit/types": "^10.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" }, @@ -12690,9 +13104,9 @@ "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "requires": { "@octokit/openapi-types": "^18.0.0" } @@ -12721,11 +13135,34 @@ "universal-user-agent": "^6.0.0" }, "dependencies": { + "@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "requires": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, "@octokit/openapi-types": { "version": "17.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" }, + "@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, "@octokit/types": { "version": "9.2.3", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", @@ -12737,13 +13174,28 @@ } }, "@octokit/endpoint": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.2.tgz", - "integrity": "sha512-8/AUACfE9vpRpehE6ZLfEtzkibe5nfsSwFZVMsG8qabqRt1M81qZYUFRZa1B8w8lP6cdfDJfRq9HWS+MbmR7tw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-8.0.1.tgz", + "integrity": "sha512-tVviBdPuf3kcCiIvXYDJg7NAJrkTh8QEnc+UCybknKdEBCjIi7uQbFX3liQrpk1m5PjwC7fUJg08DYZ4F+l1RQ==", "requires": { - "@octokit/types": "^7.0.0", + "@octokit/types": "^10.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } } }, "@octokit/graphql": { @@ -12754,22 +13206,72 @@ "@octokit/request": "^6.0.0", "@octokit/types": "^7.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "requires": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } + } + }, + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } + } + } } }, "@octokit/oauth-authorization-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-5.0.0.tgz", - "integrity": "sha512-y1WhN+ERDZTh0qZ4SR+zotgsQUE1ysKnvBt1hvDRB2WRzYtVKQjn97HEPzoehh66Fj9LwNdlZh+p6TJatT0zzg==" + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz", + "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==" }, "@octokit/oauth-methods": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-2.0.6.tgz", - "integrity": "sha512-l9Uml2iGN2aTWLZcm8hV+neBiFXAQ9+3sKiQe/sgumHlL6HDg0AQ8/l16xX/5jJvfxueqTW5CWbzd0MjnlfHZw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-3.0.2.tgz", + "integrity": "sha512-BrPZAz8goFkToeZCcw+uoNCt+j0wA7DHwPN69y71Ov6VE5kaHtn5576ZTjLTzkTcxoWqxKcPGoGyBE4n5FLbdQ==", "requires": { - "@octokit/oauth-authorization-url": "^5.0.0", - "@octokit/request": "^6.2.3", - "@octokit/request-error": "^3.0.3", - "@octokit/types": "^9.0.0", + "@octokit/oauth-authorization-url": "^6.0.2", + "@octokit/request": "^7.0.0", + "@octokit/request-error": "^4.0.1", + "@octokit/types": "^10.0.0", "btoa-lite": "^1.0.0" }, "dependencies": { @@ -12778,10 +13280,20 @@ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, + "@octokit/request-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", + "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", + "requires": { + "@octokit/types": "^10.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "requires": { "@octokit/openapi-types": "^18.0.0" } @@ -12794,9 +13306,9 @@ "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" }, "@octokit/plugin-paginate-graphql": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-2.0.3.tgz", - "integrity": "sha512-gMZN0bEksY1d67rN4oBdU9Jor682tGt7sbEiidDLHJtsKmhWYEPJgWmPG1e6omrxE5S52VZxSRm5UY/utYje5w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-3.0.0.tgz", + "integrity": "sha512-iDx9ubpdt/Bmf+IUR+W3nzoeAYFU+uFlbJdoEP4UaBtME4jeNlBRfwk+LXbDieNKkP75rFJ0XaOBWxY/r/6+hw==", "requires": {} }, "@octokit/plugin-paginate-rest": { @@ -12854,29 +13366,38 @@ } }, "@octokit/request": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.6.tgz", - "integrity": "sha512-T/waXf/xjie8Qn5IyFYAcI/HXvw9SPkcQWErGP9H471IWRDRCN+Gn/QOptPMAZRT4lJb2bLHxQfCXjU0mJRyng==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-7.0.1.tgz", + "integrity": "sha512-R227pDk1fuQXuX17LU8ChzFyTOe/myHvvceBF3C/fFath+NlsVkHICOlvEbx+9EgYUl4uDH7VqTby00menlM8Q==", "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "@octokit/endpoint": "^8.0.1", + "@octokit/request-error": "^4.0.1", + "@octokit/types": "^10.0.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "dependencies": { "@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + }, + "@octokit/request-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", + "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", + "requires": { + "@octokit/types": "^10.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } }, "@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", "requires": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^18.0.0" } } } @@ -12907,9 +13428,9 @@ } }, "@octokit/rest": { - "version": "19.0.11", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", - "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "version": "19.0.13", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", + "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", "requires": { "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^6.1.2", @@ -12977,10 +13498,44 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz", "integrity": "sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA==" }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "dependencies": { + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + } + } + }, "@primer/octicons": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.2.0.tgz", - "integrity": "sha512-9mJOwvXu4tL7pc94N8Uh+N4eSlEztcVKrU0RIp3c1NnxiKsr9FsPUOSoG5IRet4uAEDWdehUuIy11qLuBUH9+Q==", + "version": "19.4.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.4.0.tgz", + "integrity": "sha512-92eXALm3ucZkzqpJmJbC+fR9ldiuNd4W4s2MZQNQIBahpg14emJ+I9fdHqCummFlfgyohLzXn++7rz0NlkqAJA==", "requires": { "object-assign": "^4.1.1" } @@ -13051,27 +13606,27 @@ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "@tootallnate/once": { @@ -13259,9 +13814,9 @@ } }, "@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13295,9 +13850,9 @@ "dev": true }, "@types/memory-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.2.tgz", - "integrity": "sha512-xNnm6EkmYYhTnLiOHC2bdKgcYY5qjjrq5vl9KXD2nh0em0koZoFS500EL4Q4V/eW+A3P7NC7P7GIYzNOSQp7jQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.3.tgz", + "integrity": "sha512-nDojhELFCY9qk4WR0m/vYyiHLQ1JDA+/Fv4xL9oHRgQ1kkdAaRTqOyLRnTVark9fwo6ohHg/gx3CMg44Fbu2pw==", "dev": true }, "@types/mime": { @@ -13321,9 +13876,9 @@ "dev": true }, "@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz", + "integrity": "sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==" }, "@types/node-fetch": { "version": "2.6.2", @@ -13473,9 +14028,9 @@ } }, "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "@types/pug": { @@ -13560,102 +14115,106 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", - "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz", + "integrity": "sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/type-utils": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@eslint-community/regexpp": "^4.5.0", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/type-utils": "6.0.0", + "@typescript-eslint/utils": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", - "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz", + "integrity": "sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", - "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz", + "integrity": "sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11" + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0" } }, "@typescript-eslint/type-utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", - "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz", + "integrity": "sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.11", - "@typescript-eslint/utils": "5.59.11", + "@typescript-eslint/typescript-estree": "6.0.0", + "@typescript-eslint/utils": "6.0.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", - "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz", + "integrity": "sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", - "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz", + "integrity": "sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/visitor-keys": "5.59.11", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/visitor-keys": "6.0.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.0", + "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/utils": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", - "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz", + "integrity": "sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", + "@eslint-community/eslint-utils": "^4.3.0", + "@types/json-schema": "^7.0.11", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.11", - "@typescript-eslint/types": "5.59.11", - "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/scope-manager": "6.0.0", + "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/typescript-estree": "6.0.0", "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "semver": "^7.5.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.11", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", - "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz", + "integrity": "sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.11", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.0.0", + "eslint-visitor-keys": "^3.4.1" } }, "accepts": { @@ -13668,9 +14227,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-jsx": { @@ -13881,12 +14440,12 @@ } }, "babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "requires": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -13986,6 +14545,12 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -14020,6 +14585,15 @@ } } }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -14107,6 +14681,15 @@ "semver": "^7.0.0" } }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, "bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -14198,9 +14781,9 @@ "dev": true }, "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "clean-stack": { @@ -14309,9 +14892,9 @@ "dev": true }, "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "color-contrast-checker": { @@ -14696,6 +15279,95 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -14793,9 +15465,9 @@ } }, "dotenv": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", - "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==" + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" }, "dtrace-provider": { "version": "0.8.8", @@ -14893,15 +15565,15 @@ "dev": true }, "eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -14913,7 +15585,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -14933,7 +15605,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -14965,9 +15637,9 @@ "requires": {} }, "eslint-plugin-es-x": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-6.1.0.tgz", - "integrity": "sha512-f6dHOuVDDYHOCu3w+EledZnUkDdCa71GGHxZ0DMNfalM/2Upl0t/ks0+d5W5YDQJEQmvthE3WYv7RI/9Fl+csQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.1.0.tgz", + "integrity": "sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.1.2", @@ -14975,28 +15647,29 @@ } }, "eslint-plugin-n": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.0.tgz", - "integrity": "sha512-akkZTE3hsHBrq6CwmGuYCzQREbVUrA855kzcHqe6i0FLBkeY7Y/6tThCVkjUnjhvRBAlc+8lILcSe5QvvDpeZQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es-x": "^6.1.0", - "ignore": "^5.1.1", - "is-core-module": "^2.12.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", "resolve": "^1.22.2", - "semver": "^7.5.0" + "semver": "^7.5.3" } }, "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "requires": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" } }, "eslint-scope": { @@ -15016,12 +15689,12 @@ "dev": true }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } @@ -15112,16 +15785,17 @@ "dev": true }, "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "requires": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" } }, "express": { @@ -15281,9 +15955,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -15713,9 +16387,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "import-fresh": { @@ -15886,6 +16560,23 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + }, + "dependencies": { + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + } + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -16021,15 +16712,15 @@ } }, "jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" } }, "jest-changed-files": { @@ -16043,93 +16734,93 @@ } }, "jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "requires": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "jest-docblock": { @@ -16142,30 +16833,30 @@ } }, "jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" } }, "jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" } }, "jest-get-type": { @@ -16175,12 +16866,12 @@ "dev": true }, "jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", @@ -16188,8 +16879,8 @@ "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" } @@ -16207,53 +16898,53 @@ } }, "jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "requires": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" } }, "jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" } }, "jest-pnp-resolver": { @@ -16270,129 +16961,127 @@ "dev": true }, "jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "requires": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" } }, "jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "requires": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" } }, "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -16401,17 +17090,17 @@ } }, "jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "requires": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "dependencies": { "camelcase": { @@ -16423,29 +17112,29 @@ } }, "jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "requires": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -16578,9 +17267,9 @@ } }, "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", "requires": { "jws": "^3.2.2", "lodash": "^4.17.21", @@ -16714,9 +17403,9 @@ } }, "lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", "dev": true, "requires": { "chalk": "5.2.0", @@ -17465,17 +18154,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-limit": { @@ -17671,30 +18360,30 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "pg": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", - "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", + "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-cloudflare": "^1.1.0", - "pg-connection-string": "^2.6.0", - "pg-pool": "^3.6.0", + "pg-cloudflare": "^1.1.1", + "pg-connection-string": "^2.6.1", + "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" } }, "pg-cloudflare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", - "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", "optional": true }, "pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", + "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" }, "pg-escape": { "version": "0.2.0", @@ -17713,9 +18402,9 @@ "dev": true }, "pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "requires": {} }, "pg-protocol": { @@ -17851,9 +18540,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "prettier-linter-helpers": { @@ -17866,12 +18555,12 @@ } }, "pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "requires": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -18050,9 +18739,9 @@ "dev": true }, "pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true }, "qs": { @@ -18174,9 +18863,9 @@ } }, "resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "restore-cursor": { @@ -18237,6 +18926,15 @@ "glob": "^7.1.3" } }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -18287,9 +18985,9 @@ "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -18600,6 +19298,16 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -18628,6 +19336,12 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -18685,10 +19399,17 @@ "integrity": "sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==", "dev": true }, + "ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "requires": {} + }, "ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "requires": { "bs-logger": "0.x", @@ -18697,7 +19418,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" } }, @@ -18774,26 +19495,9 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "tunnel": { "version": "0.0.6", @@ -18840,9 +19544,9 @@ } }, "typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, "uc.micro": { @@ -18892,6 +19596,12 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -19043,12 +19753,6 @@ "babel-walk": "3.0.0-canary-5" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -19149,9 +19853,9 @@ "dev": true }, "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", diff --git a/package.json b/package.json index df2eb6ce0..20e672385 100644 --- a/package.json +++ b/package.json @@ -71,16 +71,16 @@ "dependencies": { "@azure/cosmos": "3.17.3", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.2.2", + "@azure/identity": "3.2.3", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.0", "@azure/storage-blob": "12.14.0", "@azure/storage-queue": "12.13.0", - "@octokit/plugin-paginate-graphql": "2.0.3", - "@octokit/request": "6.2.6", - "@octokit/auth-app": "5.0.3", - "@octokit/rest": "19.0.11", - "@primer/octicons": "19.2.0", + "@octokit/plugin-paginate-graphql": "3.0.0", + "@octokit/request": "7.0.1", + "@octokit/auth-app": "5.0.6", + "@octokit/rest": "19.0.13", + "@primer/octicons": "19.4.0", "app-root-path": "3.1.0", "applicationinsights": "2.7.0", "async-prompt": "1.0.1", @@ -93,7 +93,7 @@ "cors": "2.8.5", "debug": "4.3.4", "deepmerge": "4.3.1", - "dotenv": "16.1.4", + "dotenv": "16.3.1", "express": "4.18.2", "express-async-handler": "1.2.0", "express-session": "1.17.3", @@ -102,7 +102,7 @@ "github-username-regex": "1.0.0", "hsts": "2.2.0", "jsonc": "2.0.0", - "jsonwebtoken": "9.0.0", + "jsonwebtoken": "9.0.1", "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", @@ -116,14 +116,14 @@ "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", - "pg": "8.11.0", + "pg": "8.11.1", "pg-escape": "0.2.0", "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", "redis": "4.6.7", "secure-compare": "3.0.1", - "semver": "7.5.1", + "semver": "7.5.4", "serve-favicon": "2.5.0", "simple-oauth2": "5.0.0", "throat": "6.0.2", @@ -135,12 +135,12 @@ "@types/debug": "4.1.8", "@types/express": "4.17.17", "@types/express-session": "1.17.7", - "@types/jest": "29.5.2", + "@types/jest": "29.5.3", "@types/lodash": "4.14.195", "@types/luxon": "3.3.0", - "@types/memory-cache": "0.2.2", + "@types/memory-cache": "0.2.3", "@types/morgan": "1.9.4", - "@types/node": "20.3.1", + "@types/node": "20.4.1", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -152,23 +152,23 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "5.59.11", - "@typescript-eslint/parser": "5.59.11", + "@typescript-eslint/eslint-plugin": "6.0.0", + "@typescript-eslint/parser": "6.0.0", "cspell": "6.31.1", - "eslint": "8.42.0", + "eslint": "8.44.0", "eslint-config-prettier": "8.8.0", - "eslint-plugin-n": "16.0.0", - "eslint-plugin-prettier": "4.2.1", + "eslint-plugin-n": "16.0.1", + "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.5.0", + "jest": "29.6.1", "jest-junit": "16.0.0", - "lint-staged": "13.2.2", + "lint-staged": "13.2.3", "markdownlint-cli2": "0.8.1", - "prettier": "2.8.8", - "ts-jest": "29.1.0", + "prettier": "3.0.0", + "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.1.3" + "typescript": "5.1.6" }, "engines": { "node": ">=16" diff --git a/routes/diagnostics.ts b/routes/diagnostics.ts index 9ae9392aa..4d6072360 100644 --- a/routes/diagnostics.ts +++ b/routes/diagnostics.ts @@ -4,10 +4,11 @@ // import { Request, Router } from 'express'; +import asyncHandler from 'express-async-handler'; const router: Router = Router(); import { IAppSession, ReposAppRequest } from '../interfaces'; -import { getProviders } from '../transitional'; +import { CreateError, getProviders } from '../transitional'; const redacted = '*****'; @@ -96,4 +97,15 @@ router.get('/', (req: IRequestWithSession, res) => { }); }); +router.get( + '/advanced', + asyncHandler(async (req: ReposAppRequest, res, next) => { + if (req.user?.azure?.oid !== 'b9f9877e-1cae-445e-bc28-3c943078c8e7') { + return next(CreateError.NotAuthorized('You are not authorized to view this page.')); + } + const obj: any = Object.assign({}, process.env); + return res.json(obj) as unknown as void; + }) +); + export default router; diff --git a/routes/org/repoWorkflowEngine.ts b/routes/org/repoWorkflowEngine.ts index cf46c217d..9f23594fa 100644 --- a/routes/org/repoWorkflowEngine.ts +++ b/routes/org/repoWorkflowEngine.ts @@ -85,7 +85,11 @@ export class RepoWorkflowEngine { private log: IRepositoryWorkflowOutput[] = []; private repository: Repository; - constructor(private providers: IProviders, organization: Organization, approvalPackage: IApprovalPackage) { + constructor( + private providers: IProviders, + organization: Organization, + approvalPackage: IApprovalPackage + ) { this.request = approvalPackage.repositoryMetadata; // this.user = approvalPackage.requestingUser; this.id = approvalPackage.id; diff --git a/routes/orgAdmin.ts b/routes/orgAdmin.ts index 6310fbf24..d5bd0f5ef 100644 --- a/routes/orgAdmin.ts +++ b/routes/orgAdmin.ts @@ -25,9 +25,10 @@ router.use(requirePortalAdministrationPermission); // These functions are not pretty. enum OperationsAction { - DestroyLink, - MarkAsServiceAccount, - UnmarkServiceAccount, + DestroyLink = 'Destroy link', + MarkAsServiceAccount = 'Mark as service account', + UnmarkServiceAccount = 'Unmark service account', + DestroyCollaboratorGrants = 'Destroy collaborator grants', } enum UserQueryByType { @@ -440,9 +441,12 @@ router.post('/whois/id/:githubid', function (req: ReposAppRequest, res: Response const thirdPartyId = req.params.githubid; const markAsServiceAccount = req.body['mark-as-service-account']; const unmarkServiceAccount = req.body['unmark-service-account']; + const removeCollaboration = req.body['remove-collaboration']; const providers = getProviders(req); let action = OperationsAction.DestroyLink; - if (markAsServiceAccount) { + if (removeCollaboration) { + action = OperationsAction.DestroyCollaboratorGrants; + } else if (markAsServiceAccount) { action = OperationsAction.MarkAsServiceAccount; } else if (unmarkServiceAccount) { action = OperationsAction.UnmarkServiceAccount; @@ -458,7 +462,7 @@ router.post('/whois/id/:githubid', function (req: ReposAppRequest, res: Response } req.individualContext.webContext.render({ view: 'organization/whois/drop', - title: `Dropped link by ID ${thirdPartyId}`, + title: `${action} link by ID ${thirdPartyId}`, state, }); }) @@ -511,9 +515,12 @@ router.post('/whois/github/:username', function (req: ReposAppRequest, res: Resp const username = req.params.username; const markAsServiceAccount = req.body['mark-as-service-account']; const unmarkServiceAccount = req.body['unmark-service-account']; + const removeCollaboration = req.body['remove-collaboration']; const providers = getProviders(req); let action = OperationsAction.DestroyLink; - if (markAsServiceAccount) { + if (removeCollaboration) { + action = OperationsAction.DestroyCollaboratorGrants; + } else if (markAsServiceAccount) { action = OperationsAction.MarkAsServiceAccount; } else if (unmarkServiceAccount) { action = OperationsAction.UnmarkServiceAccount; @@ -630,6 +637,13 @@ async function destructiveLogic( ); } + if (action === OperationsAction.DestroyCollaboratorGrants) { + const account: Account = operations.getAccount(thirdPartyId); + const res = await account.removeCollaboratorPermissions(); + state.messages = res.history; + return state; + } + // Account termination if (linkQuery && linkQuery.link && !thirdPartyId) { thirdPartyId = linkQuery.link.thirdPartyId; diff --git a/scripts/migrateLinks.ts b/scripts/migrateLinks.ts index 249cc175d..ffd45a528 100644 --- a/scripts/migrateLinks.ts +++ b/scripts/migrateLinks.ts @@ -18,7 +18,7 @@ import throat from 'throat'; import job from '../job'; import { ICorporateLink, IProviders } from '../interfaces'; import { createAndInitializeLinkProviderInstance, ILinkProvider } from '../lib/linkProviders'; -import { ErrorHelper } from '../transitional'; +import { ErrorHelper, getThirdPartyLinkById } from '../transitional'; const parallelWorkLimit = 5; @@ -60,7 +60,7 @@ async function migration(providers: IProviders): Promise { await Promise.all( allSourceLinks.map((sourceLink: ICorporateLink) => throttle(async () => { - const existingLink = await getThirdPartyLink(destinationLinkProvider, sourceLink.thirdPartyId); + const existingLink = await getThirdPartyLinkById(destinationLinkProvider, sourceLink.thirdPartyId); if (existingLink && overwriteDestinationLinks) { console.warn('Removing existing destination link...'); await destinationLinkProvider.deleteLink(existingLink); @@ -104,17 +104,6 @@ async function migration(providers: IProviders): Promise { console.log(); } -async function getThirdPartyLink(linkProvider: ILinkProvider, thirdPartyId: string): Promise { - try { - return await linkProvider.getByThirdPartyId(thirdPartyId); - } catch (error) { - if (ErrorHelper.IsNotFound(error)) { - return null; - } - throw error; - } -} - async function getUserIdByUpn(graphProvider, upn: string): Promise { return new Promise((resolve, reject) => { graphProvider.getUserById(upn, (err, info) => { diff --git a/transitional.ts b/transitional.ts index b2bc2813b..a05e87b92 100644 --- a/transitional.ts +++ b/transitional.ts @@ -12,14 +12,17 @@ import type { ICreateRepositoryApiResult } from './api/createRepo'; import { Repository } from './business/repository'; import { GitHubRepositoryPermission, - IDictionary, - IFunctionPromise, - IProviders, - ISettledValue, - ReposAppRequest, + type ICorporateLink, + type IDictionary, + type IFunctionPromise, + type IGitHubCollaboratorPermissions, + type IProviders, + type ISettledValue, + type ReposAppRequest, SettledState, } from './interfaces'; import { Organization } from './business'; +import { ILinkProvider } from './lib/linkProviders'; const packageVariableName = 'static-react-package-name'; export function hasStaticReactClientApp() { @@ -53,7 +56,9 @@ export function SettleToStateValue(promise: Promise): Promise { + try { + return await linkProvider.getByThirdPartyId(String(thirdPartyId)); + } catch (error) { + if (ErrorHelper.IsNotFound(error)) { + return null; + } + throw error; + } +} + export interface ICustomizedNewRepositoryLogic { createContext(req: any): INewRepositoryContext; getAdditionalTelemetryProperties(context: INewRepositoryContext): IDictionary; diff --git a/views/organization/whois/result.pug b/views/organization/whois/result.pug index adde2067f..e6bb57c7c 100644 --- a/views/organization/whois/result.pug +++ b/views/organization/whois/result.pug @@ -173,6 +173,9 @@ block content p.lead DANGER ZONE - NO CONFIRMATION p input.btn.btn-danger(type='submit', value='Remove link', name='remove-link-only') + if query && query.collaboratorRepositories && query.collaboratorRepositories.length + p + input.btn.btn-danger(type='submit', value='Remove collaborator grants', name='remove-collaboration') if query && query.collaboratorRepositories && query.collaboratorRepositories.length h2 Active individual Collaborator permissions on repos diff --git a/webhooks/tasks/member.ts b/webhooks/tasks/member.ts index 17941bab8..6373cd8ff 100644 --- a/webhooks/tasks/member.ts +++ b/webhooks/tasks/member.ts @@ -68,8 +68,7 @@ export default class MemberWebhookProcessor implements WebhookProcessor { const repositoryName = event.repository.name; const repository = organization.repository(repositoryName, event.repository); const collaborator = await repository.getCollaborator(event.member.login); - const permission = collaborator.asGitHubRepositoryPermission(); - // TODO: may need to support the new 5 levels vs 3... + const permission = collaborator.interpretRoleAsDetailedPermission(); if (permission) { const isOrganizationMember = await organization.getMembership(userLogin); const collaboratorType = isOrganizationMember diff --git a/webhooks/tasks/team.ts b/webhooks/tasks/team.ts index 7f9aedcdb..7e80da851 100644 --- a/webhooks/tasks/team.ts +++ b/webhooks/tasks/team.ts @@ -10,7 +10,7 @@ import moment from 'moment'; import { WebhookProcessor } from '../organizationProcessor'; import { Operations } from '../../business'; import { Organization } from '../../business'; -import { permissionsObjectToValue } from '../../transitional'; +import { projectCollaboratorPermissionsObjectToGitHubRepositoryPermission } from '../../transitional'; import type { IProviders } from '../../interfaces'; // When teams are added or removed on GitHub, refresh the organization's list of @@ -64,10 +64,12 @@ export default class TeamWebhookProcessor implements WebhookProcessor { queryCache && queryCache.supportsTeamPermissions ) { - const oldRepositoryPermissionLevel = permissionsObjectToValue( + const oldRepositoryPermissionLevel = projectCollaboratorPermissionsObjectToGitHubRepositoryPermission( event.changes.repository.permissions.from ); - const newRepositoryPermissionLevel = permissionsObjectToValue(event.repository.permissions); + const newRepositoryPermissionLevel = projectCollaboratorPermissionsObjectToGitHubRepositoryPermission( + event.repository.permissions + ); console.log( `team ${event.team.name} permission level for repo ${event.repository.name} changed from ${oldRepositoryPermissionLevel} to ${newRepositoryPermissionLevel}` ); @@ -100,7 +102,7 @@ export default class TeamWebhookProcessor implements WebhookProcessor { isPrivate, repoName, event.team.id.toString(), - permissionsObjectToValue(event.repository.permissions) + projectCollaboratorPermissionsObjectToGitHubRepositoryPermission(event.repository.permissions) ); // equiv to event.team.permission as GitHubRepositoryPermission } } From 967803ac5bc115de41cc46c9acb29701af307c95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jul 2023 04:01:59 +0000 Subject: [PATCH 10/69] chore(deps): bump fast-xml-parser from 4.2.4 to 4.2.5 Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.2.4 to 4.2.5. - [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases) - [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.2.4...v4.2.5) --- updated-dependencies: - dependency-name: fast-xml-parser dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b90433b1..08897643d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6014,9 +6014,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fast-xml-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", - "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "funding": [ { "type": "paypal", @@ -15995,9 +15995,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fast-xml-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", - "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "requires": { "strnum": "^1.0.5" } From e165cb14d0a9c0f1fe39c361a9f06655a5247141 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:04:30 -0700 Subject: [PATCH 11/69] Updates; remove rename branch code --- .cspell.json | 7 + .gitignore | 1 + .markdownlint-cli2.jsonc | 3 +- .vscode/launch.json | 3 +- api/client/context/administration/app.ts | 74 + .../context/administration/appInstallation.ts | 59 + api/client/context/administration/apps.ts | 128 + api/client/context/administration/index.ts | 3 + .../administration/organization/settings.ts | 78 +- api/client/context/administration/types.ts | 44 + api/client/context/index.ts | 2 + api/client/context/settings.ts | 48 + api/client/organization/repo.ts | 34 +- business/account.ts | 13 +- business/application.ts | 30 + business/githubApps/appTokens.ts | 4 +- business/operations/index.ts | 4 - config/brand.json | 3 +- config/brand.types.ts | 1 - config/debug.json | 1 + config/debug.types.ts | 1 + docs/jobs.md | 39 - docs/scripts.md | 5 - docs/service-dependencies.md | 26 + index.ts | 6 +- interfaces/app.ts | 3 + interfaces/github/operations.ts | 1 - interfaces/middleware.ts | 11 + job.ts | 16 +- jobs/refreshQueryCache.ts | 1 - lib/github/index.ts | 36 +- lib/graphProvider/microsoftGraphProvider.ts | 2 +- middleware/business/userSettings.ts | 41 + middleware/initialize.ts | 7 +- middleware/passport-routes.ts | 1 + middleware/passport/aadStrategy.ts | 75 +- middleware/react.ts | 34 +- package-lock.json | 5040 ++++++++--------- package.json | 50 +- routes/administration/app.ts | 17 +- routes/administration/apps.ts | 47 +- routes/index-authenticated.ts | 13 +- routes/org/repos.ts | 145 - routes/orgAdmin.ts | 22 +- routes/settings/contributionData.ts | 38 +- scripts/configuration.ts | 19 +- scripts/localEnvironment.ts | 11 +- scripts/migrateLinks.ts | 6 +- transitional.ts | 13 + utils.ts | 9 +- views/message.pug | 3 + views/organization/whois/result.pug | 3 + views/repos/defaultBranch.pug | 83 - views/repos/pills.pug | 1 - views/repos/repo.pug | 3 - 55 files changed, 3104 insertions(+), 3264 deletions(-) create mode 100644 api/client/context/administration/app.ts create mode 100644 api/client/context/administration/appInstallation.ts create mode 100644 api/client/context/administration/apps.ts create mode 100644 api/client/context/administration/types.ts create mode 100644 api/client/context/settings.ts delete mode 100644 docs/jobs.md delete mode 100644 docs/scripts.md create mode 100644 docs/service-dependencies.md create mode 100644 interfaces/middleware.ts create mode 100644 middleware/business/userSettings.ts delete mode 100644 views/repos/defaultBranch.pug diff --git a/.cspell.json b/.cspell.json index 4333fc71d..3847eb2ba 100644 --- a/.cspell.json +++ b/.cspell.json @@ -5,6 +5,7 @@ ".git/", ".environment/**", "**/jitStaticConfiguration.json", + "**/*Accounts.json", "**/sentiment/**", "**/thirdparty/**", "**/vendor/**", @@ -23,6 +24,8 @@ "enableGlobDot": true, "useGitignore": true, "words": [ + "1es", + "1escopilot", "aadgraph", "aadid", "aadname", @@ -149,6 +152,7 @@ "copilotagreement", "copilotrequest", "Copybara", + "corpnet", "corporatealias", "corporatecount", "corporatedev", @@ -174,6 +178,7 @@ "DATETIME", "dbaeumer", "dcount", + "deadcode", "decisionmaker", "Decisionmaker", "Decisionmakers", @@ -583,6 +588,7 @@ "pmownerid", "popd", "portaldescription", + "portaldev", "portalppe", "portalprod", "portalwestus", @@ -788,6 +794,7 @@ "unadopted", "unarchived", "Unauthoritative", + "Uncommited", "unconfigured", "Unconfigured", "unconfirmedorganizationname", diff --git a/.gitignore b/.gitignore index d83fe8f0b..1794272f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ dist/ node_modules/ .DS_Store +reports/ # Potential local development environment scripts app.yaml diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc index 7c3b70235..92bfbc2e7 100644 --- a/.markdownlint-cli2.jsonc +++ b/.markdownlint-cli2.jsonc @@ -5,7 +5,8 @@ "MD024": { "allow_different_nesting": true }, - "MD026": false + "MD026": false, + "MD033": false // no inline HTML: we use inline HTML for expandable details sections }, "ignores": ["**/node_modules/**"] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 3cf2ea3bf..38c56eb00 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -134,7 +134,8 @@ "console": "integratedTerminal", "env": { "NODE_ENV": "localhost", - "DEBUG": "startup" + "DEBUG": "startup", + "EXIT_IMMEDIATELY": "1" } }, { diff --git a/api/client/context/administration/app.ts b/api/client/context/administration/app.ts new file mode 100644 index 000000000..a965539b7 --- /dev/null +++ b/api/client/context/administration/app.ts @@ -0,0 +1,74 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { NextFunction, Response, Router } from 'express'; +import asyncHandler from 'express-async-handler'; + +import { ReposAppRequest } from '../../../../interfaces'; +import { CreateError, getProviders } from '../../../../transitional'; + +import routeIndividualApp from './app'; +import GitHubApplication from '../../../../business/application'; +import { OrganizationSetting } from '../../../../entities/organizationSettings/organizationSetting'; +import { sortByCaseInsensitive } from '../../../../utils'; +import routeApplicationInstallation from './appInstallation'; +import { ApiRequestWithGitHubApplication, RequestWithInstallation } from './types'; + +const router: Router = Router(); + +router.get( + '/', + asyncHandler(async function (req: ApiRequestWithGitHubApplication, res: Response, next: NextFunction) { + const { gitHubApplication } = req; + const installationIdString = req.query.installation_id; + const setupAction = req.query.setup_action; + // if (installationIdString && setupAction) { + // return res.redirect( + // `./${githubApplication.id}/installations/${installationIdString}?setup_action=${setupAction}` + // ); + // } + // const individualContext = req.individualContext; + const allInstalls = await gitHubApplication.getInstallations({ maxAgeSeconds: 5 }); + const { valid, invalid } = GitHubApplication.filterInstallations(allInstalls); + return res.json({ + state: { + installations: { + valid, + invalid, + }, + app: gitHubApplication.asClientJson(), + }, + }) as unknown as void; + }) +); + +router.use( + '/installations/:installationId', + asyncHandler(async function (req: RequestWithInstallation, res, next) { + // const installationIdString = req.query.installation_id; + // const setupAction = req.query.setup_action; + const { gitHubApplication } = req; + const { installationId: installationIdAsString } = req.params; + const installationId = Number(installationIdAsString); + const installation = await gitHubApplication.getInstallation(installationId); + if (!installation) { + return next( + CreateError.NotFound( + `The GitHub app installation ${installationIdAsString} could not be found for app ${gitHubApplication.id}` + ) + ); + } + req.installation = installation; + return next(); + }) +); + +router.use('/installations/:installationId', routeApplicationInstallation); + +router.use('*', (req, res: Response, next: NextFunction) => { + return next(CreateError.NotFound('no API or function available: context/administration/apps/...')); +}); + +export default router; diff --git a/api/client/context/administration/appInstallation.ts b/api/client/context/administration/appInstallation.ts new file mode 100644 index 000000000..d55991e91 --- /dev/null +++ b/api/client/context/administration/appInstallation.ts @@ -0,0 +1,59 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { NextFunction, Response, Router } from 'express'; +import asyncHandler from 'express-async-handler'; + +import { CreateError, getProviders } from '../../../../transitional'; +import { OrganizationSetting } from '../../../../entities/organizationSettings/organizationSetting'; +import { AdministrativeGitHubAppInstallationResponse, RequestWithInstallation } from './types'; + +const router: Router = Router(); + +router.use( + asyncHandler(async function (req: RequestWithInstallation, res: Response, next: NextFunction) { + const { operations, organizationSettingsProvider } = getProviders(req); + + const { installation } = req; + const organizationId = installation.account.id; + const organizationName = installation.account.login; + let settings: OrganizationSetting = null; + try { + settings = await organizationSettingsProvider.getOrganizationSetting(organizationId.toString()); + } catch (notFound) { + /* ignored */ + } + req.organizationDynamicSettings = settings; + + const staticSettings = operations.getOrganizationSettings(organizationName); + req.organizationStaticSettings = staticSettings; + + return next(); + }) +); + +router.get( + '/', + asyncHandler(async (req: RequestWithInstallation, res: Response, next: NextFunction) => { + const { gitHubApplication, installation, organizationDynamicSettings, organizationStaticSettings } = req; + const response: AdministrativeGitHubAppInstallationResponse = { + app: gitHubApplication.asClientJson(), + // installation, + installationId: installation.id, + dynamicSettings: organizationDynamicSettings, + }; + return res.json(response) as unknown as void; + }) +); + +router.use('*', (req, res: Response, next: NextFunction) => { + return next( + CreateError.NotFound( + 'no API or function available: context/administration/apps/:appId/installations/:installationId' + ) + ); +}); + +export default router; diff --git a/api/client/context/administration/apps.ts b/api/client/context/administration/apps.ts new file mode 100644 index 000000000..e0dd06c69 --- /dev/null +++ b/api/client/context/administration/apps.ts @@ -0,0 +1,128 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { NextFunction, Response, Router } from 'express'; +import asyncHandler from 'express-async-handler'; + +import { ReposAppRequest } from '../../../../interfaces'; +import { CreateError, getProviders } from '../../../../transitional'; + +import routeIndividualApp from './app'; +import GitHubApplication from '../../../../business/application'; +import { sortByCaseInsensitive } from '../../../../utils'; +import { + ApiRequestWithGitHubApplication, + ManagedOrganizationAppConfigurationsByOrgView, + ManagedOrganizationStatus, +} from './types'; + +const router: Router = Router(); + +router.get( + '/', + asyncHandler(async (req: ReposAppRequest, res: Response) => { + const { operations, organizationSettingsProvider } = getProviders(req); + const apps = operations.getApplications(); + const byOrg = new Map(); + function getOrg(name: string) { + let o = byOrg.get(name); + if (!o) { + o = { + organizationName: name, + id: undefined, + status: ManagedOrganizationStatus.NotAdopted, + appInstallations: new Map(), + dynamicSettings: null, + configuredInstallations: [], + }; + for (const app of apps) { + o.appInstallations.set(app.id, null); + } + byOrg.set(name, o); + } + return o; + } + for (const app of apps) { + const appInstalls = await app.getInstallations({ maxAgeSeconds: 5 }); + const { valid: validInstallations } = GitHubApplication.filterInstallations(appInstalls); + for (const valid of validInstallations) { + const organizationName = valid.account.login; + const o = getOrg(organizationName.toLowerCase()); + o.appInstallations.set(app.id, { + app, + installationId: valid.id, + }); + o.id = Number(valid.target_id); + if (!o.dynamicSettings && valid.target_type === 'Organization') { + try { + o.dynamicSettings = await organizationSettingsProvider.getOrganizationSetting( + valid.target_id.toString() + ); + } catch (ignore) { + /* ignored */ + } + if (o.dynamicSettings) { + o.configuredInstallations = o.dynamicSettings.installations.map( + (install) => install.installationId + ); + o.status = ManagedOrganizationStatus.Adopted; + } + if (o.dynamicSettings && o.dynamicSettings.active === true) { + o.status = ManagedOrganizationStatus.Active; + } + } + } + } + for (const organization of operations.organizations.values()) { + const anOrg = getOrg(organization.name.toLowerCase()); + anOrg.id = organization.id; + } + const orgNames = Array.from(byOrg.keys()).sort(sortByCaseInsensitive); + return res.json({ + apps: apps.map((app) => app.asClientJson()), + orgNames, + orgs: Array.from(byOrg.values()).map((data) => { + return { + name: data.organizationName, + status: data.status, + id: data.id, + configuredInstallations: data.configuredInstallations, + hasDynamicSettings: !!data.dynamicSettings, + appInstallations: Array.from(data.appInstallations.keys()) + .filter((a) => a) + .map((appIdKey) => { + const install = data.appInstallations.get(appIdKey); + return { + installationId: install?.installationId, + appId: install?.app?.id, + }; + }), + }; + }), + }) as unknown as void; + }) +); + +router.use( + '/:appId', + asyncHandler(async function (req: ApiRequestWithGitHubApplication, res: Response, next: NextFunction) { + const { operations } = getProviders(req); + const appId = Number(req.params.appId); + const app = operations.getApplicationById(appId); + if (app) { + req.gitHubApplication = app; + return next(); + } + return next(CreateError.NotFound('no app available with that ID')); + }) +); + +router.use('/:appId', routeIndividualApp); + +router.use('*', (req, res: Response, next: NextFunction) => { + return next(CreateError.NotFound('no API or function available: context/administration/apps')); +}); + +export default router; diff --git a/api/client/context/administration/index.ts b/api/client/context/administration/index.ts index 27c7ec5a4..9a48aee18 100644 --- a/api/client/context/administration/index.ts +++ b/api/client/context/administration/index.ts @@ -13,6 +13,7 @@ import getCompanySpecificDeployment from '../../../../middleware/companySpecific import { ErrorHelper, getProviders } from '../../../../transitional'; import routeIndividualOrganization from './organization'; +import routeApps from './apps'; const router: Router = Router(); @@ -49,6 +50,8 @@ router.use((req: IRequestWithAdministration, res: Response, next: NextFunction) return req.isSystemAdministrator ? next() : next(jsonError('Not authorized', 403)); }); +router.use('/apps', routeApps); + router.use( '/organization/:orgName', asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { diff --git a/api/client/context/administration/organization/settings.ts b/api/client/context/administration/organization/settings.ts index f749e588b..ca54b8086 100644 --- a/api/client/context/administration/organization/settings.ts +++ b/api/client/context/administration/organization/settings.ts @@ -9,7 +9,7 @@ import asyncHandler from 'express-async-handler'; import { OrganizationSetting } from '../../../../../entities/organizationSettings/organizationSetting'; import { ReposAppRequest } from '../../../../../interfaces'; import { jsonError } from '../../../../../middleware'; -import { ErrorHelper, getProviders } from '../../../../../transitional'; +import { CreateError, ErrorHelper, getProviders } from '../../../../../transitional'; const router: Router = Router(); @@ -43,6 +43,27 @@ router.get( }) ); +router.delete( + '/', + asyncHandler(async function (req: IOrganizationSettings, res: Response) { + const { dynamicSettings } = req; + const { organizationId } = dynamicSettings; + const { organizationSettingsProvider, queryCache } = getProviders(req); + const orgName = req.query.deleteOrganizationConfiguration as string; + if (orgName?.toLowerCase() !== dynamicSettings.organizationName.toLowerCase()) { + throw CreateError.InvalidParameters( + 'The organization name provided does not match the organization name in the configuration.' + ); + } + await organizationSettingsProvider.deleteOrganizationSetting(dynamicSettings); + res.status(204); + if (queryCache) { + queryCache.removeOrganizationById(String(organizationId)); + } + return res.end() as unknown as void; + }) +); + // -- features router.get( @@ -77,19 +98,31 @@ router.put( const { insights, organizationSettingsProvider } = getProviders(req); const { features } = dynamicSettings; const flag = req.params.flag as string; + const restart = req.query.restart === '1'; insights?.trackEvent({ name: 'AddOrganizationFeatureFlag', properties: { flag, + restart, currentFeatureFlags: features.join(', '), }, }); - if (features.includes(flag)) { - return next(jsonError(`flag "${flag}" is already set`, 400)); + // special case + if (flag === 'active') { + if (dynamicSettings.active) { + return next(CreateError.InvalidParameters('The organization is already active.')); + } + dynamicSettings.active = true; + } else { + if (features.includes(flag)) { + return next(jsonError(`flag "${flag}" is already set`, 400)); + } + dynamicSettings.features.push(flag); } - dynamicSettings.features.push(flag); try { - dynamicSettings.updated = new Date(); + if (restart) { + dynamicSettings.updated = new Date(); + } await organizationSettingsProvider.updateOrganizationSetting(dynamicSettings); } catch (error) { return next(jsonError(`error adding flag "${flag}": ${error}`, ErrorHelper.GetStatus(error) || 400)); @@ -97,6 +130,7 @@ router.put( return res.json({ flag, value: dynamicSettings.features.includes(flag) ? flag : null, + restart, organizationName: organization.name, }) as unknown as void; }) @@ -109,19 +143,30 @@ router.delete( const { organizationSettingsProvider, insights } = getProviders(req); const { features } = dynamicSettings; const flag = req.params.flag as string; + const restart = req.query.restart === '1'; insights?.trackEvent({ name: 'RemoveOrganizationFeatureFlag', properties: { flag, + restart, currentFeatureFlags: features.join(', '), }, }); - if (!features.includes(flag)) { - return next(jsonError(`flag "${flag}" is not set`, 400)); + if (flag === 'active') { + if (!dynamicSettings.active) { + return next(CreateError.InvalidParameters('The organization is already inactive.')); + } + dynamicSettings.active = false; + } else { + if (!features.includes(flag)) { + return next(jsonError(`flag "${flag}" is not set`, 400)); + } + dynamicSettings.features = dynamicSettings.features.filter((flagEntry) => flagEntry !== flag); } - dynamicSettings.features = dynamicSettings.features.filter((flagEntry) => flagEntry !== flag); try { - dynamicSettings.updated = new Date(); + if (restart) { + dynamicSettings.updated = new Date(); + } await organizationSettingsProvider.updateOrganizationSetting(dynamicSettings); } catch (error) { return next(jsonError(`error removing flag "${flag}": ${error}`, ErrorHelper.GetStatus(error) || 400)); @@ -129,6 +174,7 @@ router.delete( return res.json({ flag, value: dynamicSettings.features.includes(flag) ? flag : null, + restart, organizationName: organization.name, }) as unknown as void; }) @@ -169,6 +215,7 @@ router.put( const { insights, organizationSettingsProvider } = getProviders(req); const { properties } = dynamicSettings; const newValue = req.body.value as string; + const restart = req.query.restart === '1'; if (!newValue) { return next(jsonError('body.value required', 400)); } @@ -181,6 +228,7 @@ router.put( name: 'SetOrganizationSettingProperty', properties: { propertyName, + restart, currentProperties: JSON.stringify(properties), currentPropertyValue, }, @@ -188,7 +236,9 @@ router.put( const updateDescription = `Changing property ${propertyName} value from "${currentPropertyValue}" to "${newValue}"`; dynamicSettings.properties[propertyName] = newValue; try { - dynamicSettings.updated = new Date(); + if (restart) { + dynamicSettings.updated = new Date(); + } await organizationSettingsProvider.updateOrganizationSetting(dynamicSettings); } catch (error) { return next( @@ -203,6 +253,7 @@ router.put( value: properties[propertyName] || null, organizationName: organization.name, dynamicSettings, + restart, updateDescription, }) as unknown as void; }) @@ -216,12 +267,14 @@ router.delete( const { properties } = dynamicSettings; const propertyName = req.params.propertyName as string; const currentPropertyValue = properties[propertyName] || null; + const restart = req.query.restart === '1'; insights?.trackEvent({ name: 'RemoveOrganizationSettingProperty', properties: { propertyName, currentProperties: JSON.stringify(properties), currentPropertyValue, + restart, }, }); if (properties[propertyName] === undefined) { @@ -229,7 +282,9 @@ router.delete( } delete dynamicSettings.properties[propertyName]; try { - dynamicSettings.updated = new Date(); + if (restart) { + dynamicSettings.updated = new Date(); + } await organizationSettingsProvider.updateOrganizationSetting(dynamicSettings); } catch (error) { return next( @@ -240,6 +295,7 @@ router.delete( property: propertyName, value: properties[propertyName] || null, organizationName: organization.name, + restart, }) as unknown as void; }) ); diff --git a/api/client/context/administration/types.ts b/api/client/context/administration/types.ts new file mode 100644 index 000000000..ad0d1eb4a --- /dev/null +++ b/api/client/context/administration/types.ts @@ -0,0 +1,44 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import GitHubApplication, { type GitHubAppDefinition } from '../../../../business/application'; +import { OrganizationSetting } from '../../../../entities/organizationSettings/organizationSetting'; +import type { IGitHubAppInstallation, ReposAppRequest } from '../../../../interfaces'; + +export type ApiRequestWithGitHubApplication = ReposAppRequest & { + gitHubApplication: GitHubApplication; +}; + +export enum ManagedOrganizationStatus { + Active = 'Active', + Adopted = 'Adopted', + NotAdopted = 'NotAdopted', +} + +export type ManagedOrganizationAppConfigurationsByOrgView = { + organizationName: string; + status: ManagedOrganizationStatus; + appInstallations: Map; + dynamicSettings: OrganizationSetting; + configuredInstallations: number[]; + id?: number; +}; + +export interface IByOrgViewAppInstallation { + app: GitHubApplication; + installationId?: number; +} + +export type RequestWithInstallation = ApiRequestWithGitHubApplication & { + installation: IGitHubAppInstallation; + organizationDynamicSettings: OrganizationSetting; + organizationStaticSettings: OrganizationSetting; +}; + +export type AdministrativeGitHubAppInstallationResponse = { + app: GitHubAppDefinition; + installationId: number; + dynamicSettings: OrganizationSetting; +}; diff --git a/api/client/context/index.ts b/api/client/context/index.ts index 13a1b4b7d..c974f2680 100644 --- a/api/client/context/index.ts +++ b/api/client/context/index.ts @@ -21,6 +21,7 @@ import routeRepos from './repos'; import routeTeams from './teams'; import routeAdministration from './administration'; import routeSample from './sample'; +import routeSettings from './settings'; const router: Router = Router(); @@ -104,6 +105,7 @@ router.get('/orgs', routeOrgs); router.get('/repos', routeRepos); router.get('/teams', routeTeams); router.use('/sample', routeSample); +router.use('/settings', routeSettings); router.use( '/orgs/:orgName', diff --git a/api/client/context/settings.ts b/api/client/context/settings.ts new file mode 100644 index 000000000..5c6199793 --- /dev/null +++ b/api/client/context/settings.ts @@ -0,0 +1,48 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { NextFunction, Response, Router } from 'express'; +import asyncHandler from 'express-async-handler'; + +import { ReposAppRequest } from '../../../interfaces'; +import { CreateError, getProviders } from '../../../transitional'; +import { getUserSettings } from '../../../middleware/business/userSettings'; + +import type { ReposAppRequestWithUserSettings } from '../../../interfaces/middleware'; + +const router: Router = Router(); + +router.use(asyncHandler(getUserSettings)); + +router.get( + '/', + asyncHandler(async (req: ReposAppRequestWithUserSettings, res: Response, next: NextFunction) => { + const { userSettings } = req; + return res.json(userSettings || {}) as unknown as any; + }) +); + +async function setPublicDataSharingValue( + sharingOptOn: boolean, + req: ReposAppRequestWithUserSettings, + res: Response, + next: NextFunction +) { + const { userSettings } = req; + const { userSettingsProvider } = getProviders(req); + userSettings.contributionShareOptIn = sharingOptOn; + await userSettingsProvider.updateUserSettings(userSettings); + return res.status(201).json(userSettings || {}) as unknown as any; +} + +// Actions as separate posts to keep the API simple +router.post('/publicDataSharing/optIn', asyncHandler(setPublicDataSharingValue.bind(null, true))); +router.post('/publicDataSharing/optOut', asyncHandler(setPublicDataSharingValue.bind(null, false))); + +router.use('*', (req: ReposAppRequest, res: Response, next: NextFunction) => { + return next(CreateError.NotFound('Contextual API route not found: /settings')); +}); + +export default router; diff --git a/api/client/organization/repo.ts b/api/client/organization/repo.ts index 80ec440eb..4b9bf97fd 100644 --- a/api/client/organization/repo.ts +++ b/api/client/organization/repo.ts @@ -14,7 +14,6 @@ import { AddRepositoryPermissionsToRequest, getContextualRepositoryPermissions, } from '../../../middleware/github/repoPermissions'; -import { renameRepositoryDefaultBranchEndToEnd } from '../../../routes/org/repos'; import getCompanySpecificDeployment from '../../../middleware/companySpecificDeployment'; import RouteRepoPermissions from './repoPermissions'; @@ -76,27 +75,24 @@ router.get( }) ); -router.patch( - '/renameDefaultBranch', - asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: RequestWithRepo, res: Response, next: NextFunction) { - const providers = getProviders(req); - const activeContext = (req.individualContext || req.apiContext) as IndividualContext; - const repoPermissions = getContextualRepositoryPermissions(req); - const targetBranchName = req.body.default_branch; +router.get( + '/archived', + asyncHandler(async (req: RequestWithRepo, res: Response, next: NextFunction) => { const { repository } = req; try { - const result = await renameRepositoryDefaultBranchEndToEnd( - providers, - activeContext, - repoPermissions, - repository, - targetBranchName, - true /* wait for refresh before sending response */ - ); - return res.json(result) as unknown as void; + await repository.getDetails(); + const data = { + archivedAt: null, + }; + if (repository?.archived) { + const archivedAt = await repository.getArchivedAt(); + if (archivedAt) { + data.archivedAt = archivedAt.toISOString(); + } + } + return res.json(data) as unknown as void; } catch (error) { - return next(jsonError(error)); + return next(error); } }) ); diff --git a/business/account.ts b/business/account.ts index 473eb8997..1e5e0ec8d 100644 --- a/business/account.ts +++ b/business/account.ts @@ -478,7 +478,11 @@ export class Account { return currentOrganizationMemberships; } - async removeCollaboratorPermissions(): Promise { + async removeCollaboratorPermissions( + onlyOneHundred?: boolean + ): Promise { + // NOTE: this at least temporarily adds the ability to punt 100 + // but not all grants; probably should use options eventually vs bool param. const history = []; const error: IReposError = null; const operations = throwIfNotGitHubCapable(this._operations); @@ -492,13 +496,18 @@ export class Account { await this.getDetails(); } const collaborativeRepos = await queryCache.userCollaboratorRepositories(this.id.toString()); + let i = 0; for (const entry of collaborativeRepos) { + if (onlyOneHundred && i >= 100) { + break; + } const { repository } = entry; try { await repository.getDetails(); if (repository.archived) { - history.push(`FYI: previous access to an archived repository ${repository.full_name}`); + history.push(`FYI: cannot alter prior grant to archived repository ${repository.full_name}`); } else { + ++i; await repository.removeCollaborator(this.login); history.push(`Removed ${this.login} as a Collaborator from the repository ${repository.full_name}`); } diff --git a/business/application.ts b/business/application.ts index 40e0b602a..c837d95b8 100644 --- a/business/application.ts +++ b/business/application.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { OrganizationSetting } from '../entities/organizationSettings/organizationSetting'; import { IOperationsGitHubRestLibrary, IOperationsDefaultCacheTimes, @@ -22,6 +23,27 @@ const primaryInstallationProperties = [ 'events', ]; +export type GitHubAppDefinition = { + id: number; + slug: string; + friendlyName: string; +}; + +export function isInstallationConfigured( + settings: OrganizationSetting, + installation: IGitHubAppInstallation +): boolean { + if (!settings || !settings.installations) { + return false; + } + for (const install of settings.installations) { + if (install.installationId === installation.id) { + return true; + } + } + return false; +} + export default class GitHubApplication { constructor( private operations: IOperationsGitHubRestLibrary & IOperationsDefaultCacheTimes, @@ -52,6 +74,14 @@ export default class GitHubApplication { return invalid; } + asClientJson(): GitHubAppDefinition { + return { + id: this.id, + slug: this.slug, + friendlyName: this.friendlyName, + }; + } + async getInstallation(installationId: number, options?: ICacheOptions): Promise { const operations = this.operations; const parameters = { diff --git a/business/githubApps/appTokens.ts b/business/githubApps/appTokens.ts index 7811be3c4..56c694f16 100644 --- a/business/githubApps/appTokens.ts +++ b/business/githubApps/appTokens.ts @@ -213,8 +213,10 @@ function sortByLatestToken(a: IInstallationToken, b: IInstallationToken) { function tokenValidFilter(timeTokenMustBeValid: Date, token: IInstallationToken) { const isValid = token.expires > timeTokenMustBeValid; if (!isValid) { + const header = token.headerValue.substr(6); + const subset = (header.length > 12 ? header.substr(0, 8) : '') + '*'.repeat(4); console.log( - `invalid or expired token being removed: expires=${token.expires} install_id=${token.installationId} org=${token.organizationName}` + `token expired: redacted=${subset}, expires=${token.expires}, install_id=${token.installationId}, org=${token.organizationName}` ); return false; } diff --git a/business/operations/index.ts b/business/operations/index.ts index b88f3348e..464c68f05 100644 --- a/business/operations/index.ts +++ b/business/operations/index.ts @@ -778,10 +778,6 @@ export class Operations return this.config.brand.operationsMail; } - getInfrastructureNotificationsMail(): string { - return this.config.brand.infrastructureNotificationsMail || this.getOperationsMailAddress(); - } - getLinksNotificationMailAddress(): string { return this.config.notifications.linksMailAddress || this.getOperationsMailAddress(); } diff --git a/config/brand.json b/config/brand.json index d0ee09995..988c5e63a 100644 --- a/config/brand.json +++ b/config/brand.json @@ -7,6 +7,5 @@ "supportMail": "env://PORTAL_ADMIN_EMAIL", "operationsMail": "env://GITHUB_OPERATIONS_EMAIL", "forkApprovalMail": "env://GITHUB_FORK_APPROVAL_EMAIL", - "electionMail": "env://FOSSFUND_ELECTION_MAIL", - "infrastructureNotificationsMail": "env://GITHUB_INFRASTRUCTURE_NOTIFICATIONS_MAIL" + "electionMail": "env://FOSSFUND_ELECTION_MAIL" } diff --git a/config/brand.types.ts b/config/brand.types.ts index 4c16aa981..62c89a816 100644 --- a/config/brand.types.ts +++ b/config/brand.types.ts @@ -17,5 +17,4 @@ export type ConfigBrand = { operationsMail: string; forkApprovalMail: string; electionMail: string; - infrastructureNotificationsMail: string; }; diff --git a/config/debug.json b/config/debug.json index 56175a688..c852798f4 100644 --- a/config/debug.json +++ b/config/debug.json @@ -2,5 +2,6 @@ "environmentName": "env://ENVIRONMENT_NAME?default=Unknown", "showUsers": "env://SITE_SHOW_USERS?trueIf=show", "showDebugFooter": "env://DEBUG_SHOW_FOOTER?trueIf=1", + "exitImmediately": "env://EXIT_IMMEDIATELY?trueIf=1", "unlinkWithoutDrops": "env://DEBUG_UNLINK_WITHOUT_DROPS?trueIf=1" } diff --git a/config/debug.types.ts b/config/debug.types.ts index 4c6c7b2a9..92ad6fe69 100644 --- a/config/debug.types.ts +++ b/config/debug.types.ts @@ -12,4 +12,5 @@ export type ConfigDebug = { showUsers: boolean; showDebugFooter: boolean; unlinkWithoutDrops: boolean; + exitImmediately: boolean; }; diff --git a/docs/jobs.md b/docs/jobs.md deleted file mode 100644 index 80050e304..000000000 --- a/docs/jobs.md +++ /dev/null @@ -1,39 +0,0 @@ -# Jobs - -There are automated cronjobs available to help keep things running smoothly, -if you choose to use them. - -Jobs are an alternate entrypoint into the application, and have full use of -the same set of [providers](./providers.md). - -## Webhook event firehose - -> The primary consistency and event processing loop for the entire app. [firehose](../jobs/firehose.ts) - -Ongoing processing of GitHub events for keeping cache up-to-date, locking down new repos, etc. - -## Cleanup organization invitations - -> [cleanupInvites](../jobs/cleanupInvites.ts) - -If configured for an org, cleanup old unaccepted invites. This predates -GitHub-native expiration of invites. - -## System Team permissions - -> [permissions](../jobs/permissions.ts) - -Updating permissions for all-write/all-read/all-admin teams when configured - -## Refresh usernames and other link attributes - -> [refreshUsernames](../jobs/refreshUsernames.ts) - -Keeps link data fresh with GitHub username renames, corporate username and display name updates, -and removing links for deleted GitHub users who remove their accounts permanently from GitHub.com. - -## Cleanup blob cache - -Removes expired cache entities from the blob cache. - -> [cleanupBlobCache](../jobs/cleanupBlobCache.ts) diff --git a/docs/scripts.md b/docs/scripts.md deleted file mode 100644 index 25064f56b..000000000 --- a/docs/scripts.md +++ /dev/null @@ -1,5 +0,0 @@ -# Scripts - -> this file is incomplete - -- `migrateLinks`: a one-time migration script to help when moving link source of truth diff --git a/docs/service-dependencies.md b/docs/service-dependencies.md new file mode 100644 index 000000000..69269e5ce --- /dev/null +++ b/docs/service-dependencies.md @@ -0,0 +1,26 @@ +# Service dependencies + +_This content was moved from the `README.md` to reduce clutter. More content would be helpful._ + +- GitHub organization(s) +- Hosting environment +- Background job environment for eventual consistency work and maintenance cronjobs +- Daemon hosting for near-real-time process +- Queue system +- A cache system or multi-tiered cache implementation +- Azure Active Directory and the Microsoft Graph +- An email service to send mail +- Optional insights or telemetry system + +## Source of truth store + +The backend maintains in a data store of your choice key metadata for +repositories, links, and general compliance info. The backend supports +natively Azure Storage, Azure Table, Azure CosmosDB, and Postgres. + +We use **Postgres** for source of truth including: + +- GitHub organization configuration +- corporate GitHub repository metadata +- corporate identity-to-GitHub login links +- compliance metadata (enable/disabled repos) diff --git a/index.ts b/index.ts index 2162b6bbb..87ada218c 100644 --- a/index.ts +++ b/index.ts @@ -11,9 +11,11 @@ import configResolver from './lib/config'; import initialize from './middleware/initialize'; // Library framework + export * from './interfaces'; // Application framework + type InitializeCall = ( executionEnvironment: ExecutionEnvironment, config: SiteConfiguration, @@ -51,11 +53,13 @@ export async function commonStartup( call: InitializeCall, isJob: boolean, enableAllGitHubApps: boolean, - app?: IReposApplication + app?: IReposApplication, + entrypointName?: string ) { const executionEnvironment: ExecutionEnvironment = { isJob, enableAllGitHubApps, + entrypointName, // expressApplication: app, // diff --git a/interfaces/app.ts b/interfaces/app.ts index 84a25968c..2b3bda593 100644 --- a/interfaces/app.ts +++ b/interfaces/app.ts @@ -65,6 +65,8 @@ export type ExecutionEnvironment = { providers: IProviders; skipModules: Set; + entrypointName: string; + started: Date; }; @@ -88,4 +90,5 @@ export interface IReposJobOptions { insightsPrefix?: string; parameters?: any; enableAllGitHubApps?: boolean; + name?: string; } diff --git a/interfaces/github/operations.ts b/interfaces/github/operations.ts index e2998f3c6..614b38f53 100644 --- a/interfaces/github/operations.ts +++ b/interfaces/github/operations.ts @@ -37,7 +37,6 @@ export interface IOperationsLinks { export interface IOperationsNotifications { getOperationsMailAddress(): string; - getInfrastructureNotificationsMail(): string; getLinksNotificationMailAddress(): string; getRepositoriesNotificationMailAddress(): string; } diff --git a/interfaces/middleware.ts b/interfaces/middleware.ts new file mode 100644 index 000000000..098541d7b --- /dev/null +++ b/interfaces/middleware.ts @@ -0,0 +1,11 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { UserSettings } from '../entities/userSettings'; +import type { ReposAppRequest } from './web'; + +export type ReposAppRequestWithUserSettings = ReposAppRequest & { + userSettings?: UserSettings; +}; diff --git a/job.ts b/job.ts index 1e996b990..268428c6d 100644 --- a/job.ts +++ b/job.ts @@ -47,7 +47,8 @@ export async function runJob( initializeJob, true /* job */, options.enableAllGitHubApps, - null /* app */ + null /* app */, + options.name ); } catch (startupError) { console.error(`Job startup error before runJob: ${startupError}`); @@ -102,7 +103,8 @@ export async function runJob( const simpleError = { ...jobError }; simpleError?.cause && delete simpleError.cause; console.dir(simpleError); - quitInTenSeconds(false); + const config = providers?.config; + quitInTenSeconds(false, config); if (options.insightsPrefix) { try { providers?.insights?.trackException({ @@ -115,15 +117,25 @@ export async function runJob( console.error(`insights error: ${ignoreInsightsError}`); } } + trySilentInsightsFlush(providers); return result; } // CONSIDER: insights metric for job time + trySilentInsightsFlush(providers); console.log(); console.log('The job was successful.'); quitInTenSeconds(true); return result; } +function trySilentInsightsFlush(providers: IProviders) { + try { + providers?.insights?.flush(); + } catch (ignored) { + console.warn(ignored); + } +} + function initializeJob( executionEnvironment: ExecutionEnvironment, config: SiteConfiguration, diff --git a/jobs/refreshQueryCache.ts b/jobs/refreshQueryCache.ts index e44ee970d..e49908789 100644 --- a/jobs/refreshQueryCache.ts +++ b/jobs/refreshQueryCache.ts @@ -258,7 +258,6 @@ async function refreshOrganization( const repositories = await organization.getRepositories(slowRequestCacheOptions); console.log(`${organizationIndex}: ${repositories.length} repositories in ${organization.name}`); const repoIds = new Set(repositories.map((repo) => repo.id.toString())); - for (let i = 0; i < repositories.length; i++) { try { const repository = repositories[i]; diff --git a/lib/github/index.ts b/lib/github/index.ts index 923b0fc81..ebe0aa8b4 100644 --- a/lib/github/index.ts +++ b/lib/github/index.ts @@ -283,8 +283,11 @@ export class RestLibrary { return finalized; } catch (error) { console.log(`API ${api} POST error: ${error.message}`); - if (error?.message?.includes('Resource not accessible by integration')) { - console.error('Options:'); + if ( + error?.message?.includes('Resource not accessible by integration') || + error?.message?.includes('Not Found') + ) { + console.error('\tOptions:'); { const options = Object.getOwnPropertyNames(diagnostic.options).length > 0 ? diagnostic.options : null; @@ -297,17 +300,17 @@ export class RestLibrary { if (key === 'headers') { const headers = value as Record; const headersKeys = Object.getOwnPropertyNames(headers); - console.log('Headers:'); + console.log('\t\tHeaders:'); for (let j = 0; j < headersKeys.length; j++) { const headerKey = headersKeys[j]; const headerValue = headerKey.toLocaleLowerCase() === 'authorization' ? headers[headerKey].substring(0, 13) + '***' : headers[headerKey]; - console.log(` - ${headerKey}: ${headerValue}`); + console.log(`\t\t - ${headerKey}: ${headerValue}`); } } else { - console.log(`Option: ${key}: ${value}`); + console.log(`\t\tOption: ${key}: ${value}`); } } } @@ -316,38 +319,39 @@ export class RestLibrary { for (let i = 0; i < remainingKeys.length; i++) { const key = remainingKeys[i]; const value = diagnostic[key]; - console.log(`${key}: ${value}`); + console.log(`\t\t${key}: ${value}`); } } } if (diagnosticHeaderInformation) { - console.error('Authorization selection information:'); + console.error('\tAuthorization selection information:'); const { installationId, organizationName, purpose, source } = diagnosticHeaderInformation; - organizationName && console.error(`Header resolved for organization: ${organizationName}`); + organizationName && console.error(`\t\tHeader resolved for organization: ${organizationName}`); const customPurpose = purpose as ICustomAppPurpose; purpose && customPurpose?.isCustomAppPurpose === true && - console.error(`Custom purpose: ${customPurpose.id}`); - purpose && !customPurpose?.isCustomAppPurpose && console.error(`Purpose: ${purpose}`); - installationId && console.error(`Installation ID: ${installationId}`); - source && console.error(`Source: ${source}`); + console.error(`\t\tCustom purpose: ${customPurpose.id}`); + purpose && !customPurpose?.isCustomAppPurpose && console.error(`\t\tPurpose: ${purpose}`); + installationId && console.error(`\t\tInstallation ID: ${installationId}`); + source && console.error(`\t\tSource: ${source}`); } } if (error.status) { - console.log(`Status: ${error.status}`); + console.log(`\tStatus: ${error.status}`); } if (error?.response?.headers && error?.response?.headers['x-github-request-id']) { - console.log(`Request ID: ${error.response.headers['x-github-request-id']}`); + console.log(`\tRequest ID: ${error.response.headers['x-github-request-id']}`); } if (error?.response?.headers && error?.response?.headers['x-ratelimit-remaining']) { - console.log(`Rate limit remaining: ${error.response.headers['x-ratelimit-remaining']}`); + console.log(`\tRate limit remaining: ${error.response.headers['x-ratelimit-remaining']}`); } if (error?.response?.headers && error?.response?.headers['x-ratelimit-used']) { - console.log(`Rate limit used: ${error.response.headers['x-ratelimit-used']}`); + console.log(`\tRate limit used: ${error.response.headers['x-ratelimit-used']}`); } if (shouldErrorShowRequest && error?.request) { console.dir(error.request); } + console.log(); throw error; } } diff --git a/lib/graphProvider/microsoftGraphProvider.ts b/lib/graphProvider/microsoftGraphProvider.ts index 8cdb4f5e0..0dbaab3f4 100644 --- a/lib/graphProvider/microsoftGraphProvider.ts +++ b/lib/graphProvider/microsoftGraphProvider.ts @@ -34,7 +34,7 @@ export interface IMicrosoftGraphProviderOptions { const graphBaseUrl = 'https://graph.microsoft.com/v1.0/'; const odataNextLink = '@odata.nextLink'; -const defaultCachePeriodMinutes = 60; +const defaultCachePeriodMinutes = 60 * 36; // 36 hours const attemptCacheGet = true; diff --git a/middleware/business/userSettings.ts b/middleware/business/userSettings.ts new file mode 100644 index 000000000..f8f2593f9 --- /dev/null +++ b/middleware/business/userSettings.ts @@ -0,0 +1,41 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import type { NextFunction, Response } from 'express'; + +import type { ReposAppRequestWithUserSettings } from '../../interfaces/middleware'; + +import { UserSettings } from '../../entities/userSettings'; +import { ErrorHelper, getProviders } from '../../transitional'; +import { IndividualContext } from '../../business/user'; + +export async function getUserSettings( + req: ReposAppRequestWithUserSettings, + res: Response, + next: NextFunction +) { + const activeContext = (req.individualContext || req.apiContext) as IndividualContext; + const corporateId = activeContext?.corporateIdentity?.id; + const { userSettingsProvider } = getProviders(req); + if (corporateId && !req.userSettings) { + let settings: UserSettings = null; + try { + settings = await userSettingsProvider.getUserSettings(corporateId); + } catch (notFoundError) { + if (ErrorHelper.IsNotFound(notFoundError)) { + // ignore + } else { + throw notFoundError; + } + } + if (!settings) { + settings = new UserSettings(); + settings.corporateId = corporateId; + await userSettingsProvider.insertUserSettings(settings); + } + req.userSettings = settings; + } + return next(); +} diff --git a/middleware/initialize.ts b/middleware/initialize.ts index 0733a5fd0..5c06ad1b9 100644 --- a/middleware/initialize.ts +++ b/middleware/initialize.ts @@ -84,7 +84,7 @@ import initializeRepositoryProvider from '../entities/repository'; import { tryGetImmutableStorageProvider } from '../lib/immutable'; const DefaultApplicationProfile: IApplicationProfile = { - applicationName: 'GitHub Management Portal', + applicationName: 'Open Source Management Portal', serveStaticAssets: true, serveClientAssets: true, logDependencies: true, @@ -364,7 +364,10 @@ export default async function initialize( : applicationProfile.webServer ? 'web application' : 'application'; - debug(`${containerPurpose} name: ${applicationProfile.applicationName}`); + if (executionEnvironment.entrypointName) { + debug(`${containerPurpose} name: ${executionEnvironment.entrypointName}`); + } + debug(`${containerPurpose} profile: ${applicationProfile.applicationName}`); debug(`environment: ${config?.debug?.environmentName || 'Unknown'}`); const codespacesConfig = (config as SiteConfiguration)?.github?.codespaces; diff --git a/middleware/passport-routes.ts b/middleware/passport-routes.ts index 574faa3db..1a8eeadea 100644 --- a/middleware/passport-routes.ts +++ b/middleware/passport-routes.ts @@ -228,6 +228,7 @@ export default function configurePassport(app, passport, config) { ? `Your ${config.brand.companyName} and GitHub accounts have been unlinked. You no longer have access to any ${config.brand.companyName} organizations, and you have been signed out of this portal.` : 'Goodbye', title: 'Goodbye', + clearLocalStorage: true, buttonText: unlinked ? 'Sign in to connect a new account' : 'Sign in', config: config.obfuscatedConfig, }); diff --git a/middleware/passport/aadStrategy.ts b/middleware/passport/aadStrategy.ts index 38227767a..ed08debe3 100644 --- a/middleware/passport/aadStrategy.ts +++ b/middleware/passport/aadStrategy.ts @@ -25,19 +25,64 @@ interface IAADUser { displayName: string; oid: string; username: string; - oauthToken?: string; + // oauthToken?: string; // we aren't using this, no need to store these } +/* cSpell:disable */ +type AadJwtJson = { + aio: string; + amr: string; + family_name: string; + given_name: string; + ipaddr: string; + name: string; + oid: string; + onprem_sid: string; + rh: string; + sub: string; + tid: string; + unique_name: string; + upn: string; + uti: string; + ver: string; +}; +/* cSpell:enable */ + +type AadResponseProfile = { + _json: AadJwtJson; + _raw: string; + displayName: string; + emails: undefined; + name: { + familyName: string; + givenName: string; + middleName: string; + }; + oid: string; + sub: string; + upn: string; +}; + +type AadBearerToken = { + access_token: string; + expireS_in: string; + expires_on: string; + ext_expires_in: string; + id_token: string; + refresh_token: string; + token_type: 'Bearer'; +}; + async function login( - app, - config, + app: IReposApplication, + config: SiteConfiguration, client: AuthorizationCode, - iss, - sub, - profile, + iss: string, + sub: string, + profile: AadResponseProfile, accessToken: string, refreshToken: string, - params + params: AadBearerToken ): Promise { const { graphProvider, insights } = app.settings.providers as IProviders; const oauthToken = JSON.stringify(params); @@ -55,7 +100,7 @@ async function login( displayName: impersonationResult.displayName, oid: impersonationResult.id, username: impersonationResult.userPrincipalName, - oauthToken, + // oauthToken, }, }; } @@ -75,21 +120,21 @@ async function login( displayName: profile.displayName, oid: profile.oid, username: profile.upn, - oauthToken, + // oauthToken, }, }; } function activeDirectorySubset( - app, - config, + app: IReposApplication, + config: SiteConfiguration, client: AuthorizationCode, - iss, - sub, - profile, + iss: string, + sub: string, + profile: AadResponseProfile, accessToken: string, refreshToken: string, - params, + params: AadBearerToken, done ) { login(app, config, client, iss, sub, profile, accessToken, refreshToken, params) diff --git a/middleware/react.ts b/middleware/react.ts index 7c7a8934d..c21749b1d 100644 --- a/middleware/react.ts +++ b/middleware/react.ts @@ -31,20 +31,25 @@ type PackageJsonSubset = { flights?: Record; }; +type BasicFlightingOptions = { + enabled: boolean; +}; + type ContentOptions = { html: string; package: PackageJsonSubset; }; -type FlightingOptions = ContentOptions & { - enabled: boolean; - divertEveryone: boolean; - staticFlightIds?: Set; - flightName: string; -}; +type FlightingOptions = BasicFlightingOptions & + ContentOptions & { + divertEveryone?: boolean; + staticFlightIds?: Set; + flightName?: string; + }; export function injectReactClient() { const standardContent = getReactScriptsIndex(staticClientPackageName); + let flightingBasics: BasicFlightingOptions = null; let flightingOptions: FlightingOptions = null; return function injectedRoute(req: ReposAppRequest, res: Response, next: NextFunction) { const { config } = getProviders(req); @@ -53,15 +58,17 @@ export function injectReactClient() { return next(); } if (!flightingOptions) { - flightingOptions = evaluateFlightConditions(req); + flightingBasics = evaluateFlightConditions(req); + flightingOptions = flightingBasics as FlightingOptions; } const activeContext = (req.individualContext || req.apiContext) as IndividualContext; - const flightAvailable = flightingOptions.enabled && flightingOptions.html; - const flightName = flightAvailable ? flightingOptions.flightName : null; + const flightEnabled = flightingBasics?.enabled === true; + const flightAvailable = flightEnabled && flightingOptions?.html; + const flightName = flightingOptions?.flightName; const userFlighted = - flightingOptions.divertEveryone === true || + flightingOptions?.divertEveryone === true || (activeContext?.corporateIdentity?.id && - flightingOptions.staticFlightIds?.has(activeContext.corporateIdentity.id)); + flightingOptions?.staticFlightIds?.has(activeContext.corporateIdentity.id)); const userFlightOverride = req.query.flight === '0' || req.query.flight === '1' ? req.query.flight : undefined; let inFlight = flightAvailable && (userFlighted || req.query.flight === '1'); @@ -141,7 +148,7 @@ export function injectReactClient() { }; } -function evaluateFlightConditions(req: ReposAppRequest): FlightingOptions { +function evaluateFlightConditions(req: ReposAppRequest): FlightingOptions | BasicFlightingOptions { const { config } = getProviders(req); if (config?.client?.flighting?.enabled === true && staticClientFlightingPackageName) { const options = getReactScriptsIndex(staticClientFlightingPackageName) as FlightingOptions; @@ -157,6 +164,9 @@ function evaluateFlightConditions(req: ReposAppRequest): FlightingOptions { ); return options; } + return { + enabled: false, + }; } function getUserClientFeatureFlags(config: any, corporateId: string) { diff --git a/package-lock.json b/package-lock.json index 6b90433b1..4d1f6eb17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,18 +11,18 @@ "dependencies": { "@azure/cosmos": "3.17.3", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.2.3", + "@azure/identity": "3.2.4", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.0", - "@azure/storage-blob": "12.14.0", - "@azure/storage-queue": "12.13.0", - "@octokit/auth-app": "5.0.6", - "@octokit/plugin-paginate-graphql": "3.0.0", - "@octokit/request": "7.0.1", - "@octokit/rest": "19.0.13", - "@primer/octicons": "19.4.0", + "@azure/storage-blob": "12.15.0", + "@azure/storage-queue": "12.14.0", + "@octokit/auth-app": "6.0.0", + "@octokit/plugin-paginate-graphql": "4.0.0", + "@octokit/request": "8.1.1", + "@octokit/rest": "20.0.1", + "@primer/octicons": "19.5.0", "app-root-path": "3.1.0", - "applicationinsights": "2.7.0", + "applicationinsights": "2.7.1", "async-prompt": "1.0.1", "axios": "1.4.0", "basic-auth": "2.0.1", @@ -46,17 +46,17 @@ "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.3.0", + "luxon": "3.4.0", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.3", + "nodemailer": "6.9.4", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", - "pg": "8.11.1", + "pg": "8.11.2", "pg-escape": "0.2.0", "pug": "3.0.2", "pug-load": "3.0.0", @@ -68,7 +68,7 @@ "simple-oauth2": "5.0.0", "throat": "6.0.2", "tmp-promise": "3.0.3", - "validator": "13.9.0", + "validator": "13.11.0", "walk-back": "5.1.0" }, "devDependencies": { @@ -76,11 +76,11 @@ "@types/express": "4.17.17", "@types/express-session": "1.17.7", "@types/jest": "29.5.3", - "@types/lodash": "4.14.195", - "@types/luxon": "3.3.0", + "@types/lodash": "4.14.197", + "@types/luxon": "3.3.1", "@types/memory-cache": "0.2.3", "@types/morgan": "1.9.4", - "@types/node": "20.4.1", + "@types/node": "20.5.0", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -91,20 +91,20 @@ "@types/recursive-readdir": "2.2.1", "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", - "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "6.0.0", - "@typescript-eslint/parser": "6.0.0", - "cspell": "6.31.1", - "eslint": "8.44.0", - "eslint-config-prettier": "8.8.0", + "@types/validator": "13.11.1", + "@typescript-eslint/eslint-plugin": "6.4.0", + "@typescript-eslint/parser": "6.4.0", + "cspell": "7.0.0", + "eslint": "8.47.0", + "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.0.1", "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.6.1", + "jest": "29.6.2", "jest-junit": "16.0.0", - "lint-staged": "13.2.3", + "lint-staged": "14.0.0", "markdownlint-cli2": "0.8.1", - "prettier": "3.0.0", + "prettier": "3.0.1", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", @@ -170,15 +170,16 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", "dependencies": { "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", "tslib": "^2.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/@azure/core-client": { @@ -272,20 +273,19 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", - "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", + "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", "form-data": "^4.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" }, "engines": { "node": ">=14.0.0" @@ -303,9 +303,9 @@ } }, "node_modules/@azure/core-util": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", - "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.4.0.tgz", + "integrity": "sha512-eGAyJpm3skVQoLiRqm/xPa+SXi/NPDdSHMxbRAz2lSprd+Zs+qrpQGQQ2VQ3Nttu+nSZR4XoYQC71LbEI7jsig==", "dependencies": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -369,9 +369,9 @@ } }, "node_modules/@azure/identity": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.3.tgz", - "integrity": "sha512-knIbl7p2i8r3qPsLW2W84esmDPr36RqieLC72OeuqYk4+0TRNthUhWTs655P9S9Pm3TVVxcFsS3Le9SXIWBIFA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.4.tgz", + "integrity": "sha512-t63oyi2LAn+ZAehYA7SDlhJDd1J0eLO3a21mxTaJcXqKW/tbRbKmo/BeyyTIXbBaoeTFn0xnyQHyomwndTqKUA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -459,15 +459,15 @@ } }, "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { - "version": "1.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.3.tgz", - "integrity": "sha512-9dvTQQ9OhjX0uh4PtDEMPGTP3WihTVLi+DHL9jRMQMPf0trYEbb8ZRIQNo+1JqchkR1YkBDBkki5hJstpUprtA==", + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.5.tgz", + "integrity": "sha512-fsUarKQDvjhmBO4nIfaZkfNSApm1hZBzcvpNbSrXdcUBxu7lRvKsV5DnwszX7cnhLyVOW9yl1uigtRQ1yDANjA==", "dependencies": { "@azure/core-tracing": "^1.0.0", "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^1.4.0", - "@opentelemetry/core": "^1.9.0", - "@opentelemetry/instrumentation": "^0.35.0", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/instrumentation": "^0.41.2", "tslib": "^2.2.0" }, "engines": { @@ -503,9 +503,9 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", - "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", + "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -533,9 +533,9 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.13.0.tgz", - "integrity": "sha512-baU7QlFwKFat8zLUMzfLHTgcpdKpvUsGl05zKVRslKIb3iPB7TPudqDfkpaFf2YL5hv88joz/fyuuYJnzz7log==", + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", + "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -1149,99 +1149,112 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.1.tgz", - "integrity": "sha512-rsIev+dk1Vd8H1OKZhNhXycIVsMfeWJaeW3QUi1l4oIoGwQfJVbs1ZPZPHE5cglzyHOW1jQNStXf34UKaC6siA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.0.tgz", + "integrity": "sha512-qfBAS4W35+loOfbprBDS8nN0Eitl9wmuPE8GQLbwYj9Qj+COlLg57KECeXF8cgGnHkahrIkc3t6V6eFF8nhXQw==", "dev": true, "dependencies": { - "@cspell/dict-ada": "^4.0.1", - "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-ada": "^4.0.2", + "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.9", - "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-companies": "^3.0.19", + "@cspell/dict-cpp": "^5.0.4", "@cspell/dict-cryptocurrencies": "^3.0.1", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.5", - "@cspell/dict-dart": "^2.0.2", - "@cspell/dict-django": "^4.0.2", - "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-css": "^4.0.6", + "@cspell/dict-dart": "^2.0.3", + "@cspell/dict-django": "^4.1.0", + "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", - "@cspell/dict-elixir": "^4.0.2", - "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-elixir": "^4.0.3", + "@cspell/dict-en_us": "^4.3.6", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.0", - "@cspell/dict-fonts": "^3.0.1", + "@cspell/dict-filetypes": "^3.0.1", + "@cspell/dict-fonts": "^4.0.0", + "@cspell/dict-fsharp": "^1.0.0", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-golang": "^6.0.2", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.3", "@cspell/dict-html-symbol-entities": "^4.0.0", "@cspell/dict-java": "^5.0.5", "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", - "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.1", "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-npm": "^5.0.8", "@cspell/dict-php": "^4.0.1", - "@cspell/dict-powershell": "^5.0.1", - "@cspell/dict-public-licenses": "^2.0.2", - "@cspell/dict-python": "^4.0.2", + "@cspell/dict-powershell": "^5.0.2", + "@cspell/dict-public-licenses": "^2.0.3", + "@cspell/dict-python": "^4.1.5", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.1.6", - "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-software-terms": "^3.2.1", + "@cspell/dict-sql": "^2.1.1", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", "@cspell/dict-typescript": "^3.1.1", "@cspell/dict-vue": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=16" + } + }, + "node_modules/@cspell/cspell-json-reporter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.0.tgz", + "integrity": "sha512-8OheTVzwwfOQqPZe3Enbe1F7Y0djjGunk5K7aC5MyXc3BuIV7Cx13xWo2gfAjiHBRuO5lqg9qidEfp6NE33amg==", + "dev": true, + "dependencies": { + "@cspell/cspell-types": "7.0.0" + }, + "engines": { + "node": ">=16" } }, "node_modules/@cspell/cspell-pipe": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", - "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.0.tgz", + "integrity": "sha512-MmQeLyyS5rZ/VvRtHGOLFUcCF9zy01WpWYthLZB61o96HCokqtlN4BBBPLYNxrotFNA4syVy9Si/wTxsC9oTiA==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", - "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.0.tgz", + "integrity": "sha512-0YMM5SJY+XooOTEoo5+xuqTBLO87FP6QR8OBLBDeWNHvON9M4TpeAAN5K+IM0vMSFzgt1aSSMJNO0HSmxn17Yw==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", - "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.0.tgz", + "integrity": "sha512-b/Dee5lb362ODlEK+kQcUDJfCprDRUFWcddo5tyzsYm3ID08ll6+DzCtfRxf48isyX1tL7uBKMj/iIpAhRNu9Q==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/dict-ada": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", - "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.2.tgz", + "integrity": "sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==", "dev": true }, "node_modules/@cspell/dict-aws": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", - "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.0.tgz", + "integrity": "sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ==", "dev": true }, "node_modules/@cspell/dict-bash": { @@ -1251,15 +1264,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.9.tgz", - "integrity": "sha512-wSkVIJjk33Sm3LhieNv9TsSvUSeP0R/h8xx06NqbMYF43w9J8hZiMHlbB3FzaSOHRpXT5eBIJBVTeFbceZdiqg==", + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.19.tgz", + "integrity": "sha512-hO7rS4DhFA333qyvf89wIVoclCtXe/2sftY6aS0oMIH1bMZLjLx2B2sQJj6dCiu6gG/By1S9YZ0fXabiPk2Tkg==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.2.tgz", - "integrity": "sha512-Q0ZjfhrHHfm0Y1/7LMCq3Fne/bhiBeBogUw4TV1wX/1tg3m+5BtaW/7GiOzRk+rFsblVj3RFam59VJKMT3vSoQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", + "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -1275,27 +1288,33 @@ "dev": true }, "node_modules/@cspell/dict-css": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.5.tgz", - "integrity": "sha512-z5vw8nJSyKd6d3i5UmMNoVcAp0wxvs9OHWOmAeJKT9fO3tok02gK24VZhcJ0NJtiKdHQ2zRuzdfWl51wdAiY6A==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", + "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==", "dev": true }, "node_modules/@cspell/dict-dart": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", - "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.3.tgz", + "integrity": "sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==", + "dev": true + }, + "node_modules/@cspell/dict-data-science": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.10.tgz", + "integrity": "sha512-7ZsRCnW0f4Bdo6Cqq8V4gHr8K58h+MP8majcDeMNhpMFUPiiSnvKsDuG9V5jciI/0t+lptPrZwGGIVEDF4Kqtg==", "dev": true }, "node_modules/@cspell/dict-django": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.0.2.tgz", - "integrity": "sha512-L0Yw6+Yh2bE9/FAMG4gy9m752G4V8HEBjEAGeRIQ9qvxDLR9yD6dPOtgEFTjv7SWlKSrLb9wA/W3Q2GKCOusSg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", + "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==", "dev": true }, "node_modules/@cspell/dict-docker": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", - "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.7.tgz", + "integrity": "sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==", "dev": true }, "node_modules/@cspell/dict-dotnet": { @@ -1305,15 +1324,15 @@ "dev": true }, "node_modules/@cspell/dict-elixir": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.2.tgz", - "integrity": "sha512-/YeHlpZ1pE9VAyxp3V0xyUPapNyC61WwFuw2RByeoMqqYaIfS3Hw+JxtimOsAKVhUvgUH58zyKl5K5Q6FqgCpw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", + "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==", "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.2.tgz", - "integrity": "sha512-o8xtHDLPNzW6hK5b1TaDTWt25vVi9lWlL6/dZ9YoS+ZMj+Dy/yuXatqfOgeGyU3a9+2gxC0kbr4oufMUQXI2mQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.6.tgz", + "integrity": "sha512-odhgsjNZI9BtEOJdvqfAuv/3yz5aB1ngfBNaph7WSnYVt//9e3fhrElZ6/pIIkoyuGgeQPwz1fXt+tMgcnLSEQ==", "dev": true }, "node_modules/@cspell/dict-en-common-misspellings": { @@ -1329,15 +1348,21 @@ "dev": true }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.0.tgz", - "integrity": "sha512-Fiyp0z5uWaK0d2TfR9GMUGDKmUMAsOhGD5A0kHoqnNGswL2iw0KB0mFBONEquxU65fEnQv4R+jdM2d9oucujuA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", + "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==", "dev": true }, "node_modules/@cspell/dict-fonts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", - "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz", + "integrity": "sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==", + "dev": true + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.0.tgz", + "integrity": "sha512-dHPkMHwW4dWv3Lv9VWxHuVm4IylqvcfRBSnZ7usJTRThraetSVrOPIJwr6UJh7F5un/lGJx2lxWVApf2WQaB/A==", "dev": true }, "node_modules/@cspell/dict-fullstack": { @@ -1359,9 +1384,9 @@ "dev": true }, "node_modules/@cspell/dict-golang": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.1.tgz", - "integrity": "sha512-Z19FN6wgg2M/A+3i1O8qhrGaxUUGOW8S2ySN0g7vp4HTHeFmockEPwYx7gArfssNIruw60JorZv+iLJ6ilTeow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", + "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==", "dev": true }, "node_modules/@cspell/dict-haskell": { @@ -1401,9 +1426,9 @@ "dev": true }, "node_modules/@cspell/dict-lorem-ipsum": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", - "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz", + "integrity": "sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==", "dev": true }, "node_modules/@cspell/dict-lua": { @@ -1419,9 +1444,9 @@ "dev": true }, "node_modules/@cspell/dict-npm": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.5.tgz", - "integrity": "sha512-eirZm4XpJNEcbmLGIwI2qXdRRlCKwEsH9mT3qCUytmbj6S6yn63F+8bShMW/yQBedV7+GXq9Td+cJdqiVutOiA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.8.tgz", + "integrity": "sha512-KuqH8tEsFD6DPKqKwIfWr9E+admE3yghaC0AKXG8jPaf77N0lkctKaS3dm0oxWUXkYKA/eXj6LCtz3VcTyxFPg==", "dev": true }, "node_modules/@cspell/dict-php": { @@ -1431,22 +1456,25 @@ "dev": true }, "node_modules/@cspell/dict-powershell": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.1.tgz", - "integrity": "sha512-lLl+syWFgfv2xdsoxHfPIB2FGkn//XahCIKcRaf52AOlm1/aXeaJN579B9HCpvM7wawHzMqJ33VJuL/vb6Lc4g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz", + "integrity": "sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==", "dev": true }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", - "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.3.tgz", + "integrity": "sha512-JSLEdpEYufQ1H+93UHi+axlqQm1fhgK6kpdLHp6uPHu//CsvETcqNVawjB+qOdI/g38JTMw5fBqSd0aGNxa6Dw==", "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.0.2.tgz", - "integrity": "sha512-w1jSWDR1CkO23cZFbSYgnD/ZqknDZSVCI1AOE6sSszOJR8shmBkV3lMBYd+vpLsWhmkLLBcZTXDkiqFLXDGowQ==", - "dev": true + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.5.tgz", + "integrity": "sha512-wWUWyHdyJtx5iG6Fz9rBQ17BtdpEsB17vmutao+gixQD28Jzb6XoLgDQ6606M0RnFjBSFhs5iT4CJBzlD2Kq6g==", + "dev": true, + "dependencies": { + "@cspell/dict-data-science": "^1.0.0" + } }, "node_modules/@cspell/dict-r": { "version": "2.0.1", @@ -1473,15 +1501,15 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.1.6.tgz", - "integrity": "sha512-w46+pIMRVtrDuTZXK/YxDP5NL5yVoX0ImEPO0s9WbxdyyfhzAF3sGYHBGN/50OGLHExcqe6Idb9feoRC9mCLxw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.1.tgz", + "integrity": "sha512-+QXmyoONVc/3aNgKW+0F0u3XUCRTfNRkWKLZQA78i+9fOfde8ZT4JmROmZgRveH/MxD4n6pNFceIRcYI6C8WuQ==", "dev": true }, "node_modules/@cspell/dict-sql": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", - "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.1.tgz", + "integrity": "sha512-v1mswi9NF40+UDUMuI148YQPEQvWjac72P6ZsjlRdLjEiQEEMEsTQ+zlkIdnzC9QCNyJaqD5Liq9Mn78/8Zxtw==", "dev": true }, "node_modules/@cspell/dict-svelte": { @@ -1509,24 +1537,24 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", - "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.0.tgz", + "integrity": "sha512-GRSJvdQvVOC0y7Qla8eg6LLe8p8WnbnHLabGJGsqYfXgtfkUFev9v65kMybQSJt9qhDtGCRw6EN1UyaeeEtavQ==", "dev": true, "dependencies": { - "import-meta-resolve": "^2.2.2" + "import-meta-resolve": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/@cspell/strong-weak-map": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", - "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.0.tgz", + "integrity": "sha512-DT1R30i3V7aJIGLt7x1igaMLHhYSFv6pgc9gNwXvZWFl1xm/f7Jx07GPXKKKhwwXd4vy7G5rhwo63F4Pt9i8Ng==", "dev": true, "engines": { - "node": ">=14.6" + "node": ">=16" } }, "node_modules/@cspotcode/source-map-support": { @@ -1567,18 +1595,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1599,9 +1627,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1781,16 +1809,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", - "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", "slash": "^3.0.0" }, "engines": { @@ -1798,15 +1826,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", - "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.1", - "@jest/reporters": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1815,20 +1843,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.1", - "jest-haste-map": "^29.6.1", - "jest-message-util": "^29.6.1", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-resolve-dependencies": "^29.6.1", - "jest-runner": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", - "jest-watcher": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1845,37 +1873,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", - "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.1", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.6.1" + "jest-mock": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", - "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", "dev": true, "dependencies": { - "expect": "^29.6.1", - "jest-snapshot": "^29.6.1" + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", - "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -1885,47 +1913,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", - "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.1", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1" + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", - "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/expect": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", "@jest/types": "^29.6.1", - "jest-mock": "^29.6.1" + "jest-mock": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", - "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1939,9 +1967,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1986,12 +2014,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", - "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", "dev": true, "dependencies": { - "@jest/console": "^29.6.1", + "@jest/console": "^29.6.2", "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2001,14 +2029,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", - "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.1", + "@jest/test-result": "^29.6.2", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "slash": "^3.0.0" }, "engines": { @@ -2016,9 +2044,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", - "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2029,9 +2057,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2152,15 +2180,15 @@ } }, "node_modules/@octokit/auth-app": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.6.tgz", - "integrity": "sha512-zWqWTn88LcOUBALRMKl6yA0PqXWZLI2OXN9EaYK63f4E84SeW7dNefFx1P13XnQceTnc8O3Z9B537foUbjmG+A==", - "dependencies": { - "@octokit/auth-oauth-app": "^6.0.1", - "@octokit/auth-oauth-user": "^3.0.1", - "@octokit/request": "^7.0.0", - "@octokit/request-error": "^4.0.2", - "@octokit/types": "^10.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.0.tgz", + "integrity": "sha512-OKct7Rukf3g9DjpzcpdacQsdmd6oPrJ7fZND22JkjzhDvfhttUOnmh+qPS4kHhaNNyTxqSThnfrUWvkqNLd1nw==", + "dependencies": { + "@octokit/auth-oauth-app": "^7.0.0", + "@octokit/auth-oauth-user": "^4.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.3.1", "lru-cache": "^10.0.0", "universal-github-app-jwt": "^1.1.1", @@ -2170,32 +2198,6 @@ "node": ">= 18" } }, - "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/auth-app/node_modules/@octokit/request-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", - "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", - "dependencies": { - "@octokit/types": "^10.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/auth-app/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, "node_modules/@octokit/auth-app/node_modules/lru-cache": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", @@ -2205,14 +2207,14 @@ } }, "node_modules/@octokit/auth-oauth-app": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.1.tgz", - "integrity": "sha512-+1j7vRLHXHD4f0p2l/EXUmxGOLOtOZdg5vkW/UapeeNs17f4GRVcgeKBcNkViLDvjk85iRZ/CcIM9lizo4k8ew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.0.0.tgz", + "integrity": "sha512-8JvJEXGoEqrbzLwt3SwIUvkDd+1wrM8up0KawvDIElB8rbxPbvWppGO0SLKAWSJ0q8ILcVq+mWck6pDcZ3a9KA==", "dependencies": { - "@octokit/auth-oauth-device": "^5.0.0", - "@octokit/auth-oauth-user": "^3.0.0", - "@octokit/request": "^7.0.0", - "@octokit/types": "^10.0.0", + "@octokit/auth-oauth-device": "^6.0.0", + "@octokit/auth-oauth-user": "^4.0.0", + "@octokit/request": "^8.0.2", + "@octokit/types": "^11.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" @@ -2221,55 +2223,29 @@ "node": ">= 18" } }, - "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/auth-oauth-app/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, "node_modules/@octokit/auth-oauth-device": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-5.0.2.tgz", - "integrity": "sha512-XC7Bveiu0d0ywx4wtIezD86g+67xeOkmiM3Wjod27K+B46OslP86bb6nhdd07gFAaReybgBzSyDORl1DVJuXGQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.0.0.tgz", + "integrity": "sha512-Zgf/LKhwWk54rJaTGYVYtbKgUty+ouil6VQeRd+pCw7Gd0ECoSWaZuHK6uDGC/HtnWHjpSWFhzxPauDoHcNRtg==", "dependencies": { - "@octokit/oauth-methods": "^3.0.1", - "@octokit/request": "^7.0.0", - "@octokit/types": "^10.0.0", + "@octokit/oauth-methods": "^4.0.0", + "@octokit/request": "^8.0.0", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" }, "engines": { "node": ">= 18" } }, - "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/auth-oauth-device/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, "node_modules/@octokit/auth-oauth-user": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.1.tgz", - "integrity": "sha512-LURRNgEXTlVKyXgm7PUjflww1QH4o9hdd/niCJxMw0blFLURZ/Ado9r5VEDPi0SigsKmCH92eaMoN2CAzIeA/g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.0.0.tgz", + "integrity": "sha512-VOm5aIkVGHaOhIvsF/4YmSjoYDzzrKbbYkdSEO0KqHK7I8SlO3ZndSikQ1fBlNPUEH0ve2BOTxLrVvI1qBf9/Q==", "dependencies": { - "@octokit/auth-oauth-device": "^5.0.2", - "@octokit/oauth-methods": "^3.0.1", - "@octokit/request": "^7.0.0", - "@octokit/types": "^10.0.0", + "@octokit/auth-oauth-device": "^6.0.0", + "@octokit/oauth-methods": "^4.0.0", + "@octokit/request": "^8.0.2", + "@octokit/types": "^11.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" }, @@ -2277,95 +2253,37 @@ "node": ">= 18" } }, - "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/auth-oauth-user/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, "node_modules/@octokit/auth-token": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz", - "integrity": "sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==", - "dependencies": { - "@octokit/types": "^7.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", - "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz", + "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core/node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core/node_modules/@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "node_modules/@octokit/core/node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core/node_modules/@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "dependencies": { - "@octokit/openapi-types": "^17.2.0" + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-8.0.1.tgz", - "integrity": "sha512-tVviBdPuf3kcCiIvXYDJg7NAJrkTh8QEnc+UCybknKdEBCjIi7uQbFX3liQrpk1m5PjwC7fUJg08DYZ4F+l1RQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", + "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", "dependencies": { - "@octokit/types": "^10.0.0", + "@octokit/types": "^11.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, @@ -2373,80 +2291,17 @@ "node": ">= 18" } }, - "node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, "node_modules/@octokit/graphql": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.1.tgz", - "integrity": "sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==", - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql/node_modules/@octokit/endpoint/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/graphql/node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz", + "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql/node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "node": ">= 18" } }, "node_modules/@octokit/oauth-authorization-url": { @@ -2458,134 +2313,83 @@ } }, "node_modules/@octokit/oauth-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-3.0.2.tgz", - "integrity": "sha512-BrPZAz8goFkToeZCcw+uoNCt+j0wA7DHwPN69y71Ov6VE5kaHtn5576ZTjLTzkTcxoWqxKcPGoGyBE4n5FLbdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.0.0.tgz", + "integrity": "sha512-dqy7BZLfLbi3/8X8xPKUKZclMEK9vN3fK5WF3ortRvtplQTszFvdAGbTo71gGLO+4ZxspNiLjnqdd64Chklf7w==", "dependencies": { "@octokit/oauth-authorization-url": "^6.0.2", - "@octokit/request": "^7.0.0", - "@octokit/request-error": "^4.0.1", - "@octokit/types": "^10.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "btoa-lite": "^1.0.0" }, "engines": { "node": ">= 18" } }, - "node_modules/@octokit/oauth-methods/node_modules/@octokit/openapi-types": { + "node_modules/@octokit/openapi-types": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, - "node_modules/@octokit/oauth-methods/node_modules/@octokit/request-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", - "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", - "dependencies": { - "@octokit/types": "^10.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, + "node_modules/@octokit/plugin-paginate-graphql": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.0.tgz", + "integrity": "sha512-7HcYW5tP7/Z6AETAPU14gp5H5KmCPT3hmJrS/5tO7HIgbwenYmgw4OY9Ma54FDySuxMwD+wsJlxtuGWwuZuItA==", "engines": { "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" } }, - "node_modules/@octokit/oauth-methods/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "node_modules/@octokit/plugin-paginate-rest": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", + "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/types": "^11.0.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=5" } }, - "node_modules/@octokit/openapi-types": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", - "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" - }, - "node_modules/@octokit/plugin-paginate-graphql": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-3.0.0.tgz", - "integrity": "sha512-iDx9ubpdt/Bmf+IUR+W3nzoeAYFU+uFlbJdoEP4UaBtME4jeNlBRfwk+LXbDieNKkP75rFJ0XaOBWxY/r/6+hw==", + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", "engines": { "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=5" } }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", + "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "dependencies": { - "@octokit/openapi-types": "^17.2.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", - "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", - "dependencies": { - "@octokit/types": "^9.2.3", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "dependencies": { - "@octokit/openapi-types": "^17.2.0" + "@octokit/core": ">=5" } }, "node_modules/@octokit/request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-7.0.1.tgz", - "integrity": "sha512-R227pDk1fuQXuX17LU8ChzFyTOe/myHvvceBF3C/fFath+NlsVkHICOlvEbx+9EgYUl4uDH7VqTby00menlM8Q==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", + "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", "dependencies": { - "@octokit/endpoint": "^8.0.1", - "@octokit/request-error": "^4.0.1", - "@octokit/types": "^10.0.0", + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, @@ -2594,42 +2398,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/request-error/node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "node_modules/@octokit/request/node_modules/@octokit/request-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", - "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", + "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", "dependencies": { - "@octokit/types": "^10.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -2637,39 +2410,26 @@ "node": ">= 18" } }, - "node_modules/@octokit/request/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, "node_modules/@octokit/rest": { - "version": "19.0.13", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", - "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", + "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^9.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" - }, "node_modules/@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", + "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", "dependencies": { - "@octokit/openapi-types": "^13.11.0" + "@octokit/openapi-types": "^18.0.0" } }, "node_modules/@opentelemetry/api": { @@ -2681,11 +2441,11 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.12.0.tgz", - "integrity": "sha512-4DWYNb3dLs2mSCGl65jY3aEgbvPWSHVQV/dmDWiYeWUrMakZQFcymqZOSUNZO0uDrEJoxMu8O5tZktX6UKFwag==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz", + "integrity": "sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/semantic-conventions": "1.15.2" }, "engines": { "node": ">=14" @@ -2695,12 +2455,14 @@ } }, "node_modules/@opentelemetry/instrumentation": { - "version": "0.35.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.35.1.tgz", - "integrity": "sha512-EZsvXqxenbRTSNsft6LDcrT4pjAiyZOx3rkDNeqKpwZZe6GmZtsXaZZKuDkJtz9fTjOGjDHjZj9/h80Ya9iIJw==", - "dependencies": { - "require-in-the-middle": "^5.0.3", - "semver": "^7.3.2", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz", + "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==", + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.1", "shimmer": "^1.2.1" }, "engines": { @@ -2711,12 +2473,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.12.0.tgz", - "integrity": "sha512-gunMKXG0hJrR0LXrqh7BVbziA/+iJBL3ZbXCXO64uY+SrExkwoyJkpiq9l5ismkGF/A20mDEV7tGwh+KyPw00Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz", + "integrity": "sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw==", "dependencies": { - "@opentelemetry/core": "1.12.0", - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" }, "engines": { "node": ">=14" @@ -2726,13 +2488,13 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.12.0.tgz", - "integrity": "sha512-pfCOB3tNDlYVoWuz4D7Ji+Jmy9MHnATWHVpkERdCEiwUGEZ+4IvNPXUcPc37wJVmMpjGLeaWgPPrie0KIpWf1A==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz", + "integrity": "sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ==", "dependencies": { - "@opentelemetry/core": "1.12.0", - "@opentelemetry/resources": "1.12.0", - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" }, "engines": { "node": ">=14" @@ -2742,9 +2504,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz", - "integrity": "sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz", + "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw==", "engines": { "node": ">=14" } @@ -2800,9 +2562,9 @@ } }, "node_modules/@primer/octicons": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.4.0.tgz", - "integrity": "sha512-92eXALm3ucZkzqpJmJbC+fR9ldiuNd4W4s2MZQNQIBahpg14emJ+I9fdHqCummFlfgyohLzXn++7rz0NlkqAJA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.5.0.tgz", + "integrity": "sha512-b3IBp3EmzLc/YMw3xdqy7Lg8CgFObYaWegPntoKO1bZLZ4sAG5PRMPp36rj4TF1sDHbNufhGMvdCCM5VdS3mPQ==", "dependencies": { "object-assign": "^4.1.1" } @@ -3119,15 +2881,15 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", + "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", "dev": true }, "node_modules/@types/memory-cache": { @@ -3157,9 +2919,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz", - "integrity": "sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==" + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -3322,12 +3084,6 @@ "node": ">=12" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "node_modules/@types/pug": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", @@ -3368,6 +3124,11 @@ "@types/node": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", + "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" + }, "node_modules/@types/simple-oauth2": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.4.tgz", @@ -3389,9 +3150,9 @@ } }, "node_modules/@types/validator": { - "version": "13.7.17", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", - "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==", + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", + "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==", "dev": true }, "node_modules/@types/yargs": { @@ -3410,23 +3171,21 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz", - "integrity": "sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.0.tgz", + "integrity": "sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.0", - "@typescript-eslint/scope-manager": "6.0.0", - "@typescript-eslint/type-utils": "6.0.0", - "@typescript-eslint/utils": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/type-utils": "6.4.0", + "@typescript-eslint/utils": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.5.0", + "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { @@ -3447,15 +3206,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz", - "integrity": "sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz", + "integrity": "sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.0.0", - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/typescript-estree": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4" }, "engines": { @@ -3475,13 +3234,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz", - "integrity": "sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz", + "integrity": "sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0" + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3492,13 +3251,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz", - "integrity": "sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.0.tgz", + "integrity": "sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.0.0", - "@typescript-eslint/utils": "6.0.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/utils": "6.4.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3519,9 +3278,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz", - "integrity": "sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.0.tgz", + "integrity": "sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3532,17 +3291,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz", - "integrity": "sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz", + "integrity": "sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.5.0", + "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { @@ -3559,19 +3318,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz", - "integrity": "sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.0.tgz", + "integrity": "sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.3.0", - "@types/json-schema": "^7.0.11", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "6.0.0", - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/typescript-estree": "6.0.0", - "eslint-scope": "^5.1.1", - "semver": "^7.5.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "semver": "^7.5.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3585,12 +3343,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz", - "integrity": "sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz", + "integrity": "sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/types": "6.4.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3617,7 +3375,6 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3625,6 +3382,14 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -3654,19 +3419,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3756,23 +3508,23 @@ } }, "node_modules/applicationinsights": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.0.tgz", - "integrity": "sha512-/vV5X6M4TlRA5NxNZAdCE0gukzfK24mb3z18D5Kl/CyIfSVIkafsIji3mK+Zi5q+7dn6H1CkFazlcnLf40anHw==", - "dependencies": { - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "1.10.1", - "@azure/core-util": "1.2.0", - "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.3", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.1.tgz", + "integrity": "sha512-N6uh3Di0uJo2vVCkBLqawgPGrkY2o1L3l7KouDeFFSmgUvZnKmoYWPKkMOUmNcKYIplY2Xb0bpU5T2Ht3ofdRg==", + "dependencies": { + "@azure/core-auth": "^1.5.0", + "@azure/core-rest-pipeline": "1.12.0", + "@azure/core-util": "1.4.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", "@microsoft/applicationinsights-web-snippet": "^1.0.1", - "@opentelemetry/api": "^1.0.4", - "@opentelemetry/core": "^1.12.0", - "@opentelemetry/sdk-trace-base": "^1.12.0", - "@opentelemetry/semantic-conventions": "^1.12.0", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/sdk-trace-base": "^1.15.2", + "@opentelemetry/semantic-conventions": "^1.15.2", "cls-hooked": "^4.2.2", "continuation-local-storage": "^3.2.1", - "diagnostic-channel": "1.1.0", - "diagnostic-channel-publishers": "1.0.6" + "diagnostic-channel": "1.1.1", + "diagnostic-channel-publishers": "1.0.7" }, "engines": { "node": ">=8.0.0" @@ -3828,15 +3580,6 @@ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async-hook-jl": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", @@ -3906,12 +3649,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", - "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", + "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.1", + "@jest/transform": "^29.6.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -4355,6 +4098,33 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", + "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", + "dev": true, + "dependencies": { + "chalk": "^5.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -4381,17 +4151,7 @@ "node_modules/cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, "node_modules/clear-module": { "version": "4.1.2", @@ -4410,15 +4170,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate": { @@ -4480,6 +4243,23 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/cls-hooked": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz", @@ -4555,9 +4335,9 @@ "dev": true }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/combined-stream": { @@ -4572,9 +4352,9 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { "node": ">=14" @@ -4651,20 +4431,22 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, "node_modules/configstore/node_modules/write-file-atomic": { @@ -4822,142 +4604,168 @@ } }, "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cspell": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.1.tgz", - "integrity": "sha512-gyCtpkOpwI/TGibbtIgMBFnAUUp2hnYdvW/9Ky4RcneHtLH0+V/jUEbZD8HbRKz0GVZ6mhKWbNRSEyP9p3Cejw==", - "dev": true, - "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/dynamic-import": "6.31.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cspell-gitignore": "6.31.1", - "cspell-glob": "6.31.1", - "cspell-io": "6.31.1", - "cspell-lib": "6.31.1", - "fast-glob": "^3.2.12", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.0.tgz", + "integrity": "sha512-E8wQP30bTLROJsSNwYnhhRUdzVa4vQo6zILv7PqgTCSaveg8Af1HEh4ocRPRhppRgIXDpccG27+ATlpEzxiPGQ==", + "dev": true, + "dependencies": { + "@cspell/cspell-json-reporter": "7.0.0", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "@cspell/dynamic-import": "7.0.0", + "chalk": "^5.3.0", + "chalk-template": "^1.1.0", + "commander": "^10.0.1", + "cspell-gitignore": "7.0.0", + "cspell-glob": "7.0.0", + "cspell-io": "7.0.0", + "cspell-lib": "7.0.0", + "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "imurmurhash": "^0.1.4", - "semver": "^7.3.8", - "strip-ansi": "^6.0.1", + "get-stdin": "^9.0.0", + "semver": "^7.5.4", + "strip-ansi": "^7.1.0", "vscode-uri": "^3.0.7" }, "bin": { - "cspell": "bin.js", + "cspell": "bin.mjs", "cspell-esm": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, "node_modules/cspell-dictionary": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", - "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.0.tgz", + "integrity": "sha512-CYB02vB870JfCtmi4Njuzw1nCjbyRCjoqlsAQgHkhRSevRKcjFrK3+XsBhNA3Zo4ek4P35+oS/I4vMOHu6cdCg==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "cspell-trie-lib": "6.31.1", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "cspell-trie-lib": "7.0.0", "fast-equals": "^4.0.3", "gensequence": "^5.0.2" }, "engines": { - "node": ">=14" + "node": ">=16" } }, + "node_modules/cspell-dictionary/node_modules/fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "dev": true + }, "node_modules/cspell-gitignore": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.1.tgz", - "integrity": "sha512-PAcmjN6X89Z8qgjem6HYb+VmvVtKuc+fWs4sk21+jv2MiLk23Bkp+8slSaIDVR//58fxJkMx17PHyo2cDO/69A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.0.tgz", + "integrity": "sha512-9VVLuiVhntXO/It3K0nTDhxbPPc2nItvGLymItfUudfB0ZqgzBaomdoYZzXrcNOITjYiBXWCPuVOXLbyoL0DjQ==", "dev": true, "dependencies": { - "cspell-glob": "6.31.1", + "cspell-glob": "7.0.0", "find-up": "^5.0.0" }, "bin": { "cspell-gitignore": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-glob": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.1.tgz", - "integrity": "sha512-ygEmr5hgE4QtO5+L3/ihfMKBhPipbapfS22ilksFSChKMc15Regds0z+z/1ZBoe+OFAPneQfIuBxMwQ/fB00GQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.0.tgz", + "integrity": "sha512-Wl47kChIuSiuStofVSPdgvwi8BRD4tN03j+yhpJ1q+lWT023ctFacZy+Lc+L6nxaTUriDy5ET+UoooPMJ2PskA==", "dev": true, "dependencies": { "micromatch": "^4.0.5" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-grammar": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", - "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.0.tgz", + "integrity": "sha512-0k1qVvxMNwP4WXX1zIp3Ub+RQnUzjiBtB+BO4Lprnkp6/JuRndpBRDrXBsqNZBVzZ+JjyRSU1elNSN6/nudXvQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1" + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0" }, "bin": { "cspell-grammar": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-io": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.1.tgz", - "integrity": "sha512-deZcpvTYY/NmLfOdOtzcm+nDvJZozKmj4TY3pPpX0HquPX0A/w42bFRT/zZNmRslFl8vvrCZZUog7SOc6ha3uA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.0.tgz", + "integrity": "sha512-pGf+XlMcOxZfO7NIwJYmje8D30OEUt2Vb7cfZ2nazdFf9/NfiZpYp3JHOT+n53DhbIXTfdmojXo5bVezPXA48g==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "6.31.1", - "node-fetch": "^2.6.9" + "@cspell/cspell-service-bus": "7.0.0", + "node-fetch": "^2.6.12" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/cspell-lib": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.1.tgz", - "integrity": "sha512-KgSiulbLExY+z2jGwkO77+aAkyugsPAw7y07j3hTQLpd+0esPCZqrmbo2ItnkvkDNd/c34PqQCr7/044/rz8gw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.0.tgz", + "integrity": "sha512-CJAa7uV4hrm8OTnWdFPONSUP1Dp7J7fVhKu15aTrpNASUMAHe5YWqFqInCg+0+XhdRpGGYjQKhd+khsXL5a+bg==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "6.31.1", - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "@cspell/strong-weak-map": "6.31.1", + "@cspell/cspell-bundled-dicts": "7.0.0", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "@cspell/strong-weak-map": "7.0.0", "clear-module": "^4.1.2", "comment-json": "^4.2.3", - "configstore": "^5.0.1", + "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "6.31.1", - "cspell-glob": "6.31.1", - "cspell-grammar": "6.31.1", - "cspell-io": "6.31.1", - "cspell-trie-lib": "6.31.1", - "fast-equals": "^4.0.3", - "find-up": "^5.0.0", + "cspell-dictionary": "7.0.0", + "cspell-glob": "7.0.0", + "cspell-grammar": "7.0.0", + "cspell-io": "7.0.0", + "cspell-trie-lib": "7.0.0", + "fast-equals": "^5.0.1", + "find-up": "^6.3.0", "gensequence": "^5.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", @@ -4966,78 +4774,207 @@ "vscode-uri": "^3.0.7" }, "engines": { - "node": ">=14.6" + "node": ">=16" } }, - "node_modules/cspell-trie-lib": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", - "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", + "node_modules/cspell-lib/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "gensequence": "^5.0.2" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=14" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/cspell-lib/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=6.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser": { + "node_modules/cspell-lib/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=14.16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-browser-id": { + "node_modules/cspell-lib/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-lib/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/cspell-lib/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cspell-trie-lib": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.0.tgz", + "integrity": "sha512-mopXyfjNRVuYbrZcbBcLwOMrWeyTezh4w8zy+RywUmsF6IW6/HM2DkfE2BmH1IyE9af29lgQqdB5eDbJLWrP5A==", + "dev": true, + "dependencies": { + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "gensequence": "^5.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/cspell/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cspell/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cspell/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", @@ -5211,29 +5148,21 @@ } }, "node_modules/diagnostic-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.0.tgz", - "integrity": "sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.1.tgz", + "integrity": "sha512-r2HV5qFkUICyoaKlBEpLKHjxMXATUf/l+h8UZPGBHGLy4DDiY2sOLcIctax4eRnTw5wH2jTMExLntGPJ8eOJxw==", "dependencies": { - "semver": "^5.3.0" + "semver": "^7.5.3" } }, "node_modules/diagnostic-channel-publishers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.6.tgz", - "integrity": "sha512-RE5AP4JmEm/CV06gOyFdgWWm3gMNOoXulod2mq4ysiz9s77ZhHb1P1DGrfePHjNOmgvWglhegmj5q8DNtjRrEg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.7.tgz", + "integrity": "sha512-SEECbY5AiVt6DfLkhkaHNeshg1CogdLLANA8xlG/TKvS+XUgvIKl7VspJGYiEdL5OUyzMVnr7o0AwB7f+/Mjtg==", "peerDependencies": { "diagnostic-channel": "*" } }, - "node_modules/diagnostic-channel/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -5282,15 +5211,18 @@ "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" }, "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, "dependencies": { "is-obj": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dotenv": { @@ -5428,27 +5360,27 @@ } }, "node_modules/eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5458,7 +5390,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -5470,7 +5401,6 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -5484,9 +5414,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -5569,23 +5499,14 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5593,15 +5514,11 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5609,19 +5526,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", @@ -5660,15 +5568,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5681,7 +5580,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -5690,15 +5589,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5716,6 +5606,12 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5757,17 +5653,17 @@ } }, "node_modules/expect": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", - "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.1", + "@jest/expect-utils": "^29.6.2", "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1" + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5964,15 +5860,18 @@ "dev": true }, "node_modules/fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6284,12 +6183,12 @@ } }, "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6356,9 +6255,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6406,12 +6305,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -6629,6 +6522,17 @@ "node": ">=4" } }, + "node_modules/import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -6649,9 +6553,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", "dev": true, "funding": { "type": "github", @@ -6667,15 +6571,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -7034,17 +6929,17 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -7062,9 +6957,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -7075,15 +6970,15 @@ } }, "node_modules/jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", - "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", + "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.1", + "@jest/core": "^29.6.2", "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.6.1" + "jest-cli": "^29.6.2" }, "bin": { "jest": "bin/jest.js" @@ -7114,28 +7009,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", - "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", + "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/expect": "^29.6.1", - "@jest/test-result": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.1", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", + "jest-each": "^29.6.2", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", "p-limit": "^3.1.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7145,21 +7040,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", - "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", + "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", "dev": true, "dependencies": { - "@jest/core": "^29.6.1", - "@jest/test-result": "^29.6.1", + "@jest/core": "^29.6.2", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-config": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -7179,31 +7074,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", - "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", + "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.1", + "@jest/test-sequencer": "^29.6.2", "@jest/types": "^29.6.1", - "babel-jest": "^29.6.1", + "babel-jest": "^29.6.2", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.1", - "jest-environment-node": "^29.6.1", + "jest-circus": "^29.6.2", + "jest-environment-node": "^29.6.2", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-runner": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7224,15 +7119,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", - "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7251,33 +7146,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", - "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", + "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.6.1", - "pretty-format": "^29.6.1" + "jest-util": "^29.6.2", + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", - "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", + "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1" + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7293,9 +7188,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", - "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", + "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", @@ -7305,8 +7200,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7333,37 +7228,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", - "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", + "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", - "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", + "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.1", + "jest-diff": "^29.6.2", "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", - "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", + "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -7372,7 +7267,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -7381,14 +7276,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", - "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", + "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.6.1" + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7421,17 +7316,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", - "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", + "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -7441,43 +7336,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", - "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", + "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.1" + "jest-snapshot": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", - "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", + "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", "dev": true, "dependencies": { - "@jest/console": "^29.6.1", - "@jest/environment": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/environment": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.1", - "jest-haste-map": "^29.6.1", - "jest-leak-detector": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-resolve": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-util": "^29.6.1", - "jest-watcher": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-environment-node": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-leak-detector": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-resolve": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-util": "^29.6.2", + "jest-watcher": "^29.6.2", + "jest-worker": "^29.6.2", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -7486,17 +7381,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", - "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", + "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", - "@jest/globals": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/globals": "^29.6.2", "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", @@ -7504,13 +7399,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-mock": "^29.6.1", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -7519,9 +7414,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", - "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", + "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -7529,21 +7424,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/expect-utils": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", - "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.1", + "expect": "^29.6.2", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.1", + "jest-diff": "^29.6.2", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "semver": "^7.5.3" }, "engines": { @@ -7551,9 +7445,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", - "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", @@ -7568,9 +7462,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", - "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", + "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", @@ -7578,7 +7472,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7597,18 +7491,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", - "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", + "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.1", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "string-length": "^4.0.1" }, "engines": { @@ -7616,13 +7510,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", - "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", + "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7941,39 +7835,36 @@ } }, "node_modules/lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", + "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -7982,10 +7873,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "node_modules/lint-staged/node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -8006,9 +7906,9 @@ } }, "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", - "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { "node": ">=14.18.0" @@ -8093,22 +7993,20 @@ } }, "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "wrap-ansi": "^8.1.0" }, "engines": { - "node": "^14.13.1 || >=16.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" @@ -8119,65 +8017,6 @@ } } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/listr2/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8216,81 +8055,76 @@ "dev": true }, "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/log-update/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==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/long": { @@ -8333,37 +8167,28 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", + "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==", "engines": { "node": ">=12" } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -8741,12 +8566,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -8770,9 +8589,9 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -8833,9 +8652,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", - "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==", + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", + "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", "engines": { "node": ">=6.0.0" } @@ -9001,21 +8820,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -9230,13 +9034,13 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "node_modules/pg": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", - "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.2.tgz", + "integrity": "sha512-l4rmVeV8qTIrrPrIR3kZQqBgSN93331s9i6wiUiLOSk0Q7PmUxZD/m1rQI622l3NfqBby9Ar5PABfS/SulfieQ==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.1", + "pg-connection-string": "^2.6.2", "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", @@ -9264,9 +9068,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", - "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "node_modules/pg-escape": { "version": "0.2.0", @@ -9480,9 +9284,9 @@ } }, "node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -9507,9 +9311,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.0", @@ -9838,16 +9642,16 @@ } }, "node_modules/require-in-the-middle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", - "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", "resolve": "^1.22.1" }, "engines": { - "node": ">=6" + "node": ">=8.6.0" } }, "node_modules/resolve": { @@ -9909,16 +9713,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/reusify": { @@ -10015,15 +9822,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -10245,9 +10043,9 @@ } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { "node": ">=12" @@ -10333,9 +10131,9 @@ } }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" @@ -10384,9 +10182,9 @@ } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -10507,12 +10305,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -10859,15 +10651,18 @@ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" }, "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "dependencies": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/universal-github-app-jwt": { @@ -10990,9 +10785,9 @@ "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { "node": ">= 0.10" } @@ -11105,49 +10900,59 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -11169,12 +10974,15 @@ } }, "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xml": { @@ -11357,11 +11165,12 @@ } }, "@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", "requires": { "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", "tslib": "^2.2.0" } }, @@ -11440,20 +11249,19 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", - "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.12.0.tgz", + "integrity": "sha512-+MnSB0vGZjszSzr5AW8z93/9fkDu2RLtWmAN8gskURq7EW2sSwqy8jZa0V26rjuBVkwhdA3Hw8z3VWoeBUOw+A==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", "form-data": "^4.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" } }, "@azure/core-tracing": { @@ -11465,9 +11273,9 @@ } }, "@azure/core-util": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", - "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.4.0.tgz", + "integrity": "sha512-eGAyJpm3skVQoLiRqm/xPa+SXi/NPDdSHMxbRAz2lSprd+Zs+qrpQGQQ2VQ3Nttu+nSZR4XoYQC71LbEI7jsig==", "requires": { "@azure/abort-controller": "^1.0.0", "tslib": "^2.2.0" @@ -11519,9 +11327,9 @@ } }, "@azure/identity": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.3.tgz", - "integrity": "sha512-knIbl7p2i8r3qPsLW2W84esmDPr36RqieLC72OeuqYk4+0TRNthUhWTs655P9S9Pm3TVVxcFsS3Le9SXIWBIFA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.4.tgz", + "integrity": "sha512-t63oyi2LAn+ZAehYA7SDlhJDd1J0eLO3a21mxTaJcXqKW/tbRbKmo/BeyyTIXbBaoeTFn0xnyQHyomwndTqKUA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -11591,15 +11399,15 @@ } }, "@azure/opentelemetry-instrumentation-azure-sdk": { - "version": "1.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.3.tgz", - "integrity": "sha512-9dvTQQ9OhjX0uh4PtDEMPGTP3WihTVLi+DHL9jRMQMPf0trYEbb8ZRIQNo+1JqchkR1YkBDBkki5hJstpUprtA==", + "version": "1.0.0-beta.5", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.5.tgz", + "integrity": "sha512-fsUarKQDvjhmBO4nIfaZkfNSApm1hZBzcvpNbSrXdcUBxu7lRvKsV5DnwszX7cnhLyVOW9yl1uigtRQ1yDANjA==", "requires": { "@azure/core-tracing": "^1.0.0", "@azure/logger": "^1.0.0", - "@opentelemetry/api": "^1.4.0", - "@opentelemetry/core": "^1.9.0", - "@opentelemetry/instrumentation": "^0.35.0", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/instrumentation": "^0.41.2", "tslib": "^2.2.0" } }, @@ -11629,9 +11437,9 @@ } }, "@azure/storage-blob": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", - "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", + "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -11655,9 +11463,9 @@ } }, "@azure/storage-queue": { - "version": "12.13.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.13.0.tgz", - "integrity": "sha512-baU7QlFwKFat8zLUMzfLHTgcpdKpvUsGl05zKVRslKIb3iPB7TPudqDfkpaFf2YL5hv88joz/fyuuYJnzz7log==", + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", + "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -12123,87 +11931,97 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-6.31.1.tgz", - "integrity": "sha512-rsIev+dk1Vd8H1OKZhNhXycIVsMfeWJaeW3QUi1l4oIoGwQfJVbs1ZPZPHE5cglzyHOW1jQNStXf34UKaC6siA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.0.tgz", + "integrity": "sha512-qfBAS4W35+loOfbprBDS8nN0Eitl9wmuPE8GQLbwYj9Qj+COlLg57KECeXF8cgGnHkahrIkc3t6V6eFF8nhXQw==", "dev": true, "requires": { - "@cspell/dict-ada": "^4.0.1", - "@cspell/dict-aws": "^3.0.0", + "@cspell/dict-ada": "^4.0.2", + "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.9", - "@cspell/dict-cpp": "^5.0.2", + "@cspell/dict-companies": "^3.0.19", + "@cspell/dict-cpp": "^5.0.4", "@cspell/dict-cryptocurrencies": "^3.0.1", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.5", - "@cspell/dict-dart": "^2.0.2", - "@cspell/dict-django": "^4.0.2", - "@cspell/dict-docker": "^1.1.6", + "@cspell/dict-css": "^4.0.6", + "@cspell/dict-dart": "^2.0.3", + "@cspell/dict-django": "^4.1.0", + "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", - "@cspell/dict-elixir": "^4.0.2", - "@cspell/dict-en_us": "^4.3.2", + "@cspell/dict-elixir": "^4.0.3", + "@cspell/dict-en_us": "^4.3.6", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.0", - "@cspell/dict-fonts": "^3.0.1", + "@cspell/dict-filetypes": "^3.0.1", + "@cspell/dict-fonts": "^4.0.0", + "@cspell/dict-fsharp": "^1.0.0", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.1", + "@cspell/dict-golang": "^6.0.2", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.3", "@cspell/dict-html-symbol-entities": "^4.0.0", "@cspell/dict-java": "^5.0.5", "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", - "@cspell/dict-lorem-ipsum": "^3.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.1", "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.5", + "@cspell/dict-npm": "^5.0.8", "@cspell/dict-php": "^4.0.1", - "@cspell/dict-powershell": "^5.0.1", - "@cspell/dict-public-licenses": "^2.0.2", - "@cspell/dict-python": "^4.0.2", + "@cspell/dict-powershell": "^5.0.2", + "@cspell/dict-public-licenses": "^2.0.3", + "@cspell/dict-python": "^4.1.5", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.1.6", - "@cspell/dict-sql": "^2.1.0", + "@cspell/dict-software-terms": "^3.2.1", + "@cspell/dict-sql": "^2.1.1", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", "@cspell/dict-typescript": "^3.1.1", "@cspell/dict-vue": "^3.0.0" } }, + "@cspell/cspell-json-reporter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.0.tgz", + "integrity": "sha512-8OheTVzwwfOQqPZe3Enbe1F7Y0djjGunk5K7aC5MyXc3BuIV7Cx13xWo2gfAjiHBRuO5lqg9qidEfp6NE33amg==", + "dev": true, + "requires": { + "@cspell/cspell-types": "7.0.0" + } + }, "@cspell/cspell-pipe": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-6.31.1.tgz", - "integrity": "sha512-zk1olZi4dr6GLm5PAjvsiZ01HURNSruUYFl1qSicGnTwYN8GaN4RhAwannAytcJ7zJPIcyXlid0YsB58nJf3wQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.0.tgz", + "integrity": "sha512-MmQeLyyS5rZ/VvRtHGOLFUcCF9zy01WpWYthLZB61o96HCokqtlN4BBBPLYNxrotFNA4syVy9Si/wTxsC9oTiA==", "dev": true }, "@cspell/cspell-service-bus": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-6.31.1.tgz", - "integrity": "sha512-YyBicmJyZ1uwKVxujXw7sgs9x+Eps43OkWmCtDZmZlnq489HdTSuhF1kTbVi2yeFSeaXIS87+uHo12z97KkQpg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.0.tgz", + "integrity": "sha512-0YMM5SJY+XooOTEoo5+xuqTBLO87FP6QR8OBLBDeWNHvON9M4TpeAAN5K+IM0vMSFzgt1aSSMJNO0HSmxn17Yw==", "dev": true }, "@cspell/cspell-types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-6.31.1.tgz", - "integrity": "sha512-1KeTQFiHMssW1eRoF2NZIEg4gPVIfXLsL2+VSD/AV6YN7lBcuf6gRRgV5KWYarhxtEfjxhDdDTmu26l/iJEUtw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.0.tgz", + "integrity": "sha512-b/Dee5lb362ODlEK+kQcUDJfCprDRUFWcddo5tyzsYm3ID08ll6+DzCtfRxf48isyX1tL7uBKMj/iIpAhRNu9Q==", "dev": true }, "@cspell/dict-ada": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.1.tgz", - "integrity": "sha512-/E9o3nHrXOhYmQE43deKbxZcR3MIJAsa+66IzP9TXGHheKEx8b9dVMVVqydDDH8oom1H0U20NRPtu6KRVbT9xw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.2.tgz", + "integrity": "sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==", "dev": true }, "@cspell/dict-aws": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-3.0.0.tgz", - "integrity": "sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.0.tgz", + "integrity": "sha512-1YkCMWuna/EGIDN/zKkW+j98/55mxigftrSFgsehXhPld+ZMJM5J9UuBA88YfL7+/ETvBdd7mwW6IwWsC+/ltQ==", "dev": true }, "@cspell/dict-bash": { @@ -12213,15 +12031,15 @@ "dev": true }, "@cspell/dict-companies": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.9.tgz", - "integrity": "sha512-wSkVIJjk33Sm3LhieNv9TsSvUSeP0R/h8xx06NqbMYF43w9J8hZiMHlbB3FzaSOHRpXT5eBIJBVTeFbceZdiqg==", + "version": "3.0.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.19.tgz", + "integrity": "sha512-hO7rS4DhFA333qyvf89wIVoclCtXe/2sftY6aS0oMIH1bMZLjLx2B2sQJj6dCiu6gG/By1S9YZ0fXabiPk2Tkg==", "dev": true }, "@cspell/dict-cpp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.2.tgz", - "integrity": "sha512-Q0ZjfhrHHfm0Y1/7LMCq3Fne/bhiBeBogUw4TV1wX/1tg3m+5BtaW/7GiOzRk+rFsblVj3RFam59VJKMT3vSoQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", + "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", "dev": true }, "@cspell/dict-cryptocurrencies": { @@ -12237,27 +12055,33 @@ "dev": true }, "@cspell/dict-css": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.5.tgz", - "integrity": "sha512-z5vw8nJSyKd6d3i5UmMNoVcAp0wxvs9OHWOmAeJKT9fO3tok02gK24VZhcJ0NJtiKdHQ2zRuzdfWl51wdAiY6A==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", + "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==", "dev": true }, "@cspell/dict-dart": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.2.tgz", - "integrity": "sha512-jigcODm7Z4IFZ4vParwwP3IT0fIgRq/9VoxkXfrxBMsLBGGM2QltHBj7pl+joX+c4cOHxfyZktGJK1B1wFtR4Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.3.tgz", + "integrity": "sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==", + "dev": true + }, + "@cspell/dict-data-science": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.10.tgz", + "integrity": "sha512-7ZsRCnW0f4Bdo6Cqq8V4gHr8K58h+MP8majcDeMNhpMFUPiiSnvKsDuG9V5jciI/0t+lptPrZwGGIVEDF4Kqtg==", "dev": true }, "@cspell/dict-django": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.0.2.tgz", - "integrity": "sha512-L0Yw6+Yh2bE9/FAMG4gy9m752G4V8HEBjEAGeRIQ9qvxDLR9yD6dPOtgEFTjv7SWlKSrLb9wA/W3Q2GKCOusSg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", + "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==", "dev": true }, "@cspell/dict-docker": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.6.tgz", - "integrity": "sha512-zCCiRTZ6EOQpBnSOm0/3rnKW1kCcAUDUA7SxJG3SuH6iZvKi3I8FEg8+O83WQUeXg0SyPNerD9F40JLnnJjJig==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.7.tgz", + "integrity": "sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==", "dev": true }, "@cspell/dict-dotnet": { @@ -12267,15 +12091,15 @@ "dev": true }, "@cspell/dict-elixir": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.2.tgz", - "integrity": "sha512-/YeHlpZ1pE9VAyxp3V0xyUPapNyC61WwFuw2RByeoMqqYaIfS3Hw+JxtimOsAKVhUvgUH58zyKl5K5Q6FqgCpw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", + "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==", "dev": true }, "@cspell/dict-en_us": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.2.tgz", - "integrity": "sha512-o8xtHDLPNzW6hK5b1TaDTWt25vVi9lWlL6/dZ9YoS+ZMj+Dy/yuXatqfOgeGyU3a9+2gxC0kbr4oufMUQXI2mQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.6.tgz", + "integrity": "sha512-odhgsjNZI9BtEOJdvqfAuv/3yz5aB1ngfBNaph7WSnYVt//9e3fhrElZ6/pIIkoyuGgeQPwz1fXt+tMgcnLSEQ==", "dev": true }, "@cspell/dict-en-common-misspellings": { @@ -12291,15 +12115,21 @@ "dev": true }, "@cspell/dict-filetypes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.0.tgz", - "integrity": "sha512-Fiyp0z5uWaK0d2TfR9GMUGDKmUMAsOhGD5A0kHoqnNGswL2iw0KB0mFBONEquxU65fEnQv4R+jdM2d9oucujuA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", + "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==", "dev": true }, "@cspell/dict-fonts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-3.0.2.tgz", - "integrity": "sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz", + "integrity": "sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==", + "dev": true + }, + "@cspell/dict-fsharp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.0.tgz", + "integrity": "sha512-dHPkMHwW4dWv3Lv9VWxHuVm4IylqvcfRBSnZ7usJTRThraetSVrOPIJwr6UJh7F5un/lGJx2lxWVApf2WQaB/A==", "dev": true }, "@cspell/dict-fullstack": { @@ -12321,9 +12151,9 @@ "dev": true }, "@cspell/dict-golang": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.1.tgz", - "integrity": "sha512-Z19FN6wgg2M/A+3i1O8qhrGaxUUGOW8S2ySN0g7vp4HTHeFmockEPwYx7gArfssNIruw60JorZv+iLJ6ilTeow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", + "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==", "dev": true }, "@cspell/dict-haskell": { @@ -12363,9 +12193,9 @@ "dev": true }, "@cspell/dict-lorem-ipsum": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-3.0.0.tgz", - "integrity": "sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz", + "integrity": "sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==", "dev": true }, "@cspell/dict-lua": { @@ -12381,9 +12211,9 @@ "dev": true }, "@cspell/dict-npm": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.5.tgz", - "integrity": "sha512-eirZm4XpJNEcbmLGIwI2qXdRRlCKwEsH9mT3qCUytmbj6S6yn63F+8bShMW/yQBedV7+GXq9Td+cJdqiVutOiA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.8.tgz", + "integrity": "sha512-KuqH8tEsFD6DPKqKwIfWr9E+admE3yghaC0AKXG8jPaf77N0lkctKaS3dm0oxWUXkYKA/eXj6LCtz3VcTyxFPg==", "dev": true }, "@cspell/dict-php": { @@ -12393,22 +12223,25 @@ "dev": true }, "@cspell/dict-powershell": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.1.tgz", - "integrity": "sha512-lLl+syWFgfv2xdsoxHfPIB2FGkn//XahCIKcRaf52AOlm1/aXeaJN579B9HCpvM7wawHzMqJ33VJuL/vb6Lc4g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.2.tgz", + "integrity": "sha512-IHfWLme3FXE7vnOmMncSBxOsMTdNWd1Vcyhag03WS8oANSgX8IZ+4lMI00mF0ptlgchf16/OU8WsV4pZfikEFw==", "dev": true }, "@cspell/dict-public-licenses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.2.tgz", - "integrity": "sha512-baKkbs/WGEV2lCWZoL0KBPh3uiPcul5GSDwmXEBAsR5McEW52LF94/b7xWM0EmSAc/y8ODc5LnPYC7RDRLi6LQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.3.tgz", + "integrity": "sha512-JSLEdpEYufQ1H+93UHi+axlqQm1fhgK6kpdLHp6uPHu//CsvETcqNVawjB+qOdI/g38JTMw5fBqSd0aGNxa6Dw==", "dev": true }, "@cspell/dict-python": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.0.2.tgz", - "integrity": "sha512-w1jSWDR1CkO23cZFbSYgnD/ZqknDZSVCI1AOE6sSszOJR8shmBkV3lMBYd+vpLsWhmkLLBcZTXDkiqFLXDGowQ==", - "dev": true + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.5.tgz", + "integrity": "sha512-wWUWyHdyJtx5iG6Fz9rBQ17BtdpEsB17vmutao+gixQD28Jzb6XoLgDQ6606M0RnFjBSFhs5iT4CJBzlD2Kq6g==", + "dev": true, + "requires": { + "@cspell/dict-data-science": "^1.0.0" + } }, "@cspell/dict-r": { "version": "2.0.1", @@ -12435,15 +12268,15 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.1.6.tgz", - "integrity": "sha512-w46+pIMRVtrDuTZXK/YxDP5NL5yVoX0ImEPO0s9WbxdyyfhzAF3sGYHBGN/50OGLHExcqe6Idb9feoRC9mCLxw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.1.tgz", + "integrity": "sha512-+QXmyoONVc/3aNgKW+0F0u3XUCRTfNRkWKLZQA78i+9fOfde8ZT4JmROmZgRveH/MxD4n6pNFceIRcYI6C8WuQ==", "dev": true }, "@cspell/dict-sql": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.0.tgz", - "integrity": "sha512-Bb+TNWUrTNNABO0bmfcYXiTlSt0RD6sB2MIY+rNlaMyIwug43jUjeYmkLz2tPkn3+2uvySeFEOMVYhMVfcuDKg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.1.tgz", + "integrity": "sha512-v1mswi9NF40+UDUMuI148YQPEQvWjac72P6ZsjlRdLjEiQEEMEsTQ+zlkIdnzC9QCNyJaqD5Liq9Mn78/8Zxtw==", "dev": true }, "@cspell/dict-svelte": { @@ -12471,18 +12304,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-6.31.1.tgz", - "integrity": "sha512-uliIUv9uZlnyYmjUlcw/Dm3p0xJOEnWJNczHAfqAl4Ytg6QZktw0GtUA9b1umbRXLv0KRTPtSC6nMq3cR7rRmQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.0.tgz", + "integrity": "sha512-GRSJvdQvVOC0y7Qla8eg6LLe8p8WnbnHLabGJGsqYfXgtfkUFev9v65kMybQSJt9qhDtGCRw6EN1UyaeeEtavQ==", "dev": true, "requires": { - "import-meta-resolve": "^2.2.2" + "import-meta-resolve": "^3.0.0" } }, "@cspell/strong-weak-map": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-6.31.1.tgz", - "integrity": "sha512-z8AuWvUuSnugFKJOA9Ke0aiFuehcqLFqia9bk8XaQNEWr44ahPVn3sEWnAncTxPbpWuUw5UajoJa0egRAE1CCg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.0.tgz", + "integrity": "sha512-DT1R30i3V7aJIGLt7x1igaMLHhYSFv6pgc9gNwXvZWFl1xm/f7Jx07GPXKKKhwwXd4vy7G5rhwo63F4Pt9i8Ng==", "dev": true }, "@cspotcode/source-map-support": { @@ -12516,15 +12349,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -12539,9 +12372,9 @@ } }, "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true }, "@hapi/boom": { @@ -12688,29 +12521,29 @@ "dev": true }, "@jest/console": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", - "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", "dev": true, "requires": { "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", - "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", "dev": true, "requires": { - "@jest/console": "^29.6.1", - "@jest/reporters": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -12719,91 +12552,91 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.1", - "jest-haste-map": "^29.6.1", - "jest-message-util": "^29.6.1", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-resolve-dependencies": "^29.6.1", - "jest-runner": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", - "jest-watcher": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", - "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", "dev": true, "requires": { - "@jest/fake-timers": "^29.6.1", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.6.1" + "jest-mock": "^29.6.2" } }, "@jest/expect": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", - "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", "dev": true, "requires": { - "expect": "^29.6.1", - "jest-snapshot": "^29.6.1" + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" } }, "@jest/expect-utils": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", - "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", "dev": true, "requires": { "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", - "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", "dev": true, "requires": { "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.1", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1" + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" } }, "@jest/globals": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", - "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", "dev": true, "requires": { - "@jest/environment": "^29.6.1", - "@jest/expect": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", "@jest/types": "^29.6.1", - "jest-mock": "^29.6.1" + "jest-mock": "^29.6.2" } }, "@jest/reporters": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", - "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -12817,9 +12650,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -12847,33 +12680,33 @@ } }, "@jest/test-result": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", - "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", "dev": true, "requires": { - "@jest/console": "^29.6.1", + "@jest/console": "^29.6.2", "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", - "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", "dev": true, "requires": { - "@jest/test-result": "^29.6.1", + "@jest/test-result": "^29.6.2", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", - "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -12884,9 +12717,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -12985,44 +12818,21 @@ } }, "@octokit/auth-app": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-5.0.6.tgz", - "integrity": "sha512-zWqWTn88LcOUBALRMKl6yA0PqXWZLI2OXN9EaYK63f4E84SeW7dNefFx1P13XnQceTnc8O3Z9B537foUbjmG+A==", - "requires": { - "@octokit/auth-oauth-app": "^6.0.1", - "@octokit/auth-oauth-user": "^3.0.1", - "@octokit/request": "^7.0.0", - "@octokit/request-error": "^4.0.2", - "@octokit/types": "^10.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.0.tgz", + "integrity": "sha512-OKct7Rukf3g9DjpzcpdacQsdmd6oPrJ7fZND22JkjzhDvfhttUOnmh+qPS4kHhaNNyTxqSThnfrUWvkqNLd1nw==", + "requires": { + "@octokit/auth-oauth-app": "^7.0.0", + "@octokit/auth-oauth-user": "^4.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.3.1", "lru-cache": "^10.0.0", "universal-github-app-jwt": "^1.1.1", "universal-user-agent": "^6.0.0" }, "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", - "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", - "requires": { - "@octokit/types": "^10.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - }, "lru-cache": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", @@ -13031,231 +12841,80 @@ } }, "@octokit/auth-oauth-app": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-6.0.1.tgz", - "integrity": "sha512-+1j7vRLHXHD4f0p2l/EXUmxGOLOtOZdg5vkW/UapeeNs17f4GRVcgeKBcNkViLDvjk85iRZ/CcIM9lizo4k8ew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-7.0.0.tgz", + "integrity": "sha512-8JvJEXGoEqrbzLwt3SwIUvkDd+1wrM8up0KawvDIElB8rbxPbvWppGO0SLKAWSJ0q8ILcVq+mWck6pDcZ3a9KA==", "requires": { - "@octokit/auth-oauth-device": "^5.0.0", - "@octokit/auth-oauth-user": "^3.0.0", - "@octokit/request": "^7.0.0", - "@octokit/types": "^10.0.0", + "@octokit/auth-oauth-device": "^6.0.0", + "@octokit/auth-oauth-user": "^4.0.0", + "@octokit/request": "^8.0.2", + "@octokit/types": "^11.0.0", "@types/btoa-lite": "^1.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/auth-oauth-device": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-5.0.2.tgz", - "integrity": "sha512-XC7Bveiu0d0ywx4wtIezD86g+67xeOkmiM3Wjod27K+B46OslP86bb6nhdd07gFAaReybgBzSyDORl1DVJuXGQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-6.0.0.tgz", + "integrity": "sha512-Zgf/LKhwWk54rJaTGYVYtbKgUty+ouil6VQeRd+pCw7Gd0ECoSWaZuHK6uDGC/HtnWHjpSWFhzxPauDoHcNRtg==", "requires": { - "@octokit/oauth-methods": "^3.0.1", - "@octokit/request": "^7.0.0", - "@octokit/types": "^10.0.0", + "@octokit/oauth-methods": "^4.0.0", + "@octokit/request": "^8.0.0", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/auth-oauth-user": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-3.0.1.tgz", - "integrity": "sha512-LURRNgEXTlVKyXgm7PUjflww1QH4o9hdd/niCJxMw0blFLURZ/Ado9r5VEDPi0SigsKmCH92eaMoN2CAzIeA/g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-4.0.0.tgz", + "integrity": "sha512-VOm5aIkVGHaOhIvsF/4YmSjoYDzzrKbbYkdSEO0KqHK7I8SlO3ZndSikQ1fBlNPUEH0ve2BOTxLrVvI1qBf9/Q==", "requires": { - "@octokit/auth-oauth-device": "^5.0.2", - "@octokit/oauth-methods": "^3.0.1", - "@octokit/request": "^7.0.0", - "@octokit/types": "^10.0.0", + "@octokit/auth-oauth-device": "^6.0.0", + "@octokit/oauth-methods": "^4.0.0", + "@octokit/request": "^8.0.2", + "@octokit/types": "^11.0.0", "btoa-lite": "^1.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/auth-token": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.1.tgz", - "integrity": "sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==", - "requires": { - "@octokit/types": "^7.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==" }, "@octokit/core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", - "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz", + "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==", + "requires": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "requires": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "requires": { - "@octokit/openapi-types": "^17.2.0" - } - } } }, "@octokit/endpoint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-8.0.1.tgz", - "integrity": "sha512-tVviBdPuf3kcCiIvXYDJg7NAJrkTh8QEnc+UCybknKdEBCjIi7uQbFX3liQrpk1m5PjwC7fUJg08DYZ4F+l1RQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", + "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", "requires": { - "@octokit/types": "^10.0.0", + "@octokit/types": "^11.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/graphql": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.1.tgz", - "integrity": "sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz", + "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==", "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^7.0.0", + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "requires": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } - } - }, - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } - } - } } }, "@octokit/oauth-authorization-url": { @@ -13264,191 +12923,89 @@ "integrity": "sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==" }, "@octokit/oauth-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-3.0.2.tgz", - "integrity": "sha512-BrPZAz8goFkToeZCcw+uoNCt+j0wA7DHwPN69y71Ov6VE5kaHtn5576ZTjLTzkTcxoWqxKcPGoGyBE4n5FLbdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-4.0.0.tgz", + "integrity": "sha512-dqy7BZLfLbi3/8X8xPKUKZclMEK9vN3fK5WF3ortRvtplQTszFvdAGbTo71gGLO+4ZxspNiLjnqdd64Chklf7w==", "requires": { "@octokit/oauth-authorization-url": "^6.0.2", - "@octokit/request": "^7.0.0", - "@octokit/request-error": "^4.0.1", - "@octokit/types": "^10.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "btoa-lite": "^1.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", - "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", - "requires": { - "@octokit/types": "^10.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/openapi-types": { - "version": "13.13.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz", - "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "@octokit/plugin-paginate-graphql": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-3.0.0.tgz", - "integrity": "sha512-iDx9ubpdt/Bmf+IUR+W3nzoeAYFU+uFlbJdoEP4UaBtME4jeNlBRfwk+LXbDieNKkP75rFJ0XaOBWxY/r/6+hw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.0.tgz", + "integrity": "sha512-7HcYW5tP7/Z6AETAPU14gp5H5KmCPT3hmJrS/5tO7HIgbwenYmgw4OY9Ma54FDySuxMwD+wsJlxtuGWwuZuItA==", "requires": {} }, "@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", + "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", "requires": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "requires": { - "@octokit/openapi-types": "^17.2.0" - } - } + "@octokit/types": "^11.0.0" } }, "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", - "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", + "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", "requires": { - "@octokit/types": "^9.2.3", - "deprecation": "^2.3.1" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "requires": { - "@octokit/openapi-types": "^17.2.0" - } - } + "@octokit/types": "^11.0.0" } }, "@octokit/request": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-7.0.1.tgz", - "integrity": "sha512-R227pDk1fuQXuX17LU8ChzFyTOe/myHvvceBF3C/fFath+NlsVkHICOlvEbx+9EgYUl4uDH7VqTby00menlM8Q==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", + "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", "requires": { - "@octokit/endpoint": "^8.0.1", - "@octokit/request-error": "^4.0.1", - "@octokit/types": "^10.0.0", + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-4.0.2.tgz", - "integrity": "sha512-uqwUEmZw3x4I9DGYq9fODVAAvcLsPQv97NRycP6syEFu5916M189VnNBW2zANNwqg3OiligNcAey7P0SET843w==", - "requires": { - "@octokit/types": "^10.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", + "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", "requires": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" - }, - "dependencies": { - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - } } }, "@octokit/rest": { - "version": "19.0.13", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", - "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", + "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", "requires": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^9.0.0" } }, - "@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" - }, "@octokit/types": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz", - "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", + "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", "requires": { - "@octokit/openapi-types": "^13.11.0" + "@octokit/openapi-types": "^18.0.0" } }, "@opentelemetry/api": { @@ -13457,46 +13014,48 @@ "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" }, "@opentelemetry/core": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.12.0.tgz", - "integrity": "sha512-4DWYNb3dLs2mSCGl65jY3aEgbvPWSHVQV/dmDWiYeWUrMakZQFcymqZOSUNZO0uDrEJoxMu8O5tZktX6UKFwag==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz", + "integrity": "sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw==", "requires": { - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/semantic-conventions": "1.15.2" } }, "@opentelemetry/instrumentation": { - "version": "0.35.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.35.1.tgz", - "integrity": "sha512-EZsvXqxenbRTSNsft6LDcrT4pjAiyZOx3rkDNeqKpwZZe6GmZtsXaZZKuDkJtz9fTjOGjDHjZj9/h80Ya9iIJw==", - "requires": { - "require-in-the-middle": "^5.0.3", - "semver": "^7.3.2", + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz", + "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==", + "requires": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.4.2", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.1", "shimmer": "^1.2.1" } }, "@opentelemetry/resources": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.12.0.tgz", - "integrity": "sha512-gunMKXG0hJrR0LXrqh7BVbziA/+iJBL3ZbXCXO64uY+SrExkwoyJkpiq9l5ismkGF/A20mDEV7tGwh+KyPw00Q==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz", + "integrity": "sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw==", "requires": { - "@opentelemetry/core": "1.12.0", - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" } }, "@opentelemetry/sdk-trace-base": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.12.0.tgz", - "integrity": "sha512-pfCOB3tNDlYVoWuz4D7Ji+Jmy9MHnATWHVpkERdCEiwUGEZ+4IvNPXUcPc37wJVmMpjGLeaWgPPrie0KIpWf1A==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz", + "integrity": "sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ==", "requires": { - "@opentelemetry/core": "1.12.0", - "@opentelemetry/resources": "1.12.0", - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/core": "1.15.2", + "@opentelemetry/resources": "1.15.2", + "@opentelemetry/semantic-conventions": "1.15.2" } }, "@opentelemetry/semantic-conventions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz", - "integrity": "sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz", + "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw==" }, "@pkgr/utils": { "version": "2.4.2", @@ -13533,9 +13092,9 @@ } }, "@primer/octicons": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.4.0.tgz", - "integrity": "sha512-92eXALm3ucZkzqpJmJbC+fR9ldiuNd4W4s2MZQNQIBahpg14emJ+I9fdHqCummFlfgyohLzXn++7rz0NlkqAJA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.5.0.tgz", + "integrity": "sha512-b3IBp3EmzLc/YMw3xdqy7Lg8CgFObYaWegPntoKO1bZLZ4sAG5PRMPp36rj4TF1sDHbNufhGMvdCCM5VdS3mPQ==", "requires": { "object-assign": "^4.1.1" } @@ -13838,15 +13397,15 @@ } }, "@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", "dev": true }, "@types/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", + "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", "dev": true }, "@types/memory-cache": { @@ -13876,9 +13435,9 @@ "dev": true }, "@types/node": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz", - "integrity": "sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==" + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", + "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" }, "@types/node-fetch": { "version": "2.6.2", @@ -14027,12 +13586,6 @@ } } }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "@types/pug": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", @@ -14073,6 +13626,11 @@ "@types/node": "*" } }, + "@types/shimmer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.2.tgz", + "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" + }, "@types/simple-oauth2": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.4.tgz", @@ -14094,9 +13652,9 @@ } }, "@types/validator": { - "version": "13.7.17", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", - "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==", + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", + "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==", "dev": true }, "@types/yargs": { @@ -14115,105 +13673,102 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.0.0.tgz", - "integrity": "sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.0.tgz", + "integrity": "sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==", "dev": true, "requires": { - "@eslint-community/regexpp": "^4.5.0", - "@typescript-eslint/scope-manager": "6.0.0", - "@typescript-eslint/type-utils": "6.0.0", - "@typescript-eslint/utils": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/type-utils": "6.4.0", + "@typescript-eslint/utils": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.5.0", + "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.0.0.tgz", - "integrity": "sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz", + "integrity": "sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.0.0", - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/typescript-estree": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.0.0.tgz", - "integrity": "sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz", + "integrity": "sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==", "dev": true, "requires": { - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0" + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0" } }, "@typescript-eslint/type-utils": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.0.0.tgz", - "integrity": "sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.0.tgz", + "integrity": "sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.0.0", - "@typescript-eslint/utils": "6.0.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/utils": "6.4.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.0.0.tgz", - "integrity": "sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.0.tgz", + "integrity": "sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.0.0.tgz", - "integrity": "sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz", + "integrity": "sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==", "dev": true, "requires": { - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/visitor-keys": "6.0.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/visitor-keys": "6.4.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.5.0", + "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/utils": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.0.0.tgz", - "integrity": "sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.0.tgz", + "integrity": "sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.3.0", - "@types/json-schema": "^7.0.11", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "6.0.0", - "@typescript-eslint/types": "6.0.0", - "@typescript-eslint/typescript-estree": "6.0.0", - "eslint-scope": "^5.1.1", - "semver": "^7.5.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.0", + "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.0", + "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.0.0.tgz", - "integrity": "sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz", + "integrity": "sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==", "dev": true, "requires": { - "@typescript-eslint/types": "6.0.0", + "@typescript-eslint/types": "6.4.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -14229,8 +13784,13 @@ "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} }, "acorn-jsx": { "version": "5.3.2", @@ -14253,16 +13813,6 @@ "debug": "4" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -14323,23 +13873,23 @@ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "applicationinsights": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.0.tgz", - "integrity": "sha512-/vV5X6M4TlRA5NxNZAdCE0gukzfK24mb3z18D5Kl/CyIfSVIkafsIji3mK+Zi5q+7dn6H1CkFazlcnLf40anHw==", - "requires": { - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "1.10.1", - "@azure/core-util": "1.2.0", - "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.3", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.1.tgz", + "integrity": "sha512-N6uh3Di0uJo2vVCkBLqawgPGrkY2o1L3l7KouDeFFSmgUvZnKmoYWPKkMOUmNcKYIplY2Xb0bpU5T2Ht3ofdRg==", + "requires": { + "@azure/core-auth": "^1.5.0", + "@azure/core-rest-pipeline": "1.12.0", + "@azure/core-util": "1.4.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", "@microsoft/applicationinsights-web-snippet": "^1.0.1", - "@opentelemetry/api": "^1.0.4", - "@opentelemetry/core": "^1.12.0", - "@opentelemetry/sdk-trace-base": "^1.12.0", - "@opentelemetry/semantic-conventions": "^1.12.0", + "@opentelemetry/api": "^1.4.1", + "@opentelemetry/core": "^1.15.2", + "@opentelemetry/sdk-trace-base": "^1.15.2", + "@opentelemetry/semantic-conventions": "^1.15.2", "cls-hooked": "^4.2.2", "continuation-local-storage": "^3.2.1", - "diagnostic-channel": "1.1.0", - "diagnostic-channel-publishers": "1.0.6" + "diagnostic-channel": "1.1.1", + "diagnostic-channel-publishers": "1.0.7" } }, "arg": { @@ -14381,12 +13931,6 @@ "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "async-hook-jl": { "version": "1.7.6", "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz", @@ -14440,12 +13984,12 @@ } }, "babel-jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", - "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", + "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", "dev": true, "requires": { - "@jest/transform": "^29.6.1", + "@jest/transform": "^29.6.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -14760,6 +14304,23 @@ "supports-color": "^7.1.0" } }, + "chalk-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", + "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", + "dev": true, + "requires": { + "chalk": "^5.2.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + } + } + }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -14783,14 +14344,7 @@ "cjs-module-lexer": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, "clear-module": { "version": "4.1.2", @@ -14803,12 +14357,12 @@ } }, "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" } }, "cli-truncate": { @@ -14854,6 +14408,17 @@ "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, @@ -14918,9 +14483,9 @@ "dev": true }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "combined-stream": { @@ -14932,9 +14497,9 @@ } }, "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, "comment-json": { @@ -14998,17 +14563,16 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, "dependencies": { "write-file-atomic": { @@ -15133,124 +14697,219 @@ } }, "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "requires": { + "type-fest": "^1.0.1" + }, + "dependencies": { + "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==", + "dev": true + } + } }, "cspell": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-6.31.1.tgz", - "integrity": "sha512-gyCtpkOpwI/TGibbtIgMBFnAUUp2hnYdvW/9Ky4RcneHtLH0+V/jUEbZD8HbRKz0GVZ6mhKWbNRSEyP9p3Cejw==", - "dev": true, - "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/dynamic-import": "6.31.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cspell-gitignore": "6.31.1", - "cspell-glob": "6.31.1", - "cspell-io": "6.31.1", - "cspell-lib": "6.31.1", - "fast-glob": "^3.2.12", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.0.tgz", + "integrity": "sha512-E8wQP30bTLROJsSNwYnhhRUdzVa4vQo6zILv7PqgTCSaveg8Af1HEh4ocRPRhppRgIXDpccG27+ATlpEzxiPGQ==", + "dev": true, + "requires": { + "@cspell/cspell-json-reporter": "7.0.0", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "@cspell/dynamic-import": "7.0.0", + "chalk": "^5.3.0", + "chalk-template": "^1.1.0", + "commander": "^10.0.1", + "cspell-gitignore": "7.0.0", + "cspell-glob": "7.0.0", + "cspell-io": "7.0.0", + "cspell-lib": "7.0.0", + "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", - "get-stdin": "^8.0.0", - "imurmurhash": "^0.1.4", - "semver": "^7.3.8", - "strip-ansi": "^6.0.1", + "get-stdin": "^9.0.0", + "semver": "^7.5.4", + "strip-ansi": "^7.1.0", "vscode-uri": "^3.0.7" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "cspell-dictionary": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-6.31.1.tgz", - "integrity": "sha512-7+K7aQGarqbpucky26wled7QSCJeg6VkLUWS+hLjyf0Cqc9Zew5xsLa4QjReExWUJx+a97jbiflITZNuWxgMrg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.0.tgz", + "integrity": "sha512-CYB02vB870JfCtmi4Njuzw1nCjbyRCjoqlsAQgHkhRSevRKcjFrK3+XsBhNA3Zo4ek4P35+oS/I4vMOHu6cdCg==", "dev": true, "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "cspell-trie-lib": "6.31.1", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "cspell-trie-lib": "7.0.0", "fast-equals": "^4.0.3", "gensequence": "^5.0.2" + }, + "dependencies": { + "fast-equals": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", + "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "dev": true + } } }, "cspell-gitignore": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-6.31.1.tgz", - "integrity": "sha512-PAcmjN6X89Z8qgjem6HYb+VmvVtKuc+fWs4sk21+jv2MiLk23Bkp+8slSaIDVR//58fxJkMx17PHyo2cDO/69A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.0.tgz", + "integrity": "sha512-9VVLuiVhntXO/It3K0nTDhxbPPc2nItvGLymItfUudfB0ZqgzBaomdoYZzXrcNOITjYiBXWCPuVOXLbyoL0DjQ==", "dev": true, "requires": { - "cspell-glob": "6.31.1", + "cspell-glob": "7.0.0", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-6.31.1.tgz", - "integrity": "sha512-ygEmr5hgE4QtO5+L3/ihfMKBhPipbapfS22ilksFSChKMc15Regds0z+z/1ZBoe+OFAPneQfIuBxMwQ/fB00GQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.0.tgz", + "integrity": "sha512-Wl47kChIuSiuStofVSPdgvwi8BRD4tN03j+yhpJ1q+lWT023ctFacZy+Lc+L6nxaTUriDy5ET+UoooPMJ2PskA==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-6.31.1.tgz", - "integrity": "sha512-AsRVP0idcNFVSb9+p9XjMumFj3BUV67WIPWApaAzJl/dYyiIygQObRE+si0/QtFWGNw873b7hNhWZiKjqIdoaQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.0.tgz", + "integrity": "sha512-0k1qVvxMNwP4WXX1zIp3Ub+RQnUzjiBtB+BO4Lprnkp6/JuRndpBRDrXBsqNZBVzZ+JjyRSU1elNSN6/nudXvQ==", "dev": true, "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1" + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0" } }, "cspell-io": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-6.31.1.tgz", - "integrity": "sha512-deZcpvTYY/NmLfOdOtzcm+nDvJZozKmj4TY3pPpX0HquPX0A/w42bFRT/zZNmRslFl8vvrCZZUog7SOc6ha3uA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.0.tgz", + "integrity": "sha512-pGf+XlMcOxZfO7NIwJYmje8D30OEUt2Vb7cfZ2nazdFf9/NfiZpYp3JHOT+n53DhbIXTfdmojXo5bVezPXA48g==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "6.31.1", - "node-fetch": "^2.6.9" + "@cspell/cspell-service-bus": "7.0.0", + "node-fetch": "^2.6.12" } }, "cspell-lib": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-6.31.1.tgz", - "integrity": "sha512-KgSiulbLExY+z2jGwkO77+aAkyugsPAw7y07j3hTQLpd+0esPCZqrmbo2ItnkvkDNd/c34PqQCr7/044/rz8gw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.0.tgz", + "integrity": "sha512-CJAa7uV4hrm8OTnWdFPONSUP1Dp7J7fVhKu15aTrpNASUMAHe5YWqFqInCg+0+XhdRpGGYjQKhd+khsXL5a+bg==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "6.31.1", - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", - "@cspell/strong-weak-map": "6.31.1", + "@cspell/cspell-bundled-dicts": "7.0.0", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", + "@cspell/strong-weak-map": "7.0.0", "clear-module": "^4.1.2", "comment-json": "^4.2.3", - "configstore": "^5.0.1", + "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "6.31.1", - "cspell-glob": "6.31.1", - "cspell-grammar": "6.31.1", - "cspell-io": "6.31.1", - "cspell-trie-lib": "6.31.1", - "fast-equals": "^4.0.3", - "find-up": "^5.0.0", + "cspell-dictionary": "7.0.0", + "cspell-glob": "7.0.0", + "cspell-grammar": "7.0.0", + "cspell-io": "7.0.0", + "cspell-trie-lib": "7.0.0", + "fast-equals": "^5.0.1", + "find-up": "^6.3.0", "gensequence": "^5.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" + }, + "dependencies": { + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } } }, "cspell-trie-lib": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-6.31.1.tgz", - "integrity": "sha512-MtYh7s4Sbr1rKT31P2BK6KY+YfOy3dWsuusq9HnqCXmq6aZ1HyFgjH/9p9uvqGi/TboMqn1KOV8nifhXK3l3jg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.0.tgz", + "integrity": "sha512-mopXyfjNRVuYbrZcbBcLwOMrWeyTezh4w8zy+RywUmsF6IW6/HM2DkfE2BmH1IyE9af29lgQqdB5eDbJLWrP5A==", "dev": true, "requires": { - "@cspell/cspell-pipe": "6.31.1", - "@cspell/cspell-types": "6.31.1", + "@cspell/cspell-pipe": "7.0.0", + "@cspell/cspell-types": "7.0.0", "gensequence": "^5.0.2" } }, @@ -15263,10 +14922,11 @@ } }, "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "requires": {} }, "deep-is": { "version": "0.1.4", @@ -15400,24 +15060,17 @@ "dev": true }, "diagnostic-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.0.tgz", - "integrity": "sha512-fwujyMe1gj6rk6dYi9hMZm0c8Mz8NDMVl2LB4iaYh3+LIAThZC8RKFGXWG0IML2OxAit/ZFRgZhMkhQ3d/bobQ==", - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.1.tgz", + "integrity": "sha512-r2HV5qFkUICyoaKlBEpLKHjxMXATUf/l+h8UZPGBHGLy4DDiY2sOLcIctax4eRnTw5wH2jTMExLntGPJ8eOJxw==", + "requires": { + "semver": "^7.5.3" } }, "diagnostic-channel-publishers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.6.tgz", - "integrity": "sha512-RE5AP4JmEm/CV06gOyFdgWWm3gMNOoXulod2mq4ysiz9s77ZhHb1P1DGrfePHjNOmgvWglhegmj5q8DNtjRrEg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.7.tgz", + "integrity": "sha512-SEECbY5AiVt6DfLkhkaHNeshg1CogdLLANA8xlG/TKvS+XUgvIKl7VspJGYiEdL5OUyzMVnr7o0AwB7f+/Mjtg==", "requires": {} }, "diff": { @@ -15456,9 +15109,9 @@ "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" }, "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -15565,27 +15218,27 @@ "dev": true }, "eslint": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", - "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -15595,7 +15248,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -15607,32 +15259,13 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, "requires": {} }, @@ -15673,25 +15306,25 @@ } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { "acorn": "^8.9.0", @@ -15712,14 +15345,6 @@ "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "esrecurse": { @@ -15729,20 +15354,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -15756,6 +15373,12 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -15785,17 +15408,17 @@ "dev": true }, "expect": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", - "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", "dev": true, "requires": { - "@jest/expect-utils": "^29.6.1", + "@jest/expect-utils": "^29.6.2", "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1" + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2" } }, "express": { @@ -15949,15 +15572,15 @@ "dev": true }, "fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", "dev": true }, "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -16188,9 +15811,9 @@ "dev": true }, "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true }, "get-stream": { @@ -16236,9 +15859,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -16271,12 +15894,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -16419,6 +16036,17 @@ } } }, + "import-in-the-middle": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz", + "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==", + "requires": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -16430,9 +16058,9 @@ } }, "import-meta-resolve": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.2.tgz", - "integrity": "sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", + "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", "dev": true }, "imurmurhash": { @@ -16441,12 +16069,6 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -16680,13 +16302,13 @@ } }, "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, @@ -16702,9 +16324,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -16712,15 +16334,15 @@ } }, "jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", - "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", + "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", "dev": true, "requires": { - "@jest/core": "^29.6.1", + "@jest/core": "^29.6.2", "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.6.1" + "jest-cli": "^29.6.2" } }, "jest-changed-files": { @@ -16734,93 +16356,93 @@ } }, "jest-circus": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", - "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", + "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", "dev": true, "requires": { - "@jest/environment": "^29.6.1", - "@jest/expect": "^29.6.1", - "@jest/test-result": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.1", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", + "jest-each": "^29.6.2", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", "p-limit": "^3.1.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", - "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", + "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", "dev": true, "requires": { - "@jest/core": "^29.6.1", - "@jest/test-result": "^29.6.1", + "@jest/core": "^29.6.2", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-config": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "prompts": "^2.0.1", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", - "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", + "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.1", + "@jest/test-sequencer": "^29.6.2", "@jest/types": "^29.6.1", - "babel-jest": "^29.6.1", + "babel-jest": "^29.6.2", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.1", - "jest-environment-node": "^29.6.1", + "jest-circus": "^29.6.2", + "jest-environment-node": "^29.6.2", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-runner": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", - "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" } }, "jest-docblock": { @@ -16833,30 +16455,30 @@ } }, "jest-each": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", - "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", + "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", "dev": true, "requires": { "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.6.1", - "pretty-format": "^29.6.1" + "jest-util": "^29.6.2", + "pretty-format": "^29.6.2" } }, "jest-environment-node": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", - "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", + "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1" + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" } }, "jest-get-type": { @@ -16866,9 +16488,9 @@ "dev": true }, "jest-haste-map": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", - "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", + "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", "dev": true, "requires": { "@jest/types": "^29.6.1", @@ -16879,8 +16501,8 @@ "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", "micromatch": "^4.0.4", "walker": "^1.0.8" } @@ -16898,31 +16520,31 @@ } }, "jest-leak-detector": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", - "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", + "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", "dev": true, "requires": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" } }, "jest-matcher-utils": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", - "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", + "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.6.1", + "jest-diff": "^29.6.2", "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" } }, "jest-message-util": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", - "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", + "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -16931,20 +16553,20 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", - "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", + "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", "dev": true, "requires": { "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.6.1" + "jest-util": "^29.6.2" } }, "jest-pnp-resolver": { @@ -16961,73 +16583,73 @@ "dev": true }, "jest-resolve": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", - "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", + "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", - "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", + "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", "dev": true, "requires": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.1" + "jest-snapshot": "^29.6.2" } }, "jest-runner": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", - "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", + "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", "dev": true, "requires": { - "@jest/console": "^29.6.1", - "@jest/environment": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/environment": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.1", - "jest-haste-map": "^29.6.1", - "jest-leak-detector": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-resolve": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-util": "^29.6.1", - "jest-watcher": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-environment-node": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-leak-detector": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-resolve": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-util": "^29.6.2", + "jest-watcher": "^29.6.2", + "jest-worker": "^29.6.2", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", - "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", + "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", "dev": true, "requires": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", - "@jest/globals": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/globals": "^29.6.2", "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", @@ -17035,21 +16657,21 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-mock": "^29.6.1", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", - "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", + "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -17057,28 +16679,27 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/expect-utils": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", - "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.1", + "expect": "^29.6.2", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.1", + "jest-diff": "^29.6.2", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "semver": "^7.5.3" } }, "jest-util": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", - "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", "dev": true, "requires": { "@jest/types": "^29.6.1", @@ -17090,9 +16711,9 @@ } }, "jest-validate": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", - "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", + "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", "dev": true, "requires": { "@jest/types": "^29.6.1", @@ -17100,7 +16721,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "dependencies": { "camelcase": { @@ -17112,29 +16733,29 @@ } }, "jest-watcher": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", - "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", + "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", "dev": true, "requires": { - "@jest/test-result": "^29.6.1", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", - "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", + "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -17403,36 +17024,39 @@ } }, "lint-staged": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.3.tgz", - "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", + "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", "dev": true, "requires": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" }, "dependencies": { "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true }, "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -17447,9 +17071,9 @@ } }, "human-signals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", - "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true }, "is-stream": { @@ -17497,65 +17121,17 @@ } }, "listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } + "wrap-ansi": "^8.1.0" } }, "locate-path": { @@ -17590,61 +17166,47 @@ "dev": true }, "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "type-fest": "^1.0.2" } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" } + }, + "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==", + "dev": true } } }, @@ -17687,25 +17249,17 @@ } }, "luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", + "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==" }, "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "semver": "^7.5.3" } }, "make-error": { @@ -17997,12 +17551,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -18020,9 +17568,9 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" }, "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" } @@ -18068,9 +17616,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.3.tgz", - "integrity": "sha512-fy9v3NgTzBngrMFkDsKEj0r02U7jm6XfC3b52eoNV+GCrGj+s8pt5OqhiJdWKuw51zCTdiNR/IUD1z33LIIGpg==" + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", + "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==" }, "normalize-path": { "version": "3.0.0", @@ -18185,15 +17733,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -18360,14 +17899,14 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "pg": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.1.tgz", - "integrity": "sha512-utdq2obft07MxaDg0zBJI+l/M3mBRfIpEN3iSemsz0G5F2/VXx+XzqF4oxrbIZXQxt2AZzIUzyVg/YM6xOP/WQ==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.2.tgz", + "integrity": "sha512-l4rmVeV8qTIrrPrIR3kZQqBgSN93331s9i6wiUiLOSk0Q7PmUxZD/m1rQI622l3NfqBby9Ar5PABfS/SulfieQ==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-cloudflare": "^1.1.1", - "pg-connection-string": "^2.6.1", + "pg-connection-string": "^2.6.2", "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", @@ -18381,9 +17920,9 @@ "optional": true }, "pg-connection-string": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.1.tgz", - "integrity": "sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "pg-escape": { "version": "0.2.0", @@ -18540,9 +18079,9 @@ "dev": true }, "prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", + "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", "dev": true }, "prettier-linter-helpers": { @@ -18555,9 +18094,9 @@ } }, "pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", "dev": true, "requires": { "@jest/schemas": "^29.6.0", @@ -18819,9 +18358,9 @@ "dev": true }, "require-in-the-middle": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", - "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", + "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", "requires": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -18869,9 +18408,9 @@ "dev": true }, "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "requires": { "onetime": "^5.1.0", @@ -18944,15 +18483,6 @@ "queue-microtask": "^1.2.2" } }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -19144,9 +18674,9 @@ }, "dependencies": { "ansi-styles": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", - "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true } } @@ -19211,9 +18741,9 @@ "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" }, "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, "string-length": { @@ -19244,9 +18774,9 @@ "dev": true }, "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { "ansi-regex": "^6.0.1" @@ -19330,12 +18860,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -19569,12 +19093,12 @@ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" }, "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "requires": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" } }, "universal-github-app-jwt": { @@ -19666,9 +19190,9 @@ "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, "validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==" + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==" }, "vary": { "version": "1.1.2", @@ -19754,37 +19278,35 @@ } }, "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.0.1" } } } @@ -19805,9 +19327,9 @@ } }, "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true }, "xml": { diff --git a/package.json b/package.json index 20e672385..8cc3b1804 100644 --- a/package.json +++ b/package.json @@ -71,18 +71,18 @@ "dependencies": { "@azure/cosmos": "3.17.3", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.2.3", + "@azure/identity": "3.2.4", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.0", - "@azure/storage-blob": "12.14.0", - "@azure/storage-queue": "12.13.0", - "@octokit/plugin-paginate-graphql": "3.0.0", - "@octokit/request": "7.0.1", - "@octokit/auth-app": "5.0.6", - "@octokit/rest": "19.0.13", - "@primer/octicons": "19.4.0", + "@azure/storage-blob": "12.15.0", + "@azure/storage-queue": "12.14.0", + "@octokit/plugin-paginate-graphql": "4.0.0", + "@octokit/request": "8.1.1", + "@octokit/auth-app": "6.0.0", + "@octokit/rest": "20.0.1", + "@primer/octicons": "19.5.0", "app-root-path": "3.1.0", - "applicationinsights": "2.7.0", + "applicationinsights": "2.7.1", "async-prompt": "1.0.1", "axios": "1.4.0", "basic-auth": "2.0.1", @@ -106,17 +106,17 @@ "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.3.0", + "luxon": "3.4.0", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.3", + "nodemailer": "6.9.4", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", - "pg": "8.11.1", + "pg": "8.11.2", "pg-escape": "0.2.0", "pug": "3.0.2", "pug-load": "3.0.0", @@ -128,7 +128,7 @@ "simple-oauth2": "5.0.0", "throat": "6.0.2", "tmp-promise": "3.0.3", - "validator": "13.9.0", + "validator": "13.11.0", "walk-back": "5.1.0" }, "devDependencies": { @@ -136,11 +136,11 @@ "@types/express": "4.17.17", "@types/express-session": "1.17.7", "@types/jest": "29.5.3", - "@types/lodash": "4.14.195", - "@types/luxon": "3.3.0", + "@types/lodash": "4.14.197", + "@types/luxon": "3.3.1", "@types/memory-cache": "0.2.3", "@types/morgan": "1.9.4", - "@types/node": "20.4.1", + "@types/node": "20.5.0", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -151,20 +151,20 @@ "@types/recursive-readdir": "2.2.1", "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", - "@types/validator": "13.7.17", - "@typescript-eslint/eslint-plugin": "6.0.0", - "@typescript-eslint/parser": "6.0.0", - "cspell": "6.31.1", - "eslint": "8.44.0", - "eslint-config-prettier": "8.8.0", + "@types/validator": "13.11.1", + "@typescript-eslint/eslint-plugin": "6.4.0", + "@typescript-eslint/parser": "6.4.0", + "cspell": "7.0.0", + "eslint": "8.47.0", + "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.0.1", "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.6.1", + "jest": "29.6.2", "jest-junit": "16.0.0", - "lint-staged": "13.2.3", + "lint-staged": "14.0.0", "markdownlint-cli2": "0.8.1", - "prettier": "3.0.0", + "prettier": "3.0.1", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", diff --git a/routes/administration/app.ts b/routes/administration/app.ts index 864d78316..6bf902870 100644 --- a/routes/administration/app.ts +++ b/routes/administration/app.ts @@ -15,7 +15,7 @@ import { } from '../../entities/organizationSettings/organizationSetting'; import { IndividualContext } from '../../business/user'; import { Operations, Organization } from '../../business'; -import GitHubApplication from '../../business/application'; +import GitHubApplication, { isInstallationConfigured } from '../../business/application'; import { ReposAppRequest, IGitHubAppInstallation, @@ -101,21 +101,6 @@ router.use( }) ); -function isInstallationConfigured( - settings: OrganizationSetting, - installation: IGitHubAppInstallation -): boolean { - if (!settings || !settings.installations) { - return false; - } - for (const install of settings.installations) { - if (install.installationId === installation.id) { - return true; - } - } - return false; -} - async function getDynamicSettingsFromLegacySettings( operations: Operations, staticSettings: any, diff --git a/routes/administration/apps.ts b/routes/administration/apps.ts index 3c7f5bc89..fde8a42e7 100644 --- a/routes/administration/apps.ts +++ b/routes/administration/apps.ts @@ -10,28 +10,11 @@ const router: Router = Router(); import { getProviders } from '../../transitional'; import { sortByCaseInsensitive } from '../../utils'; import GitHubApplication from '../../business/application'; -import { OrganizationSetting } from '../../entities/organizationSettings/organizationSetting'; import { ReposAppRequest, UserAlertType } from '../../interfaces'; - -interface IByOrgViewAppInstallation { - app: GitHubApplication; - installationId?: number; -} - -enum OrgStatus { - Active = 'Active', - Adopted = 'Adopted', - NotAdopted = 'NotAdopted', -} - -interface IByOrgView { - organizationName: string; - status: OrgStatus; - appInstallations: Map; - dynamicSettings: OrganizationSetting; - configuredInstallations: number[]; - id?: number; -} +import { + ManagedOrganizationAppConfigurationsByOrgView, + ManagedOrganizationStatus, +} from '../../api/client/context/administration/types'; router.post( '/', @@ -75,14 +58,14 @@ router.get( const apps = providers.operations.getApplications(); const individualContext = req.individualContext; const organizationSettingsProvider = providers.organizationSettingsProvider; - const byOrg = new Map(); + const byOrg = new Map(); function getOrg(name: string) { let o = byOrg.get(name); if (!o) { o = { organizationName: name, id: undefined, - status: OrgStatus.NotAdopted, + status: ManagedOrganizationStatus.NotAdopted, appInstallations: new Map(), dynamicSettings: null, configuredInstallations: [], @@ -96,19 +79,19 @@ router.get( } for (const app of apps) { const appInstalls = await app.getInstallations({ maxAgeSeconds: 5 }); - const { valid } = GitHubApplication.filterInstallations(appInstalls); - for (const vi of valid) { - const organizationName = vi.account.login; + const { valid: validInstallations } = GitHubApplication.filterInstallations(appInstalls); + for (const valid of validInstallations) { + const organizationName = valid.account.login; const o = getOrg(organizationName.toLowerCase()); o.appInstallations.set(app.id, { app, - installationId: vi.id, + installationId: valid.id, }); - o.id = Number(vi.target_id); - if (!o.dynamicSettings && vi.target_type === 'Organization') { + o.id = Number(valid.target_id); + if (!o.dynamicSettings && valid.target_type === 'Organization') { try { o.dynamicSettings = await organizationSettingsProvider.getOrganizationSetting( - vi.target_id.toString() + valid.target_id.toString() ); } catch (ignore) { /* ignored */ @@ -117,10 +100,10 @@ router.get( o.configuredInstallations = o.dynamicSettings.installations.map( (install) => install.installationId ); - o.status = OrgStatus.Adopted; + o.status = ManagedOrganizationStatus.Adopted; } if (o.dynamicSettings && o.dynamicSettings.active === true) { - o.status = OrgStatus.Active; + o.status = ManagedOrganizationStatus.Active; } } } diff --git a/routes/index-authenticated.ts b/routes/index-authenticated.ts index 924018915..a4ec7d941 100644 --- a/routes/index-authenticated.ts +++ b/routes/index-authenticated.ts @@ -27,14 +27,15 @@ import linkRoute from './link'; import linkedUserRoute from './index-linked'; import linkCleanupRoute from './link-cleanup'; -import SettingsRoute from './settings'; +import routeSettings from './settings'; import getCompanySpecificDeployment from '../middleware/companySpecificDeployment'; const hasReactApp = hasStaticReactClientApp(); const reactRoute = hasReactApp ? injectReactClient() : undefined; -import RoutePlaceholders from './placeholders'; -import RouteReleasesSpa from './releasesSpa'; +import routePlaceholders from './placeholders'; +import routeReleasesSpa from './releasesSpa'; + import { ReposAppRequest, UserAlertType } from '../interfaces'; // - - - Middleware: require that they have a passport - - - @@ -48,10 +49,10 @@ router.use(asyncHandler(AddLinkToRequest)); router.use(asyncHandler(blockEnterpriseManagedUsersAuthentication)); -router.use('/placeholder', RoutePlaceholders); +router.use('/placeholder', routePlaceholders); router.use('/link/cleanup', reactRoute || linkCleanupRoute); router.use('/link', reactRoute || linkRoute); -router.use('/releases', reactRoute || RouteReleasesSpa); +router.use('/releases', reactRoute || routeReleasesSpa); if (reactRoute) { // client-only routes @@ -67,7 +68,7 @@ const dynamicStartupInstance = getCompanySpecificDeployment(); dynamicStartupInstance?.routes?.connectAuthenticatedRoutes && dynamicStartupInstance.routes.connectAuthenticatedRoutes(router, reactRoute); -router.use('/settings', SettingsRoute); +router.use('/settings', reactRoute || routeSettings); router.get('/news', (req: ReposAppRequest, res: Response, next: NextFunction) => { const config = getProviders(req).config; diff --git a/routes/org/repos.ts b/routes/org/repos.ts index d32f6e2f6..9ea3acf84 100644 --- a/routes/org/repos.ts +++ b/routes/org/repos.ts @@ -248,100 +248,6 @@ export interface IRenameOutput { output: ITemporaryCommandOutput[]; } -router.post( - '/:repoName/defaultBranch', - asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { - try { - const targetBranchName = req.body.targetBranchName || 'main'; - const providers = getProviders(req); - const activeContext = (req.individualContext || req.apiContext) as IndividualContext; - const repoPermissions = getContextualRepositoryPermissions(req); - const repository = req.repository as Repository; - const outcome = await renameRepositoryDefaultBranchEndToEnd( - providers, - activeContext, - repoPermissions, - repository, - targetBranchName, - false - ); - req.individualContext.webContext.render({ - view: 'repos/repoBranchRenamed', - title: outcome.message, - state: { - output: outcome.output, - repository, - }, - }); - } catch (error) { - return next(error); - } - }) -); - -export async function renameRepositoryDefaultBranchEndToEnd( - providers: IProviders, - activeContext: IndividualContext, - repoPermissions: IContextualRepositoryPermissions, - repository: Repository, - targetBranchName: string, - waitForRefresh: boolean -): Promise { - const corporateUsername = activeContext.corporateIdentity.username; - if (!corporateUsername) { - throw CreateError.InvalidParameters('no corporate username in the session'); - } - if (!targetBranchName) { - throw CreateError.InvalidParameters('invalid target branch name'); - } - if (!repoPermissions) { - throw CreateError.InvalidParameters('no repo permissions'); - } - if (!repoPermissions.allowAdministration) { - throw CreateError.NotAuthorized('You do not have administrative permission on this repository'); - } - await repository.getDetails(); - function finishUp(): Promise { - return new Promise((resolve) => { - triggerRenameNotification(providers, repository, corporateUsername, targetBranchName, output) - .then((ok) => { - /* ignore */ - }) - .catch((error) => { - console.error(`Notify rename trigger: ${error}`); - }); - repository - .getDetails(NoCacheNoBackground) - .then((ok) => { - return resolve(); - }) - .catch((error) => { - console.error(`Background refresh error: ${error}`); - return resolve(); - }); - }); - } - const output = await repository.renameDefaultBranch(targetBranchName); - if (waitForRefresh) { - await finishUp(); - } else { - process.nextTick(() => { - finishUp() - .then((ok) => { - /* ignore */ - }) - .catch((error) => { - /* ignore */ - }); - }); - } - return { - message: `Branch renamed to ${targetBranchName} for ${repository.name}`, - output, - }; -} - router.post( '/:repoName', asyncHandler(AddRepositoryPermissionsToRequest), @@ -771,55 +677,4 @@ function teamsToSet(teams) { // return next(new Error('You are not authorized to administer this repository.')); // } -async function triggerRenameNotification( - providers: IProviders, - repository: Repository, - corporateUsername: string, - targetBranchName: string, - output: ITemporaryCommandOutput[] -): Promise { - const { config, insights, operations, mailAddressProvider, viewServices } = providers; - insights.trackMetric({ name: 'RenameDefaultBranches', value: 1 }); - insights.trackEvent({ - name: 'RenameDefaultBranch', - properties: { - orgName: repository.organization.name, - repoName: repository.name, - targetBranchName, - }, - }); - const mailAddress = await mailAddressProvider.getAddressFromUpn(corporateUsername); - const emailTemplate = 'repoDefaultBranchRenamed'; - const mail: IMail = { - to: [mailAddress], - cc: [operations.getInfrastructureNotificationsMail()], - subject: `${repository.organization.name}/${repository.name} default branch is now ${targetBranchName}`, - content: undefined, - }; - const contentOptions = { - reason: `You are receiving this e-mail as a transaction record from your action to rename the default branch of this repository you administer.`, - headline: `${targetBranchName} branch`, - notification: 'information', - app: config.brand?.companyName ? `${config.brand.companyName} GitHub` : 'GitHub', - output, - repository, - organization: repository.organization, - viewServices, - }; - try { - mail.content = await operations.emailRender(emailTemplate, contentOptions); - await operations.sendMail(mail); - } catch (mailError) { - console.warn(mailError); - insights.trackException({ - exception: mailError, - properties: { - repositoryName: repository.full_name, - organizationName: repository.organization.name, - eventName: 'SendRenameDefaultBranchMail', - }, - }); - } -} - export default router; diff --git a/routes/orgAdmin.ts b/routes/orgAdmin.ts index d5bd0f5ef..a8bc2b7bc 100644 --- a/routes/orgAdmin.ts +++ b/routes/orgAdmin.ts @@ -29,6 +29,7 @@ enum OperationsAction { MarkAsServiceAccount = 'Mark as service account', UnmarkServiceAccount = 'Unmark service account', DestroyCollaboratorGrants = 'Destroy collaborator grants', + Destroy100 = 'Destroy 100', } enum UserQueryByType { @@ -208,10 +209,13 @@ async function loadInformation( if (queryCache && queryCache.supportsRepositoryCollaborators) { const result = await queryCache.userCollaboratorRepositories(thirdPartyId); const collaboratorRepositories = []; + const hasMany = result.length > 100; for (const { repository } of result) { try { - await repository.getDetails(); - collaboratorRepositories.push(repository.full_name); + if (!hasMany) { + await repository.getDetails(); + } + collaboratorRepositories.push(repository.organization.name + '/' + repository.name); } catch (ignoreError) { console.dir(ignoreError); } @@ -441,11 +445,12 @@ router.post('/whois/id/:githubid', function (req: ReposAppRequest, res: Response const thirdPartyId = req.params.githubid; const markAsServiceAccount = req.body['mark-as-service-account']; const unmarkServiceAccount = req.body['unmark-service-account']; - const removeCollaboration = req.body['remove-collaboration']; + const removeCollaboration = req.body['remove-collaboration'] || req.body['remove-collaboration-100']; + const remove100 = req.body['remove-collaboration-100']; const providers = getProviders(req); let action = OperationsAction.DestroyLink; if (removeCollaboration) { - action = OperationsAction.DestroyCollaboratorGrants; + action = remove100 ? OperationsAction.Destroy100 : OperationsAction.DestroyCollaboratorGrants; } else if (markAsServiceAccount) { action = OperationsAction.MarkAsServiceAccount; } else if (unmarkServiceAccount) { @@ -515,11 +520,12 @@ router.post('/whois/github/:username', function (req: ReposAppRequest, res: Resp const username = req.params.username; const markAsServiceAccount = req.body['mark-as-service-account']; const unmarkServiceAccount = req.body['unmark-service-account']; - const removeCollaboration = req.body['remove-collaboration']; + const removeCollaboration = req.body['remove-collaboration'] || req.body['remove-collaboration-100']; + const remove100 = req.body['remove-collaboration-100']; const providers = getProviders(req); let action = OperationsAction.DestroyLink; if (removeCollaboration) { - action = OperationsAction.DestroyCollaboratorGrants; + action = remove100 ? OperationsAction.Destroy100 : OperationsAction.DestroyCollaboratorGrants; } else if (markAsServiceAccount) { action = OperationsAction.MarkAsServiceAccount; } else if (unmarkServiceAccount) { @@ -637,9 +643,9 @@ async function destructiveLogic( ); } - if (action === OperationsAction.DestroyCollaboratorGrants) { + if (action === OperationsAction.DestroyCollaboratorGrants || action === OperationsAction.Destroy100) { const account: Account = operations.getAccount(thirdPartyId); - const res = await account.removeCollaboratorPermissions(); + const res = await account.removeCollaboratorPermissions(action === OperationsAction.Destroy100); state.messages = res.history; return state; } diff --git a/routes/settings/contributionData.ts b/routes/settings/contributionData.ts index 6e5e4aad4..a401ee71a 100644 --- a/routes/settings/contributionData.ts +++ b/routes/settings/contributionData.ts @@ -9,37 +9,11 @@ const router: Router = Router(); import { ErrorHelper, getProviders } from '../../transitional'; import { UserSettings } from '../../entities/userSettings'; -import { ReposAppRequest, UserAlertType } from '../../interfaces'; +import { UserAlertType } from '../../interfaces'; +import type { ReposAppRequestWithUserSettings } from '../../interfaces/middleware'; +import { getUserSettings } from '../../middleware/business/userSettings'; -export interface IRequestWithUserSettings extends ReposAppRequest { - userSettings?: UserSettings; -} - -async function getSettings(req: IRequestWithUserSettings, res: Response, next: NextFunction) { - const corporateId = req.individualContext.corporateIdentity.id; - const { userSettingsProvider } = getProviders(req); - if (!req.userSettings) { - let settings: UserSettings = null; - try { - settings = await userSettingsProvider.getUserSettings(corporateId); - } catch (notFoundError) { - if (ErrorHelper.IsNotFound(notFoundError)) { - // ignore - } else { - throw notFoundError; - } - } - if (!settings) { - settings = new UserSettings(); - settings.corporateId = corporateId; - await userSettingsProvider.insertUserSettings(settings); - } - req.userSettings = settings; - } - return next(); -} - -function view(req: IRequestWithUserSettings, res) { +function view(req: ReposAppRequestWithUserSettings, res) { const userSettings = req.userSettings; req.individualContext.webContext.render({ view: 'settings/contributionData', @@ -50,13 +24,13 @@ function view(req: IRequestWithUserSettings, res) { }); } -router.use(asyncHandler(getSettings)); +router.use(asyncHandler(getUserSettings)); router.get('/', view); router.post( '/', - asyncHandler(async function (req: IRequestWithUserSettings, res: Response, next: NextFunction) { + asyncHandler(async function (req: ReposAppRequestWithUserSettings, res: Response, next: NextFunction) { const isOptIn = !!(req.body.optIn === '1'); const currentSetting = req.userSettings.contributionShareOptIn; req.userSettings.contributionShareOptIn = isOptIn; diff --git a/scripts/configuration.ts b/scripts/configuration.ts index 5ad017e22..8225c5164 100644 --- a/scripts/configuration.ts +++ b/scripts/configuration.ts @@ -5,11 +5,14 @@ import job from '../job'; -job.run(async (providers) => { - const { config } = providers; - for (const key of Object.getOwnPropertyNames(config)) { - console.log(`${key}\n`); - console.dir(config[key]); - console.log(); - } -}); +job.run( + async (providers) => { + const { config } = providers; + for (const key of Object.getOwnPropertyNames(config)) { + console.log(`${key}\n`); + console.dir(config[key]); + console.log(); + } + }, + { name: 'Script: View configuration' } +); diff --git a/scripts/localEnvironment.ts b/scripts/localEnvironment.ts index a342f12cc..8611726c5 100644 --- a/scripts/localEnvironment.ts +++ b/scripts/localEnvironment.ts @@ -5,8 +5,11 @@ import job from '../job'; -// The local environment script allows for local inner-loop development. +// This script allows for quick inner-loop development. -job.run(async (providers) => { - // -}); +job.run( + async (providers) => { + // + }, + { name: 'Local Environment' } +); diff --git a/scripts/migrateLinks.ts b/scripts/migrateLinks.ts index ffd45a528..66dc52539 100644 --- a/scripts/migrateLinks.ts +++ b/scripts/migrateLinks.ts @@ -17,12 +17,12 @@ import throat from 'throat'; import job from '../job'; import { ICorporateLink, IProviders } from '../interfaces'; -import { createAndInitializeLinkProviderInstance, ILinkProvider } from '../lib/linkProviders'; -import { ErrorHelper, getThirdPartyLinkById } from '../transitional'; +import { createAndInitializeLinkProviderInstance } from '../lib/linkProviders'; +import { getThirdPartyLinkById } from '../transitional'; const parallelWorkLimit = 5; -job.run(migration); +job.run(migration, { name: 'Link migration' }); async function migration(providers: IProviders): Promise { // const sourceLinkProvider = providers.linkProvider; diff --git a/transitional.ts b/transitional.ts index a05e87b92..67c4a1792 100644 --- a/transitional.ts +++ b/transitional.ts @@ -73,6 +73,19 @@ export function projectCollaboratorPermissionsObjectToGitHubRepositoryPermission throw new Error(`Unsupported GitHubRepositoryPermission value inside permissions`); } +export async function streamToBuffer(readableStream: NodeJS.ReadableStream): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + readableStream.on('data', (data: Buffer | string) => { + chunks.push(data instanceof Buffer ? data : Buffer.from(data)); + }); + readableStream.on('end', () => { + resolve(Buffer.concat(chunks)); + }); + readableStream.on('error', reject); + }); +} + export function isPermissionBetterThan( currentBest: GitHubRepositoryPermission, newConsideration: GitHubRepositoryPermission diff --git a/utils.ts b/utils.ts index 514b95476..dd9576020 100644 --- a/utils.ts +++ b/utils.ts @@ -10,7 +10,7 @@ import { URL } from 'url'; import zlib from 'zlib'; import { type Repository } from './business/repository'; -import { ReposAppRequest, IAppSession, IReposError, SiteConfiguration } from './interfaces'; +import type { ReposAppRequest, IAppSession, IReposError, SiteConfiguration } from './interfaces'; import { getProviders } from './transitional'; export function daysInMilliseconds(days: number): number { @@ -262,7 +262,12 @@ export function writeTextToFile(filename: string, stringContent: string): Promis }); } -export function quitInTenSeconds(successful: boolean) { +export function quitInTenSeconds(successful: boolean, config?: SiteConfiguration) { + // To allow telemetry to flush, we'll wait typically + if (config?.debug?.exitImmediately || process.env.EXIT_IMMEDIATELY === '1') { + console.log(`EXIT_IMMEDIATELY set, exiting... exit code=${successful ? 0 : 1}`); + return process.exit(successful ? 0 : 1); + } console.log(`Quitting process in 10s... exit code=${successful ? 0 : 1}`); return setTimeout(() => { process.exit(successful ? 0 : 1); diff --git a/views/message.pug b/views/message.pug index 10feac70c..d04cb6a70 100644 --- a/views/message.pug +++ b/views/message.pug @@ -6,6 +6,9 @@ extends layout block content + if clearLocalStorage + script. + localStorage.clear(); div.container#top(style='margin-top:60px') div.container#content div.row diff --git a/views/organization/whois/result.pug b/views/organization/whois/result.pug index e6bb57c7c..4a044bab3 100644 --- a/views/organization/whois/result.pug +++ b/views/organization/whois/result.pug @@ -176,6 +176,9 @@ block content if query && query.collaboratorRepositories && query.collaboratorRepositories.length p input.btn.btn-danger(type='submit', value='Remove collaborator grants', name='remove-collaboration') + if query && query.collaboratorRepositories && query.collaboratorRepositories.length > 100 + p + input.btn.btn-danger(type='submit', value='Remove 100 collaborator grants', name='remove-collaboration-100') if query && query.collaboratorRepositories && query.collaboratorRepositories.length h2 Active individual Collaborator permissions on repos diff --git a/views/repos/defaultBranch.pug b/views/repos/defaultBranch.pug deleted file mode 100644 index a44fc9e34..000000000 --- a/views/repos/defaultBranch.pug +++ /dev/null @@ -1,83 +0,0 @@ -//- -//- Copyright (c) Microsoft. -//- Licensed under the MIT license. See LICENSE file in the project root for full license information. -//- - -extends ../layout - -block content - - //- Variables - - var githubUrl = 'https://github.com/' + repo.full_name - - var cloneUrl = repo.clone_url - - var sshUrl = repo.ssh_url - - var admin = repoPermissions && repoPermissions.allowAdministration - - .container - .row: .col-md-12 - if fromReposPage - .nav - ul.pager.zero-pad-bottom - li.previous - a(href='javascript:window.history.back()') - span(aria-hidden=true) ← - = ' Back' - - var hugeHeading = repo.name.length < 33 - h1(class={huge: hugeHeading}) - a(href='https://github.com/' + repo.full_name, target="_blank")= repo.name - if repo.private === true - |   - .label.label-warning(class={shrink66: !hugeHeading, shrink50: hugeHeading}) Private - h6= repo.full_name.replace('/' + repo.name, '') + ' organization' - if repo.description - p.lead=repo.description - - include ./pills - - if admin - if !organizationSupportsUpdatesApp - h4 Default branch rename #[span.label.label-muted PREVIEW] - ul.list-inline.list-horizontal-space - li - | Current default branch name - br - strong= repo.default_branch - p. - The #{organization.name} is not configured to allow renames at this time. - else - //- repo.default_branch !== 'main' - h4 Default branch rename #[span.label.label-muted PREVIEW] - ul.list-inline.list-horizontal-space - li - | Current default branch name - br - strong= repo.default_branch - p You have administrative rights to this repo and can choose to rename the default branch. - if repo.default_branch == 'main' - p: strong You're already using the default branch "main", no action required. - p. - Easily convert the default branch of this project. Note that there are - many potential side effects, including impacting deep URL links, continuous - integration and deployment systems, and likely this will require cleanup - work. - p. - This automated default branch rename capability: - ul - li Creates a new branch based off of the current default branch's latest commit - li Reassigns any protected branch settings to the new default branch from the former - li Updates any open pull requests against the current default branch for the new branch - li Updates the default branch to the new branch - li Deletes the current default branch - p The automated operation will halt if a major error is detected, but will not revert the changes completely. It will take 20-120 seconds to process. Please anticipate updating this repo to take some time, and resource for this change. This process may timeout if there are a large number of open pull requests. - - form(method='post', action=repository.baseUrl + 'defaultBranch') - p: strong New default branch name - input.form-control(name='targetBranchName', type='text', placeholder='The new default branch name to use', value='main') - br - input.btn.btn-sm( - type='submit', - name='rename-default-branch' - class='btn-danger', - value='Rename default branch', - onclick='return confirm(\'Are you sure that you want to rename the default branch? Additional work may be required to address any errors or configure systems such as webhooks, continuous integration, etc.\');' - title='Select this operation to begin the default branch rename process automatically') diff --git a/views/repos/pills.pug b/views/repos/pills.pug index 7800be760..9f1e89b86 100644 --- a/views/repos/pills.pug +++ b/views/repos/pills.pug @@ -6,6 +6,5 @@ .row: .col-md-12(style='margin-bottom: 32px; margin-top: 16px') ul.nav.nav-tabs li(role='presentation', class={active: !reposSubView || reposSubView === 'default'}): a(href=repository.baseUrl) Overview - li(role='presentation', class={active: reposSubView === 'defaultBranch'}): a(href=repository.baseUrl + 'defaultBranch/') Default Branch Name li(role='presentation', class={active: reposSubView === 'permissions'}): a(href=repository.baseUrl + 'permissions/') Permissions li(role='presentation', class={active: reposSubView === 'history'}): a(href=repository.baseUrl + 'history/') History diff --git a/views/repos/repo.pug b/views/repos/repo.pug index 552ff847d..d5c91008c 100644 --- a/views/repos/repo.pug +++ b/views/repos/repo.pug @@ -164,9 +164,6 @@ block content | Default branch br strong= repo.default_branch - if repo.default_branch === 'master' && admin - span   - a.btn.btn-sm.btn-muted(href=repository.baseUrl + 'defaultBranch') Rename... if organizationSupportsUpdatesApp && repo.default_branch !== 'main' && admin .alert.alert-gray From 63bc50145f2db39aed4e4017c2a023d8f82e65fe Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 26 Aug 2023 09:06:26 -0700 Subject: [PATCH 12/69] Lint changes --- business/queryCache.ts | 10 +- package-lock.json | 2266 ++++++++++++++++-------------- package.json | 34 +- routes/org/index.ts | 5 +- webhooks/tasks/automaticTeams.ts | 5 +- 5 files changed, 1199 insertions(+), 1121 deletions(-) diff --git a/business/queryCache.ts b/business/queryCache.ts index 9a26e6776..9ad133cd4 100644 --- a/business/queryCache.ts +++ b/business/queryCache.ts @@ -835,9 +835,8 @@ export default class QueryCache { this.throwMethodNotSupported('repositoryCollaborators', 'repositoryCollaboratorCacheProvider'); } const repositoryCollaboratorCacheProvider = this._providers.repositoryCollaboratorCacheProvider; - const rawEntities = await repositoryCollaboratorCacheProvider.queryCollaboratorsByRepositoryId( - repositoryId - ); + const rawEntities = + await repositoryCollaboratorCacheProvider.queryCollaboratorsByRepositoryId(repositoryId); return rawEntities .map((cacheEntity) => this.hydrateRepositoryCollaborator(cacheEntity)) .filter((real) => real); @@ -993,9 +992,8 @@ export default class QueryCache { this.throwMethodNotSupported('organizationMembers', 'organizationMemberCacheProvider'); } const organizationMemberCacheProvider = this._providers.organizationMemberCacheProvider; - const rawEntities = await organizationMemberCacheProvider.queryOrganizationMembersByOrganizationId( - organizationId - ); + const rawEntities = + await organizationMemberCacheProvider.queryOrganizationMembersByOrganizationId(organizationId); return this.hydrateOrganizationMembers(rawEntities); } diff --git a/package-lock.json b/package-lock.json index 4d1f6eb17..b9d82be81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@azure/cosmos": "3.17.3", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.2.4", + "@azure/identity": "3.3.0", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.0", "@azure/storage-blob": "12.15.0", @@ -20,9 +20,9 @@ "@octokit/plugin-paginate-graphql": "4.0.0", "@octokit/request": "8.1.1", "@octokit/rest": "20.0.1", - "@primer/octicons": "19.5.0", + "@primer/octicons": "19.6.0", "app-root-path": "3.1.0", - "applicationinsights": "2.7.1", + "applicationinsights": "2.7.3", "async-prompt": "1.0.1", "axios": "1.4.0", "basic-auth": "2.0.1", @@ -46,7 +46,7 @@ "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.4.0", + "luxon": "3.4.1", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", @@ -56,12 +56,12 @@ "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", - "pg": "8.11.2", + "pg": "8.11.3", "pg-escape": "0.2.0", "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.7", + "redis": "4.6.8", "secure-compare": "3.0.1", "semver": "7.5.4", "serve-favicon": "2.5.0", @@ -75,12 +75,12 @@ "@types/debug": "4.1.8", "@types/express": "4.17.17", "@types/express-session": "1.17.7", - "@types/jest": "29.5.3", + "@types/jest": "29.5.4", "@types/lodash": "4.14.197", "@types/luxon": "3.3.1", "@types/memory-cache": "0.2.3", - "@types/morgan": "1.9.4", - "@types/node": "20.5.0", + "@types/morgan": "1.9.5", + "@types/node": "20.5.6", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -92,23 +92,23 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.11.1", - "@typescript-eslint/eslint-plugin": "6.4.0", - "@typescript-eslint/parser": "6.4.0", - "cspell": "7.0.0", + "@typescript-eslint/eslint-plugin": "6.4.1", + "@typescript-eslint/parser": "6.4.1", + "cspell": "7.0.1", "eslint": "8.47.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.0.1", + "eslint-plugin-n": "16.0.2", "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.6.2", + "jest": "29.6.4", "jest-junit": "16.0.0", - "lint-staged": "14.0.0", + "lint-staged": "14.0.1", "markdownlint-cli2": "0.8.1", - "prettier": "3.0.1", + "prettier": "3.0.2", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.1.6" + "typescript": "5.2.2" }, "engines": { "node": ">=16" @@ -369,12 +369,12 @@ } }, "node_modules/@azure/identity": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.4.tgz", - "integrity": "sha512-t63oyi2LAn+ZAehYA7SDlhJDd1J0eLO3a21mxTaJcXqKW/tbRbKmo/BeyyTIXbBaoeTFn0xnyQHyomwndTqKUA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.0.tgz", + "integrity": "sha512-gISa/dAAxrWt6F2WiDXZY0y2xY4MLlN2wkNW4cPuq5OgPQKLSkxLc4I2WR04puTfZyQZnpXbAapAMEj1b96fgg==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/core-auth": "^1.5.0", "@azure/core-client": "^1.4.0", "@azure/core-rest-pipeline": "^1.1.0", "@azure/core-tracing": "^1.0.0", @@ -1149,15 +1149,15 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.0.tgz", - "integrity": "sha512-qfBAS4W35+loOfbprBDS8nN0Eitl9wmuPE8GQLbwYj9Qj+COlLg57KECeXF8cgGnHkahrIkc3t6V6eFF8nhXQw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.1.tgz", + "integrity": "sha512-Rm3AAOhZBPWy3L9lYRPQ41HAPP/jKBzTAkDVCsmT3SDbF1R1e7uqzQ86KhLWgcRfqGIh1uLcLjcUOAAh6jLu6Q==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.19", + "@cspell/dict-companies": "^3.0.20", "@cspell/dict-cpp": "^5.0.4", "@cspell/dict-cryptocurrencies": "^3.0.1", "@cspell/dict-csharp": "^4.0.2", @@ -1187,10 +1187,10 @@ "@cspell/dict-lua": "^4.0.1", "@cspell/dict-node": "^4.0.2", "@cspell/dict-npm": "^5.0.8", - "@cspell/dict-php": "^4.0.1", + "@cspell/dict-php": "^4.0.2", "@cspell/dict-powershell": "^5.0.2", "@cspell/dict-public-licenses": "^2.0.3", - "@cspell/dict-python": "^4.1.5", + "@cspell/dict-python": "^4.1.6", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", @@ -1207,39 +1207,51 @@ } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.0.tgz", - "integrity": "sha512-8OheTVzwwfOQqPZe3Enbe1F7Y0djjGunk5K7aC5MyXc3BuIV7Cx13xWo2gfAjiHBRuO5lqg9qidEfp6NE33amg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.1.tgz", + "integrity": "sha512-qOnGvnkV4s84X4LncR9F8e9TD2Y+0Yt1GJgsThul8Zgr90qjPpdUnfIwvptByXv7OWOuImpYk66NQIVTQtpcvQ==", "dev": true, "dependencies": { - "@cspell/cspell-types": "7.0.0" + "@cspell/cspell-types": "7.0.1" }, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-pipe": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.0.tgz", - "integrity": "sha512-MmQeLyyS5rZ/VvRtHGOLFUcCF9zy01WpWYthLZB61o96HCokqtlN4BBBPLYNxrotFNA4syVy9Si/wTxsC9oTiA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.1.tgz", + "integrity": "sha512-qbQkBS1xsJfwRFzrPLFE1jDt2MRRG75GKxKmFskNxuE5kdmshQT9/hjs+O/HUgPnNH2+l+aK/S5yisFti3YYoA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.0.1.tgz", + "integrity": "sha512-GfaYy+17l8cdZk8wEzp6UxA3hV4th/OsvQnUERMGSQ6oN1j8Rn1aEGUD3xxjhFAK2+AOeB3gx8RyIHQLWgE80g==", "dev": true, + "dependencies": { + "global-dirs": "^3.0.1" + }, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.0.tgz", - "integrity": "sha512-0YMM5SJY+XooOTEoo5+xuqTBLO87FP6QR8OBLBDeWNHvON9M4TpeAAN5K+IM0vMSFzgt1aSSMJNO0HSmxn17Yw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.1.tgz", + "integrity": "sha512-rtN4HyW8eHnrTNSji1DEM0v810sqhIIh6Tuo8aNNVoEuUMVdE+L17PoVnMc2dAp6VMv2nvTnh4Lpfsj5l5NsZw==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.0.tgz", - "integrity": "sha512-b/Dee5lb362ODlEK+kQcUDJfCprDRUFWcddo5tyzsYm3ID08ll6+DzCtfRxf48isyX1tL7uBKMj/iIpAhRNu9Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.1.tgz", + "integrity": "sha512-nPQGIwVUxNqAhBmSsnvRSJtHUo3cSQiCRpppNaXY8s1IrJ2kskS+LEF+d4SGTjQbCQH39sf3NoFWSCTfjl1jFg==", "dev": true, "engines": { "node": ">=16" @@ -1264,9 +1276,9 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.19.tgz", - "integrity": "sha512-hO7rS4DhFA333qyvf89wIVoclCtXe/2sftY6aS0oMIH1bMZLjLx2B2sQJj6dCiu6gG/By1S9YZ0fXabiPk2Tkg==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.20.tgz", + "integrity": "sha512-o13HaqYxkWo20FC5iU9PHKMFexY9D7/XeSj9tvBzy3sEzW324zw5MWEkeDszwmC/GsLZtot+5vopCv6/evRNlA==", "dev": true }, "node_modules/@cspell/dict-cpp": { @@ -1288,9 +1300,9 @@ "dev": true }, "node_modules/@cspell/dict-css": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", - "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.7.tgz", + "integrity": "sha512-NNlUTx/sYg+74kC0EtRewb7pjkEtPlIsu9JFNWAXa0JMTqqpQXqM3aEO4QJvUZFZF09bObeCAvzzxemAwxej7Q==", "dev": true }, "node_modules/@cspell/dict-dart": { @@ -1300,9 +1312,9 @@ "dev": true }, "node_modules/@cspell/dict-data-science": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.10.tgz", - "integrity": "sha512-7ZsRCnW0f4Bdo6Cqq8V4gHr8K58h+MP8majcDeMNhpMFUPiiSnvKsDuG9V5jciI/0t+lptPrZwGGIVEDF4Kqtg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.11.tgz", + "integrity": "sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==", "dev": true }, "node_modules/@cspell/dict-django": { @@ -1450,9 +1462,9 @@ "dev": true }, "node_modules/@cspell/dict-php": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", - "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.2.tgz", + "integrity": "sha512-7yglcmMoFHDPQXHW+9QAl8YjAToMm1qOi+4x/yGY1FSIEjZbCpjeDgyKMGg/NgpooQQceEN38AR59Pn23EDriA==", "dev": true }, "node_modules/@cspell/dict-powershell": { @@ -1468,12 +1480,12 @@ "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.5.tgz", - "integrity": "sha512-wWUWyHdyJtx5iG6Fz9rBQ17BtdpEsB17vmutao+gixQD28Jzb6XoLgDQ6606M0RnFjBSFhs5iT4CJBzlD2Kq6g==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", + "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", "dev": true, "dependencies": { - "@cspell/dict-data-science": "^1.0.0" + "@cspell/dict-data-science": "^1.0.11" } }, "node_modules/@cspell/dict-r": { @@ -1537,9 +1549,9 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.0.tgz", - "integrity": "sha512-GRSJvdQvVOC0y7Qla8eg6LLe8p8WnbnHLabGJGsqYfXgtfkUFev9v65kMybQSJt9qhDtGCRw6EN1UyaeeEtavQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.1.tgz", + "integrity": "sha512-ILOvieaJ4TspyKmXVDNF89zQxG/EORKAVY5U8HichIchJlQJDHKCxLy9YFJnoWgkAl11oPATImvuiztcDUZoDA==", "dev": true, "dependencies": { "import-meta-resolve": "^3.0.0" @@ -1549,9 +1561,9 @@ } }, "node_modules/@cspell/strong-weak-map": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.0.tgz", - "integrity": "sha512-DT1R30i3V7aJIGLt7x1igaMLHhYSFv6pgc9gNwXvZWFl1xm/f7Jx07GPXKKKhwwXd4vy7G5rhwo63F4Pt9i8Ng==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.1.tgz", + "integrity": "sha512-Y2L3kY12J77ETHNtZrfMwfufur2klsl33AqotC+kJ6Kbo2YZ6I3A224G5EBeIbQdmQdkE8KnpLDDcUv5640fJA==", "dev": true, "engines": { "node": ">=16" @@ -1809,16 +1821,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1826,37 +1838,37 @@ } }, "node_modules/@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1873,88 +1885,88 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/fake-timers": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/types": "^29.6.3", + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", @@ -1963,13 +1975,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1987,10 +1999,26 @@ } } }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" @@ -2000,9 +2028,9 @@ } }, "node_modules/@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", @@ -2014,13 +2042,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -2029,14 +2057,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -2044,22 +2072,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.6.4", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2076,12 +2104,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -2562,9 +2590,9 @@ } }, "node_modules/@primer/octicons": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.5.0.tgz", - "integrity": "sha512-b3IBp3EmzLc/YMw3xdqy7Lg8CgFObYaWegPntoKO1bZLZ4sAG5PRMPp36rj4TF1sDHbNufhGMvdCCM5VdS3mPQ==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.6.0.tgz", + "integrity": "sha512-/10tz0hyJijS9hCLKw5Wb3LfRmVSQjtiUDPfvf582bhe+/xZDybgf3VLJncD5SZaetC4zNhz31VwV8nnG2PdSQ==", "dependencies": { "object-assign": "^4.1.1" } @@ -2578,9 +2606,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", - "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.9.tgz", + "integrity": "sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -2615,9 +2643,9 @@ } }, "node_modules/@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", + "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", "peerDependencies": { "@redis/client": "^1.0.0" } @@ -2714,9 +2742,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -2746,12 +2774,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { @@ -2857,9 +2885,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", - "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "version": "29.5.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", + "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2904,9 +2932,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/morgan": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", - "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", + "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", "dev": true, "dependencies": { "@types/node": "*" @@ -2919,9 +2947,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" + "version": "20.5.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", + "integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -3171,16 +3199,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.0.tgz", - "integrity": "sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.0", - "@typescript-eslint/type-utils": "6.4.0", - "@typescript-eslint/utils": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3206,15 +3234,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz", - "integrity": "sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", + "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.4.0", - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/typescript-estree": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4" }, "engines": { @@ -3234,13 +3262,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz", - "integrity": "sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0" + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3251,13 +3279,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.0.tgz", - "integrity": "sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.4.0", - "@typescript-eslint/utils": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3278,9 +3306,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.0.tgz", - "integrity": "sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3291,13 +3319,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz", - "integrity": "sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3318,17 +3346,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.0.tgz", - "integrity": "sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.0", - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", "semver": "^7.5.4" }, "engines": { @@ -3343,12 +3371,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz", - "integrity": "sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/types": "6.4.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3508,13 +3536,13 @@ } }, "node_modules/applicationinsights": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.1.tgz", - "integrity": "sha512-N6uh3Di0uJo2vVCkBLqawgPGrkY2o1L3l7KouDeFFSmgUvZnKmoYWPKkMOUmNcKYIplY2Xb0bpU5T2Ht3ofdRg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.3.tgz", + "integrity": "sha512-JY8+kTEkjbA+kAVNWDtpfW2lqsrDALfDXuxOs74KLPu2y13fy/9WB52V4LfYVTVcW1/jYOXjTxNS2gPZIDh1iw==", "dependencies": { "@azure/core-auth": "^1.5.0", - "@azure/core-rest-pipeline": "1.12.0", - "@azure/core-util": "1.4.0", + "@azure/core-rest-pipeline": "1.10.1", + "@azure/core-util": "1.2.0", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", "@microsoft/applicationinsights-web-snippet": "^1.0.1", "@opentelemetry/api": "^1.4.1", @@ -3538,6 +3566,38 @@ } } }, + "node_modules/applicationinsights/node_modules/@azure/core-rest-pipeline": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", + "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/applicationinsights/node_modules/@azure/core-util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", + "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3649,15 +3709,15 @@ } }, "node_modules/babel-jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", - "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.2", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -3686,9 +3746,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -3724,12 +3784,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -4352,12 +4412,12 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/comment-json": { @@ -4631,22 +4691,22 @@ } }, "node_modules/cspell": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.0.tgz", - "integrity": "sha512-E8wQP30bTLROJsSNwYnhhRUdzVa4vQo6zILv7PqgTCSaveg8Af1HEh4ocRPRhppRgIXDpccG27+ATlpEzxiPGQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.1.tgz", + "integrity": "sha512-nl35cQJ1XxESRZS5QD6S+X1XtBU9Q/acUPXt8yZjd+PcgkyTwCRk7qwxwEodkTUMP3Yxkg5hGWMtzDXfNK35RQ==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "7.0.0", - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", - "@cspell/dynamic-import": "7.0.0", + "@cspell/cspell-json-reporter": "7.0.1", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1", + "@cspell/dynamic-import": "7.0.1", "chalk": "^5.3.0", "chalk-template": "^1.1.0", - "commander": "^10.0.1", - "cspell-gitignore": "7.0.0", - "cspell-glob": "7.0.0", - "cspell-io": "7.0.0", - "cspell-lib": "7.0.0", + "commander": "^11.0.0", + "cspell-gitignore": "7.0.1", + "cspell-glob": "7.0.1", + "cspell-io": "7.0.1", + "cspell-lib": "7.0.1", "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", @@ -4667,14 +4727,14 @@ } }, "node_modules/cspell-dictionary": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.0.tgz", - "integrity": "sha512-CYB02vB870JfCtmi4Njuzw1nCjbyRCjoqlsAQgHkhRSevRKcjFrK3+XsBhNA3Zo4ek4P35+oS/I4vMOHu6cdCg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.1.tgz", + "integrity": "sha512-mC2+sjsfxWZ5uYsnUHG/2opnpnoy492o13caai0h4GODV0u3hxhCS4f7twLf0Rdm+Is0MU7wrTecDdDVKu1mOA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", - "cspell-trie-lib": "7.0.0", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1", + "cspell-trie-lib": "7.0.1", "fast-equals": "^4.0.3", "gensequence": "^5.0.2" }, @@ -4689,12 +4749,12 @@ "dev": true }, "node_modules/cspell-gitignore": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.0.tgz", - "integrity": "sha512-9VVLuiVhntXO/It3K0nTDhxbPPc2nItvGLymItfUudfB0ZqgzBaomdoYZzXrcNOITjYiBXWCPuVOXLbyoL0DjQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.1.tgz", + "integrity": "sha512-ebi4VvH3KqUF9G93EoQA0PUIA8eM/y3GITIVDkdF2Ueo6uIWEeGjSaYNeJgNJHvccBZViR6XsrZuVxBOkSW3Rw==", "dev": true, "dependencies": { - "cspell-glob": "7.0.0", + "cspell-glob": "7.0.1", "find-up": "^5.0.0" }, "bin": { @@ -4705,9 +4765,9 @@ } }, "node_modules/cspell-glob": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.0.tgz", - "integrity": "sha512-Wl47kChIuSiuStofVSPdgvwi8BRD4tN03j+yhpJ1q+lWT023ctFacZy+Lc+L6nxaTUriDy5ET+UoooPMJ2PskA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.1.tgz", + "integrity": "sha512-Qm2r+FgtwvJnWbW03QoUohTLDkoic1JVjFSbUTua8AlzbOPJ2M+IJZx47rf5dAiUFtxIDsjiaDepcrkyW7q5HQ==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -4717,13 +4777,13 @@ } }, "node_modules/cspell-grammar": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.0.tgz", - "integrity": "sha512-0k1qVvxMNwP4WXX1zIp3Ub+RQnUzjiBtB+BO4Lprnkp6/JuRndpBRDrXBsqNZBVzZ+JjyRSU1elNSN6/nudXvQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.1.tgz", + "integrity": "sha512-qrwll/JWpa2/2cq4a39yLQPn0hsYcPFN8BWr2xsuFuuYjplaUhSU40LbngUAUkbcWGxVrQCR9odClboZ6xzYFQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0" + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1" }, "bin": { "cspell-grammar": "bin.mjs" @@ -4733,43 +4793,43 @@ } }, "node_modules/cspell-io": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.0.tgz", - "integrity": "sha512-pGf+XlMcOxZfO7NIwJYmje8D30OEUt2Vb7cfZ2nazdFf9/NfiZpYp3JHOT+n53DhbIXTfdmojXo5bVezPXA48g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.1.tgz", + "integrity": "sha512-z3dzYFJgredZJYV9piU/rvulCeMixNeJbxBZyHGOGWeKg36iZhXrIkNpK4s6GEAgGB9r/BD9P31E7YQomzhKZA==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "7.0.0", - "node-fetch": "^2.6.12" + "@cspell/cspell-service-bus": "7.0.1", + "node-fetch": "^2.6.13" }, "engines": { "node": ">=16" } }, "node_modules/cspell-lib": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.0.tgz", - "integrity": "sha512-CJAa7uV4hrm8OTnWdFPONSUP1Dp7J7fVhKu15aTrpNASUMAHe5YWqFqInCg+0+XhdRpGGYjQKhd+khsXL5a+bg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.1.tgz", + "integrity": "sha512-BaFhA0GFnuMEFzEALSt/TgrOl7A6vJSwtqqpdOGI5goLBIu8DDYqIncLrcglELosFo+KXnnYtYtPXuQIX3P5Kw==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "7.0.0", - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", - "@cspell/strong-weak-map": "7.0.0", + "@cspell/cspell-bundled-dicts": "7.0.1", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-resolver": "7.0.1", + "@cspell/cspell-types": "7.0.1", + "@cspell/strong-weak-map": "7.0.1", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.0.0", - "cspell-glob": "7.0.0", - "cspell-grammar": "7.0.0", - "cspell-io": "7.0.0", - "cspell-trie-lib": "7.0.0", + "cspell-dictionary": "7.0.1", + "cspell-glob": "7.0.1", + "cspell-grammar": "7.0.1", + "cspell-io": "7.0.1", + "cspell-trie-lib": "7.0.1", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^5.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" }, @@ -4860,13 +4920,13 @@ } }, "node_modules/cspell-trie-lib": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.0.tgz", - "integrity": "sha512-mopXyfjNRVuYbrZcbBcLwOMrWeyTezh4w8zy+RywUmsF6IW6/HM2DkfE2BmH1IyE9af29lgQqdB5eDbJLWrP5A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.1.tgz", + "integrity": "sha512-rdY78YK46LUmcez63kMbMF2nCmPIcnWd3a0rivnhyPaVvY+cwNKqpp7WSWOFDLboiMaEdCrdaS4AecspTCLjaw==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1", "gensequence": "^5.0.2" }, "engines": { @@ -5173,9 +5233,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5445,9 +5505,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", - "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -5653,17 +5713,16 @@ } }, "node_modules/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.2", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2" + "@jest/expect-utils": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6107,9 +6166,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -6243,15 +6302,18 @@ } }, "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, "dependencies": { - "ini": "^1.3.4" + "ini": "2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globals": { @@ -6586,10 +6648,13 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -6970,15 +7035,15 @@ } }, "node_modules/jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", - "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", + "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.6.4", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.2" + "jest-cli": "^29.6.4" }, "bin": { "jest": "bin/jest.js" @@ -6996,12 +7061,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -7009,28 +7075,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", - "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.2", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7040,21 +7106,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", - "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -7074,31 +7140,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", - "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-jest": "^29.6.2", + "@jest/test-sequencer": "^29.6.4", + "@jest/types": "^29.6.3", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.2", - "jest-environment-node": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7119,24 +7185,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7146,62 +7212,62 @@ } }, "node_modules/jest-each": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", - "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.6.2", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", - "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7228,46 +7294,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", - "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", - "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-diff": "^29.6.4", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", - "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -7276,14 +7342,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", - "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.2" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7307,26 +7373,26 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", - "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -7336,43 +7402,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", - "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", - "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.6.2", - "@jest/environment": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-leak-detector": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-resolve": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-util": "^29.6.2", - "jest-watcher": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -7381,31 +7447,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", - "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/globals": "^29.6.2", - "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -7414,9 +7480,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", - "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -7424,20 +7490,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.2", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-diff": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -7445,12 +7511,12 @@ } }, "node_modules/jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -7462,17 +7528,17 @@ } }, "node_modules/jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.2" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7491,18 +7557,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", - "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.2", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -7510,13 +7576,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.2", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7835,9 +7901,9 @@ } }, "node_modules/lint-staged": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", - "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", + "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -7873,15 +7939,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, "node_modules/lint-staged/node_modules/execa": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", @@ -8167,9 +8224,9 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/luxon": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", - "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.1.tgz", + "integrity": "sha512-2USspxOCXWGIKHwuQ9XElxPPYrDOJHDQ5DQ870CoD+CxJbBnRDIBCfhioUJJjct7BKOy80Ia8cVstIcIMb/0+Q==", "engines": { "node": ">=12" } @@ -8589,9 +8646,9 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9034,9 +9091,9 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "node_modules/pg": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.2.tgz", - "integrity": "sha512-l4rmVeV8qTIrrPrIR3kZQqBgSN93331s9i6wiUiLOSk0Q7PmUxZD/m1rQI622l3NfqBby9Ar5PABfS/SulfieQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", @@ -9284,9 +9341,9 @@ } }, "node_modules/prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -9311,12 +9368,12 @@ } }, "node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -9611,16 +9668,16 @@ } }, "node_modules/redis": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", - "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.8.tgz", + "integrity": "sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==", "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.8", + "@redis/client": "1.5.9", "@redis/graph": "1.1.0", "@redis/json": "1.0.4", "@redis/search": "1.1.3", - "@redis/time-series": "1.0.4" + "@redis/time-series": "1.0.5" } }, "node_modules/repeat-string": { @@ -9691,18 +9748,6 @@ "node": ">=8" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -10616,9 +10661,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11327,12 +11372,12 @@ } }, "@azure/identity": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.2.4.tgz", - "integrity": "sha512-t63oyi2LAn+ZAehYA7SDlhJDd1J0eLO3a21mxTaJcXqKW/tbRbKmo/BeyyTIXbBaoeTFn0xnyQHyomwndTqKUA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.0.tgz", + "integrity": "sha512-gISa/dAAxrWt6F2WiDXZY0y2xY4MLlN2wkNW4cPuq5OgPQKLSkxLc4I2WR04puTfZyQZnpXbAapAMEj1b96fgg==", "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/core-auth": "^1.5.0", "@azure/core-client": "^1.4.0", "@azure/core-rest-pipeline": "^1.1.0", "@azure/core-tracing": "^1.0.0", @@ -11931,15 +11976,15 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.0.tgz", - "integrity": "sha512-qfBAS4W35+loOfbprBDS8nN0Eitl9wmuPE8GQLbwYj9Qj+COlLg57KECeXF8cgGnHkahrIkc3t6V6eFF8nhXQw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.1.tgz", + "integrity": "sha512-Rm3AAOhZBPWy3L9lYRPQ41HAPP/jKBzTAkDVCsmT3SDbF1R1e7uqzQ86KhLWgcRfqGIh1uLcLjcUOAAh6jLu6Q==", "dev": true, "requires": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.19", + "@cspell/dict-companies": "^3.0.20", "@cspell/dict-cpp": "^5.0.4", "@cspell/dict-cryptocurrencies": "^3.0.1", "@cspell/dict-csharp": "^4.0.2", @@ -11969,10 +12014,10 @@ "@cspell/dict-lua": "^4.0.1", "@cspell/dict-node": "^4.0.2", "@cspell/dict-npm": "^5.0.8", - "@cspell/dict-php": "^4.0.1", + "@cspell/dict-php": "^4.0.2", "@cspell/dict-powershell": "^5.0.2", "@cspell/dict-public-licenses": "^2.0.3", - "@cspell/dict-python": "^4.1.5", + "@cspell/dict-python": "^4.1.6", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", @@ -11986,30 +12031,39 @@ } }, "@cspell/cspell-json-reporter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.0.tgz", - "integrity": "sha512-8OheTVzwwfOQqPZe3Enbe1F7Y0djjGunk5K7aC5MyXc3BuIV7Cx13xWo2gfAjiHBRuO5lqg9qidEfp6NE33amg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.1.tgz", + "integrity": "sha512-qOnGvnkV4s84X4LncR9F8e9TD2Y+0Yt1GJgsThul8Zgr90qjPpdUnfIwvptByXv7OWOuImpYk66NQIVTQtpcvQ==", "dev": true, "requires": { - "@cspell/cspell-types": "7.0.0" + "@cspell/cspell-types": "7.0.1" } }, "@cspell/cspell-pipe": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.0.tgz", - "integrity": "sha512-MmQeLyyS5rZ/VvRtHGOLFUcCF9zy01WpWYthLZB61o96HCokqtlN4BBBPLYNxrotFNA4syVy9Si/wTxsC9oTiA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.1.tgz", + "integrity": "sha512-qbQkBS1xsJfwRFzrPLFE1jDt2MRRG75GKxKmFskNxuE5kdmshQT9/hjs+O/HUgPnNH2+l+aK/S5yisFti3YYoA==", "dev": true }, + "@cspell/cspell-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.0.1.tgz", + "integrity": "sha512-GfaYy+17l8cdZk8wEzp6UxA3hV4th/OsvQnUERMGSQ6oN1j8Rn1aEGUD3xxjhFAK2+AOeB3gx8RyIHQLWgE80g==", + "dev": true, + "requires": { + "global-dirs": "^3.0.1" + } + }, "@cspell/cspell-service-bus": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.0.tgz", - "integrity": "sha512-0YMM5SJY+XooOTEoo5+xuqTBLO87FP6QR8OBLBDeWNHvON9M4TpeAAN5K+IM0vMSFzgt1aSSMJNO0HSmxn17Yw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.1.tgz", + "integrity": "sha512-rtN4HyW8eHnrTNSji1DEM0v810sqhIIh6Tuo8aNNVoEuUMVdE+L17PoVnMc2dAp6VMv2nvTnh4Lpfsj5l5NsZw==", "dev": true }, "@cspell/cspell-types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.0.tgz", - "integrity": "sha512-b/Dee5lb362ODlEK+kQcUDJfCprDRUFWcddo5tyzsYm3ID08ll6+DzCtfRxf48isyX1tL7uBKMj/iIpAhRNu9Q==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.1.tgz", + "integrity": "sha512-nPQGIwVUxNqAhBmSsnvRSJtHUo3cSQiCRpppNaXY8s1IrJ2kskS+LEF+d4SGTjQbCQH39sf3NoFWSCTfjl1jFg==", "dev": true }, "@cspell/dict-ada": { @@ -12031,9 +12085,9 @@ "dev": true }, "@cspell/dict-companies": { - "version": "3.0.19", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.19.tgz", - "integrity": "sha512-hO7rS4DhFA333qyvf89wIVoclCtXe/2sftY6aS0oMIH1bMZLjLx2B2sQJj6dCiu6gG/By1S9YZ0fXabiPk2Tkg==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.20.tgz", + "integrity": "sha512-o13HaqYxkWo20FC5iU9PHKMFexY9D7/XeSj9tvBzy3sEzW324zw5MWEkeDszwmC/GsLZtot+5vopCv6/evRNlA==", "dev": true }, "@cspell/dict-cpp": { @@ -12055,9 +12109,9 @@ "dev": true }, "@cspell/dict-css": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.6.tgz", - "integrity": "sha512-2Lo8W2ezHmGgY8cWFr4RUwnjbndna5mokpCK/DuxGILQnuajR0J31ANQOXj/8iZM2phFB93ZzMNk/0c04TDfSQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.7.tgz", + "integrity": "sha512-NNlUTx/sYg+74kC0EtRewb7pjkEtPlIsu9JFNWAXa0JMTqqpQXqM3aEO4QJvUZFZF09bObeCAvzzxemAwxej7Q==", "dev": true }, "@cspell/dict-dart": { @@ -12067,9 +12121,9 @@ "dev": true }, "@cspell/dict-data-science": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.10.tgz", - "integrity": "sha512-7ZsRCnW0f4Bdo6Cqq8V4gHr8K58h+MP8majcDeMNhpMFUPiiSnvKsDuG9V5jciI/0t+lptPrZwGGIVEDF4Kqtg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-1.0.11.tgz", + "integrity": "sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ==", "dev": true }, "@cspell/dict-django": { @@ -12217,9 +12271,9 @@ "dev": true }, "@cspell/dict-php": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.1.tgz", - "integrity": "sha512-XaQ/JkSyq2c07MfRG54DjLi2CV+HHwS99DDCAao9Fq2JfkWroTQsUeek7wYZXJATrJVOULoV3HKih12x905AtQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.2.tgz", + "integrity": "sha512-7yglcmMoFHDPQXHW+9QAl8YjAToMm1qOi+4x/yGY1FSIEjZbCpjeDgyKMGg/NgpooQQceEN38AR59Pn23EDriA==", "dev": true }, "@cspell/dict-powershell": { @@ -12235,12 +12289,12 @@ "dev": true }, "@cspell/dict-python": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.5.tgz", - "integrity": "sha512-wWUWyHdyJtx5iG6Fz9rBQ17BtdpEsB17vmutao+gixQD28Jzb6XoLgDQ6606M0RnFjBSFhs5iT4CJBzlD2Kq6g==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", + "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", "dev": true, "requires": { - "@cspell/dict-data-science": "^1.0.0" + "@cspell/dict-data-science": "^1.0.11" } }, "@cspell/dict-r": { @@ -12304,18 +12358,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.0.tgz", - "integrity": "sha512-GRSJvdQvVOC0y7Qla8eg6LLe8p8WnbnHLabGJGsqYfXgtfkUFev9v65kMybQSJt9qhDtGCRw6EN1UyaeeEtavQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.1.tgz", + "integrity": "sha512-ILOvieaJ4TspyKmXVDNF89zQxG/EORKAVY5U8HichIchJlQJDHKCxLy9YFJnoWgkAl11oPATImvuiztcDUZoDA==", "dev": true, "requires": { "import-meta-resolve": "^3.0.0" } }, "@cspell/strong-weak-map": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.0.tgz", - "integrity": "sha512-DT1R30i3V7aJIGLt7x1igaMLHhYSFv6pgc9gNwXvZWFl1xm/f7Jx07GPXKKKhwwXd4vy7G5rhwo63F4Pt9i8Ng==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.1.tgz", + "integrity": "sha512-Y2L3kY12J77ETHNtZrfMwfufur2klsl33AqotC+kJ6Kbo2YZ6I3A224G5EBeIbQdmQdkE8KnpLDDcUv5640fJA==", "dev": true }, "@cspotcode/source-map-support": { @@ -12521,123 +12575,123 @@ "dev": true }, "@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "requires": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "requires": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/fake-timers": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2" + "jest-mock": "^29.6.3" } }, "@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "requires": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" } }, "@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "requires": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" } }, "@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "requires": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/types": "^29.6.3", + "jest-mock": "^29.6.3" } }, "@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", @@ -12646,32 +12700,47 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + } } }, "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.18", @@ -12680,46 +12749,46 @@ } }, "@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "requires": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "requires": { - "@jest/test-result": "^29.6.2", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.6.4", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -12735,12 +12804,12 @@ } }, "@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -13092,9 +13161,9 @@ } }, "@primer/octicons": { - "version": "19.5.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.5.0.tgz", - "integrity": "sha512-b3IBp3EmzLc/YMw3xdqy7Lg8CgFObYaWegPntoKO1bZLZ4sAG5PRMPp36rj4TF1sDHbNufhGMvdCCM5VdS3mPQ==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.6.0.tgz", + "integrity": "sha512-/10tz0hyJijS9hCLKw5Wb3LfRmVSQjtiUDPfvf582bhe+/xZDybgf3VLJncD5SZaetC4zNhz31VwV8nnG2PdSQ==", "requires": { "object-assign": "^4.1.1" } @@ -13106,9 +13175,9 @@ "requires": {} }, "@redis/client": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", - "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.9.tgz", + "integrity": "sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==", "requires": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -13134,9 +13203,9 @@ "requires": {} }, "@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", + "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", "requires": {} }, "@sideway/address": { @@ -13230,9 +13299,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "requires": { "@babel/parser": "^7.20.7", @@ -13262,12 +13331,12 @@ } }, "@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/body-parser": { @@ -13373,9 +13442,9 @@ } }, "@types/jest": { - "version": "29.5.3", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", - "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", + "version": "29.5.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", + "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13420,9 +13489,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/morgan": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.4.tgz", - "integrity": "sha512-cXoc4k+6+YAllH3ZHmx4hf7La1dzUk6keTR4bF4b4Sc0mZxU/zK4wO7l+ZzezXm/jkYj/qC+uYGZrarZdIVvyQ==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", + "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", "dev": true, "requires": { "@types/node": "*" @@ -13435,9 +13504,9 @@ "dev": true }, "@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" + "version": "20.5.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", + "integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==" }, "@types/node-fetch": { "version": "2.6.2", @@ -13673,16 +13742,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.0.tgz", - "integrity": "sha512-62o2Hmc7Gs3p8SLfbXcipjWAa6qk2wZGChXG2JbBtYpwSRmti/9KHLqfbLs9uDigOexG+3PaQ9G2g3201FWLKg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.0", - "@typescript-eslint/type-utils": "6.4.0", - "@typescript-eslint/utils": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -13692,54 +13761,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.0.tgz", - "integrity": "sha512-I1Ah1irl033uxjxO9Xql7+biL3YD7w9IU8zF+xlzD/YxY6a4b7DYA08PXUUCbm2sEljwJF6ERFy2kTGAGcNilg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", + "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.4.0", - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/typescript-estree": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.0.tgz", - "integrity": "sha512-TUS7vaKkPWDVvl7GDNHFQMsMruD+zhkd3SdVW0d7b+7Zo+bd/hXJQ8nsiUZMi1jloWo6c9qt3B7Sqo+flC1nig==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0" + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" } }, "@typescript-eslint/type-utils": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.0.tgz", - "integrity": "sha512-TvqrUFFyGY0cX3WgDHcdl2/mMCWCDv/0thTtx/ODMY1QhEiyFtv/OlLaNIiYLwRpAxAtOLOY9SUf1H3Q3dlwAg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.4.0", - "@typescript-eslint/utils": "6.4.0", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.0.tgz", - "integrity": "sha512-+FV9kVFrS7w78YtzkIsNSoYsnOtrYVnKWSTVXoL1761CsCRv5wpDOINgsXpxD67YCLZtVQekDDyaxfjVWUJmmg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.0.tgz", - "integrity": "sha512-iDPJArf/K2sxvjOR6skeUCNgHR/tCQXBsa+ee1/clRKr3olZjZ/dSkXPZjG6YkPtnW6p5D1egeEPMCW6Gn4yLA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/visitor-keys": "6.4.0", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13748,27 +13817,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.0.tgz", - "integrity": "sha512-BvvwryBQpECPGo8PwF/y/q+yacg8Hn/2XS+DqL/oRsOPK+RPt29h5Ui5dqOKHDlbXrAeHUTnyG3wZA0KTDxRZw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.0", - "@typescript-eslint/types": "6.4.0", - "@typescript-eslint/typescript-estree": "6.4.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.0.tgz", - "integrity": "sha512-yJSfyT+uJm+JRDWYRYdCm2i+pmvXJSMtPR9Cq5/XQs4QIgNoLcoRtDdzsLbLsFM/c6um6ohQkg/MLxWvoIndJA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.0", + "@typescript-eslint/types": "6.4.1", "eslint-visitor-keys": "^3.4.1" } }, @@ -13873,13 +13942,13 @@ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "applicationinsights": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.1.tgz", - "integrity": "sha512-N6uh3Di0uJo2vVCkBLqawgPGrkY2o1L3l7KouDeFFSmgUvZnKmoYWPKkMOUmNcKYIplY2Xb0bpU5T2Ht3ofdRg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.3.tgz", + "integrity": "sha512-JY8+kTEkjbA+kAVNWDtpfW2lqsrDALfDXuxOs74KLPu2y13fy/9WB52V4LfYVTVcW1/jYOXjTxNS2gPZIDh1iw==", "requires": { "@azure/core-auth": "^1.5.0", - "@azure/core-rest-pipeline": "1.12.0", - "@azure/core-util": "1.4.0", + "@azure/core-rest-pipeline": "1.10.1", + "@azure/core-util": "1.2.0", "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5", "@microsoft/applicationinsights-web-snippet": "^1.0.1", "@opentelemetry/api": "^1.4.1", @@ -13890,6 +13959,34 @@ "continuation-local-storage": "^3.2.1", "diagnostic-channel": "1.1.1", "diagnostic-channel-publishers": "1.0.7" + }, + "dependencies": { + "@azure/core-rest-pipeline": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz", + "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-tracing": "^1.0.1", + "@azure/core-util": "^1.0.0", + "@azure/logger": "^1.0.0", + "form-data": "^4.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "tslib": "^2.2.0", + "uuid": "^8.3.0" + } + }, + "@azure/core-util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz", + "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + } + } } }, "arg": { @@ -13984,15 +14081,15 @@ } }, "babel-jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", - "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "requires": { - "@jest/transform": "^29.6.2", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -14012,9 +14109,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -14044,12 +14141,12 @@ } }, "babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -14497,9 +14594,9 @@ } }, "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true }, "comment-json": { @@ -14714,22 +14811,22 @@ } }, "cspell": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.0.tgz", - "integrity": "sha512-E8wQP30bTLROJsSNwYnhhRUdzVa4vQo6zILv7PqgTCSaveg8Af1HEh4ocRPRhppRgIXDpccG27+ATlpEzxiPGQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.1.tgz", + "integrity": "sha512-nl35cQJ1XxESRZS5QD6S+X1XtBU9Q/acUPXt8yZjd+PcgkyTwCRk7qwxwEodkTUMP3Yxkg5hGWMtzDXfNK35RQ==", "dev": true, "requires": { - "@cspell/cspell-json-reporter": "7.0.0", - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", - "@cspell/dynamic-import": "7.0.0", + "@cspell/cspell-json-reporter": "7.0.1", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1", + "@cspell/dynamic-import": "7.0.1", "chalk": "^5.3.0", "chalk-template": "^1.1.0", - "commander": "^10.0.1", - "cspell-gitignore": "7.0.0", - "cspell-glob": "7.0.0", - "cspell-io": "7.0.0", - "cspell-lib": "7.0.0", + "commander": "^11.0.0", + "cspell-gitignore": "7.0.1", + "cspell-glob": "7.0.1", + "cspell-io": "7.0.1", + "cspell-lib": "7.0.1", "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^6.0.1", @@ -14763,14 +14860,14 @@ } }, "cspell-dictionary": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.0.tgz", - "integrity": "sha512-CYB02vB870JfCtmi4Njuzw1nCjbyRCjoqlsAQgHkhRSevRKcjFrK3+XsBhNA3Zo4ek4P35+oS/I4vMOHu6cdCg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.1.tgz", + "integrity": "sha512-mC2+sjsfxWZ5uYsnUHG/2opnpnoy492o13caai0h4GODV0u3hxhCS4f7twLf0Rdm+Is0MU7wrTecDdDVKu1mOA==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", - "cspell-trie-lib": "7.0.0", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1", + "cspell-trie-lib": "7.0.1", "fast-equals": "^4.0.3", "gensequence": "^5.0.2" }, @@ -14784,69 +14881,69 @@ } }, "cspell-gitignore": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.0.tgz", - "integrity": "sha512-9VVLuiVhntXO/It3K0nTDhxbPPc2nItvGLymItfUudfB0ZqgzBaomdoYZzXrcNOITjYiBXWCPuVOXLbyoL0DjQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.1.tgz", + "integrity": "sha512-ebi4VvH3KqUF9G93EoQA0PUIA8eM/y3GITIVDkdF2Ueo6uIWEeGjSaYNeJgNJHvccBZViR6XsrZuVxBOkSW3Rw==", "dev": true, "requires": { - "cspell-glob": "7.0.0", + "cspell-glob": "7.0.1", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.0.tgz", - "integrity": "sha512-Wl47kChIuSiuStofVSPdgvwi8BRD4tN03j+yhpJ1q+lWT023ctFacZy+Lc+L6nxaTUriDy5ET+UoooPMJ2PskA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.1.tgz", + "integrity": "sha512-Qm2r+FgtwvJnWbW03QoUohTLDkoic1JVjFSbUTua8AlzbOPJ2M+IJZx47rf5dAiUFtxIDsjiaDepcrkyW7q5HQ==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.0.tgz", - "integrity": "sha512-0k1qVvxMNwP4WXX1zIp3Ub+RQnUzjiBtB+BO4Lprnkp6/JuRndpBRDrXBsqNZBVzZ+JjyRSU1elNSN6/nudXvQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.1.tgz", + "integrity": "sha512-qrwll/JWpa2/2cq4a39yLQPn0hsYcPFN8BWr2xsuFuuYjplaUhSU40LbngUAUkbcWGxVrQCR9odClboZ6xzYFQ==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0" + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1" } }, "cspell-io": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.0.tgz", - "integrity": "sha512-pGf+XlMcOxZfO7NIwJYmje8D30OEUt2Vb7cfZ2nazdFf9/NfiZpYp3JHOT+n53DhbIXTfdmojXo5bVezPXA48g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.1.tgz", + "integrity": "sha512-z3dzYFJgredZJYV9piU/rvulCeMixNeJbxBZyHGOGWeKg36iZhXrIkNpK4s6GEAgGB9r/BD9P31E7YQomzhKZA==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "7.0.0", - "node-fetch": "^2.6.12" + "@cspell/cspell-service-bus": "7.0.1", + "node-fetch": "^2.6.13" } }, "cspell-lib": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.0.tgz", - "integrity": "sha512-CJAa7uV4hrm8OTnWdFPONSUP1Dp7J7fVhKu15aTrpNASUMAHe5YWqFqInCg+0+XhdRpGGYjQKhd+khsXL5a+bg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.1.tgz", + "integrity": "sha512-BaFhA0GFnuMEFzEALSt/TgrOl7A6vJSwtqqpdOGI5goLBIu8DDYqIncLrcglELosFo+KXnnYtYtPXuQIX3P5Kw==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "7.0.0", - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", - "@cspell/strong-weak-map": "7.0.0", + "@cspell/cspell-bundled-dicts": "7.0.1", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-resolver": "7.0.1", + "@cspell/cspell-types": "7.0.1", + "@cspell/strong-weak-map": "7.0.1", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.0.0", - "cspell-glob": "7.0.0", - "cspell-grammar": "7.0.0", - "cspell-io": "7.0.0", - "cspell-trie-lib": "7.0.0", + "cspell-dictionary": "7.0.1", + "cspell-glob": "7.0.1", + "cspell-grammar": "7.0.1", + "cspell-io": "7.0.1", + "cspell-trie-lib": "7.0.1", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^5.0.2", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0", "vscode-languageserver-textdocument": "^1.0.8", "vscode-uri": "^3.0.7" }, @@ -14903,13 +15000,13 @@ } }, "cspell-trie-lib": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.0.tgz", - "integrity": "sha512-mopXyfjNRVuYbrZcbBcLwOMrWeyTezh4w8zy+RywUmsF6IW6/HM2DkfE2BmH1IyE9af29lgQqdB5eDbJLWrP5A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.1.tgz", + "integrity": "sha512-rdY78YK46LUmcez63kMbMF2nCmPIcnWd3a0rivnhyPaVvY+cwNKqpp7WSWOFDLboiMaEdCrdaS4AecspTCLjaw==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.0.0", - "@cspell/cspell-types": "7.0.0", + "@cspell/cspell-pipe": "7.0.1", + "@cspell/cspell-types": "7.0.1", "gensequence": "^5.0.2" } }, @@ -15080,9 +15177,9 @@ "dev": true }, "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "dir-glob": { @@ -15280,9 +15377,9 @@ } }, "eslint-plugin-n": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", - "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", @@ -15408,17 +15505,16 @@ "dev": true }, "expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "requires": { - "@jest/expect-utils": "^29.6.2", - "@types/node": "*", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2" + "@jest/expect-utils": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" } }, "express": { @@ -15760,9 +15856,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -15850,12 +15946,12 @@ } }, "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, "requires": { - "ini": "^1.3.4" + "ini": "2.0.0" } }, "globals": { @@ -16084,9 +16180,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, "ipaddr.js": { @@ -16334,175 +16430,176 @@ } }, "jest": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", - "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", + "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", "dev": true, "requires": { - "@jest/core": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.6.4", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.2" + "jest-cli": "^29.6.4" } }, "jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "requires": { "execa": "^5.0.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" } }, "jest-circus": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", - "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "requires": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.2", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", - "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "requires": { - "@jest/core": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "prompts": "^2.0.1", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", - "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.2", - "@jest/types": "^29.6.1", - "babel-jest": "^29.6.2", + "@jest/test-sequencer": "^29.6.4", + "@jest/types": "^29.6.3", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.2", - "jest-environment-node": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", - "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", - "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.6.2", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-environment-node": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", - "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" } }, "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-haste-map": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", - "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" } @@ -16520,53 +16617,53 @@ } }, "jest-leak-detector": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", - "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "requires": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-matcher-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", - "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.2" + "jest-diff": "^29.6.4", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.6.3" } }, "jest-message-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", - "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", - "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.2" + "jest-util": "^29.6.3" } }, "jest-pnp-resolver": { @@ -16577,101 +16674,101 @@ "requires": {} }, "jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true }, "jest-resolve": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", - "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", - "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "requires": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.6.4" } }, "jest-runner": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", - "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "requires": { - "@jest/console": "^29.6.2", - "@jest/environment": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-leak-detector": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-resolve": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-util": "^29.6.2", - "jest-watcher": "^29.6.2", - "jest-worker": "^29.6.2", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", - "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", - "dev": true, - "requires": { - "@jest/environment": "^29.6.2", - "@jest/fake-timers": "^29.6.2", - "@jest/globals": "^29.6.2", - "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", - "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -16679,30 +16776,30 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.2", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.2", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", + "jest-diff": "^29.6.4", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.2", + "pretty-format": "^29.6.3", "semver": "^7.5.3" } }, "jest-util": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", - "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -16711,17 +16808,17 @@ } }, "jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.2" + "pretty-format": "^29.6.3" }, "dependencies": { "camelcase": { @@ -16733,29 +16830,29 @@ } }, "jest-watcher": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", - "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "requires": { - "@jest/test-result": "^29.6.2", - "@jest/types": "^29.6.1", + "@jest/test-result": "^29.6.4", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.2", + "jest-util": "^29.6.3", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", - "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.6.2", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -17024,9 +17121,9 @@ } }, "lint-staged": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.0.tgz", - "integrity": "sha512-0tLf0pqZYkar/wu3nTctk4rVIG+d7PanDYv4/IQR4qwdqfQkTDziLRFnqMcLuLBTuUqmcLwsHPD2EjQ18d/oaA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", + "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", "dev": true, "requires": { "chalk": "5.3.0", @@ -17047,12 +17144,6 @@ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true }, - "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true - }, "execa": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", @@ -17249,9 +17340,9 @@ } }, "luxon": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", - "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.1.tgz", + "integrity": "sha512-2USspxOCXWGIKHwuQ9XElxPPYrDOJHDQ5DQ870CoD+CxJbBnRDIBCfhioUJJjct7BKOy80Ia8cVstIcIMb/0+Q==" }, "make-dir": { "version": "4.0.0", @@ -17568,9 +17659,9 @@ "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==" }, "node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" } @@ -17899,9 +17990,9 @@ "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, "pg": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.2.tgz", - "integrity": "sha512-l4rmVeV8qTIrrPrIR3kZQqBgSN93331s9i6wiUiLOSk0Q7PmUxZD/m1rQI622l3NfqBby9Ar5PABfS/SulfieQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", @@ -18079,9 +18170,9 @@ "dev": true }, "prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "dev": true }, "prettier-linter-helpers": { @@ -18094,12 +18185,12 @@ } }, "pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "requires": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -18333,16 +18424,16 @@ } }, "redis": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", - "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", + "version": "4.6.8", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.8.tgz", + "integrity": "sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==", "requires": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.8", + "@redis/client": "1.5.9", "@redis/graph": "1.1.0", "@redis/json": "1.0.4", "@redis/search": "1.1.3", - "@redis/time-series": "1.0.4" + "@redis/time-series": "1.0.5" } }, "repeat-string": { @@ -18392,15 +18483,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, "resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -19068,9 +19150,9 @@ } }, "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index 8cc3b1804..08ff73708 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "dependencies": { "@azure/cosmos": "3.17.3", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.2.4", + "@azure/identity": "3.3.0", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.0", "@azure/storage-blob": "12.15.0", @@ -80,9 +80,9 @@ "@octokit/request": "8.1.1", "@octokit/auth-app": "6.0.0", "@octokit/rest": "20.0.1", - "@primer/octicons": "19.5.0", + "@primer/octicons": "19.6.0", "app-root-path": "3.1.0", - "applicationinsights": "2.7.1", + "applicationinsights": "2.7.3", "async-prompt": "1.0.1", "axios": "1.4.0", "basic-auth": "2.0.1", @@ -106,7 +106,7 @@ "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.4.0", + "luxon": "3.4.1", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", @@ -116,12 +116,12 @@ "passport": "0.6.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", - "pg": "8.11.2", + "pg": "8.11.3", "pg-escape": "0.2.0", "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.7", + "redis": "4.6.8", "secure-compare": "3.0.1", "semver": "7.5.4", "serve-favicon": "2.5.0", @@ -135,12 +135,12 @@ "@types/debug": "4.1.8", "@types/express": "4.17.17", "@types/express-session": "1.17.7", - "@types/jest": "29.5.3", + "@types/jest": "29.5.4", "@types/lodash": "4.14.197", "@types/luxon": "3.3.1", "@types/memory-cache": "0.2.3", - "@types/morgan": "1.9.4", - "@types/node": "20.5.0", + "@types/morgan": "1.9.5", + "@types/node": "20.5.6", "@types/node-jose": "1.1.10", "@types/object-path": "0.11.1", "@types/passport": "1.0.12", @@ -152,23 +152,23 @@ "@types/semver": "7.5.0", "@types/simple-oauth2": "5.0.4", "@types/validator": "13.11.1", - "@typescript-eslint/eslint-plugin": "6.4.0", - "@typescript-eslint/parser": "6.4.0", - "cspell": "7.0.0", + "@typescript-eslint/eslint-plugin": "6.4.1", + "@typescript-eslint/parser": "6.4.1", + "cspell": "7.0.1", "eslint": "8.47.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.0.1", + "eslint-plugin-n": "16.0.2", "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.6.2", + "jest": "29.6.4", "jest-junit": "16.0.0", - "lint-staged": "14.0.0", + "lint-staged": "14.0.1", "markdownlint-cli2": "0.8.1", - "prettier": "3.0.1", + "prettier": "3.0.2", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.1.6" + "typescript": "5.2.2" }, "engines": { "node": ">=16" diff --git a/routes/org/index.ts b/routes/org/index.ts index 7f3af60da..92a74ba13 100644 --- a/routes/org/index.ts +++ b/routes/org/index.ts @@ -106,9 +106,8 @@ router.get( teamsMaintainedHash: null, pendingApprovals: null as TeamJoinApprovalEntity[], }; - results.organizationOverview = await individualContext.aggregations.getAggregatedOrganizationOverview( - organization - ); + results.organizationOverview = + await individualContext.aggregations.getAggregatedOrganizationOverview(organization); // Check for pending approvals const teamsMaintained = results.organizationOverview.teams.maintainer as Team[]; if (teamsMaintained && teamsMaintained.length && teamsMaintained.length > 0) { diff --git a/webhooks/tasks/automaticTeams.ts b/webhooks/tasks/automaticTeams.ts index 0f93e3416..b17cdcb2c 100644 --- a/webhooks/tasks/automaticTeams.ts +++ b/webhooks/tasks/automaticTeams.ts @@ -362,9 +362,8 @@ async function setTeamPermission( const orgName = organization.name; const repository = organization.repository(repoName, { id: repoId }); if (customizedTeamPermissionsWebhookLogic) { - const shouldSkipEnforcement = await customizedTeamPermissionsWebhookLogic.shouldSkipEnforcement( - repository - ); + const shouldSkipEnforcement = + await customizedTeamPermissionsWebhookLogic.shouldSkipEnforcement(repository); if (shouldSkipEnforcement && necessaryPermission !== GitHubRepositoryPermission.Pull) { console.log( `Customized logic for team permissions: skipping enforcement for repository ${repository.id}` From 9f3f76421030749e907a595c7a5bdc82fcbb6663 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 07:23:09 -0700 Subject: [PATCH 13/69] Actions: adding comments Adding note regarding variables and values in the workflow. --- .github/workflows/container.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index e1a2fb5db..42be3cadb 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -1,3 +1,13 @@ +# Create containers and deploy to a test environment +# --- +# Note that this workflow uses OpenID Connect for secretless deployment to Azure. +# +# Variables that are not secrets and can be configured as Actions variables _or_ secrets: +# - AAD tenant ID, subscription ID, client ID for OpenID Connect +# - Azure Container Registry name and username +# - App Service endpoints, app names, and slot names +# - Test environment URLs + name: Ship it 🐿️ on: From 8f0892d4da0a820fc8b702a6f7d1df9593761554 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 09:05:44 -0700 Subject: [PATCH 14/69] Spell + add helper func --- .cspell.json | 1 + transitional.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.cspell.json b/.cspell.json index 3847eb2ba..1a83440d8 100644 --- a/.cspell.json +++ b/.cspell.json @@ -681,6 +681,7 @@ "scansummary", "SCIM", "scorecardreprocessrequest", + "secretless", "secretscanningonpush", "secscandata", "securityevents", diff --git a/transitional.ts b/transitional.ts index 67c4a1792..e69b6f228 100644 --- a/transitional.ts +++ b/transitional.ts @@ -296,6 +296,10 @@ export function stripDistFolderName(dirname: string) { return dirname; } +export function getSafeCosmosResourceKey(key: string) { + return key.replace(/[%:\\/?#]/g, ''); +} + export function sha256(str: string) { const hash = crypto.createHash('sha256').update(str).digest('base64'); return hash; From 2caa114ce9f12d1aaf280d0c9b198d1729d65266 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 10:59:30 -0700 Subject: [PATCH 15/69] CSpell: updating terms --- .cspell.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index 1a83440d8..2fa7eaabe 100644 --- a/.cspell.json +++ b/.cspell.json @@ -19,7 +19,8 @@ "**/demo/user.json", "**/*_html.ts", "**/*.ignore_data.ts", - "package*.json" + "package*.json", + "**/known.csv" ], "enableGlobDot": true, "useGitignore": true, @@ -105,12 +106,16 @@ "CELA", "champscount", "champstatus", + "chromedriver", + "citus", + "citusdata", "classificationdelegated", "classificationnative", "classificationnativechecked", "classificationupdated", "classificationupdatedby", "classname", + "classpath", "cleanupblobs", "cleanupinvites", "cleanupkeys", @@ -152,6 +157,7 @@ "copilotagreement", "copilotrequest", "Copybara", + "countuse", "corpnet", "corporatealias", "corporatecount", @@ -185,6 +191,7 @@ "deepmerge", "defaultbranch", "deferreason", + "definitelytyped", "deislabs", "deletedetected", "deletesettingsorgname", @@ -199,6 +206,7 @@ "devstaging", "directoryname", "directowners", + "distributeonly", "distro", "divisionid", "dnfmit", @@ -261,9 +269,11 @@ "firstconfigured", "FIRSTRUNFILE", "flipgrid", + "fontawesome", "fontname", "forceopen", "forkscount", + "fortawesome", "FOSS", "FOSSFUND", "fossfundabout", @@ -320,6 +330,7 @@ "haswiki", "hierarchynames", "hierarchytext", + "highcharts", "hsts", "Hsts", "HSTS", @@ -362,6 +373,7 @@ "istest", "jeffwilcox", "jitgrants", + "jabberpl", "joblog", "jobname", "jsoncontribution", @@ -445,6 +457,8 @@ "monthlycontributionactivity", "msapplication", "msecnd", + "MSEULA", + "MSFTEULA", "MSFTIES", "msftmetadata", "msrc", @@ -463,6 +477,8 @@ "newrepo", "newrepolockdown", "newrepolockremoved", + "Newtonsoft", + "NOASSERTION", "nodeapp", "nodenext", "noemail", @@ -475,7 +491,9 @@ "npminitignore", "npminstallignore", "npmrc", + "npmjs", "nums", + "Nunit", "octicon", "odata", "offboard", @@ -506,6 +524,7 @@ "opensourcedocsprod", "opensourceprod", "opensourcepulls", + "opensourcerepoowners", "opensourcereposdev", "opensourcereposprod", "opensourcesite", @@ -776,6 +795,7 @@ "timezoneoffset", "tlink", "tolower", + "Toolset", "totalcount", "touchedtime", "toupper", @@ -842,12 +862,15 @@ "watcherscount", "Wcag", "webcontext", + "webfonts", "webhoooks", "welcomeemailsent", "whois", "Whois", + "withsource", "withmaintainers", "withservicetree", + "wixtoolset", "xamarinhq", "Xcache", "xlink", From 4f43e4827edd889a920da6d65e7749ca31f44b2e Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 11:01:28 -0700 Subject: [PATCH 16/69] package.json: remove unused item --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index 08ff73708..65b66daab 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,6 @@ "management", "organization" ], - "_ignore_main": "dist/index.js", - "_ignore_types": "dist/index.d.ts", "tags": [ "github", "node", From dfa6c8e080d30949e8ce29b13575a4d519d7fbff Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:50:06 -0700 Subject: [PATCH 17/69] Default branch: removing our one-off custom logic --- routes/org/repos.ts | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/routes/org/repos.ts b/routes/org/repos.ts index 9ea3acf84..414b809fd 100644 --- a/routes/org/repos.ts +++ b/routes/org/repos.ts @@ -377,38 +377,6 @@ router.get( }) ); -router.get( - '/:repoName/defaultBranch', - asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { - const referer = req.headers.referer as string; - const fromReposPage = referer && (referer.endsWith('repos') || referer.endsWith('repos/')); - const organization = req.organization; - const repoPermissions = req.repoPermissions; - const repository = req.repository; - const repositoryMetadataEntity = req.repositoryMetadata; - await repository.getDetails(); - const title = `${repository.name} - Default Branch Name`; - const details = await repository.organization.getDetails(); - const organizationSupportsUpdatesApp = await organization.supportsUpdatesApp(); - organization.id = details.id; - req.individualContext.webContext.render({ - view: 'repos/defaultBranch', - title, - state: { - organization, - organizationSupportsUpdatesApp, - repo: decorateRepoForView(repository), - reposSubView: 'defaultBranch', - repository, - fromReposPage, - repoPermissions, - repositoryMetadataEntity, - }, - }); - }) -); - export interface IRepositoryPermissionsView {} export async function calculateGroupedPermissionsViewForRepository(repository: Repository): Promise { From 7672504d50fc8b49f99b9b04770f6a030bf614ff Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:50:36 -0700 Subject: [PATCH 18/69] Removing comment --- index.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/index.ts b/index.ts index 87ada218c..b90109b36 100644 --- a/index.ts +++ b/index.ts @@ -10,12 +10,8 @@ import type { ExecutionEnvironment, IReposApplication, SiteConfiguration } from import configResolver from './lib/config'; import initialize from './middleware/initialize'; -// Library framework - export * from './interfaces'; -// Application framework - type InitializeCall = ( executionEnvironment: ExecutionEnvironment, config: SiteConfiguration, From 0797acf9d4fa5182ad04b8184d947c08accbda6b Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:51:06 -0700 Subject: [PATCH 19/69] Cosmos: key wrap --- lib/caching/cosmosdb.ts | 4 ++-- lib/campaigns.ts | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/caching/cosmosdb.ts b/lib/caching/cosmosdb.ts index 9eb9eb0b9..7007d7326 100644 --- a/lib/caching/cosmosdb.ts +++ b/lib/caching/cosmosdb.ts @@ -7,7 +7,7 @@ import { ICacheHelper } from '.'; import { CosmosClient, Database, Container } from '@azure/cosmos'; import BlobCache, { IBlobCacheOptions } from './blob'; import { sleep } from '../../utils'; -import { ErrorHelper, sha256 } from '../../transitional'; +import { ErrorHelper, getSafeCosmosResourceKey, sha256 } from '../../transitional'; import Debug from 'debug'; const debug = Debug.debug('cache'); @@ -55,7 +55,7 @@ export default class CosmosCache implements ICacheHelper { } private safetyKey(str: string) { - return str.replace(/[%:\\/?#]/g, ''); + return getSafeCosmosResourceKey(str); } private key(key: string) { diff --git a/lib/campaigns.ts b/lib/campaigns.ts index 1d3418cf2..a65a91d12 100644 --- a/lib/campaigns.ts +++ b/lib/campaigns.ts @@ -3,6 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { getSafeCosmosResourceKey } from '../transitional'; import CosmosHelper from './cosmosHelper'; export interface ICampaignUserState { @@ -160,9 +161,9 @@ export class StatefulCampaignProvider implements ICampaignHelper { } private key(corporateId: string, campaignGroupId: string, campaignId?: string) { - return campaignId - ? `${campaignGroupId}-${campaignId}-${corporateId}` - : `${campaignGroupId}-${corporateId}`; + return getSafeCosmosResourceKey( + campaignId ? `${campaignGroupId}-${campaignId}-${corporateId}` : `${campaignGroupId}-${corporateId}` + ); } private baseObject(corporateId: string, campaignGroupId: string, campaignId?: string) { From 626c03fff4850c4c7f89abfc194025c455abb32d Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:51:27 -0700 Subject: [PATCH 20/69] Operations: repo by ID speedup --- business/operations/index.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/business/operations/index.ts b/business/operations/index.ts index 464c68f05..d2cde96f6 100644 --- a/business/operations/index.ts +++ b/business/operations/index.ts @@ -875,6 +875,22 @@ export class Operations } async getRepoById(repoId: number, options?: ICacheOptions): Promise { + const { repositoryCacheProvider } = this.providers; + if (repositoryCacheProvider) { + try { + const cachedRepository = await repositoryCacheProvider.getRepository(String(repoId)); + if (cachedRepository?.organizationId) { + const organization = this.getOrganizationById(Number(cachedRepository.organizationId)); + return organization.repository(cachedRepository.repositoryName); + } + } catch (error) { + if (ErrorHelper.IsNotFound(error)) { + console.log(`Repository ${repoId} not found in the cache: ${error}`); + } else { + console.log(`Repository ${repoId} error retrieving from cache: ${error}`); + } + } + } const cacheOptions = options || { maxAgeSeconds: this.defaults.crossOrgsReposStaleSecondsPerOrg, }; From c1a3accb89cd24e977fdc26b8c2249201a1ec6f2 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:52:02 -0700 Subject: [PATCH 21/69] Package updates --- package-lock.json | 2896 +++++++++++++++++++++++++-------------------- package.json | 89 +- 2 files changed, 1674 insertions(+), 1311 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24d916ea7..8ff66566a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,24 +9,25 @@ "version": "7.1.0", "license": "MIT", "dependencies": { - "@azure/cosmos": "3.17.3", + "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", "@azure/identity": "3.3.0", "@azure/keyvault-secrets": "4.7.0", - "@azure/service-bus": "7.9.0", - "@azure/storage-blob": "12.15.0", - "@azure/storage-queue": "12.14.0", - "@octokit/auth-app": "6.0.0", + "@azure/service-bus": "7.9.1", + "@azure/storage-blob": "12.16.0", + "@azure/storage-queue": "12.15.0", + "@octokit/auth-app": "6.0.1", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.1", - "@octokit/rest": "20.0.1", - "@primer/octicons": "19.6.0", + "@octokit/request": "8.1.2", + "@octokit/rest": "20.0.2", + "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", - "applicationinsights": "2.7.3", + "applicationinsights": "2.8.0", "async-prompt": "1.0.1", - "axios": "1.4.0", + "axios": "1.5.1", "basic-auth": "2.0.1", "body-parser": "1.20.2", + "change-case": "5.0.1", "color-contrast-checker": "2.1.0", "compression": "1.7.4", "connect-redis": "7.1.0", @@ -42,16 +43,16 @@ "github-username-regex": "1.0.0", "hsts": "2.2.0", "jsonc": "2.0.0", - "jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.2", "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.4.1", + "luxon": "3.4.3", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.4", + "nodemailer": "6.9.5", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", @@ -61,7 +62,7 @@ "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.8", + "redis": "4.6.10", "secure-compare": "3.0.1", "semver": "7.5.4", "serve-favicon": "2.5.0", @@ -72,46 +73,47 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/debug": "4.1.8", - "@types/express": "4.17.17", - "@types/express-session": "1.17.7", - "@types/jest": "29.5.4", - "@types/lodash": "4.14.197", - "@types/luxon": "3.3.1", + "@types/cors": "2.8.14", + "@types/debug": "4.1.9", + "@types/express": "4.17.18", + "@types/express-session": "1.17.8", + "@types/jest": "29.5.5", + "@types/lodash": "4.14.199", + "@types/luxon": "3.3.2", "@types/memory-cache": "0.2.3", - "@types/morgan": "1.9.5", - "@types/node": "20.5.6", - "@types/node-jose": "1.1.10", - "@types/object-path": "0.11.1", - "@types/passport": "1.0.12", - "@types/passport-azure-ad": "4.3.1", - "@types/passport-github": "1.1.7", - "@types/pg": "8.10.2", - "@types/pug": "2.0.6", - "@types/recursive-readdir": "2.2.1", - "@types/semver": "7.5.0", - "@types/simple-oauth2": "5.0.4", - "@types/validator": "13.11.1", - "@typescript-eslint/eslint-plugin": "6.4.1", - "@typescript-eslint/parser": "6.4.1", - "cspell": "7.0.1", - "eslint": "8.47.0", + "@types/morgan": "1.9.6", + "@types/node": "20.8.2", + "@types/node-jose": "1.1.11", + "@types/object-path": "0.11.2", + "@types/passport": "1.0.13", + "@types/passport-azure-ad": "4.3.2", + "@types/passport-github": "1.1.10", + "@types/pg": "8.10.3", + "@types/pug": "2.0.7", + "@types/recursive-readdir": "2.2.2", + "@types/semver": "7.5.3", + "@types/simple-oauth2": "5.0.5", + "@types/validator": "13.11.2", + "@typescript-eslint/eslint-plugin": "6.7.4", + "@typescript-eslint/parser": "6.7.4", + "cspell": "7.3.7", + "eslint": "8.50.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.0.2", + "eslint-plugin-n": "16.1.0", "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.6.4", + "jest": "29.7.0", "jest-junit": "16.0.0", "lint-staged": "14.0.1", - "markdownlint-cli2": "0.8.1", - "prettier": "3.0.2", + "markdownlint-cli2": "0.10.0", + "prettier": "3.0.3", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", "typescript": "5.2.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -327,9 +329,9 @@ } }, "node_modules/@azure/cosmos": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.17.3.tgz", - "integrity": "sha512-wBglkQ6Irjv5Vo2iw8fd6eYj60WYRSSg4/0DBkeOP6BwQ4RA91znsOHd6s3qG6UAbNgYuzC9Nnq07vlFFZkHEw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-4.0.0.tgz", + "integrity": "sha512-/Z27p1+FTkmjmm8jk90zi/HrczPHw2t8WecFnsnTe4xGocWl0Z4clP0YlLUTJPhRLWYa5upwD9rMvKJkS1f1kg==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -475,9 +477,9 @@ } }, "node_modules/@azure/service-bus": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.0.tgz", - "integrity": "sha512-DzvWGmIertkF404nQ/AZQ6hwgXtOtabjBME7dsNvzXmBMfGRjviNWLD5yGyPT4x+clJzbMjRuzvTER+cbRwTYw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.1.tgz", + "integrity": "sha512-4IqhCOV1aSA2ChqFPOWN/5Qh2V8GDBnYleAmtETcHgKkpTQ3PCKX42gP6ZdhUPdNkHET+eu+KkwKYxRZJjqadw==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-amqp": "^3.3.0", @@ -503,9 +505,9 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", - "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.16.0.tgz", + "integrity": "sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -533,9 +535,9 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", - "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.15.0.tgz", + "integrity": "sha512-qotyfMcmocaT1r9bfX7RyQQnkRJcTXGSG/m6LIchtEsNmqLu3ulVqkOlNM+O0XP9wwJ6Da1XQbWz5jQtrDe3DQ==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -1149,25 +1151,25 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.1.tgz", - "integrity": "sha512-Rm3AAOhZBPWy3L9lYRPQ41HAPP/jKBzTAkDVCsmT3SDbF1R1e7uqzQ86KhLWgcRfqGIh1uLcLjcUOAAh6jLu6Q==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.7.tgz", + "integrity": "sha512-Mw7J0RAWGpEup/+eIePw3wi+OlMGNicrD1r9OhdgIgO6sHEi01ibS/RzNNbC7UziLaYEHi8+WfLyGzmp1ZISrQ==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", - "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.20", - "@cspell/dict-cpp": "^5.0.4", - "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-bash": "^4.1.2", + "@cspell/dict-companies": "^3.0.24", + "@cspell/dict-cpp": "^5.0.5", + "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.6", + "@cspell/dict-css": "^4.0.10", "@cspell/dict-dart": "^2.0.3", "@cspell/dict-django": "^4.1.0", "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.6", + "@cspell/dict-en_us": "^4.3.8", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", "@cspell/dict-filetypes": "^3.0.1", @@ -1176,30 +1178,30 @@ "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.2", + "@cspell/dict-golang": "^6.0.3", "@cspell/dict-haskell": "^4.0.1", - "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", - "@cspell/dict-java": "^5.0.5", + "@cspell/dict-java": "^5.0.6", "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.1", - "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.8", - "@cspell/dict-php": "^4.0.2", + "@cspell/dict-node": "^4.0.3", + "@cspell/dict-npm": "^5.0.10", + "@cspell/dict-php": "^4.0.3", "@cspell/dict-powershell": "^5.0.2", - "@cspell/dict-public-licenses": "^2.0.3", - "@cspell/dict-python": "^4.1.6", + "@cspell/dict-public-licenses": "^2.0.4", + "@cspell/dict-python": "^4.1.9", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.2.1", + "@cspell/dict-software-terms": "^3.3.2", "@cspell/dict-sql": "^2.1.1", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", - "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-typescript": "^3.1.2", "@cspell/dict-vue": "^3.0.0" }, "engines": { @@ -1207,30 +1209,30 @@ } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.1.tgz", - "integrity": "sha512-qOnGvnkV4s84X4LncR9F8e9TD2Y+0Yt1GJgsThul8Zgr90qjPpdUnfIwvptByXv7OWOuImpYk66NQIVTQtpcvQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.7.tgz", + "integrity": "sha512-bogUQKKZWLttZtxFKjpzHuliIha/ByV2km18gm8dA2uB3IrzD1UJy4sCE8lnaodm6n3VtjnViSkQ5XIVU3gAKQ==", "dev": true, "dependencies": { - "@cspell/cspell-types": "7.0.1" + "@cspell/cspell-types": "7.3.7" }, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-pipe": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.1.tgz", - "integrity": "sha512-qbQkBS1xsJfwRFzrPLFE1jDt2MRRG75GKxKmFskNxuE5kdmshQT9/hjs+O/HUgPnNH2+l+aK/S5yisFti3YYoA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.7.tgz", + "integrity": "sha512-ZO8v3EwGhjUvhPo1S48+CKv7EPXMoYF7LGERB34K8EXFByb9+J74ojMYj9UgLRV68lFTrDFde3bHoZPPVS1FsA==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.0.1.tgz", - "integrity": "sha512-GfaYy+17l8cdZk8wEzp6UxA3hV4th/OsvQnUERMGSQ6oN1j8Rn1aEGUD3xxjhFAK2+AOeB3gx8RyIHQLWgE80g==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.7.tgz", + "integrity": "sha512-WWZcTI5f2cCjr1yRDTMkcVg7Meil3s+0aaKcLCDTGQf9J2UWWjpqDJ6M6keYei3paAjxW2Pk03IRNNwdA3+igQ==", "dev": true, "dependencies": { "global-dirs": "^3.0.1" @@ -1240,18 +1242,18 @@ } }, "node_modules/@cspell/cspell-service-bus": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.1.tgz", - "integrity": "sha512-rtN4HyW8eHnrTNSji1DEM0v810sqhIIh6Tuo8aNNVoEuUMVdE+L17PoVnMc2dAp6VMv2nvTnh4Lpfsj5l5NsZw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.7.tgz", + "integrity": "sha512-pnDOFpjht7dZYydMygcf0brCSk5BGRvbeWRH6MaMhd+3CdyzyEvtZG3IbBQVNyVvDTA2c/K3rljOAo8y3/lpnw==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.1.tgz", - "integrity": "sha512-nPQGIwVUxNqAhBmSsnvRSJtHUo3cSQiCRpppNaXY8s1IrJ2kskS+LEF+d4SGTjQbCQH39sf3NoFWSCTfjl1jFg==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.7.tgz", + "integrity": "sha512-zM2BuZJ3UUgPwF78bssggi8X20nmW3a95EmbNJKfbO6Zf2ui7UMzeP3BwpCZk30A/EixGlFhLf6Xd+eBT/DQqw==", "dev": true, "engines": { "node": ">=16" @@ -1270,27 +1272,27 @@ "dev": true }, "node_modules/@cspell/dict-bash": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", - "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.2.tgz", + "integrity": "sha512-AEBWjbaMaJEyAjOHW0F15P2izBjli2cNerG3NjuVH7xX/HUUeNoTj8FF1nwpMufKwGQCvuyO2hCmkVxhJ0y55Q==", "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.20.tgz", - "integrity": "sha512-o13HaqYxkWo20FC5iU9PHKMFexY9D7/XeSj9tvBzy3sEzW324zw5MWEkeDszwmC/GsLZtot+5vopCv6/evRNlA==", + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.25.tgz", + "integrity": "sha512-7phQlGJ/4qCx9fQg/kR8YV0n5TPak4+eleQ7M/e7uhsQR8TwOWsPU1dW23WABoTqJbYCgdUYLxqjQ8458w7jZQ==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", - "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", + "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", - "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-4.0.0.tgz", + "integrity": "sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==", "dev": true }, "node_modules/@cspell/dict-csharp": { @@ -1300,9 +1302,9 @@ "dev": true }, "node_modules/@cspell/dict-css": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.7.tgz", - "integrity": "sha512-NNlUTx/sYg+74kC0EtRewb7pjkEtPlIsu9JFNWAXa0JMTqqpQXqM3aEO4QJvUZFZF09bObeCAvzzxemAwxej7Q==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.11.tgz", + "integrity": "sha512-kHQqg3/3Xra2Xki3K4e6s3BHDw5L82geie4q7jRBxQ9CofIgVEMcOqTr2QWKgIWegmACEe7B/CIMH35d4eiafA==", "dev": true }, "node_modules/@cspell/dict-dart": { @@ -1342,9 +1344,9 @@ "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.6.tgz", - "integrity": "sha512-odhgsjNZI9BtEOJdvqfAuv/3yz5aB1ngfBNaph7WSnYVt//9e3fhrElZ6/pIIkoyuGgeQPwz1fXt+tMgcnLSEQ==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.8.tgz", + "integrity": "sha512-rCPsbDHuRnFUbzWAY6O1H9+cLZt5FNQwjPVw2TdQZfipdb0lim984aLGY+nupi1iKC3lfjyd5SVUgmSZEG1QNA==", "dev": true }, "node_modules/@cspell/dict-en-common-misspellings": { @@ -1396,9 +1398,9 @@ "dev": true }, "node_modules/@cspell/dict-golang": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", - "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.3.tgz", + "integrity": "sha512-KiNnjAeqDBq6zH4s46hzBrKgqIrkSZ9bbHzQ54PbHfe+jurZkSZ4lXz6E+315RNh2TkRLcNppFvaZqJvKZXomA==", "dev": true }, "node_modules/@cspell/dict-haskell": { @@ -1408,9 +1410,9 @@ "dev": true }, "node_modules/@cspell/dict-html": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", - "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.5.tgz", + "integrity": "sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==", "dev": true }, "node_modules/@cspell/dict-html-symbol-entities": { @@ -1420,9 +1422,9 @@ "dev": true }, "node_modules/@cspell/dict-java": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", - "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.6.tgz", + "integrity": "sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==", "dev": true }, "node_modules/@cspell/dict-k8s": { @@ -1450,21 +1452,21 @@ "dev": true }, "node_modules/@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", + "integrity": "sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==", "dev": true }, "node_modules/@cspell/dict-npm": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.8.tgz", - "integrity": "sha512-KuqH8tEsFD6DPKqKwIfWr9E+admE3yghaC0AKXG8jPaf77N0lkctKaS3dm0oxWUXkYKA/eXj6LCtz3VcTyxFPg==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.11.tgz", + "integrity": "sha512-QlgF92q29mT0LbNqlDHb3UgY5jCLcSn+GnA1pvD5ps/zw2LhVl+ZXMHExwSIi7gwTzP3IyJ1f/dT6rnw9wic4A==", "dev": true }, "node_modules/@cspell/dict-php": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.2.tgz", - "integrity": "sha512-7yglcmMoFHDPQXHW+9QAl8YjAToMm1qOi+4x/yGY1FSIEjZbCpjeDgyKMGg/NgpooQQceEN38AR59Pn23EDriA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.3.tgz", + "integrity": "sha512-PxtSmWJCDEB4M8R9ER9ijxBum/tvUqYT26QeuV58q2IFs5IrPZ6hocQKvnFGXItjCWH4oYXyAEAAzINlBC4Opg==", "dev": true }, "node_modules/@cspell/dict-powershell": { @@ -1474,15 +1476,15 @@ "dev": true }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.3.tgz", - "integrity": "sha512-JSLEdpEYufQ1H+93UHi+axlqQm1fhgK6kpdLHp6uPHu//CsvETcqNVawjB+qOdI/g38JTMw5fBqSd0aGNxa6Dw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.4.tgz", + "integrity": "sha512-KjsfuGwMWvPkp6s0nR+s4mZc9SQhh1tHDOyQZfEVRwi+2ev7f8l7R6ts9sP2Mplb8UcxwO6YmKwxHjN+XHoMoA==", "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", - "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.9.tgz", + "integrity": "sha512-JMA4v/ZPJWuDt3PPFz+23VIY3iDIB+xOTQ6nw+WkcJU5yr6FUl5zMU9ModKrgujg3jGRuuJqofErZVPqHNHYAA==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^1.0.11" @@ -1513,9 +1515,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.1.tgz", - "integrity": "sha512-+QXmyoONVc/3aNgKW+0F0u3XUCRTfNRkWKLZQA78i+9fOfde8ZT4JmROmZgRveH/MxD4n6pNFceIRcYI6C8WuQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.3.tgz", + "integrity": "sha512-JKxBPyubapWkeekGquJYo5MLZe1TXAWAC8bqxuarG0cYkWoa7wIqCNH6/9OywRFSBzIYCgoVu2xDP1yRqTEokg==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -1537,9 +1539,9 @@ "dev": true }, "node_modules/@cspell/dict-typescript": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", - "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.2.tgz", + "integrity": "sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==", "dev": true }, "node_modules/@cspell/dict-vue": { @@ -1549,9 +1551,9 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.1.tgz", - "integrity": "sha512-ILOvieaJ4TspyKmXVDNF89zQxG/EORKAVY5U8HichIchJlQJDHKCxLy9YFJnoWgkAl11oPATImvuiztcDUZoDA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.7.tgz", + "integrity": "sha512-ac52OLDMYBHkRQ8XzihOWnyfqri3M84ELTZdqBhR5YGcHW/mxKhsmXqudA980SdRRKaicD39yhX4idAFb4AsDg==", "dev": true, "dependencies": { "import-meta-resolve": "^3.0.0" @@ -1561,9 +1563,9 @@ } }, "node_modules/@cspell/strong-weak-map": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.1.tgz", - "integrity": "sha512-Y2L3kY12J77ETHNtZrfMwfufur2klsl33AqotC+kJ6Kbo2YZ6I3A224G5EBeIbQdmQdkE8KnpLDDcUv5640fJA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.7.tgz", + "integrity": "sha512-n+jRgwH0wU+HsfqgCGVzPmWnZl4SyhtvPxusKwXj6L/STGdt8IP2rYl1PFOtyvgjPjh8xXe/jRrq7zH07btiKA==", "dev": true, "engines": { "node": ">=16" @@ -1639,9 +1641,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1689,9 +1691,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1821,16 +1823,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1838,15 +1840,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1854,21 +1856,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1885,37 +1887,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1925,47 +1927,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1979,9 +1981,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2042,12 +2044,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2057,14 +2059,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2072,9 +2074,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2085,9 +2087,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2208,15 +2210,15 @@ } }, "node_modules/@octokit/auth-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.0.tgz", - "integrity": "sha512-OKct7Rukf3g9DjpzcpdacQsdmd6oPrJ7fZND22JkjzhDvfhttUOnmh+qPS4kHhaNNyTxqSThnfrUWvkqNLd1nw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.1.tgz", + "integrity": "sha512-tjCD4nzQNZgmLH62+PSnTF6eGerisFgV4v6euhqJik6yWV96e1ZiiGj+NXIqbgnpjLmtnBqVUrNyGKu3DoGEGA==", "dependencies": { "@octokit/auth-oauth-app": "^7.0.0", "@octokit/auth-oauth-user": "^4.0.0", "@octokit/request": "^8.0.2", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.3.1", "lru-cache": "^10.0.0", "universal-github-app-jwt": "^1.1.1", @@ -2226,6 +2228,19 @@ "node": ">= 18" } }, + "node_modules/@octokit/auth-app/node_modules/@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "node_modules/@octokit/auth-app/node_modules/@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "dependencies": { + "@octokit/openapi-types": "^19.0.0" + } + }, "node_modules/@octokit/auth-app/node_modules/lru-cache": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", @@ -2372,11 +2387,11 @@ } }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", - "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.0.0.tgz", + "integrity": "sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw==", "dependencies": { - "@octokit/types": "^11.0.0" + "@octokit/types": "^12.0.0" }, "engines": { "node": ">= 18" @@ -2385,6 +2400,19 @@ "@octokit/core": ">=5" } }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "dependencies": { + "@octokit/openapi-types": "^19.0.0" + } + }, "node_modules/@octokit/plugin-request-log": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", @@ -2397,11 +2425,11 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", - "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.0.0.tgz", + "integrity": "sha512-16VkwE2v6rXU+/gBsYC62M8lKWOphY5Lg4wpjYnVE9Zbu0J6IwiT5kILoj1YOB53XLmcJR+Nqp8DmifOPY4H3g==", "dependencies": { - "@octokit/types": "^11.0.0" + "@octokit/types": "^12.0.0" }, "engines": { "node": ">= 18" @@ -2410,14 +2438,27 @@ "@octokit/core": ">=5" } }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "dependencies": { + "@octokit/openapi-types": "^19.0.0" + } + }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.2.tgz", + "integrity": "sha512-A0RJJfzjlZQwb+39eDm5UM23dkxbp28WEG4p2ueH+Q2yY4p349aRK/vcUlEuIB//ggcrHJceoYYkBP/LYCoXEg==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", + "@octokit/types": "^12.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, @@ -2438,15 +2479,28 @@ "node": ">= 18" } }, + "node_modules/@octokit/request/node_modules/@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "node_modules/@octokit/request/node_modules/@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "dependencies": { + "@octokit/openapi-types": "^19.0.0" + } + }, "node_modules/@octokit/rest": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", - "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.2.tgz", + "integrity": "sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==", "dependencies": { "@octokit/core": "^5.0.0", - "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "^9.0.0" + "@octokit/plugin-rest-endpoint-methods": "^10.0.0" }, "engines": { "node": ">= 18" @@ -2590,9 +2644,9 @@ } }, "node_modules/@primer/octicons": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.6.0.tgz", - "integrity": "sha512-/10tz0hyJijS9hCLKw5Wb3LfRmVSQjtiUDPfvf582bhe+/xZDybgf3VLJncD5SZaetC4zNhz31VwV8nnG2PdSQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.8.0.tgz", + "integrity": "sha512-Imze/fyW41Io5fN+27T5EAeXJrgBjMbz6nzU+wYbRylXvIAjLPUvaJPVoStiFlgSU+TjTUJqg5A9rgMDzTyMCg==", "dependencies": { "object-assign": "^4.1.1" } @@ -2606,9 +2660,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.9.tgz", - "integrity": "sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==", + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.11.tgz", + "integrity": "sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -2627,17 +2681,17 @@ } }, "node_modules/@redis/json": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", - "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", + "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/search": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", - "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.5.tgz", + "integrity": "sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg==", "peerDependencies": { "@redis/client": "^1.0.0" } @@ -2804,19 +2858,28 @@ "@types/node": "*" } }, + "node_modules/@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", + "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2835,18 +2898,18 @@ } }, "node_modules/@types/express-session": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.7.tgz", - "integrity": "sha512-L25080PBYoRLu472HY/HNCxaXY8AaGgqGC8/p/8+BYMhG0RDOLQ1wpXOpAzr4Gi5TGozTKyJv5BVODM5UNyVMw==", + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.8.tgz", + "integrity": "sha512-bFF7/3wOldMn+56XyFRGY9ZzCr3JWhNSP2ajMPgTlbZR6BQOCHdAbNA9W5dMBPgMywpIP4zkmhxP6Opm/NRYMQ==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "dependencies": { "@types/node": "*" @@ -2885,9 +2948,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2895,9 +2958,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/jsonwebtoken": { @@ -2909,15 +2972,15 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.197", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", - "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", - "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", + "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", "dev": true }, "node_modules/@types/memory-cache": { @@ -2932,9 +2995,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/morgan": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", - "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", + "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -2947,9 +3010,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", - "integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==" + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", + "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -2974,9 +3037,9 @@ } }, "node_modules/@types/node-jose": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.10.tgz", - "integrity": "sha512-7L0ucJTugW4x/sYpQ+c5IudAwr0pFuxDVnZLpHKWpff7p1lVa3wTuNvnrzFBNeLojE+UY0cVCwNGXLxXsMIrzw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.11.tgz", + "integrity": "sha512-8hEAhDB2A3k0Inhxh71qWfEp9mg970z/NvEPkzJN5KZSlIE47lEeYf3k+pNvk/W4hiSL/A0lW0AO7Fw8QMEtkA==", "dev": true, "dependencies": { "@types/node": "*" @@ -2992,9 +3055,9 @@ } }, "node_modules/@types/object-path": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.1.tgz", - "integrity": "sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.2.tgz", + "integrity": "sha512-STkyj0IQkgbmohF1afXQN64KucE3w7EgSbNJxqkJoq0KHVBV4nU5Pyku+TM9UCiCLXhZlkEFd8zq38P8lDFi6g==", "dev": true }, "node_modules/@types/parse-json": { @@ -3004,18 +3067,18 @@ "dev": true }, "node_modules/@types/passport": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", - "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.13.tgz", + "integrity": "sha512-XXURryL+EZAWtbQFOHX1eNB+RJwz5XMPPz1xrGpEKr2xUZCXM4NCPkHMtZQ3B2tTSG/1IRaAcTHjczRA4sSFCw==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/passport-azure-ad": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.1.tgz", - "integrity": "sha512-X0EVVXJU54K6gaS1f3CPZibV58/bAe6JjE8C/nwMAcje0R73MOFnkm0elTecIdx1tFXLzzo80QuW1CYtEKQC3Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.2.tgz", + "integrity": "sha512-EHJcuRCNbvpVlBsIdoHAB+tWKGT43alFr6/f4hZOexfS7Oh4VEC28hycDrHUHBbFmQPPgvYkgNsMwf4KZyv7Fw==", "dev": true, "dependencies": { "@types/express": "*", @@ -3023,9 +3086,9 @@ } }, "node_modules/@types/passport-github": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.7.tgz", - "integrity": "sha512-CCBwZyBRy3fLOd96Idn00TLHMDXZIzUGXq+gSvB70h8k4j61dkbZCI6m5ZauL+hLdyJur7Z94tdfd8DBjFA0og==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.10.tgz", + "integrity": "sha512-fj3FV2uWnE70S8x5afP70TgG8REEvLm2MWNocD28rLZhU4vmf/vchtG3yPrCZOGrme+Csbf1UO/KXZhvCqBElQ==", "dev": true, "dependencies": { "@types/express": "*", @@ -3045,9 +3108,9 @@ } }, "node_modules/@types/pg": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.2.tgz", - "integrity": "sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==", + "version": "8.10.3", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.3.tgz", + "integrity": "sha512-BACzsw64lCZesclRpZGu55tnqgFAYcrCBP92xLh1KLypZLCOsvJTSTgaoFVTy3lCys/aZTQzfeDxtjwrvdzL2g==", "dev": true, "dependencies": { "@types/node": "*", @@ -3113,9 +3176,9 @@ } }, "node_modules/@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.7.tgz", + "integrity": "sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==", "dev": true }, "node_modules/@types/qs": { @@ -3129,18 +3192,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha512-Xd+Ptc4/F2ueInqy5yK2FI5FxtwwbX2+VZpcg+9oYsFJVen8qQKGapCr+Bi5wQtHU1cTXT8s+07lo/nKPgu8Gg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-pYLuc3EaFA3SwYfZRC6cSV9TfL+0tLi9Otu2djGavsNhmrEna1yG1EkFOZW7SKJr/nIuDNk4mM6kMMpNLntIhw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/serve-static": { @@ -3158,9 +3221,9 @@ "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" }, "node_modules/@types/simple-oauth2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.4.tgz", - "integrity": "sha512-4SvTfmAa1fGUa1d07j9vIiC4o92bGh0ihPXmtS05udMMmNwVIaU2nZ706cC4wI8cJxOlHD4P/d5tzqvWYd+KxA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.5.tgz", + "integrity": "sha512-hsUpJyOQnexMxa2Ilvs1CwmcSN62Y4irIvBbviUJNiyxUGIOQS7CUs0QPq+nuxkaNeNqdjxJ1BE/AoCGiG7L+g==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3178,9 +3241,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==", + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==", "dev": true }, "node_modules/@types/yargs": { @@ -3199,16 +3262,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3234,15 +3297,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", - "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", + "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4" }, "engines": { @@ -3262,13 +3325,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3279,13 +3342,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3306,9 +3369,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3319,13 +3382,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3346,17 +3409,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", "semver": "^7.5.4" }, "engines": { @@ -3371,12 +3434,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3536,9 +3599,9 @@ } }, "node_modules/applicationinsights": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.3.tgz", - "integrity": "sha512-JY8+kTEkjbA+kAVNWDtpfW2lqsrDALfDXuxOs74KLPu2y13fy/9WB52V4LfYVTVcW1/jYOXjTxNS2gPZIDh1iw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.8.0.tgz", + "integrity": "sha512-pxVOdCPwXTal1A904yGmzOOUJrIeQ89xQir0ifr7fLl+e0BlGrZ1P4StcIDuEXk93gV9CGxGm5Mol8ksPk2mcg==", "dependencies": { "@azure/core-auth": "^1.5.0", "@azure/core-rest-pipeline": "1.10.1", @@ -3699,9 +3762,9 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -3709,12 +3772,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -4185,6 +4248,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.0.1.tgz", + "integrity": "sha512-iQ4vIQKF6hFRAGi3AKnoZPRpYfzj6/Zc4trhe/Ngzlk1FblM573PgfIiccATvQc81oFYub8Z9UY5QSOxsSSQYA==" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -4643,6 +4711,27 @@ "node": ">=14" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -4691,25 +4780,25 @@ } }, "node_modules/cspell": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.1.tgz", - "integrity": "sha512-nl35cQJ1XxESRZS5QD6S+X1XtBU9Q/acUPXt8yZjd+PcgkyTwCRk7qwxwEodkTUMP3Yxkg5hGWMtzDXfNK35RQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.7.tgz", + "integrity": "sha512-p23EuTu+7b2qioRxC7sV1TVfxIPm7928BtT4jYBHGeONiYP0EOOWNP8ynaksMYLTifQBzH1Q0LO4L5ogHiQsfw==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "7.0.1", - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "@cspell/dynamic-import": "7.0.1", + "@cspell/cspell-json-reporter": "7.3.7", + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "@cspell/dynamic-import": "7.3.7", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.0.0", - "cspell-gitignore": "7.0.1", - "cspell-glob": "7.0.1", - "cspell-io": "7.0.1", - "cspell-lib": "7.0.1", + "cspell-gitignore": "7.3.7", + "cspell-glob": "7.3.7", + "cspell-io": "7.3.7", + "cspell-lib": "7.3.7", "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^7.0.0", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", @@ -4727,16 +4816,16 @@ } }, "node_modules/cspell-dictionary": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.1.tgz", - "integrity": "sha512-mC2+sjsfxWZ5uYsnUHG/2opnpnoy492o13caai0h4GODV0u3hxhCS4f7twLf0Rdm+Is0MU7wrTecDdDVKu1mOA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.7.tgz", + "integrity": "sha512-mJ0h2BGxYEqb/1FxKD50WuufKhDaCaIk8pwZQryqazXQCvoTpla0yud3KO61Cke92za8z37Rfb+5xATlywEfaw==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "cspell-trie-lib": "7.0.1", + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "cspell-trie-lib": "7.3.7", "fast-equals": "^4.0.3", - "gensequence": "^5.0.2" + "gensequence": "^6.0.0" }, "engines": { "node": ">=16" @@ -4749,12 +4838,12 @@ "dev": true }, "node_modules/cspell-gitignore": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.1.tgz", - "integrity": "sha512-ebi4VvH3KqUF9G93EoQA0PUIA8eM/y3GITIVDkdF2Ueo6uIWEeGjSaYNeJgNJHvccBZViR6XsrZuVxBOkSW3Rw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.7.tgz", + "integrity": "sha512-nP4Gg+zq5y0njzhiNYTLvaJIMAponBhJoTMzkXCOOKYEHJmiRQocfa3gO4t2s8iZ4YVhscbrB2h+dYvo3MLQqg==", "dev": true, "dependencies": { - "cspell-glob": "7.0.1", + "cspell-glob": "7.3.7", "find-up": "^5.0.0" }, "bin": { @@ -4765,9 +4854,9 @@ } }, "node_modules/cspell-glob": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.1.tgz", - "integrity": "sha512-Qm2r+FgtwvJnWbW03QoUohTLDkoic1JVjFSbUTua8AlzbOPJ2M+IJZx47rf5dAiUFtxIDsjiaDepcrkyW7q5HQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.7.tgz", + "integrity": "sha512-DJX5wJ5dhcNzyycukZst+WtbIdpCLTL7DaKS0EKW/57QjzMwwMBgpsF89ufnreGHB8dHrPF85epF9qyOI1SRNg==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -4777,13 +4866,13 @@ } }, "node_modules/cspell-grammar": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.1.tgz", - "integrity": "sha512-qrwll/JWpa2/2cq4a39yLQPn0hsYcPFN8BWr2xsuFuuYjplaUhSU40LbngUAUkbcWGxVrQCR9odClboZ6xzYFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.7.tgz", + "integrity": "sha512-4cyJ4Alq/wBGTctH7fNTbY9EZCihm11fbrGSYVe8w+msRNx6W8rugsMX009aHiw9zlvGrMAeTD08YFPnBVdfpA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1" + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7" }, "bin": { "cspell-grammar": "bin.mjs" @@ -4793,44 +4882,45 @@ } }, "node_modules/cspell-io": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.1.tgz", - "integrity": "sha512-z3dzYFJgredZJYV9piU/rvulCeMixNeJbxBZyHGOGWeKg36iZhXrIkNpK4s6GEAgGB9r/BD9P31E7YQomzhKZA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.7.tgz", + "integrity": "sha512-zqGGllG/OM3Of7zaOELdrSoBpCyG9nJuSRCzLfKgnCG4g2zpoMfDZknJaY9VjZODHP99PvYWooF8E6kVxT34Fw==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "7.0.1", - "node-fetch": "^2.6.13" + "@cspell/cspell-service-bus": "7.3.7", + "node-fetch": "^2.7.0" }, "engines": { "node": ">=16" } }, "node_modules/cspell-lib": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.1.tgz", - "integrity": "sha512-BaFhA0GFnuMEFzEALSt/TgrOl7A6vJSwtqqpdOGI5goLBIu8DDYqIncLrcglELosFo+KXnnYtYtPXuQIX3P5Kw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.7.tgz", + "integrity": "sha512-KuFn0WTwmK50Ij1KVaXVuheleSOfv3oFIO3PfMuFg7llkfPfaRawF0b61da/EFGckU/hUc8uHRbBuGELlDo3tA==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "7.0.1", - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-resolver": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "@cspell/strong-weak-map": "7.0.1", + "@cspell/cspell-bundled-dicts": "7.3.7", + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-resolver": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "@cspell/dynamic-import": "7.3.7", + "@cspell/strong-weak-map": "7.3.7", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.0.1", - "cspell-glob": "7.0.1", - "cspell-grammar": "7.0.1", - "cspell-io": "7.0.1", - "cspell-trie-lib": "7.0.1", + "cspell-dictionary": "7.3.7", + "cspell-glob": "7.3.7", + "cspell-grammar": "7.3.7", + "cspell-io": "7.3.7", + "cspell-trie-lib": "7.3.7", "fast-equals": "^5.0.1", "find-up": "^6.3.0", - "gensequence": "^5.0.2", + "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.7" }, "engines": { @@ -4920,14 +5010,14 @@ } }, "node_modules/cspell-trie-lib": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.1.tgz", - "integrity": "sha512-rdY78YK46LUmcez63kMbMF2nCmPIcnWd3a0rivnhyPaVvY+cwNKqpp7WSWOFDLboiMaEdCrdaS4AecspTCLjaw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.7.tgz", + "integrity": "sha512-Vv8TdTMZD3DE79SorTwn5NoWj8JD7DnYMeUK+5S6JDNLy4Ck+kTEPN6Ic9hvLAxuDmQjmoZI3TizrWvuCG66aA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "gensequence": "^5.0.2" + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "gensequence": "^6.0.0" }, "engines": { "node": ">=16" @@ -4957,6 +5047,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cspell/node_modules/file-entry-cache": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.0.tgz", + "integrity": "sha512-OWhoO9dvvwspdI7YjGrs5wD7bPggVHc5b1NFAdyd1fEPIeno3Fj70fjBhklAqzUefgX7KCNDBnvrT8rZhS8Shw==", + "dev": true, + "dependencies": { + "flat-cache": "^3.1.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/cspell/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -5420,16 +5522,16 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5505,14 +5607,15 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", - "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.1.0.tgz", + "integrity": "sha512-3wv/TooBst0N4ND+pnvffHuz9gNPmk/NkLwAxOt2JykTl/hcuECe6yhTtLJcZjIxtZwN+GX92ACp/QTLpHA3Hg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", "eslint-plugin-es-x": "^7.1.0", + "get-tsconfig": "^4.7.0", "ignore": "^5.2.4", "is-core-module": "^2.12.1", "minimatch": "^3.1.2", @@ -5713,16 +5816,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6086,16 +6189,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -6193,12 +6297,12 @@ } }, "node_modules/gensequence": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", - "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-6.0.0.tgz", + "integrity": "sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/gensync": { @@ -6265,6 +6369,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/github-username-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/github-username-regex/-/github-username-regex-1.0.0.tgz", @@ -7035,15 +7151,15 @@ } }, "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -7061,13 +7177,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7075,28 +7191,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7106,22 +7222,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7140,31 +7255,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7185,24 +7300,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7212,33 +7327,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7254,9 +7369,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7266,8 +7381,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7294,37 +7409,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -7333,7 +7448,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -7342,14 +7457,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7382,17 +7497,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -7402,43 +7517,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -7447,17 +7562,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -7465,13 +7580,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -7480,9 +7595,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -7490,20 +7605,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -7511,9 +7626,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7528,9 +7643,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7538,7 +7653,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7557,18 +7672,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -7576,13 +7691,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7670,6 +7785,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -7745,14 +7866,20 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -7835,6 +7962,15 @@ "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", "integrity": "sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==" }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -8099,6 +8235,36 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8111,6 +8277,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/log-update": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", @@ -8224,9 +8395,9 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/luxon": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.1.tgz", - "integrity": "sha512-2USspxOCXWGIKHwuQ9XElxPPYrDOJHDQ5DQ870CoD+CxJbBnRDIBCfhioUJJjct7BKOy80Ia8cVstIcIMb/0+Q==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", + "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", "engines": { "node": ">=12" } @@ -8278,30 +8449,30 @@ } }, "node_modules/markdownlint": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz", - "integrity": "sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", + "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", "dev": true, "dependencies": { "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.5" + "markdownlint-micromark": "0.1.7" }, "engines": { "node": ">=16" } }, "node_modules/markdownlint-cli2": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.8.1.tgz", - "integrity": "sha512-y0Siwt+RApKxSSb0CT9p7z1DcAO+ncjrB9IpC/jflJRIet4namCFmxLTbfBBQdPF6EntPk5yyXKe7vcoPGlnXw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", + "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", "dev": true, "dependencies": { - "globby": "13.1.4", - "markdownlint": "0.29.0", + "globby": "13.2.2", + "markdownlint": "0.31.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", - "strip-json-comments": "5.0.0", - "yaml": "2.3.1" + "strip-json-comments": "5.0.1", + "yaml": "2.3.2" }, "bin": { "markdownlint-cli2": "markdownlint-cli2.js", @@ -8322,14 +8493,14 @@ } }, "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -8353,9 +8524,9 @@ } }, "node_modules/markdownlint-cli2/node_modules/strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "dev": true, "engines": { "node": ">=14.16" @@ -8364,10 +8535,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdownlint-cli2/node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/markdownlint-micromark": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz", - "integrity": "sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz", + "integrity": "sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==", "dev": true, "engines": { "node": ">=16" @@ -8709,9 +8889,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", - "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", + "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==", "engines": { "node": ">=6.0.0" } @@ -9341,9 +9521,9 @@ } }, "node_modules/prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -9368,9 +9548,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -9571,9 +9751,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true, "funding": [ { @@ -9668,15 +9848,15 @@ } }, "node_modules/redis": { - "version": "4.6.8", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.8.tgz", - "integrity": "sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==", + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.10.tgz", + "integrity": "sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg==", "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.9", + "@redis/client": "1.5.11", "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.3", + "@redis/json": "1.0.6", + "@redis/search": "1.1.5", "@redis/time-series": "1.0.5" } }, @@ -9748,6 +9928,15 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -10854,9 +11043,9 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, "node_modules/vscode-uri": { @@ -11336,9 +11525,9 @@ } }, "@azure/cosmos": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.17.3.tgz", - "integrity": "sha512-wBglkQ6Irjv5Vo2iw8fd6eYj60WYRSSg4/0DBkeOP6BwQ4RA91znsOHd6s3qG6UAbNgYuzC9Nnq07vlFFZkHEw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-4.0.0.tgz", + "integrity": "sha512-/Z27p1+FTkmjmm8jk90zi/HrczPHw2t8WecFnsnTe4xGocWl0Z4clP0YlLUTJPhRLWYa5upwD9rMvKJkS1f1kg==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -11457,9 +11646,9 @@ } }, "@azure/service-bus": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.0.tgz", - "integrity": "sha512-DzvWGmIertkF404nQ/AZQ6hwgXtOtabjBME7dsNvzXmBMfGRjviNWLD5yGyPT4x+clJzbMjRuzvTER+cbRwTYw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.1.tgz", + "integrity": "sha512-4IqhCOV1aSA2ChqFPOWN/5Qh2V8GDBnYleAmtETcHgKkpTQ3PCKX42gP6ZdhUPdNkHET+eu+KkwKYxRZJjqadw==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-amqp": "^3.3.0", @@ -11482,9 +11671,9 @@ } }, "@azure/storage-blob": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", - "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.16.0.tgz", + "integrity": "sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -11508,9 +11697,9 @@ } }, "@azure/storage-queue": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.14.0.tgz", - "integrity": "sha512-1j6uxhzCcbEDVPOTNWIJ5CsLzOAU5U/bXgGZeT25fy6IghFTC1JlPGALez2CWJ9fBVj6AmSnsiBXL/77iXhSpg==", + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.15.0.tgz", + "integrity": "sha512-qotyfMcmocaT1r9bfX7RyQQnkRJcTXGSG/m6LIchtEsNmqLu3ulVqkOlNM+O0XP9wwJ6Da1XQbWz5jQtrDe3DQ==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -11976,25 +12165,25 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.0.1.tgz", - "integrity": "sha512-Rm3AAOhZBPWy3L9lYRPQ41HAPP/jKBzTAkDVCsmT3SDbF1R1e7uqzQ86KhLWgcRfqGIh1uLcLjcUOAAh6jLu6Q==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.7.tgz", + "integrity": "sha512-Mw7J0RAWGpEup/+eIePw3wi+OlMGNicrD1r9OhdgIgO6sHEi01ibS/RzNNbC7UziLaYEHi8+WfLyGzmp1ZISrQ==", "dev": true, "requires": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", - "@cspell/dict-bash": "^4.1.1", - "@cspell/dict-companies": "^3.0.20", - "@cspell/dict-cpp": "^5.0.4", - "@cspell/dict-cryptocurrencies": "^3.0.1", + "@cspell/dict-bash": "^4.1.2", + "@cspell/dict-companies": "^3.0.24", + "@cspell/dict-cpp": "^5.0.5", + "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.6", + "@cspell/dict-css": "^4.0.10", "@cspell/dict-dart": "^2.0.3", "@cspell/dict-django": "^4.1.0", "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.6", + "@cspell/dict-en_us": "^4.3.8", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", "@cspell/dict-filetypes": "^3.0.1", @@ -12003,67 +12192,67 @@ "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.2", + "@cspell/dict-golang": "^6.0.3", "@cspell/dict-haskell": "^4.0.1", - "@cspell/dict-html": "^4.0.3", + "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", - "@cspell/dict-java": "^5.0.5", + "@cspell/dict-java": "^5.0.6", "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.1", - "@cspell/dict-node": "^4.0.2", - "@cspell/dict-npm": "^5.0.8", - "@cspell/dict-php": "^4.0.2", + "@cspell/dict-node": "^4.0.3", + "@cspell/dict-npm": "^5.0.10", + "@cspell/dict-php": "^4.0.3", "@cspell/dict-powershell": "^5.0.2", - "@cspell/dict-public-licenses": "^2.0.3", - "@cspell/dict-python": "^4.1.6", + "@cspell/dict-public-licenses": "^2.0.4", + "@cspell/dict-python": "^4.1.9", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.0", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.2.1", + "@cspell/dict-software-terms": "^3.3.2", "@cspell/dict-sql": "^2.1.1", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", - "@cspell/dict-typescript": "^3.1.1", + "@cspell/dict-typescript": "^3.1.2", "@cspell/dict-vue": "^3.0.0" } }, "@cspell/cspell-json-reporter": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.0.1.tgz", - "integrity": "sha512-qOnGvnkV4s84X4LncR9F8e9TD2Y+0Yt1GJgsThul8Zgr90qjPpdUnfIwvptByXv7OWOuImpYk66NQIVTQtpcvQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.7.tgz", + "integrity": "sha512-bogUQKKZWLttZtxFKjpzHuliIha/ByV2km18gm8dA2uB3IrzD1UJy4sCE8lnaodm6n3VtjnViSkQ5XIVU3gAKQ==", "dev": true, "requires": { - "@cspell/cspell-types": "7.0.1" + "@cspell/cspell-types": "7.3.7" } }, "@cspell/cspell-pipe": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.0.1.tgz", - "integrity": "sha512-qbQkBS1xsJfwRFzrPLFE1jDt2MRRG75GKxKmFskNxuE5kdmshQT9/hjs+O/HUgPnNH2+l+aK/S5yisFti3YYoA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.7.tgz", + "integrity": "sha512-ZO8v3EwGhjUvhPo1S48+CKv7EPXMoYF7LGERB34K8EXFByb9+J74ojMYj9UgLRV68lFTrDFde3bHoZPPVS1FsA==", "dev": true }, "@cspell/cspell-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.0.1.tgz", - "integrity": "sha512-GfaYy+17l8cdZk8wEzp6UxA3hV4th/OsvQnUERMGSQ6oN1j8Rn1aEGUD3xxjhFAK2+AOeB3gx8RyIHQLWgE80g==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.7.tgz", + "integrity": "sha512-WWZcTI5f2cCjr1yRDTMkcVg7Meil3s+0aaKcLCDTGQf9J2UWWjpqDJ6M6keYei3paAjxW2Pk03IRNNwdA3+igQ==", "dev": true, "requires": { "global-dirs": "^3.0.1" } }, "@cspell/cspell-service-bus": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.0.1.tgz", - "integrity": "sha512-rtN4HyW8eHnrTNSji1DEM0v810sqhIIh6Tuo8aNNVoEuUMVdE+L17PoVnMc2dAp6VMv2nvTnh4Lpfsj5l5NsZw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.7.tgz", + "integrity": "sha512-pnDOFpjht7dZYydMygcf0brCSk5BGRvbeWRH6MaMhd+3CdyzyEvtZG3IbBQVNyVvDTA2c/K3rljOAo8y3/lpnw==", "dev": true }, "@cspell/cspell-types": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.0.1.tgz", - "integrity": "sha512-nPQGIwVUxNqAhBmSsnvRSJtHUo3cSQiCRpppNaXY8s1IrJ2kskS+LEF+d4SGTjQbCQH39sf3NoFWSCTfjl1jFg==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.7.tgz", + "integrity": "sha512-zM2BuZJ3UUgPwF78bssggi8X20nmW3a95EmbNJKfbO6Zf2ui7UMzeP3BwpCZk30A/EixGlFhLf6Xd+eBT/DQqw==", "dev": true }, "@cspell/dict-ada": { @@ -12079,27 +12268,27 @@ "dev": true }, "@cspell/dict-bash": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.1.tgz", - "integrity": "sha512-8czAa/Mh96wu2xr0RXQEGMTBUGkTvYn/Pb0o+gqOO1YW+poXGQc3gx0YPqILDryP/KCERrNvkWUJz3iGbvwC2A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.2.tgz", + "integrity": "sha512-AEBWjbaMaJEyAjOHW0F15P2izBjli2cNerG3NjuVH7xX/HUUeNoTj8FF1nwpMufKwGQCvuyO2hCmkVxhJ0y55Q==", "dev": true }, "@cspell/dict-companies": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.20.tgz", - "integrity": "sha512-o13HaqYxkWo20FC5iU9PHKMFexY9D7/XeSj9tvBzy3sEzW324zw5MWEkeDszwmC/GsLZtot+5vopCv6/evRNlA==", + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.25.tgz", + "integrity": "sha512-7phQlGJ/4qCx9fQg/kR8YV0n5TPak4+eleQ7M/e7uhsQR8TwOWsPU1dW23WABoTqJbYCgdUYLxqjQ8458w7jZQ==", "dev": true }, "@cspell/dict-cpp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", - "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", + "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", "dev": true }, "@cspell/dict-cryptocurrencies": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-3.0.1.tgz", - "integrity": "sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-4.0.0.tgz", + "integrity": "sha512-EiZp91ATyRxTmauIQfOX9adLYCunKjHEh092rrM7o2eMXP9n7zpXAL9BK7LviL+LbB8VDOm21q+s83cKrrRrsg==", "dev": true }, "@cspell/dict-csharp": { @@ -12109,9 +12298,9 @@ "dev": true }, "@cspell/dict-css": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.7.tgz", - "integrity": "sha512-NNlUTx/sYg+74kC0EtRewb7pjkEtPlIsu9JFNWAXa0JMTqqpQXqM3aEO4QJvUZFZF09bObeCAvzzxemAwxej7Q==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.11.tgz", + "integrity": "sha512-kHQqg3/3Xra2Xki3K4e6s3BHDw5L82geie4q7jRBxQ9CofIgVEMcOqTr2QWKgIWegmACEe7B/CIMH35d4eiafA==", "dev": true }, "@cspell/dict-dart": { @@ -12151,9 +12340,9 @@ "dev": true }, "@cspell/dict-en_us": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.6.tgz", - "integrity": "sha512-odhgsjNZI9BtEOJdvqfAuv/3yz5aB1ngfBNaph7WSnYVt//9e3fhrElZ6/pIIkoyuGgeQPwz1fXt+tMgcnLSEQ==", + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.8.tgz", + "integrity": "sha512-rCPsbDHuRnFUbzWAY6O1H9+cLZt5FNQwjPVw2TdQZfipdb0lim984aLGY+nupi1iKC3lfjyd5SVUgmSZEG1QNA==", "dev": true }, "@cspell/dict-en-common-misspellings": { @@ -12205,9 +12394,9 @@ "dev": true }, "@cspell/dict-golang": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.2.tgz", - "integrity": "sha512-5pyZn4AAiYukAW+gVMIMVmUSkIERFrDX2vtPDjg8PLQUhAHWiVeQSDjuOhq9/C5GCCEZU/zWSONkGiwLBBvV9A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.3.tgz", + "integrity": "sha512-KiNnjAeqDBq6zH4s46hzBrKgqIrkSZ9bbHzQ54PbHfe+jurZkSZ4lXz6E+315RNh2TkRLcNppFvaZqJvKZXomA==", "dev": true }, "@cspell/dict-haskell": { @@ -12217,9 +12406,9 @@ "dev": true }, "@cspell/dict-html": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.3.tgz", - "integrity": "sha512-Gae8i8rrArT0UyG1I6DHDK62b7Be6QEcBSIeWOm4VIIW1CASkN9B0qFgSVnkmfvnu1Y3H7SSaaEynKjdj3cs8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.5.tgz", + "integrity": "sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==", "dev": true }, "@cspell/dict-html-symbol-entities": { @@ -12229,9 +12418,9 @@ "dev": true }, "@cspell/dict-java": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.5.tgz", - "integrity": "sha512-X19AoJgWIBwJBSWGFqSgHaBR/FEykBHTMjL6EqOnhIGEyE9nvuo32tsSHjXNJ230fQxQptEvRZoaldNLtKxsRg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.6.tgz", + "integrity": "sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw==", "dev": true }, "@cspell/dict-k8s": { @@ -12259,21 +12448,21 @@ "dev": true }, "@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", + "integrity": "sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==", "dev": true }, "@cspell/dict-npm": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.8.tgz", - "integrity": "sha512-KuqH8tEsFD6DPKqKwIfWr9E+admE3yghaC0AKXG8jPaf77N0lkctKaS3dm0oxWUXkYKA/eXj6LCtz3VcTyxFPg==", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.11.tgz", + "integrity": "sha512-QlgF92q29mT0LbNqlDHb3UgY5jCLcSn+GnA1pvD5ps/zw2LhVl+ZXMHExwSIi7gwTzP3IyJ1f/dT6rnw9wic4A==", "dev": true }, "@cspell/dict-php": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.2.tgz", - "integrity": "sha512-7yglcmMoFHDPQXHW+9QAl8YjAToMm1qOi+4x/yGY1FSIEjZbCpjeDgyKMGg/NgpooQQceEN38AR59Pn23EDriA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.3.tgz", + "integrity": "sha512-PxtSmWJCDEB4M8R9ER9ijxBum/tvUqYT26QeuV58q2IFs5IrPZ6hocQKvnFGXItjCWH4oYXyAEAAzINlBC4Opg==", "dev": true }, "@cspell/dict-powershell": { @@ -12283,15 +12472,15 @@ "dev": true }, "@cspell/dict-public-licenses": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.3.tgz", - "integrity": "sha512-JSLEdpEYufQ1H+93UHi+axlqQm1fhgK6kpdLHp6uPHu//CsvETcqNVawjB+qOdI/g38JTMw5fBqSd0aGNxa6Dw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.4.tgz", + "integrity": "sha512-KjsfuGwMWvPkp6s0nR+s4mZc9SQhh1tHDOyQZfEVRwi+2ev7f8l7R6ts9sP2Mplb8UcxwO6YmKwxHjN+XHoMoA==", "dev": true }, "@cspell/dict-python": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", - "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.9.tgz", + "integrity": "sha512-JMA4v/ZPJWuDt3PPFz+23VIY3iDIB+xOTQ6nw+WkcJU5yr6FUl5zMU9ModKrgujg3jGRuuJqofErZVPqHNHYAA==", "dev": true, "requires": { "@cspell/dict-data-science": "^1.0.11" @@ -12322,9 +12511,9 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.1.tgz", - "integrity": "sha512-+QXmyoONVc/3aNgKW+0F0u3XUCRTfNRkWKLZQA78i+9fOfde8ZT4JmROmZgRveH/MxD4n6pNFceIRcYI6C8WuQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.3.tgz", + "integrity": "sha512-JKxBPyubapWkeekGquJYo5MLZe1TXAWAC8bqxuarG0cYkWoa7wIqCNH6/9OywRFSBzIYCgoVu2xDP1yRqTEokg==", "dev": true }, "@cspell/dict-sql": { @@ -12346,9 +12535,9 @@ "dev": true }, "@cspell/dict-typescript": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.1.tgz", - "integrity": "sha512-N9vNJZoOXmmrFPR4ir3rGvnqqwmQGgOYoL1+y6D4oIhyr7FhaYiyF/d7QT61RmjZQcATMa6PSL+ZisCeRLx9+A==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.2.tgz", + "integrity": "sha512-lcNOYWjLUvDZdLa0UMNd/LwfVdxhE9rKA+agZBGjL3lTA3uNvH7IUqSJM/IXhJoBpLLMVEOk8v1N9xi+vDuCdA==", "dev": true }, "@cspell/dict-vue": { @@ -12358,18 +12547,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.0.1.tgz", - "integrity": "sha512-ILOvieaJ4TspyKmXVDNF89zQxG/EORKAVY5U8HichIchJlQJDHKCxLy9YFJnoWgkAl11oPATImvuiztcDUZoDA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.7.tgz", + "integrity": "sha512-ac52OLDMYBHkRQ8XzihOWnyfqri3M84ELTZdqBhR5YGcHW/mxKhsmXqudA980SdRRKaicD39yhX4idAFb4AsDg==", "dev": true, "requires": { "import-meta-resolve": "^3.0.0" } }, "@cspell/strong-weak-map": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.0.1.tgz", - "integrity": "sha512-Y2L3kY12J77ETHNtZrfMwfufur2klsl33AqotC+kJ6Kbo2YZ6I3A224G5EBeIbQdmQdkE8KnpLDDcUv5640fJA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.7.tgz", + "integrity": "sha512-n+jRgwH0wU+HsfqgCGVzPmWnZl4SyhtvPxusKwXj6L/STGdt8IP2rYl1PFOtyvgjPjh8xXe/jRrq7zH07btiKA==", "dev": true }, "@cspotcode/source-map-support": { @@ -12426,9 +12615,9 @@ } }, "@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true }, "@hapi/boom": { @@ -12475,9 +12664,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -12575,29 +12764,29 @@ "dev": true }, "@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -12605,92 +12794,92 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" } }, "@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "requires": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" } }, "@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" } }, "@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -12704,9 +12893,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -12749,33 +12938,33 @@ } }, "@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "requires": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -12786,9 +12975,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -12887,21 +13076,34 @@ } }, "@octokit/auth-app": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.0.tgz", - "integrity": "sha512-OKct7Rukf3g9DjpzcpdacQsdmd6oPrJ7fZND22JkjzhDvfhttUOnmh+qPS4kHhaNNyTxqSThnfrUWvkqNLd1nw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-6.0.1.tgz", + "integrity": "sha512-tjCD4nzQNZgmLH62+PSnTF6eGerisFgV4v6euhqJik6yWV96e1ZiiGj+NXIqbgnpjLmtnBqVUrNyGKu3DoGEGA==", "requires": { "@octokit/auth-oauth-app": "^7.0.0", "@octokit/auth-oauth-user": "^4.0.0", "@octokit/request": "^8.0.2", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.3.1", "lru-cache": "^10.0.0", "universal-github-app-jwt": "^1.1.1", "universal-user-agent": "^6.0.0" }, "dependencies": { + "@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "requires": { + "@octokit/openapi-types": "^19.0.0" + } + }, "lru-cache": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", @@ -13015,11 +13217,26 @@ "requires": {} }, "@octokit/plugin-paginate-rest": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", - "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.0.0.tgz", + "integrity": "sha512-oIJzCpttmBTlEhBmRvb+b9rlnGpmFgDtZ0bB6nq39qIod6A5DP+7RkVLMOixIgRCYSHDTeayWqmiJ2SZ6xgfdw==", "requires": { - "@octokit/types": "^11.0.0" + "@octokit/types": "^12.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "requires": { + "@octokit/openapi-types": "^19.0.0" + } + } } }, "@octokit/plugin-request-log": { @@ -13029,23 +13246,53 @@ "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", - "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.0.0.tgz", + "integrity": "sha512-16VkwE2v6rXU+/gBsYC62M8lKWOphY5Lg4wpjYnVE9Zbu0J6IwiT5kILoj1YOB53XLmcJR+Nqp8DmifOPY4H3g==", "requires": { - "@octokit/types": "^11.0.0" + "@octokit/types": "^12.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "requires": { + "@octokit/openapi-types": "^19.0.0" + } + } } }, "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.2.tgz", + "integrity": "sha512-A0RJJfzjlZQwb+39eDm5UM23dkxbp28WEG4p2ueH+Q2yY4p349aRK/vcUlEuIB//ggcrHJceoYYkBP/LYCoXEg==", "requires": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", + "@octokit/types": "^12.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "@octokit/openapi-types": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.0.0.tgz", + "integrity": "sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==" + }, + "@octokit/types": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.0.0.tgz", + "integrity": "sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==", + "requires": { + "@octokit/openapi-types": "^19.0.0" + } + } } }, "@octokit/request-error": { @@ -13059,14 +13306,14 @@ } }, "@octokit/rest": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", - "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", + "version": "20.0.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.2.tgz", + "integrity": "sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==", "requires": { "@octokit/core": "^5.0.0", - "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-paginate-rest": "^9.0.0", "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "^9.0.0" + "@octokit/plugin-rest-endpoint-methods": "^10.0.0" } }, "@octokit/types": { @@ -13161,9 +13408,9 @@ } }, "@primer/octicons": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.6.0.tgz", - "integrity": "sha512-/10tz0hyJijS9hCLKw5Wb3LfRmVSQjtiUDPfvf582bhe+/xZDybgf3VLJncD5SZaetC4zNhz31VwV8nnG2PdSQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.8.0.tgz", + "integrity": "sha512-Imze/fyW41Io5fN+27T5EAeXJrgBjMbz6nzU+wYbRylXvIAjLPUvaJPVoStiFlgSU+TjTUJqg5A9rgMDzTyMCg==", "requires": { "object-assign": "^4.1.1" } @@ -13175,9 +13422,9 @@ "requires": {} }, "@redis/client": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.9.tgz", - "integrity": "sha512-SffgN+P1zdWJWSXBvJeynvEnmnZrYmtKSRW00xl8pOPFOMJjxRR9u0frSxJpPR6Y4V+k54blJjGW7FgxbTI7bQ==", + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.11.tgz", + "integrity": "sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA==", "requires": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -13191,15 +13438,15 @@ "requires": {} }, "@redis/json": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", - "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", + "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", "requires": {} }, "@redis/search": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", - "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.5.tgz", + "integrity": "sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg==", "requires": {} }, "@redis/time-series": { @@ -13361,19 +13608,28 @@ "@types/node": "*" } }, + "@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", + "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", "dev": true, "requires": { "@types/ms": "*" } }, "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -13392,18 +13648,18 @@ } }, "@types/express-session": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.7.tgz", - "integrity": "sha512-L25080PBYoRLu472HY/HNCxaXY8AaGgqGC8/p/8+BYMhG0RDOLQ1wpXOpAzr4Gi5TGozTKyJv5BVODM5UNyVMw==", + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.8.tgz", + "integrity": "sha512-bFF7/3wOldMn+56XyFRGY9ZzCr3JWhNSP2ajMPgTlbZR6BQOCHdAbNA9W5dMBPgMywpIP4zkmhxP6Opm/NRYMQ==", "dev": true, "requires": { "@types/express": "*" } }, "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "requires": { "@types/node": "*" @@ -13442,9 +13698,9 @@ } }, "@types/jest": { - "version": "29.5.4", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz", - "integrity": "sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==", + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13452,9 +13708,9 @@ } }, "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "@types/jsonwebtoken": { @@ -13466,15 +13722,15 @@ } }, "@types/lodash": { - "version": "4.14.197", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", - "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", "dev": true }, "@types/luxon": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", - "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", + "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", "dev": true }, "@types/memory-cache": { @@ -13489,9 +13745,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/morgan": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz", - "integrity": "sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", + "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", "dev": true, "requires": { "@types/node": "*" @@ -13504,9 +13760,9 @@ "dev": true }, "@types/node": { - "version": "20.5.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", - "integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==" + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", + "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==" }, "@types/node-fetch": { "version": "2.6.2", @@ -13530,9 +13786,9 @@ } }, "@types/node-jose": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.10.tgz", - "integrity": "sha512-7L0ucJTugW4x/sYpQ+c5IudAwr0pFuxDVnZLpHKWpff7p1lVa3wTuNvnrzFBNeLojE+UY0cVCwNGXLxXsMIrzw==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.11.tgz", + "integrity": "sha512-8hEAhDB2A3k0Inhxh71qWfEp9mg970z/NvEPkzJN5KZSlIE47lEeYf3k+pNvk/W4hiSL/A0lW0AO7Fw8QMEtkA==", "dev": true, "requires": { "@types/node": "*" @@ -13548,9 +13804,9 @@ } }, "@types/object-path": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.1.tgz", - "integrity": "sha512-219LSCO9HPcoXcRTC6DbCs0FRhZgBnEMzf16RRqkT40WbkKx3mOeQuz3e2XqbfhOz/AHfbru0kzB1n1RCAsIIg==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.2.tgz", + "integrity": "sha512-STkyj0IQkgbmohF1afXQN64KucE3w7EgSbNJxqkJoq0KHVBV4nU5Pyku+TM9UCiCLXhZlkEFd8zq38P8lDFi6g==", "dev": true }, "@types/parse-json": { @@ -13560,18 +13816,18 @@ "dev": true }, "@types/passport": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.12.tgz", - "integrity": "sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.13.tgz", + "integrity": "sha512-XXURryL+EZAWtbQFOHX1eNB+RJwz5XMPPz1xrGpEKr2xUZCXM4NCPkHMtZQ3B2tTSG/1IRaAcTHjczRA4sSFCw==", "dev": true, "requires": { "@types/express": "*" } }, "@types/passport-azure-ad": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.1.tgz", - "integrity": "sha512-X0EVVXJU54K6gaS1f3CPZibV58/bAe6JjE8C/nwMAcje0R73MOFnkm0elTecIdx1tFXLzzo80QuW1CYtEKQC3Q==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.2.tgz", + "integrity": "sha512-EHJcuRCNbvpVlBsIdoHAB+tWKGT43alFr6/f4hZOexfS7Oh4VEC28hycDrHUHBbFmQPPgvYkgNsMwf4KZyv7Fw==", "dev": true, "requires": { "@types/express": "*", @@ -13579,9 +13835,9 @@ } }, "@types/passport-github": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.7.tgz", - "integrity": "sha512-CCBwZyBRy3fLOd96Idn00TLHMDXZIzUGXq+gSvB70h8k4j61dkbZCI6m5ZauL+hLdyJur7Z94tdfd8DBjFA0og==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.10.tgz", + "integrity": "sha512-fj3FV2uWnE70S8x5afP70TgG8REEvLm2MWNocD28rLZhU4vmf/vchtG3yPrCZOGrme+Csbf1UO/KXZhvCqBElQ==", "dev": true, "requires": { "@types/express": "*", @@ -13601,9 +13857,9 @@ } }, "@types/pg": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.2.tgz", - "integrity": "sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==", + "version": "8.10.3", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.3.tgz", + "integrity": "sha512-BACzsw64lCZesclRpZGu55tnqgFAYcrCBP92xLh1KLypZLCOsvJTSTgaoFVTy3lCys/aZTQzfeDxtjwrvdzL2g==", "dev": true, "requires": { "@types/node": "*", @@ -13656,9 +13912,9 @@ } }, "@types/pug": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", - "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.7.tgz", + "integrity": "sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==", "dev": true }, "@types/qs": { @@ -13672,18 +13928,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha512-Xd+Ptc4/F2ueInqy5yK2FI5FxtwwbX2+VZpcg+9oYsFJVen8qQKGapCr+Bi5wQtHU1cTXT8s+07lo/nKPgu8Gg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-pYLuc3EaFA3SwYfZRC6cSV9TfL+0tLi9Otu2djGavsNhmrEna1yG1EkFOZW7SKJr/nIuDNk4mM6kMMpNLntIhw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "@types/serve-static": { @@ -13701,9 +13957,9 @@ "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" }, "@types/simple-oauth2": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.4.tgz", - "integrity": "sha512-4SvTfmAa1fGUa1d07j9vIiC4o92bGh0ihPXmtS05udMMmNwVIaU2nZ706cC4wI8cJxOlHD4P/d5tzqvWYd+KxA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.5.tgz", + "integrity": "sha512-hsUpJyOQnexMxa2Ilvs1CwmcSN62Y4irIvBbviUJNiyxUGIOQS7CUs0QPq+nuxkaNeNqdjxJ1BE/AoCGiG7L+g==", "dev": true }, "@types/stack-utils": { @@ -13721,9 +13977,9 @@ } }, "@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==", + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==", "dev": true }, "@types/yargs": { @@ -13742,16 +13998,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -13761,54 +14017,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", - "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", + "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" } }, "@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -13817,27 +14073,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "requires": { - "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" } }, @@ -13942,9 +14198,9 @@ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "applicationinsights": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.7.3.tgz", - "integrity": "sha512-JY8+kTEkjbA+kAVNWDtpfW2lqsrDALfDXuxOs74KLPu2y13fy/9WB52V4LfYVTVcW1/jYOXjTxNS2gPZIDh1iw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.8.0.tgz", + "integrity": "sha512-pxVOdCPwXTal1A904yGmzOOUJrIeQ89xQir0ifr7fLl+e0BlGrZ1P4StcIDuEXk93gV9CGxGm5Mol8ksPk2mcg==", "requires": { "@azure/core-auth": "^1.5.0", "@azure/core-rest-pipeline": "1.10.1", @@ -14071,9 +14327,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -14081,12 +14337,12 @@ } }, "babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "requires": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -14418,6 +14674,11 @@ } } }, + "change-case": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.0.1.tgz", + "integrity": "sha512-iQ4vIQKF6hFRAGi3AKnoZPRpYfzj6/Zc4trhe/Ngzlk1FblM573PgfIiccATvQc81oFYub8Z9UY5QSOxsSSQYA==" + }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -14776,6 +15037,21 @@ "path-type": "^4.0.0" } }, + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -14811,25 +15087,25 @@ } }, "cspell": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.0.1.tgz", - "integrity": "sha512-nl35cQJ1XxESRZS5QD6S+X1XtBU9Q/acUPXt8yZjd+PcgkyTwCRk7qwxwEodkTUMP3Yxkg5hGWMtzDXfNK35RQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.7.tgz", + "integrity": "sha512-p23EuTu+7b2qioRxC7sV1TVfxIPm7928BtT4jYBHGeONiYP0EOOWNP8ynaksMYLTifQBzH1Q0LO4L5ogHiQsfw==", "dev": true, "requires": { - "@cspell/cspell-json-reporter": "7.0.1", - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "@cspell/dynamic-import": "7.0.1", + "@cspell/cspell-json-reporter": "7.3.7", + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "@cspell/dynamic-import": "7.3.7", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.0.0", - "cspell-gitignore": "7.0.1", - "cspell-glob": "7.0.1", - "cspell-io": "7.0.1", - "cspell-lib": "7.0.1", + "cspell-gitignore": "7.3.7", + "cspell-glob": "7.3.7", + "cspell-io": "7.3.7", + "cspell-lib": "7.3.7", "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^7.0.0", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", @@ -14848,6 +15124,15 @@ "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true }, + "file-entry-cache": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.0.tgz", + "integrity": "sha512-OWhoO9dvvwspdI7YjGrs5wD7bPggVHc5b1NFAdyd1fEPIeno3Fj70fjBhklAqzUefgX7KCNDBnvrT8rZhS8Shw==", + "dev": true, + "requires": { + "flat-cache": "^3.1.0" + } + }, "strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -14860,16 +15145,16 @@ } }, "cspell-dictionary": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.0.1.tgz", - "integrity": "sha512-mC2+sjsfxWZ5uYsnUHG/2opnpnoy492o13caai0h4GODV0u3hxhCS4f7twLf0Rdm+Is0MU7wrTecDdDVKu1mOA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.7.tgz", + "integrity": "sha512-mJ0h2BGxYEqb/1FxKD50WuufKhDaCaIk8pwZQryqazXQCvoTpla0yud3KO61Cke92za8z37Rfb+5xATlywEfaw==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "cspell-trie-lib": "7.0.1", + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "cspell-trie-lib": "7.3.7", "fast-equals": "^4.0.3", - "gensequence": "^5.0.2" + "gensequence": "^6.0.0" }, "dependencies": { "fast-equals": { @@ -14881,70 +15166,71 @@ } }, "cspell-gitignore": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.0.1.tgz", - "integrity": "sha512-ebi4VvH3KqUF9G93EoQA0PUIA8eM/y3GITIVDkdF2Ueo6uIWEeGjSaYNeJgNJHvccBZViR6XsrZuVxBOkSW3Rw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.7.tgz", + "integrity": "sha512-nP4Gg+zq5y0njzhiNYTLvaJIMAponBhJoTMzkXCOOKYEHJmiRQocfa3gO4t2s8iZ4YVhscbrB2h+dYvo3MLQqg==", "dev": true, "requires": { - "cspell-glob": "7.0.1", + "cspell-glob": "7.3.7", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.0.1.tgz", - "integrity": "sha512-Qm2r+FgtwvJnWbW03QoUohTLDkoic1JVjFSbUTua8AlzbOPJ2M+IJZx47rf5dAiUFtxIDsjiaDepcrkyW7q5HQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.7.tgz", + "integrity": "sha512-DJX5wJ5dhcNzyycukZst+WtbIdpCLTL7DaKS0EKW/57QjzMwwMBgpsF89ufnreGHB8dHrPF85epF9qyOI1SRNg==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.0.1.tgz", - "integrity": "sha512-qrwll/JWpa2/2cq4a39yLQPn0hsYcPFN8BWr2xsuFuuYjplaUhSU40LbngUAUkbcWGxVrQCR9odClboZ6xzYFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.7.tgz", + "integrity": "sha512-4cyJ4Alq/wBGTctH7fNTbY9EZCihm11fbrGSYVe8w+msRNx6W8rugsMX009aHiw9zlvGrMAeTD08YFPnBVdfpA==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1" + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7" } }, "cspell-io": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.0.1.tgz", - "integrity": "sha512-z3dzYFJgredZJYV9piU/rvulCeMixNeJbxBZyHGOGWeKg36iZhXrIkNpK4s6GEAgGB9r/BD9P31E7YQomzhKZA==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.7.tgz", + "integrity": "sha512-zqGGllG/OM3Of7zaOELdrSoBpCyG9nJuSRCzLfKgnCG4g2zpoMfDZknJaY9VjZODHP99PvYWooF8E6kVxT34Fw==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "7.0.1", - "node-fetch": "^2.6.13" + "@cspell/cspell-service-bus": "7.3.7", + "node-fetch": "^2.7.0" } }, "cspell-lib": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.0.1.tgz", - "integrity": "sha512-BaFhA0GFnuMEFzEALSt/TgrOl7A6vJSwtqqpdOGI5goLBIu8DDYqIncLrcglELosFo+KXnnYtYtPXuQIX3P5Kw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.7.tgz", + "integrity": "sha512-KuFn0WTwmK50Ij1KVaXVuheleSOfv3oFIO3PfMuFg7llkfPfaRawF0b61da/EFGckU/hUc8uHRbBuGELlDo3tA==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "7.0.1", - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-resolver": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "@cspell/strong-weak-map": "7.0.1", + "@cspell/cspell-bundled-dicts": "7.3.7", + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-resolver": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "@cspell/dynamic-import": "7.3.7", + "@cspell/strong-weak-map": "7.3.7", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.0.1", - "cspell-glob": "7.0.1", - "cspell-grammar": "7.0.1", - "cspell-io": "7.0.1", - "cspell-trie-lib": "7.0.1", + "cspell-dictionary": "7.3.7", + "cspell-glob": "7.3.7", + "cspell-grammar": "7.3.7", + "cspell-io": "7.3.7", + "cspell-trie-lib": "7.3.7", "fast-equals": "^5.0.1", "find-up": "^6.3.0", - "gensequence": "^5.0.2", + "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.7" }, "dependencies": { @@ -15000,14 +15286,14 @@ } }, "cspell-trie-lib": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.0.1.tgz", - "integrity": "sha512-rdY78YK46LUmcez63kMbMF2nCmPIcnWd3a0rivnhyPaVvY+cwNKqpp7WSWOFDLboiMaEdCrdaS4AecspTCLjaw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.7.tgz", + "integrity": "sha512-Vv8TdTMZD3DE79SorTwn5NoWj8JD7DnYMeUK+5S6JDNLy4Ck+kTEPN6Ic9hvLAxuDmQjmoZI3TizrWvuCG66aA==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.0.1", - "@cspell/cspell-types": "7.0.1", - "gensequence": "^5.0.2" + "@cspell/cspell-pipe": "7.3.7", + "@cspell/cspell-types": "7.3.7", + "gensequence": "^6.0.0" } }, "debug": { @@ -15315,16 +15601,16 @@ "dev": true }, "eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -15377,14 +15663,15 @@ } }, "eslint-plugin-n": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", - "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.1.0.tgz", + "integrity": "sha512-3wv/TooBst0N4ND+pnvffHuz9gNPmk/NkLwAxOt2JykTl/hcuECe6yhTtLJcZjIxtZwN+GX92ACp/QTLpHA3Hg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", "eslint-plugin-es-x": "^7.1.0", + "get-tsconfig": "^4.7.0", "ignore": "^5.2.4", "is-core-module": "^2.12.1", "minimatch": "^3.1.2", @@ -15505,16 +15792,16 @@ "dev": true }, "expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "requires": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" } }, "express": { @@ -15802,12 +16089,13 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, @@ -15873,9 +16161,9 @@ "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" }, "gensequence": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", - "integrity": "sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-6.0.0.tgz", + "integrity": "sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q==", "dev": true }, "gensync": { @@ -15918,6 +16206,15 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, + "get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "github-username-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/github-username-regex/-/github-username-regex-1.0.0.tgz", @@ -16430,152 +16727,151 @@ } }, "jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" } }, "jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" } }, "jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" } }, "jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" } }, "jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "jest-get-type": { @@ -16585,9 +16881,9 @@ "dev": true }, "jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -16598,8 +16894,8 @@ "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" } @@ -16617,31 +16913,31 @@ } }, "jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" } }, "jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", @@ -16650,20 +16946,20 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" } }, "jest-pnp-resolver": { @@ -16680,73 +16976,73 @@ "dev": true }, "jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" } }, "jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -16754,21 +17050,21 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { "@babel/core": "^7.11.6", @@ -16776,27 +17072,27 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" } }, "jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -16808,9 +17104,9 @@ } }, "jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { "@jest/types": "^29.6.3", @@ -16818,7 +17114,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "dependencies": { "camelcase": { @@ -16830,29 +17126,29 @@ } }, "jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -16923,6 +17219,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -16985,14 +17287,20 @@ } }, "jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "requires": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "dependencies": { "jwa": { @@ -17067,6 +17375,15 @@ "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", "integrity": "sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==" }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -17244,6 +17561,36 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -17256,6 +17603,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "log-update": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", @@ -17340,9 +17692,9 @@ } }, "luxon": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.1.tgz", - "integrity": "sha512-2USspxOCXWGIKHwuQ9XElxPPYrDOJHDQ5DQ870CoD+CxJbBnRDIBCfhioUJJjct7BKOy80Ia8cVstIcIMb/0+Q==" + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", + "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==" }, "make-dir": { "version": "4.0.0", @@ -17382,38 +17734,38 @@ } }, "markdownlint": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.29.0.tgz", - "integrity": "sha512-ASAzqpODstu/Qsk0xW5BPgWnK/qjpBQ4e7IpsSvvFXcfYIjanLTdwFRJK1SIEEh0fGSMKXcJf/qhaZYHyME0wA==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", + "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", "dev": true, "requires": { "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.5" + "markdownlint-micromark": "0.1.7" } }, "markdownlint-cli2": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.8.1.tgz", - "integrity": "sha512-y0Siwt+RApKxSSb0CT9p7z1DcAO+ncjrB9IpC/jflJRIet4namCFmxLTbfBBQdPF6EntPk5yyXKe7vcoPGlnXw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", + "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", "dev": true, "requires": { - "globby": "13.1.4", - "markdownlint": "0.29.0", + "globby": "13.2.2", + "markdownlint": "0.31.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", - "strip-json-comments": "5.0.0", - "yaml": "2.3.1" + "strip-json-comments": "5.0.1", + "yaml": "2.3.2" }, "dependencies": { "globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -17425,9 +17777,15 @@ "dev": true }, "strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "dev": true + }, + "yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true } } @@ -17440,9 +17798,9 @@ "requires": {} }, "markdownlint-micromark": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.5.tgz", - "integrity": "sha512-HvofNU4QCvfUCWnocQP1IAWaqop5wpWrB0mKB6SSh0fcpV0PdmQNS6tdUuFew1utpYlUvYYzz84oDkrD76GB9A==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz", + "integrity": "sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==", "dev": true }, "mdurl": { @@ -17707,9 +18065,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", - "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==" + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", + "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==" }, "normalize-path": { "version": "3.0.0", @@ -18170,9 +18528,9 @@ "dev": true }, "prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true }, "prettier-linter-helpers": { @@ -18185,9 +18543,9 @@ } }, "pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { "@jest/schemas": "^29.6.3", @@ -18369,9 +18727,9 @@ "dev": true }, "pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", + "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true }, "qs": { @@ -18424,15 +18782,15 @@ } }, "redis": { - "version": "4.6.8", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.8.tgz", - "integrity": "sha512-S7qNkPUYrsofQ0ztWlTHSaK0Qqfl1y+WMIxrzeAGNG+9iUZB4HGeBgkHxE6uJJ6iXrkvLd1RVJ2nvu6H1sAzfQ==", + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.10.tgz", + "integrity": "sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg==", "requires": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.9", + "@redis/client": "1.5.11", "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.3", + "@redis/json": "1.0.6", + "@redis/search": "1.1.5", "@redis/time-series": "1.0.5" } }, @@ -18483,6 +18841,12 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, "resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -19287,9 +19651,9 @@ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" }, "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, "vscode-uri": { diff --git a/package.json b/package.json index 65b66daab..73a743c8b 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,6 @@ { "name": "opensource-management-portal", "author": "Microsoft Corporation", - "contributors": [ - "Jeff Wilcox " - ], "version": "7.1.0", "license": "MIT", "private": true, @@ -67,24 +64,25 @@ "_end_microsoft_internal_": 0, "//...": "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ", "dependencies": { - "@azure/cosmos": "3.17.3", + "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", "@azure/identity": "3.3.0", "@azure/keyvault-secrets": "4.7.0", - "@azure/service-bus": "7.9.0", - "@azure/storage-blob": "12.15.0", - "@azure/storage-queue": "12.14.0", + "@azure/service-bus": "7.9.1", + "@azure/storage-blob": "12.16.0", + "@azure/storage-queue": "12.15.0", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.1", - "@octokit/auth-app": "6.0.0", - "@octokit/rest": "20.0.1", - "@primer/octicons": "19.6.0", + "@octokit/request": "8.1.2", + "@octokit/auth-app": "6.0.1", + "@octokit/rest": "20.0.2", + "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", - "applicationinsights": "2.7.3", + "applicationinsights": "2.8.0", "async-prompt": "1.0.1", - "axios": "1.4.0", + "axios": "1.5.1", "basic-auth": "2.0.1", "body-parser": "1.20.2", + "change-case": "5.0.1", "color-contrast-checker": "2.1.0", "compression": "1.7.4", "connect-redis": "7.1.0", @@ -100,16 +98,16 @@ "github-username-regex": "1.0.0", "hsts": "2.2.0", "jsonc": "2.0.0", - "jsonwebtoken": "9.0.1", + "jsonwebtoken": "9.0.2", "jwks-rsa": "3.0.1", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.4.1", + "luxon": "3.4.3", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.4", + "nodemailer": "6.9.5", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", @@ -119,7 +117,7 @@ "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.8", + "redis": "4.6.10", "secure-compare": "3.0.1", "semver": "7.5.4", "serve-favicon": "2.5.0", @@ -130,45 +128,46 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/debug": "4.1.8", - "@types/express": "4.17.17", - "@types/express-session": "1.17.7", - "@types/jest": "29.5.4", - "@types/lodash": "4.14.197", - "@types/luxon": "3.3.1", + "@types/cors": "2.8.14", + "@types/debug": "4.1.9", + "@types/express": "4.17.18", + "@types/express-session": "1.17.8", + "@types/jest": "29.5.5", + "@types/lodash": "4.14.199", + "@types/luxon": "3.3.2", "@types/memory-cache": "0.2.3", - "@types/morgan": "1.9.5", - "@types/node": "20.5.6", - "@types/node-jose": "1.1.10", - "@types/object-path": "0.11.1", - "@types/passport": "1.0.12", - "@types/passport-azure-ad": "4.3.1", - "@types/passport-github": "1.1.7", - "@types/pg": "8.10.2", - "@types/pug": "2.0.6", - "@types/recursive-readdir": "2.2.1", - "@types/semver": "7.5.0", - "@types/simple-oauth2": "5.0.4", - "@types/validator": "13.11.1", - "@typescript-eslint/eslint-plugin": "6.4.1", - "@typescript-eslint/parser": "6.4.1", - "cspell": "7.0.1", - "eslint": "8.47.0", + "@types/morgan": "1.9.6", + "@types/node": "20.8.2", + "@types/node-jose": "1.1.11", + "@types/object-path": "0.11.2", + "@types/passport": "1.0.13", + "@types/passport-azure-ad": "4.3.2", + "@types/passport-github": "1.1.10", + "@types/pg": "8.10.3", + "@types/pug": "2.0.7", + "@types/recursive-readdir": "2.2.2", + "@types/semver": "7.5.3", + "@types/simple-oauth2": "5.0.5", + "@types/validator": "13.11.2", + "@typescript-eslint/eslint-plugin": "6.7.4", + "@typescript-eslint/parser": "6.7.4", + "cspell": "7.3.7", + "eslint": "8.50.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.0.2", + "eslint-plugin-n": "16.1.0", "eslint-plugin-prettier": "5.0.0", "husky": "8.0.3", - "jest": "29.6.4", + "jest": "29.7.0", "jest-junit": "16.0.0", "lint-staged": "14.0.1", - "markdownlint-cli2": "0.8.1", - "prettier": "3.0.2", + "markdownlint-cli2": "0.10.0", + "prettier": "3.0.3", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", "typescript": "5.2.2" }, "engines": { - "node": ">=16" + "node": ">=18" } } From 00fa63d65c0513791ffaa91558f5fbebcefe4429 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:52:12 -0700 Subject: [PATCH 22/69] Editor config update --- .editorconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/.editorconfig b/.editorconfig index d7ce5c432..6375e1c4c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,3 +9,4 @@ indent_size = 2 trim_trailing_whitespace = true charset = utf-8 end_of_line = lf +tabCompletion = on From 040775abd7f1d8960ea50a08767fa25b802685e8 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:52:23 -0700 Subject: [PATCH 23/69] API middleware --- api/index.ts | 8 ++++--- interfaces/companySpecific/middleware.ts | 4 ++-- middleware/apiAad.ts | 30 +++++++++++++++++++----- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/api/index.ts b/api/index.ts index 2a1195463..bd309f1c5 100644 --- a/api/index.ts +++ b/api/index.ts @@ -17,8 +17,9 @@ import { IApiRequest } from '../middleware/apiReposAuth'; import apiExtension from './extension'; import apiWebhook from './webhook'; import apiPeople from './people'; +import apiNews from './client/news'; -import AadApiAuthentication, { requireAadApiAuthorizedScope } from '../middleware/apiAad'; +import aadApiAuthentication, { requireAadApiAuthorizedScope } from '../middleware/apiAad'; import AzureDevOpsAuthenticationMiddleware from '../middleware/apiVstsAuth'; import ReposApiAuthentication from '../middleware/apiReposAuth'; import { CreateRepository, CreateRepositoryEntrypoint } from './createRepo'; @@ -67,15 +68,16 @@ router.use((req: IApiRequest, res: Response, next: NextFunction) => { // AUTHENTICATION: VSTS or repos //----------------------------------------------------------------------------- const multipleProviders = supportMultipleAuthProviders([ - AadApiAuthentication, + aadApiAuthentication, ReposApiAuthentication, AzureDevOpsAuthenticationMiddleware, ]); -const aadAndCustomProviders = supportMultipleAuthProviders([AadApiAuthentication, ReposApiAuthentication]); +const aadAndCustomProviders = supportMultipleAuthProviders([aadApiAuthentication, ReposApiAuthentication]); router.use('/people', cors(), multipleProviders, apiPeople); router.use('/extension', cors(), multipleProviders, apiExtension); +router.use('/news', cors(), aadApiAuthentication, requireAadApiAuthorizedScope('news'), apiNews); //----------------------------------------------------------------------------- // AUTHENTICATION: AAD or repos (specific to this app) diff --git a/interfaces/companySpecific/middleware.ts b/interfaces/companySpecific/middleware.ts index ceb754970..8f9c96fb9 100644 --- a/interfaces/companySpecific/middleware.ts +++ b/interfaces/companySpecific/middleware.ts @@ -46,8 +46,8 @@ export interface ICompanySpecificAuthenticationCalls { export interface IAadAuthenticationValidator { isAuthorizedTenant(tenantId: string): Promise; getAudienceIdentities(): Promise; - getAuthorizedClientIdToken(clientId: string): Promise; - getAuthorizedObjectIdToken(objectId: string): Promise; + getAuthorizedClientIdToken(clientId: string): Promise; + getAuthorizedObjectIdToken(objectId: string): Promise; getScopes(tokenRepresentation: any): Promise; getDisplayValues(tokenRepresentation: any): Promise; } diff --git a/middleware/apiAad.ts b/middleware/apiAad.ts index 9231ca083..0a566f909 100644 --- a/middleware/apiAad.ts +++ b/middleware/apiAad.ts @@ -123,20 +123,37 @@ async function validateAadAuthorization(req: IApiRequest): Promise { } const { appid, oid } = payload as any; - let approvedAppMonikerId = await aadApiValidator.getAuthorizedClientIdToken(appid); - if (!approvedAppMonikerId) { - approvedAppMonikerId = await aadApiValidator.getAuthorizedObjectIdToken(oid); + const monikerSources = []; + const approvedAppMonikerClientId = await aadApiValidator.getAuthorizedClientIdToken(appid); + if (approvedAppMonikerClientId) { + monikerSources.push('client'); + } + const approvedAppMonikerObjectId = await aadApiValidator.getAuthorizedObjectIdToken(oid); + if (approvedAppMonikerObjectId) { + monikerSources.push('object'); } - const notAuthorized = !approvedAppMonikerId; + const notAuthorized = !approvedAppMonikerClientId && !approvedAppMonikerObjectId; if (notAuthorized) { throw wrapErrorForImmediateUserError( jsonError(`App ${appid} and object ID ${oid} is not authorized for this API endpoint`, 403) ); } - const scopes = await aadApiValidator.getScopes(approvedAppMonikerId); - const displayValues = await aadApiValidator.getDisplayValues(approvedAppMonikerId); + const scopesSet = new Set(); + if (approvedAppMonikerClientId) { + const clientIdScopes = await aadApiValidator.getScopes(approvedAppMonikerClientId); + clientIdScopes.forEach((s) => scopesSet.add(s)); + } + if (approvedAppMonikerObjectId) { + const objectIdScopes = await aadApiValidator.getScopes(approvedAppMonikerObjectId); + objectIdScopes.forEach((s) => scopesSet.add(s)); + } + const scopes = Array.from(scopesSet); + + const displayValues = await aadApiValidator.getDisplayValues( + approvedAppMonikerClientId || approvedAppMonikerObjectId + ); const apiToken = PersonalAccessToken.CreateFromAadAuthorization( { @@ -153,6 +170,7 @@ async function validateAadAuthorization(req: IApiRequest): Promise { name: 'ApiAadAppAuthorized', properties: Object.assign({}, decodedToken as any, { authorizedScopes: scopes.join(','), + monikerSources: monikerSources.join(','), }), }); } catch (error) { From b5b3147475fd78e10eb58b5026acfdb615febbf6 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:54:30 -0700 Subject: [PATCH 24/69] Actions: to v4 --- .github/workflows/ci.yml | 4 ++-- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/container.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3769270a0..0e2220f50 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,14 +6,14 @@ on: - 'dependabot/**' - trunk pull_request: - + jobs: test: runs-on: [self-hosted, 1ES.Pool=ost-ospo-opensource] steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v3 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4bfc955e2..bc18a0df2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 42be3cadb..cf55c7447 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout 🛒 - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Packages 📦 run: | @@ -46,7 +46,7 @@ jobs: environment: name: development steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 #- uses: docker/build-push-action@v3 - name: Azure OpenID Connect ✨ From 8d06c8098cfdb6b8e0d7aa56420385e6be186ba1 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 4 Oct 2023 07:50:39 -0700 Subject: [PATCH 25/69] Remove unused dependency --- package-lock.json | 11 ----------- package.json | 1 - 2 files changed, 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ff66566a..1238e5fce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,6 @@ "axios": "1.5.1", "basic-auth": "2.0.1", "body-parser": "1.20.2", - "change-case": "5.0.1", "color-contrast-checker": "2.1.0", "compression": "1.7.4", "connect-redis": "7.1.0", @@ -4248,11 +4247,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/change-case": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.0.1.tgz", - "integrity": "sha512-iQ4vIQKF6hFRAGi3AKnoZPRpYfzj6/Zc4trhe/Ngzlk1FblM573PgfIiccATvQc81oFYub8Z9UY5QSOxsSSQYA==" - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -14674,11 +14668,6 @@ } } }, - "change-case": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.0.1.tgz", - "integrity": "sha512-iQ4vIQKF6hFRAGi3AKnoZPRpYfzj6/Zc4trhe/Ngzlk1FblM573PgfIiccATvQc81oFYub8Z9UY5QSOxsSSQYA==" - }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", diff --git a/package.json b/package.json index 73a743c8b..e5b0e4156 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,6 @@ "axios": "1.5.1", "basic-auth": "2.0.1", "body-parser": "1.20.2", - "change-case": "5.0.1", "color-contrast-checker": "2.1.0", "compression": "1.7.4", "connect-redis": "7.1.0", From 8a1967e305e8f742cbec3596194fcfcefe997216 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 4 Oct 2023 10:50:38 -0700 Subject: [PATCH 26/69] Add package script --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e5b0e4156..f7ab67819 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ ], "scripts": { "build": "tsc", + "dev:local": "DEBUG=startup EXIT_IMMEDIATELY=1 node ./dist/scripts/localEnvironment.js", "find-deadcode": "ts-prune", "find-circular-dependencies": "npx madge --circular --extensions ts .", "fix:js": "eslint --fix .", From 3c3ab2e4b811a7591bd4e45ddc1d4eaa4ae4eecd Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:48:26 -0700 Subject: [PATCH 27/69] Debug: minute-spaced alert option --- config/debug.json | 3 ++- config/debug.types.ts | 1 + middleware/initialize.ts | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/config/debug.json b/config/debug.json index c852798f4..1f904f311 100644 --- a/config/debug.json +++ b/config/debug.json @@ -3,5 +3,6 @@ "showUsers": "env://SITE_SHOW_USERS?trueIf=show", "showDebugFooter": "env://DEBUG_SHOW_FOOTER?trueIf=1", "exitImmediately": "env://EXIT_IMMEDIATELY?trueIf=1", - "unlinkWithoutDrops": "env://DEBUG_UNLINK_WITHOUT_DROPS?trueIf=1" + "unlinkWithoutDrops": "env://DEBUG_UNLINK_WITHOUT_DROPS?trueIf=1", + "breakConsoleEveryMinute": "env://DEBUG_MINUTE_BREAKS?trueIf=1" } diff --git a/config/debug.types.ts b/config/debug.types.ts index 92ad6fe69..2dc85bd95 100644 --- a/config/debug.types.ts +++ b/config/debug.types.ts @@ -13,4 +13,5 @@ export type ConfigDebug = { showDebugFooter: boolean; unlinkWithoutDrops: boolean; exitImmediately: boolean; + breakConsoleEveryMinute?: boolean; }; diff --git a/middleware/initialize.ts b/middleware/initialize.ts index 5c06ad1b9..01927aaf9 100644 --- a/middleware/initialize.ts +++ b/middleware/initialize.ts @@ -27,6 +27,7 @@ import { Pool as PostgresPool } from 'pg'; import Debug from 'debug'; const debug = Debug.debug('startup'); const pgDebug = Debug.debug('pgpool'); +const nowDebug = Debug.debug('now'); import appInsights from './appInsights'; import keyVault from './keyVault'; @@ -531,6 +532,20 @@ export default async function initialize( } } await ErrorRoutes(app, exception); + if (config?.debug?.breakConsoleEveryMinute === true) { + const isNowDebugging = Debug.enabled('now'); + const everyMinute = () => { + const display = new Date().toISOString().substring(0, 19).replace('T', ' '); + if (isNowDebugging) { + nowDebug(display); + } else { + console.log(); + console.log(display); + } + }; + everyMinute(); + setInterval(everyMinute, 60000); + } return executionEnvironment; } From 10233a22cd761ed1691981fc52bd3426532ac58b Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:48:47 -0700 Subject: [PATCH 28/69] Dependency updates --- package-lock.json | 66 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1238e5fce..5da727245 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "hsts": "2.2.0", "jsonc": "2.0.0", "jsonwebtoken": "9.0.2", - "jwks-rsa": "3.0.1", + "jwks-rsa": "3.1.0", "language-map": "1.5.0", "lodash": "4.17.21", "luxon": "3.4.3", @@ -2963,9 +2963,9 @@ "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", "dependencies": { "@types/node": "*" } @@ -7732,9 +7732,9 @@ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/jose": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.4.tgz", - "integrity": "sha512-eBH77Xs9Yc/oTDvukhAEDVMijhekPuNktXJL4tUlB22jqKP1k48v5nmsUmc8feoJPsxB3HsfEt2LbVSoz+1mng==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.2.tgz", + "integrity": "sha512-IY73F228OXRl9ar3jJagh7Vnuhj/GzBunPiZP13K0lOl7Am9SoWW3kEzq3MCllJMTtZqHTiDXQvoRd4U95aU6A==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -7927,16 +7927,16 @@ } }, "node_modules/jwks-rsa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.0.1.tgz", - "integrity": "sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", "debug": "^4.3.4", - "jose": "^4.10.4", + "jose": "^4.14.6", "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" + "lru-memoizer": "^2.2.0" }, "engines": { "node": ">=14" @@ -8366,9 +8366,9 @@ } }, "node_modules/lru-memoizer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", - "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", + "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", "dependencies": { "lodash.clonedeep": "^4.5.0", "lru-cache": "~4.0.0" @@ -13708,9 +13708,9 @@ "dev": true }, "@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==", "requires": { "@types/node": "*" } @@ -17173,9 +17173,9 @@ } }, "jose": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.4.tgz", - "integrity": "sha512-eBH77Xs9Yc/oTDvukhAEDVMijhekPuNktXJL4tUlB22jqKP1k48v5nmsUmc8feoJPsxB3HsfEt2LbVSoz+1mng==" + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.2.tgz", + "integrity": "sha512-IY73F228OXRl9ar3jJagh7Vnuhj/GzBunPiZP13K0lOl7Am9SoWW3kEzq3MCllJMTtZqHTiDXQvoRd4U95aU6A==" }, "js-stringify": { "version": "1.0.2", @@ -17338,16 +17338,16 @@ } }, "jwks-rsa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.0.1.tgz", - "integrity": "sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", + "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", "requires": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^9.0.0", + "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.2", "debug": "^4.3.4", - "jose": "^4.10.4", + "jose": "^4.14.6", "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" + "lru-memoizer": "^2.2.0" } }, "jws": { @@ -17656,9 +17656,9 @@ } }, "lru-memoizer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", - "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", + "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", "requires": { "lodash.clonedeep": "^4.5.0", "lru-cache": "~4.0.0" diff --git a/package.json b/package.json index f7ab67819..0da28ddae 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "hsts": "2.2.0", "jsonc": "2.0.0", "jsonwebtoken": "9.0.2", - "jwks-rsa": "3.0.1", + "jwks-rsa": "3.1.0", "language-map": "1.5.0", "lodash": "4.17.21", "luxon": "3.4.3", From e55f5ca2b1a3e919e6d4e5ea8bc10c833f67c7da Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:48:54 -0700 Subject: [PATCH 29/69] Repository invitations list support --- .cspell.json | 1 + api/client/index.ts | 2 ++ api/client/people.ts | 4 ++-- api/client/person.ts | 4 +++- business/account.ts | 6 ++++++ business/repository.ts | 40 ++++++++++++++++++++++++++++++++++++ interfaces/github/account.ts | 1 + lib/github/collections.ts | 24 +++++++++++++++++++++- utils.ts | 4 ++++ 9 files changed, 82 insertions(+), 4 deletions(-) diff --git a/.cspell.json b/.cspell.json index 2fa7eaabe..343d1ea96 100644 --- a/.cspell.json +++ b/.cspell.json @@ -737,6 +737,7 @@ "shortcutting", "shouldrestore", "showids", + "shuf", "Sida", "signin", "signoff", diff --git a/api/client/index.ts b/api/client/index.ts index 6cc9bc95c..a662e58a4 100644 --- a/api/client/index.ts +++ b/api/client/index.ts @@ -31,6 +31,7 @@ import routeNews from './news'; import routeCrossOrganizationPeople from './people'; import routeCrossOrganizationRepos from './repos'; import routeCrossOrganizationTeams from './teams'; +import routeUsers from './users'; const router: Router = Router(); @@ -63,6 +64,7 @@ router.use('/signout', routeSession); router.use('/people', routeCrossOrganizationPeople); router.use('/repos', routeCrossOrganizationRepos); router.use('/teams', routeCrossOrganizationTeams); +router.use('/users', routeUsers); router.use('/news', routeNews); const dynamicStartupInstance = getCompanySpecificDeployment(); diff --git a/api/client/people.ts b/api/client/people.ts index 8a71f2508..41b30e959 100644 --- a/api/client/people.ts +++ b/api/client/people.ts @@ -12,7 +12,7 @@ import { type GitHubSimpleAccount, type ICorporateLink, ReposAppRequest } from ' import JsonPager from './jsonPager'; import getCompanySpecificDeployment from '../../middleware/companySpecificDeployment'; -import RouteGetPerson from './person'; +import { getPerson as routeGetPerson } from './person'; import { equivalentLegacyPeopleSearch } from './peopleSearch'; const router: Router = Router(); @@ -37,7 +37,7 @@ interface IOrganizationMembershipAccount { [id: string]: GitHubSimpleAccount; } -router.get('/:login', RouteGetPerson); +router.get('/:login', routeGetPerson); router.get( '/', diff --git a/api/client/person.ts b/api/client/person.ts index c82a54a50..7b58e626a 100644 --- a/api/client/person.ts +++ b/api/client/person.ts @@ -12,7 +12,7 @@ import { IGraphEntry } from '../../lib/graphProvider'; import { jsonError } from '../../middleware'; import { getProviders } from '../../transitional'; -export default asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { +const getPerson = asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const { operations, queryCache, graphProvider } = providers; const login = req.params.login as string; @@ -77,3 +77,5 @@ export default asyncHandler(async (req: ReposAppRequest, res: Response, next: Ne return next(jsonError(`login ${login} error: ${error}`, 500)); } }); + +export { getPerson }; diff --git a/business/account.ts b/business/account.ts index 1e5e0ec8d..17a6277a0 100644 --- a/business/account.ts +++ b/business/account.ts @@ -70,6 +70,12 @@ export class Account { case AccountJsonFormat.GitHub: { return basic; } + case AccountJsonFormat.GitHubExtended: { + const cloneEntity = Object.assign({}, this._originalEntity || {}); + delete (cloneEntity as any).cost; + delete (cloneEntity as any).headers; + return cloneEntity; + } case AccountJsonFormat.GitHubDetailedWithLink: { const cloneEntity = Object.assign({}, this._originalEntity || {}); delete (cloneEntity as any).cost; diff --git a/business/repository.ts b/business/repository.ts index bb253ec18..aa3453777 100644 --- a/business/repository.ts +++ b/business/repository.ts @@ -56,6 +56,7 @@ import { RepositoryActions } from './repositoryActions'; import { RepositoryPullRequest } from './repositoryPullRequest'; import { ErrorHelper } from '../transitional'; import { augmentInertiaPreview, RepositoryProject } from './repositoryProject'; +import { RepositoryInvitation } from './repositoryInvitation'; interface IRepositoryMoments { created?: moment.Moment; @@ -1057,6 +1058,39 @@ export class Repository { return collaborators; } + async listCollaboratorInvitations(cacheOptions?: IPagedCacheOptions): Promise { + cacheOptions = cacheOptions || {}; + const operations = throwIfNotGitHubCapable(this._operations); + const github = operations.github; + const parameters = { + owner: this.organization.name, + repo: this.name, + per_page: getPageSize(operations), + }; + if (!cacheOptions.maxAgeSeconds) { + cacheOptions.maxAgeSeconds = getMaxAgeSeconds( + operations, + CacheDefault.orgRepoCollaboratorsStaleSeconds + ); + } + if (cacheOptions.backgroundRefresh === undefined) { + cacheOptions.backgroundRefresh = true; + } + const invitationEntities = await github.collections.getRepoInvitations( + this.authorize(AppPurpose.Data), + parameters, + cacheOptions + ); + const invitations = common.createInstances( + this, + invitationFromEntity, + invitationEntities + ); + invitationEntities?.cost && ((invitations as any).cost = invitationEntities.cost); + invitationEntities?.headers && ((invitations as any).headers = invitationEntities.headers); + return invitations; + } + async addCollaborator( username: string, permission: GitHubRepositoryPermission @@ -1945,3 +1979,9 @@ function collaboratorPermissionFromEntity(entity) { const permission = new Collaborator(entity); return permission; } + +function invitationFromEntity(entity) { + // 'this' is bound for this function to be a private method + const invitation = new RepositoryInvitation(this, entity); + return invitation; +} diff --git a/interfaces/github/account.ts b/interfaces/github/account.ts index c57efafa5..f4bf943e3 100644 --- a/interfaces/github/account.ts +++ b/interfaces/github/account.ts @@ -5,6 +5,7 @@ export enum AccountJsonFormat { GitHub = 'github', + GitHubExtended = 'github+extended', UplevelWithLink = 'github+link', GitHubDetailedWithLink = 'detailed+link', } diff --git a/lib/github/collections.ts b/lib/github/collections.ts index cb18c7215..7f69f1229 100644 --- a/lib/github/collections.ts +++ b/lib/github/collections.ts @@ -13,11 +13,17 @@ import { IRestResponse, flattenData } from './core'; import { CompositeApiContext, CompositeIntelligentEngine } from './composite'; import { Collaborator } from '../../business/collaborator'; import { Team } from '../../business/team'; -import { IPagedCacheOptions, IGetAuthorizationHeader, IDictionary } from '../../interfaces'; +import { + IPagedCacheOptions, + IGetAuthorizationHeader, + IDictionary, + GitHubRepositoryPermission, +} from '../../interfaces'; import { RestLibrary } from '.'; import { sleep } from '../../utils'; import GitHubApplication from '../../business/application'; import { RepositoryPrimaryProperties } from '../../business/primaryProperties'; +import { RepositoryInvitation } from '../../business/repositoryInvitation'; export interface IGetAppInstallationsParameters { app_id: string; @@ -57,6 +63,7 @@ const teamDetailsToCopy = Team.PrimaryProperties; const memberDetailsToCopy = Collaborator.PrimaryProperties; const appInstallDetailsToCopy = GitHubApplication.PrimaryInstallationProperties; const contributorsDetailsToCopy = [...Collaborator.PrimaryProperties, 'contributions']; +const repoInviteDetailsToCopy = RepositoryInvitation.PrimaryProperties; const teamPermissionsToCopy = [ 'id', @@ -294,6 +301,21 @@ export class RestCollections { ); } + getRepoInvitations( + token: string | IGetAuthorizationHeader, + options, + cacheOptions: IPagedCacheOptions + ): Promise { + return this.generalizedCollectionWithFilter( + 'repoInvitations', + 'repos.listInvitations', + repoInviteDetailsToCopy, + token, + options, + cacheOptions + ); + } + getRepoBranches( token: string | IGetAuthorizationHeader, options, diff --git a/utils.ts b/utils.ts index dd9576020..84046d22b 100644 --- a/utils.ts +++ b/utils.ts @@ -17,6 +17,10 @@ export function daysInMilliseconds(days: number): number { return 1000 * 60 * 60 * 24 * days; } +export function dateToDateString(date: Date) { + return date.toISOString().substr(0, 10); +} + export function stringOrNumberAsString(value: any) { if (typeof value === 'number') { return (value as number).toString(); From 676d7b5691e71839a4ad0437e775edc2a1482785 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 5 Oct 2023 21:51:52 -0700 Subject: [PATCH 30/69] +missing merge --- api/client/users.ts | 35 +++++++++++++++ business/repositoryInvitation.ts | 77 ++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 api/client/users.ts create mode 100644 business/repositoryInvitation.ts diff --git a/api/client/users.ts b/api/client/users.ts new file mode 100644 index 000000000..a794d5306 --- /dev/null +++ b/api/client/users.ts @@ -0,0 +1,35 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { NextFunction, Response, Router } from 'express'; +import asyncHandler from 'express-async-handler'; + +import { ReposAppRequest, AccountJsonFormat } from '../../interfaces'; +import { CreateError, getProviders } from '../../transitional'; + +const router: Router = Router(); + +router.get( + '/:login', + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { + const { operations } = getProviders(req); + const login = req.params.login as string; + try { + if (!login) { + throw CreateError.ParameterRequired('login'); + } + const accountInfo = await operations.getAccountByUsername(login); + return res.json(accountInfo.asJson(AccountJsonFormat.GitHubExtended)) as any as void; + } catch (error) { + return next(error); + } + }) +); + +router.use('*', (req, res: Response, next: NextFunction) => { + return next(CreateError.NotFound('/users: no API found')); +}); + +export default router; diff --git a/business/repositoryInvitation.ts b/business/repositoryInvitation.ts new file mode 100644 index 000000000..449774cbb --- /dev/null +++ b/business/repositoryInvitation.ts @@ -0,0 +1,77 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { GitHubRepositoryPermission, GitHubSimpleAccount } from '../interfaces'; +import * as common from './common'; +import { Repository } from './repository'; + +const primaryProperties = ['inviter', 'invitee', 'permissions', 'created_at', 'html_url', 'node_id']; + +export type RepositoryInvitationClientJson = { + inviter: { + id: number; + login: string; + }; + invitee: { + id: number; + login: string; + }; + permissions: GitHubRepositoryPermission; + created_at: string; + html_url: string; + // node_id: string; +}; + +export class RepositoryInvitation { + public static PrimaryProperties = primaryProperties; + + private _inviter: GitHubSimpleAccount; + private _invitee: GitHubSimpleAccount; + private _permissions: GitHubRepositoryPermission; + private _html_url: string; + private _created_at: string; + + constructor( + private repository: Repository, + entity: unknown + ) { + if (entity) { + common.assignKnownFieldsPrefixed(this, entity, 'invitation', primaryProperties); + } + } + + asJson(): RepositoryInvitationClientJson { + return { + invitee: this.invitee, + inviter: this.inviter, + permissions: this.permission, + html_url: this.invitationUrl, + created_at: this._created_at, + }; + } + + get permission(): GitHubRepositoryPermission { + return this._permissions; + } + + // getHighestPermission() { + // if (!this._permissions) { + // return GitHubRepositoryPermission.None; + // } + // return projectCollaboratorPermissionsObjectToGitHubRepositoryPermission(this._permissions); + // } + + get inviter(): GitHubSimpleAccount { + return this._inviter; + } + + get invitee(): GitHubSimpleAccount { + return this._invitee; + } + + get invitationUrl(): string { + return this._html_url; + } +} From 661698807cb4249e4550c5a92c895d4a85f9f209 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 10 Oct 2023 12:56:52 -0700 Subject: [PATCH 31/69] Updating dependencies --- .cspell.json | 2 + package-lock.json | 316 ++++++++++++++++++++++++---------------------- package.json | 20 +-- 3 files changed, 178 insertions(+), 160 deletions(-) diff --git a/.cspell.json b/.cspell.json index 343d1ea96..6fee4b9fc 100644 --- a/.cspell.json +++ b/.cspell.json @@ -20,6 +20,7 @@ "**/*_html.ts", "**/*.ignore_data.ts", "package*.json", + "**/assets/*.xlsx", "**/known.csv" ], "enableGlobDot": true, @@ -259,6 +260,7 @@ "eventid", "eventrecord", "eventtype", + "exceljs", "existingrepoid", "existingreponame", "fakeaccesstoken", diff --git a/package-lock.json b/package-lock.json index 5da727245..372b98a1e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,18 +11,18 @@ "dependencies": { "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.3.0", + "@azure/identity": "3.3.1", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.1", "@azure/storage-blob": "12.16.0", "@azure/storage-queue": "12.15.0", "@octokit/auth-app": "6.0.1", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.2", + "@octokit/request": "8.1.4", "@octokit/rest": "20.0.2", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", - "applicationinsights": "2.8.0", + "applicationinsights": "2.9.0", "async-prompt": "1.0.1", "axios": "1.5.1", "basic-auth": "2.0.1", @@ -51,7 +51,7 @@ "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.5", + "nodemailer": "6.9.6", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", @@ -74,29 +74,29 @@ "devDependencies": { "@types/cors": "2.8.14", "@types/debug": "4.1.9", - "@types/express": "4.17.18", + "@types/express": "4.17.19", "@types/express-session": "1.17.8", "@types/jest": "29.5.5", "@types/lodash": "4.14.199", "@types/luxon": "3.3.2", "@types/memory-cache": "0.2.3", "@types/morgan": "1.9.6", - "@types/node": "20.8.2", + "@types/node": "20.8.4", "@types/node-jose": "1.1.11", "@types/object-path": "0.11.2", "@types/passport": "1.0.13", "@types/passport-azure-ad": "4.3.2", "@types/passport-github": "1.1.10", - "@types/pg": "8.10.3", + "@types/pg": "8.10.4", "@types/pug": "2.0.7", "@types/recursive-readdir": "2.2.2", "@types/semver": "7.5.3", "@types/simple-oauth2": "5.0.5", "@types/validator": "13.11.2", - "@typescript-eslint/eslint-plugin": "6.7.4", - "@typescript-eslint/parser": "6.7.4", + "@typescript-eslint/eslint-plugin": "6.7.5", + "@typescript-eslint/parser": "6.7.5", "cspell": "7.3.7", - "eslint": "8.50.0", + "eslint": "8.51.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.1.0", "eslint-plugin-prettier": "5.0.0", @@ -370,9 +370,9 @@ } }, "node_modules/@azure/identity": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.0.tgz", - "integrity": "sha512-gISa/dAAxrWt6F2WiDXZY0y2xY4MLlN2wkNW4cPuq5OgPQKLSkxLc4I2WR04puTfZyQZnpXbAapAMEj1b96fgg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.1.tgz", + "integrity": "sha512-96im0LrJt0kzsMqA8XjWxqbd2pPuEZHDlyLM4zdMv6nowLV/ul3dOW5X55OuLoFX+h22tYnMcGmQb3tlkdt/UA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -1640,9 +1640,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2451,9 +2451,9 @@ } }, "node_modules/@octokit/request": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.2.tgz", - "integrity": "sha512-A0RJJfzjlZQwb+39eDm5UM23dkxbp28WEG4p2ueH+Q2yY4p349aRK/vcUlEuIB//ggcrHJceoYYkBP/LYCoXEg==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz", + "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", @@ -2876,9 +2876,9 @@ } }, "node_modules/@types/express": { - "version": "4.17.18", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", - "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.19.tgz", + "integrity": "sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3009,9 +3009,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", - "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==" + "version": "20.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", + "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -3107,9 +3110,9 @@ } }, "node_modules/@types/pg": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.3.tgz", - "integrity": "sha512-BACzsw64lCZesclRpZGu55tnqgFAYcrCBP92xLh1KLypZLCOsvJTSTgaoFVTy3lCys/aZTQzfeDxtjwrvdzL2g==", + "version": "8.10.4", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.4.tgz", + "integrity": "sha512-6cxJPHzhlJxqAMkWl2w3KubTEM0UjGC0UrtIToa9J/CEuRFJ2bquKt+g9MhYBN9n1+U6UZZ8CW6Z4oLx/Tvh/w==", "dev": true, "dependencies": { "@types/node": "*", @@ -3261,16 +3264,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", - "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", + "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/type-utils": "6.7.4", - "@typescript-eslint/utils": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/type-utils": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3296,15 +3299,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", - "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.5.tgz", + "integrity": "sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4" }, "engines": { @@ -3324,13 +3327,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", - "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", + "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4" + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3341,13 +3344,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", - "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", + "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/utils": "6.7.5", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3368,9 +3371,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", - "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", + "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3381,13 +3384,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", - "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", + "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3408,17 +3411,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", - "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", + "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", "semver": "^7.5.4" }, "engines": { @@ -3433,12 +3436,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", - "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", + "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/types": "6.7.5", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3598,9 +3601,9 @@ } }, "node_modules/applicationinsights": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.8.0.tgz", - "integrity": "sha512-pxVOdCPwXTal1A904yGmzOOUJrIeQ89xQir0ifr7fLl+e0BlGrZ1P4StcIDuEXk93gV9CGxGm5Mol8ksPk2mcg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.0.tgz", + "integrity": "sha512-W90WNjtvZ10GUInpkyNM0xBGe2qRYChHhdb44SE5KU7hXtCZLxs3IZjWw1gJINQem0qGAgtZlxrVvKPj5SlTbQ==", "dependencies": { "@azure/core-auth": "^1.5.0", "@azure/core-rest-pipeline": "1.10.1", @@ -5516,15 +5519,15 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8883,9 +8886,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", - "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.6.tgz", + "integrity": "sha512-s7pDtWwe5fLMkQUhw8TkWB/wnZ7SRdd9HRZslq/s24hlZvBP3j32N/ETLmnqTpmj4xoBZL9fOWyCIZ7r2HORHg==", "engines": { "node": ">=6.0.0" } @@ -10878,6 +10881,11 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", @@ -11555,9 +11563,9 @@ } }, "@azure/identity": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.0.tgz", - "integrity": "sha512-gISa/dAAxrWt6F2WiDXZY0y2xY4MLlN2wkNW4cPuq5OgPQKLSkxLc4I2WR04puTfZyQZnpXbAapAMEj1b96fgg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.1.tgz", + "integrity": "sha512-96im0LrJt0kzsMqA8XjWxqbd2pPuEZHDlyLM4zdMv6nowLV/ul3dOW5X55OuLoFX+h22tYnMcGmQb3tlkdt/UA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -12609,9 +12617,9 @@ } }, "@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true }, "@hapi/boom": { @@ -13263,9 +13271,9 @@ } }, "@octokit/request": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.2.tgz", - "integrity": "sha512-A0RJJfzjlZQwb+39eDm5UM23dkxbp28WEG4p2ueH+Q2yY4p349aRK/vcUlEuIB//ggcrHJceoYYkBP/LYCoXEg==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz", + "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==", "requires": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", @@ -13621,9 +13629,9 @@ } }, "@types/express": { - "version": "4.17.18", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", - "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.19.tgz", + "integrity": "sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -13754,9 +13762,12 @@ "dev": true }, "@types/node": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", - "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==" + "version": "20.8.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", + "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "requires": { + "undici-types": "~5.25.1" + } }, "@types/node-fetch": { "version": "2.6.2", @@ -13851,9 +13862,9 @@ } }, "@types/pg": { - "version": "8.10.3", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.3.tgz", - "integrity": "sha512-BACzsw64lCZesclRpZGu55tnqgFAYcrCBP92xLh1KLypZLCOsvJTSTgaoFVTy3lCys/aZTQzfeDxtjwrvdzL2g==", + "version": "8.10.4", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.4.tgz", + "integrity": "sha512-6cxJPHzhlJxqAMkWl2w3KubTEM0UjGC0UrtIToa9J/CEuRFJ2bquKt+g9MhYBN9n1+U6UZZ8CW6Z4oLx/Tvh/w==", "dev": true, "requires": { "@types/node": "*", @@ -13992,16 +14003,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", - "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", + "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/type-utils": "6.7.4", - "@typescript-eslint/utils": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/type-utils": "6.7.5", + "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14011,54 +14022,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", - "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.5.tgz", + "integrity": "sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", - "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", + "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", "dev": true, "requires": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4" + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5" } }, "@typescript-eslint/type-utils": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", - "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", + "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.7.4", - "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/utils": "6.7.5", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", - "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", + "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", - "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", + "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/visitor-keys": "6.7.4", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/visitor-keys": "6.7.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14067,27 +14078,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", - "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", + "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.4", - "@typescript-eslint/types": "6.7.4", - "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/scope-manager": "6.7.5", + "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/typescript-estree": "6.7.5", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", - "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", + "version": "6.7.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", + "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/types": "6.7.5", "eslint-visitor-keys": "^3.4.1" } }, @@ -14192,9 +14203,9 @@ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "applicationinsights": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.8.0.tgz", - "integrity": "sha512-pxVOdCPwXTal1A904yGmzOOUJrIeQ89xQir0ifr7fLl+e0BlGrZ1P4StcIDuEXk93gV9CGxGm5Mol8ksPk2mcg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.0.tgz", + "integrity": "sha512-W90WNjtvZ10GUInpkyNM0xBGe2qRYChHhdb44SE5KU7hXtCZLxs3IZjWw1gJINQem0qGAgtZlxrVvKPj5SlTbQ==", "requires": { "@azure/core-auth": "^1.5.0", "@azure/core-rest-pipeline": "1.10.1", @@ -15590,15 +15601,15 @@ "dev": true }, "eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -18054,9 +18065,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.5.tgz", - "integrity": "sha512-/dmdWo62XjumuLc5+AYQZeiRj+PRR8y8qKtFCOyuOl1k/hckZd8durUUHs/ucKx6/8kN+wFxqKJlQ/LK/qR5FA==" + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.6.tgz", + "integrity": "sha512-s7pDtWwe5fLMkQUhw8TkWB/wnZ7SRdd9HRZslq/s24hlZvBP3j32N/ETLmnqTpmj4xoBZL9fOWyCIZ7r2HORHg==" }, "normalize-path": { "version": "3.0.0", @@ -19527,6 +19538,11 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" }, + "undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + }, "unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", diff --git a/package.json b/package.json index 0da28ddae..86a634f68 100644 --- a/package.json +++ b/package.json @@ -67,18 +67,18 @@ "dependencies": { "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.3.0", + "@azure/identity": "3.3.1", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.1", "@azure/storage-blob": "12.16.0", "@azure/storage-queue": "12.15.0", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.2", + "@octokit/request": "8.1.4", "@octokit/auth-app": "6.0.1", "@octokit/rest": "20.0.2", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", - "applicationinsights": "2.8.0", + "applicationinsights": "2.9.0", "async-prompt": "1.0.1", "axios": "1.5.1", "basic-auth": "2.0.1", @@ -107,7 +107,7 @@ "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.5", + "nodemailer": "6.9.6", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", @@ -130,29 +130,29 @@ "devDependencies": { "@types/cors": "2.8.14", "@types/debug": "4.1.9", - "@types/express": "4.17.18", + "@types/express": "4.17.19", "@types/express-session": "1.17.8", "@types/jest": "29.5.5", "@types/lodash": "4.14.199", "@types/luxon": "3.3.2", "@types/memory-cache": "0.2.3", "@types/morgan": "1.9.6", - "@types/node": "20.8.2", + "@types/node": "20.8.4", "@types/node-jose": "1.1.11", "@types/object-path": "0.11.2", "@types/passport": "1.0.13", "@types/passport-azure-ad": "4.3.2", "@types/passport-github": "1.1.10", - "@types/pg": "8.10.3", + "@types/pg": "8.10.4", "@types/pug": "2.0.7", "@types/recursive-readdir": "2.2.2", "@types/semver": "7.5.3", "@types/simple-oauth2": "5.0.5", "@types/validator": "13.11.2", - "@typescript-eslint/eslint-plugin": "6.7.4", - "@typescript-eslint/parser": "6.7.4", + "@typescript-eslint/eslint-plugin": "6.7.5", + "@typescript-eslint/parser": "6.7.5", "cspell": "7.3.7", - "eslint": "8.50.0", + "eslint": "8.51.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.1.0", "eslint-plugin-prettier": "5.0.0", From ca2d444e7227d0c1b4d3ce54960d4528ca49f208 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Oct 2023 09:40:43 +0000 Subject: [PATCH 32/69] chore(deps-dev): bump @babel/traverse from 7.19.3 to 7.23.2 Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.19.3 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 381 +++++++++++++++++++++++++++++++--------------- 1 file changed, 257 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 372b98a1e..208c93642 100644 --- a/package-lock.json +++ b/package-lock.json @@ -562,17 +562,89 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.19.3", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", @@ -622,13 +694,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -677,34 +750,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -763,29 +836,29 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -814,13 +887,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -899,9 +972,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1087,33 +1160,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1131,12 +1204,12 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -11723,12 +11796,71 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -11769,13 +11901,14 @@ } }, "@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -11813,28 +11946,28 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -11878,23 +12011,23 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.18.6", @@ -11914,13 +12047,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -11983,9 +12116,9 @@ } }, "@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -12114,30 +12247,30 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -12151,12 +12284,12 @@ } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, From 9cd60cdad8e505dfd417522138c2120571252bf4 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:50:54 -0700 Subject: [PATCH 33/69] Privatize API + updated dependencies Syncing with our internal bits. --- api/client/organization/repo.ts | 77 +- interfaces/web.ts | 1 + package-lock.json | 1943 +++++++++++++++++-------------- package.json | 58 +- 4 files changed, 1181 insertions(+), 898 deletions(-) diff --git a/api/client/organization/repo.ts b/api/client/organization/repo.ts index 4b9bf97fd..5ca09bce9 100644 --- a/api/client/organization/repo.ts +++ b/api/client/organization/repo.ts @@ -7,7 +7,7 @@ import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; import { jsonError } from '../../../middleware'; -import { ErrorHelper, getProviders } from '../../../transitional'; +import { CreateError, ErrorHelper, getProviders } from '../../../transitional'; import { IndividualContext } from '../../../business/user'; import NewRepositoryLockdownSystem from '../../../features/newRepositories/newRepositoryLockdown'; import { @@ -17,12 +17,18 @@ import { import getCompanySpecificDeployment from '../../../middleware/companySpecificDeployment'; import RouteRepoPermissions from './repoPermissions'; -import { LocalApiRepoAction, getRepositoryMetadataProvider, NoCacheNoBackground } from '../../../interfaces'; +import { + LocalApiRepoAction, + getRepositoryMetadataProvider, + NoCacheNoBackground, + GitHubRepositoryVisibility, +} from '../../../interfaces'; import { RequestWithRepo } from '../../../middleware/business/repository'; -enum ArchivalAction { +enum RepositoryChangeAction { Archive, UnArchive, + Privatize, } const router: Router = Router(); @@ -96,21 +102,26 @@ router.get( } }) ); +router.post( + '/privatize', + asyncHandler(AddRepositoryPermissionsToRequest), + asyncHandler(RepositoryStateChangeHandler.bind(null, RepositoryChangeAction.Privatize)) +); router.post( '/archive', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(archiveUnArchiveRepositoryHandler.bind(null, ArchivalAction.Archive)) + asyncHandler(RepositoryStateChangeHandler.bind(null, RepositoryChangeAction.Archive)) ); router.post( '/unarchive', asyncHandler(AddRepositoryPermissionsToRequest), - asyncHandler(archiveUnArchiveRepositoryHandler.bind(null, ArchivalAction.UnArchive)) + asyncHandler(RepositoryStateChangeHandler.bind(null, RepositoryChangeAction.UnArchive)) ); -async function archiveUnArchiveRepositoryHandler( - action: ArchivalAction, +async function RepositoryStateChangeHandler( + action: RepositoryChangeAction, req: RequestWithRepo, res: Response, next: NextFunction @@ -119,12 +130,32 @@ async function archiveUnArchiveRepositoryHandler( const providers = getProviders(req); const { insights } = providers; const repoPermissions = getContextualRepositoryPermissions(req); - const phrase = action === ArchivalAction.Archive ? 'archive' : 'unarchive'; + let phrase: string = null; + let insightsPrefix: string = null; + let localAction: LocalApiRepoAction = null; + switch (action) { + case RepositoryChangeAction.Archive: + phrase = 'archive'; + insightsPrefix = 'ArchiveRepo'; + localAction = LocalApiRepoAction.Archive; + break; + case RepositoryChangeAction.UnArchive: + phrase = 'unarchive'; + insightsPrefix = 'UnArchiveRepo'; + localAction = LocalApiRepoAction.UnArchive; + break; + case RepositoryChangeAction.Privatize: + phrase = 'privatize'; + insightsPrefix = 'PrivatizeRepo'; + localAction = LocalApiRepoAction.Privatize; + break; + default: + return next(jsonError('Invalid action', 400)); + } const completedPhrase = `${phrase}d`; if (!repoPermissions.allowAdministration) { return next(jsonError(`You do not have permission to ${phrase} this repo`, 403)); } - const insightsPrefix = `${action === ArchivalAction.UnArchive ? 'Un' : ''}ArchiveRepo`; const { repository } = req; try { insights?.trackEvent({ @@ -139,16 +170,28 @@ async function archiveUnArchiveRepositoryHandler( const currentRepositoryState = deployment?.features?.repositoryActions?.getCurrentRepositoryState ? await deployment.features.repositoryActions.getCurrentRepositoryState(providers, repository) : null; - await (action === ArchivalAction.Archive ? repository.archive() : repository.unarchive()); + switch (action) { + case RepositoryChangeAction.Archive: { + await repository.archive(); + break; + } + case RepositoryChangeAction.UnArchive: { + await repository.unarchive(); + break; + } + case RepositoryChangeAction.Privatize: { + await repository.update({ + visibility: GitHubRepositoryVisibility.Private, + }); + break; + } + default: { + return next(CreateError.InvalidParameters('Invalid action')); + } + } if (deployment?.features?.repositoryActions?.sendActionReceipt) { deployment.features.repositoryActions - .sendActionReceipt( - providers, - activeContext, - repository, - action === ArchivalAction.Archive ? LocalApiRepoAction.Archive : LocalApiRepoAction.UnArchive, - currentRepositoryState - ) + .sendActionReceipt(providers, activeContext, repository, localAction, currentRepositoryState) .then((ok) => {}) .catch(() => {}); } diff --git a/interfaces/web.ts b/interfaces/web.ts index fe0b4dacc..4657f0082 100644 --- a/interfaces/web.ts +++ b/interfaces/web.ts @@ -36,6 +36,7 @@ export enum LocalApiRepoAction { Delete = 'delete', Archive = 'archive', UnArchive = 'unarchive', + Privatize = 'privatize', } export type VoidedExpressRoute = (req: ReposAppRequest, res: Response, next: NextFunction) => Promise; diff --git a/package-lock.json b/package-lock.json index 372b98a1e..367c752b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.3.1", + "@azure/identity": "3.3.2", "@azure/keyvault-secrets": "4.7.0", - "@azure/service-bus": "7.9.1", + "@azure/service-bus": "7.9.2", "@azure/storage-blob": "12.16.0", "@azure/storage-queue": "12.15.0", "@octokit/auth-app": "6.0.1", @@ -72,38 +72,38 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/cors": "2.8.14", - "@types/debug": "4.1.9", - "@types/express": "4.17.19", - "@types/express-session": "1.17.8", - "@types/jest": "29.5.5", - "@types/lodash": "4.14.199", - "@types/luxon": "3.3.2", - "@types/memory-cache": "0.2.3", - "@types/morgan": "1.9.6", - "@types/node": "20.8.4", - "@types/node-jose": "1.1.11", - "@types/object-path": "0.11.2", - "@types/passport": "1.0.13", - "@types/passport-azure-ad": "4.3.2", - "@types/passport-github": "1.1.10", - "@types/pg": "8.10.4", - "@types/pug": "2.0.7", - "@types/recursive-readdir": "2.2.2", - "@types/semver": "7.5.3", - "@types/simple-oauth2": "5.0.5", - "@types/validator": "13.11.2", - "@typescript-eslint/eslint-plugin": "6.7.5", - "@typescript-eslint/parser": "6.7.5", - "cspell": "7.3.7", + "@types/cors": "2.8.15", + "@types/debug": "4.1.10", + "@types/express": "4.17.20", + "@types/express-session": "1.17.9", + "@types/jest": "29.5.6", + "@types/lodash": "4.14.200", + "@types/luxon": "3.3.3", + "@types/memory-cache": "0.2.4", + "@types/morgan": "1.9.7", + "@types/node": "20.8.7", + "@types/node-jose": "1.1.12", + "@types/object-path": "0.11.3", + "@types/passport": "1.0.14", + "@types/passport-azure-ad": "4.3.3", + "@types/passport-github": "1.1.11", + "@types/pg": "8.10.7", + "@types/pug": "2.0.8", + "@types/recursive-readdir": "2.2.3", + "@types/semver": "7.5.4", + "@types/simple-oauth2": "5.0.6", + "@types/validator": "13.11.5", + "@typescript-eslint/eslint-plugin": "6.8.0", + "@typescript-eslint/parser": "6.8.0", + "cspell": "7.3.8", "eslint": "8.51.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.1.0", - "eslint-plugin-prettier": "5.0.0", + "eslint-plugin-n": "16.2.0", + "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", "jest-junit": "16.0.0", - "lint-staged": "14.0.1", + "lint-staged": "15.0.2", "markdownlint-cli2": "0.10.0", "prettier": "3.0.3", "ts-jest": "29.1.1", @@ -149,9 +149,9 @@ } }, "node_modules/@azure/core-amqp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-3.3.0.tgz", - "integrity": "sha512-RYIyC8PtGpMzZRiSokADw0ezFgNq1eUkCPV8rd7tJ85dn8CAhYDEYapzMYxAwIBLWidshu14m9UWjQS7hKYDpA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.0.0.tgz", + "integrity": "sha512-5QhtJ69qLbTKTL3arLHkQCN96C7tqENF4oKkPYp5Pqb+YA5Gh0aREL2aqp98sAT/YB/G8wAfvFLnYB7bUyzFVw==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -159,7 +159,6 @@ "@azure/logger": "^1.0.0", "buffer": "^6.0.0", "events": "^3.0.0", - "jssha": "^3.1.0", "process": "^0.11.10", "rhea": "^3.0.0", "rhea-promise": "^3.0.0", @@ -167,7 +166,7 @@ "util": "^0.12.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@azure/core-auth": { @@ -370,9 +369,9 @@ } }, "node_modules/@azure/identity": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.1.tgz", - "integrity": "sha512-96im0LrJt0kzsMqA8XjWxqbd2pPuEZHDlyLM4zdMv6nowLV/ul3dOW5X55OuLoFX+h22tYnMcGmQb3tlkdt/UA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.2.tgz", + "integrity": "sha512-aDLwgMXpNBEXOlfCP9r5Rn+inmbnTbadlOnrKI2dPS9Lpf4gHvpYBV+DEZKttakfJ+qn4iWWb7zONQSO3A4XSA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -476,12 +475,12 @@ } }, "node_modules/@azure/service-bus": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.1.tgz", - "integrity": "sha512-4IqhCOV1aSA2ChqFPOWN/5Qh2V8GDBnYleAmtETcHgKkpTQ3PCKX42gP6ZdhUPdNkHET+eu+KkwKYxRZJjqadw==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.2.tgz", + "integrity": "sha512-w8d1/KhlbUz8DvY3Ca7GvoU5cJ8ONV4QBW25OfUk4Br6waAKWY+1wugEThQNCueRKvNlJlJyRbr9T14ibYMZeQ==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-amqp": "^3.3.0", + "@azure/core-amqp": "^4.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-client": "^1.0.0", "@azure/core-paging": "^1.4.0", @@ -500,7 +499,7 @@ "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@azure/storage-blob": { @@ -562,17 +561,89 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.19.3", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", @@ -613,22 +684,23 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -668,43 +740,43 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -763,29 +835,29 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } @@ -814,13 +886,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -899,9 +971,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1087,33 +1159,33 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1131,12 +1203,12 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1150,25 +1222,25 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.7.tgz", - "integrity": "sha512-Mw7J0RAWGpEup/+eIePw3wi+OlMGNicrD1r9OhdgIgO6sHEi01ibS/RzNNbC7UziLaYEHi8+WfLyGzmp1ZISrQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.8.tgz", + "integrity": "sha512-Dj8iSGQyfgIsCjmXk9D/SjV7EpbpQSogeaGcBM66H33pd0GyGmLhn3biRN+vqi/vqWmsp75rT3kd5MKa8X5W9Q==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.24", - "@cspell/dict-cpp": "^5.0.5", + "@cspell/dict-companies": "^3.0.26", + "@cspell/dict-cpp": "^5.0.8", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.10", + "@cspell/dict-css": "^4.0.12", "@cspell/dict-dart": "^2.0.3", "@cspell/dict-django": "^4.1.0", "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.8", + "@cspell/dict-en_us": "^4.3.9", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", "@cspell/dict-filetypes": "^3.0.1", @@ -1185,19 +1257,19 @@ "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", - "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-lua": "^4.0.2", "@cspell/dict-node": "^4.0.3", - "@cspell/dict-npm": "^5.0.10", + "@cspell/dict-npm": "^5.0.12", "@cspell/dict-php": "^4.0.3", "@cspell/dict-powershell": "^5.0.2", - "@cspell/dict-public-licenses": "^2.0.4", + "@cspell/dict-public-licenses": "^2.0.5", "@cspell/dict-python": "^4.1.9", "@cspell/dict-r": "^2.0.1", - "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.2", - "@cspell/dict-sql": "^2.1.1", + "@cspell/dict-software-terms": "^3.3.6", + "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", "@cspell/dict-typescript": "^3.1.2", @@ -1208,30 +1280,30 @@ } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.7.tgz", - "integrity": "sha512-bogUQKKZWLttZtxFKjpzHuliIha/ByV2km18gm8dA2uB3IrzD1UJy4sCE8lnaodm6n3VtjnViSkQ5XIVU3gAKQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.8.tgz", + "integrity": "sha512-FxYJWtDgxIQYxdP0RWwRV8nzLfxVx8D8D5L2sbbP/0NFczDbq/zWYep4nSAHJT10aUJrogsVUYwNwdkr562wKA==", "dev": true, "dependencies": { - "@cspell/cspell-types": "7.3.7" + "@cspell/cspell-types": "7.3.8" }, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-pipe": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.7.tgz", - "integrity": "sha512-ZO8v3EwGhjUvhPo1S48+CKv7EPXMoYF7LGERB34K8EXFByb9+J74ojMYj9UgLRV68lFTrDFde3bHoZPPVS1FsA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.8.tgz", + "integrity": "sha512-/vKPfiHM5bJUkNX12w9j533Lm2JvvSMKUCChM2AxYjy6vL8prc/7ei++4g2xAWwRxLZPg2OfpDJS5EirZNBJdA==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-resolver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.7.tgz", - "integrity": "sha512-WWZcTI5f2cCjr1yRDTMkcVg7Meil3s+0aaKcLCDTGQf9J2UWWjpqDJ6M6keYei3paAjxW2Pk03IRNNwdA3+igQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.8.tgz", + "integrity": "sha512-CeyQmhqZI5a+T7a6oiVN90TFlzU3qVVYqCaZ9grFrVOsmzY9ipH5gmqfgMavaBOqb0di/+VZS8d02suMOXcKLQ==", "dev": true, "dependencies": { "global-dirs": "^3.0.1" @@ -1241,18 +1313,18 @@ } }, "node_modules/@cspell/cspell-service-bus": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.7.tgz", - "integrity": "sha512-pnDOFpjht7dZYydMygcf0brCSk5BGRvbeWRH6MaMhd+3CdyzyEvtZG3IbBQVNyVvDTA2c/K3rljOAo8y3/lpnw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.8.tgz", + "integrity": "sha512-3E7gwY6QILrZH83p69i9CERbRBEqeBiKCIKnAd7U2PbxfFqG/P47fqpnarzSWFwFpU92oyGsYry+wC8TEGISRQ==", "dev": true, "engines": { "node": ">=16" } }, "node_modules/@cspell/cspell-types": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.7.tgz", - "integrity": "sha512-zM2BuZJ3UUgPwF78bssggi8X20nmW3a95EmbNJKfbO6Zf2ui7UMzeP3BwpCZk30A/EixGlFhLf6Xd+eBT/DQqw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.8.tgz", + "integrity": "sha512-hsOtaULDnawEL4pU0fga941GhvE8mbTbywrJBx+eGX3fnJsaUr8XQzCtnLsW2ko7WCLWFItNEhSSTPQHBFRLsw==", "dev": true, "engines": { "node": ">=16" @@ -1277,15 +1349,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.25.tgz", - "integrity": "sha512-7phQlGJ/4qCx9fQg/kR8YV0n5TPak4+eleQ7M/e7uhsQR8TwOWsPU1dW23WABoTqJbYCgdUYLxqjQ8458w7jZQ==", + "version": "3.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.26.tgz", + "integrity": "sha512-BGRZ/Uykx+IgQoTGqvRqbBMQy7QSuY0pbTHgtmKtc1scgzZMJQKMDwyuE6LJzlhdlrV7TsVY0lyXREybnDpQPQ==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", - "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.9.tgz", + "integrity": "sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -1301,9 +1373,9 @@ "dev": true }, "node_modules/@cspell/dict-css": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.11.tgz", - "integrity": "sha512-kHQqg3/3Xra2Xki3K4e6s3BHDw5L82geie4q7jRBxQ9CofIgVEMcOqTr2QWKgIWegmACEe7B/CIMH35d4eiafA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.12.tgz", + "integrity": "sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==", "dev": true }, "node_modules/@cspell/dict-dart": { @@ -1343,9 +1415,9 @@ "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.8.tgz", - "integrity": "sha512-rCPsbDHuRnFUbzWAY6O1H9+cLZt5FNQwjPVw2TdQZfipdb0lim984aLGY+nupi1iKC3lfjyd5SVUgmSZEG1QNA==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.11.tgz", + "integrity": "sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw==", "dev": true }, "node_modules/@cspell/dict-en-common-misspellings": { @@ -1373,9 +1445,9 @@ "dev": true }, "node_modules/@cspell/dict-fsharp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.0.tgz", - "integrity": "sha512-dHPkMHwW4dWv3Lv9VWxHuVm4IylqvcfRBSnZ7usJTRThraetSVrOPIJwr6UJh7F5un/lGJx2lxWVApf2WQaB/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz", + "integrity": "sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==", "dev": true }, "node_modules/@cspell/dict-fullstack": { @@ -1397,9 +1469,9 @@ "dev": true }, "node_modules/@cspell/dict-golang": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.3.tgz", - "integrity": "sha512-KiNnjAeqDBq6zH4s46hzBrKgqIrkSZ9bbHzQ54PbHfe+jurZkSZ4lXz6E+315RNh2TkRLcNppFvaZqJvKZXomA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.4.tgz", + "integrity": "sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ==", "dev": true }, "node_modules/@cspell/dict-haskell": { @@ -1427,9 +1499,9 @@ "dev": true }, "node_modules/@cspell/dict-k8s": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", - "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.2.tgz", + "integrity": "sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==", "dev": true }, "node_modules/@cspell/dict-latex": { @@ -1445,9 +1517,9 @@ "dev": true }, "node_modules/@cspell/dict-lua": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", - "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.2.tgz", + "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", "dev": true }, "node_modules/@cspell/dict-node": { @@ -1457,15 +1529,15 @@ "dev": true }, "node_modules/@cspell/dict-npm": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.11.tgz", - "integrity": "sha512-QlgF92q29mT0LbNqlDHb3UgY5jCLcSn+GnA1pvD5ps/zw2LhVl+ZXMHExwSIi7gwTzP3IyJ1f/dT6rnw9wic4A==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.12.tgz", + "integrity": "sha512-T/+WeQmtbxo7ad6hrdI8URptYstKJP+kXyWJZfuVJJGWJQ7yubxrI5Z5AfM+Dh/ff4xHmdzapxD9adaEQ727uw==", "dev": true }, "node_modules/@cspell/dict-php": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.3.tgz", - "integrity": "sha512-PxtSmWJCDEB4M8R9ER9ijxBum/tvUqYT26QeuV58q2IFs5IrPZ6hocQKvnFGXItjCWH4oYXyAEAAzINlBC4Opg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.4.tgz", + "integrity": "sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==", "dev": true }, "node_modules/@cspell/dict-powershell": { @@ -1475,9 +1547,9 @@ "dev": true }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.4.tgz", - "integrity": "sha512-KjsfuGwMWvPkp6s0nR+s4mZc9SQhh1tHDOyQZfEVRwi+2ev7f8l7R6ts9sP2Mplb8UcxwO6YmKwxHjN+XHoMoA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.5.tgz", + "integrity": "sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==", "dev": true }, "node_modules/@cspell/dict-python": { @@ -1496,9 +1568,9 @@ "dev": true }, "node_modules/@cspell/dict-ruby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", - "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.1.tgz", + "integrity": "sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==", "dev": true }, "node_modules/@cspell/dict-rust": { @@ -1514,15 +1586,15 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.3.tgz", - "integrity": "sha512-JKxBPyubapWkeekGquJYo5MLZe1TXAWAC8bqxuarG0cYkWoa7wIqCNH6/9OywRFSBzIYCgoVu2xDP1yRqTEokg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.8.tgz", + "integrity": "sha512-zcwPl+EA5kWyWzPiwE2eF21ltKshzZ5NQ4kKCaND9uo4oeqTrD7hG8FTJTd7kz7GNhNqbT0G1SVMC2BtI+UpVQ==", "dev": true }, "node_modules/@cspell/dict-sql": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.1.tgz", - "integrity": "sha512-v1mswi9NF40+UDUMuI148YQPEQvWjac72P6ZsjlRdLjEiQEEMEsTQ+zlkIdnzC9QCNyJaqD5Liq9Mn78/8Zxtw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.2.tgz", + "integrity": "sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==", "dev": true }, "node_modules/@cspell/dict-svelte": { @@ -1550,9 +1622,9 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.7.tgz", - "integrity": "sha512-ac52OLDMYBHkRQ8XzihOWnyfqri3M84ELTZdqBhR5YGcHW/mxKhsmXqudA980SdRRKaicD39yhX4idAFb4AsDg==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.8.tgz", + "integrity": "sha512-s8x7dH/ScfW0pFEIvNFo4JOR7YmvM2wZSHOykmWTJCQ8k2EQ/+uECPp6ZxkoJoukTz8sj+3KzF0fRl5mKxPd6g==", "dev": true, "dependencies": { "import-meta-resolve": "^3.0.0" @@ -1562,9 +1634,9 @@ } }, "node_modules/@cspell/strong-weak-map": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.7.tgz", - "integrity": "sha512-n+jRgwH0wU+HsfqgCGVzPmWnZl4SyhtvPxusKwXj6L/STGdt8IP2rYl1PFOtyvgjPjh8xXe/jRrq7zH07btiKA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.8.tgz", + "integrity": "sha512-qNnt2wG45wb8JP54mENarnQgxfSYKPp3zlYID/2przbMNmVJRqUlcIBOdLI6plCgGeNkzJTl3T9T1ATbnN+LLw==", "dev": true, "engines": { "node": ">=16" @@ -2858,27 +2930,27 @@ } }, "node_modules/@types/cors": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", - "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", + "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", - "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", + "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/express": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.19.tgz", - "integrity": "sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2897,9 +2969,9 @@ } }, "node_modules/@types/express-session": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.8.tgz", - "integrity": "sha512-bFF7/3wOldMn+56XyFRGY9ZzCr3JWhNSP2ajMPgTlbZR6BQOCHdAbNA9W5dMBPgMywpIP4zkmhxP6Opm/NRYMQ==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.9.tgz", + "integrity": "sha512-yIqficLlTPdloeEPhOVenpOUWILkdaXHUWhTOqFGx9JoSuTgeatNjb97k8VvJehbTk0kUSUAHy5r27PXMga89Q==", "dev": true, "dependencies": { "@types/express": "*" @@ -2947,9 +3019,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", - "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", + "version": "29.5.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", + "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2957,9 +3029,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/jsonwebtoken": { @@ -2971,21 +3043,21 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.199", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", - "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", + "version": "4.14.200", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz", + "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==", "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", - "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.3.tgz", + "integrity": "sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==", "dev": true }, "node_modules/@types/memory-cache": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.3.tgz", - "integrity": "sha512-nDojhELFCY9qk4WR0m/vYyiHLQ1JDA+/Fv4xL9oHRgQ1kkdAaRTqOyLRnTVark9fwo6ohHg/gx3CMg44Fbu2pw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.4.tgz", + "integrity": "sha512-yUj2q3Iav0kuefl+qGtn3d3nZtYDlMG1CI3DYe1UDfJb3zqnH1w1oE8R0lhv1sSua0CR0cAvCgNUzQHahGFI4g==", "dev": true }, "node_modules/@types/mime": { @@ -2994,9 +3066,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/morgan": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", - "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", + "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", "dev": true, "dependencies": { "@types/node": "*" @@ -3009,9 +3081,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", "dependencies": { "undici-types": "~5.25.1" } @@ -3039,9 +3111,9 @@ } }, "node_modules/@types/node-jose": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.11.tgz", - "integrity": "sha512-8hEAhDB2A3k0Inhxh71qWfEp9mg970z/NvEPkzJN5KZSlIE47lEeYf3k+pNvk/W4hiSL/A0lW0AO7Fw8QMEtkA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.12.tgz", + "integrity": "sha512-HtSXbirRMuONr/KSNtBgh631xCt/t3lPz0geQ4pe/FA+yu06TUrJrXEU5y8nJFHNy8KhiZrq6OVlqXD1AtT/dQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -3057,9 +3129,9 @@ } }, "node_modules/@types/object-path": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.2.tgz", - "integrity": "sha512-STkyj0IQkgbmohF1afXQN64KucE3w7EgSbNJxqkJoq0KHVBV4nU5Pyku+TM9UCiCLXhZlkEFd8zq38P8lDFi6g==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.3.tgz", + "integrity": "sha512-P6V8jUKl0qA/U5ZAWW1y/BxeFf/R3yZucVGnHtD1qRXmFPndKZK4iZ49qX73R0FIwZnk0yKYixmqtYrPtManaA==", "dev": true }, "node_modules/@types/parse-json": { @@ -3069,18 +3141,18 @@ "dev": true }, "node_modules/@types/passport": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.13.tgz", - "integrity": "sha512-XXURryL+EZAWtbQFOHX1eNB+RJwz5XMPPz1xrGpEKr2xUZCXM4NCPkHMtZQ3B2tTSG/1IRaAcTHjczRA4sSFCw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", + "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/passport-azure-ad": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.2.tgz", - "integrity": "sha512-EHJcuRCNbvpVlBsIdoHAB+tWKGT43alFr6/f4hZOexfS7Oh4VEC28hycDrHUHBbFmQPPgvYkgNsMwf4KZyv7Fw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.3.tgz", + "integrity": "sha512-dRkF6PXKNAdsQBKLMqHIhnN84KFU94t/p6nJqJAEkP0ux9itsyzM8agErgjYsA7pJ92eVKz8dqzyHpeyM3Tiqw==", "dev": true, "dependencies": { "@types/express": "*", @@ -3088,9 +3160,9 @@ } }, "node_modules/@types/passport-github": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.10.tgz", - "integrity": "sha512-fj3FV2uWnE70S8x5afP70TgG8REEvLm2MWNocD28rLZhU4vmf/vchtG3yPrCZOGrme+Csbf1UO/KXZhvCqBElQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.11.tgz", + "integrity": "sha512-V2t1/P8BnnFX8AOYpk0ep9p4p7u2V1KdQBSUIvSvcxMseu7n2+cTLCr3rat8K876caQ1C95Y9vprVBbtLVVYXg==", "dev": true, "dependencies": { "@types/express": "*", @@ -3110,9 +3182,9 @@ } }, "node_modules/@types/pg": { - "version": "8.10.4", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.4.tgz", - "integrity": "sha512-6cxJPHzhlJxqAMkWl2w3KubTEM0UjGC0UrtIToa9J/CEuRFJ2bquKt+g9MhYBN9n1+U6UZZ8CW6Z4oLx/Tvh/w==", + "version": "8.10.7", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.7.tgz", + "integrity": "sha512-ksJqHipwYaSEHz9e1fr6H6erjoEdNNaOxwyJgPx9bNeaqOW3iWBQgVHfpwiSAoqGzchfc+ZyRLwEfeCcyYD3uQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -3178,9 +3250,9 @@ } }, "node_modules/@types/pug": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.7.tgz", - "integrity": "sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.8.tgz", + "integrity": "sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==", "dev": true }, "node_modules/@types/qs": { @@ -3194,18 +3266,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-pYLuc3EaFA3SwYfZRC6cSV9TfL+0tLi9Otu2djGavsNhmrEna1yG1EkFOZW7SKJr/nIuDNk4mM6kMMpNLntIhw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-fhOVQ23ki+GB0WGmJJF9OwPBjel2Iv02pmEv58T0DZqIAlKnyhAaC2E9/LuKQLIZF88w7ivXSZXJtvEXGXFgeQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/serve-static": { @@ -3223,9 +3295,9 @@ "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" }, "node_modules/@types/simple-oauth2": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.5.tgz", - "integrity": "sha512-hsUpJyOQnexMxa2Ilvs1CwmcSN62Y4irIvBbviUJNiyxUGIOQS7CUs0QPq+nuxkaNeNqdjxJ1BE/AoCGiG7L+g==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.6.tgz", + "integrity": "sha512-i1tx1TwdET6m9tit+p+pWABuNWz0W8LThmzwh+cYC9yKJTXD3q3zPWOwstuL8/ELO0HoE0f9r/yYQ3XHaiTjrw==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3243,9 +3315,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", - "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==", + "version": "13.11.5", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", + "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==", "dev": true }, "node_modules/@types/yargs": { @@ -3264,16 +3336,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", - "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3299,15 +3371,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.5.tgz", - "integrity": "sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4" }, "engines": { @@ -3327,13 +3399,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3344,13 +3416,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", - "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", + "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/utils": "6.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3371,9 +3443,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", + "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3384,13 +3456,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", - "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", + "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3411,17 +3483,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", - "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", + "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", "semver": "^7.5.4" }, "engines": { @@ -3436,12 +3508,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", + "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/types": "6.8.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3729,9 +3801,9 @@ } }, "node_modules/async-listener/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -4162,12 +4234,13 @@ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4399,9 +4472,9 @@ } }, "node_modules/cls-hooked/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -4477,9 +4550,9 @@ } }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -4777,29 +4850,29 @@ } }, "node_modules/cspell": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.7.tgz", - "integrity": "sha512-p23EuTu+7b2qioRxC7sV1TVfxIPm7928BtT4jYBHGeONiYP0EOOWNP8ynaksMYLTifQBzH1Q0LO4L5ogHiQsfw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.8.tgz", + "integrity": "sha512-8AkqsBQAMsKYV5XyJLB6rBs5hgspL4+MPOg6mBKG2j5EvQgRVc6dIfAPWDNLpIeW2a3+7K5BIWqKHapKPeiknQ==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "7.3.7", - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "@cspell/dynamic-import": "7.3.7", + "@cspell/cspell-json-reporter": "7.3.8", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8", + "@cspell/dynamic-import": "7.3.8", "chalk": "^5.3.0", "chalk-template": "^1.1.0", - "commander": "^11.0.0", - "cspell-gitignore": "7.3.7", - "cspell-glob": "7.3.7", - "cspell-io": "7.3.7", - "cspell-lib": "7.3.7", + "commander": "^11.1.0", + "cspell-gitignore": "7.3.8", + "cspell-glob": "7.3.8", + "cspell-io": "7.3.8", + "cspell-lib": "7.3.8", "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^7.0.0", + "file-entry-cache": "^7.0.1", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", - "vscode-uri": "^3.0.7" + "vscode-uri": "^3.0.8" }, "bin": { "cspell": "bin.mjs", @@ -4813,14 +4886,14 @@ } }, "node_modules/cspell-dictionary": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.7.tgz", - "integrity": "sha512-mJ0h2BGxYEqb/1FxKD50WuufKhDaCaIk8pwZQryqazXQCvoTpla0yud3KO61Cke92za8z37Rfb+5xATlywEfaw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.8.tgz", + "integrity": "sha512-gkq4t78eLR0xC3P0vDDHPeNY4iZRd5YE6Z8uDJ7RM4UaX/TSdVUN9KNFr34RnJ119NYVHujpL9+uW7wPSAe8Eg==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "cspell-trie-lib": "7.3.7", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8", + "cspell-trie-lib": "7.3.8", "fast-equals": "^4.0.3", "gensequence": "^6.0.0" }, @@ -4835,12 +4908,12 @@ "dev": true }, "node_modules/cspell-gitignore": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.7.tgz", - "integrity": "sha512-nP4Gg+zq5y0njzhiNYTLvaJIMAponBhJoTMzkXCOOKYEHJmiRQocfa3gO4t2s8iZ4YVhscbrB2h+dYvo3MLQqg==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.8.tgz", + "integrity": "sha512-vJzCOUEiw6/MwV/U4Ux3bgSdj9mXB+X5eHL+qzVoyFI7ArlvrkuGTL+iFJThQcS8McM3SGqtvaBNCiKBmAeCkA==", "dev": true, "dependencies": { - "cspell-glob": "7.3.7", + "cspell-glob": "7.3.8", "find-up": "^5.0.0" }, "bin": { @@ -4851,9 +4924,9 @@ } }, "node_modules/cspell-glob": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.7.tgz", - "integrity": "sha512-DJX5wJ5dhcNzyycukZst+WtbIdpCLTL7DaKS0EKW/57QjzMwwMBgpsF89ufnreGHB8dHrPF85epF9qyOI1SRNg==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.8.tgz", + "integrity": "sha512-wUZC6znyxEs0wlhzGfZ4XHkATPJyazJIFi/VvAdj+KHe7U8SoSgitJVDQqdgectI2y3MxR7lQdVLX9dONFh+7A==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -4863,13 +4936,13 @@ } }, "node_modules/cspell-grammar": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.7.tgz", - "integrity": "sha512-4cyJ4Alq/wBGTctH7fNTbY9EZCihm11fbrGSYVe8w+msRNx6W8rugsMX009aHiw9zlvGrMAeTD08YFPnBVdfpA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.8.tgz", + "integrity": "sha512-nTjAlMAZAVSFhBd9U3MB9l5FfC5JCCr9DTOA2wWxusVOm+36MbSEH90ucLPkhPa9/+0HtbpDhqVMwXCZllRpsg==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7" + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8" }, "bin": { "cspell-grammar": "bin.mjs" @@ -4879,12 +4952,12 @@ } }, "node_modules/cspell-io": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.7.tgz", - "integrity": "sha512-zqGGllG/OM3Of7zaOELdrSoBpCyG9nJuSRCzLfKgnCG4g2zpoMfDZknJaY9VjZODHP99PvYWooF8E6kVxT34Fw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.8.tgz", + "integrity": "sha512-XrxPbaiek7EZh+26k9RYVz2wKclaMqM6mXBiu/kpFAHRHHfz91ado6xWvyxZ7UAxQ8ixEwZ+oz9TU+k21gHzyw==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "7.3.7", + "@cspell/cspell-service-bus": "7.3.8", "node-fetch": "^2.7.0" }, "engines": { @@ -4892,33 +4965,33 @@ } }, "node_modules/cspell-lib": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.7.tgz", - "integrity": "sha512-KuFn0WTwmK50Ij1KVaXVuheleSOfv3oFIO3PfMuFg7llkfPfaRawF0b61da/EFGckU/hUc8uHRbBuGELlDo3tA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.8.tgz", + "integrity": "sha512-2L770sI5DdsAKVzO3jxmfP2fz4LryW6dzL93BpN7WU+ebFC6rg4ioa5liOJV4WoDo2fNQMSeqfW4Aawu9zWR7A==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "7.3.7", - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-resolver": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "@cspell/dynamic-import": "7.3.7", - "@cspell/strong-weak-map": "7.3.7", + "@cspell/cspell-bundled-dicts": "7.3.8", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-resolver": "7.3.8", + "@cspell/cspell-types": "7.3.8", + "@cspell/dynamic-import": "7.3.8", + "@cspell/strong-weak-map": "7.3.8", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.3.7", - "cspell-glob": "7.3.7", - "cspell-grammar": "7.3.7", - "cspell-io": "7.3.7", - "cspell-trie-lib": "7.3.7", + "cspell-dictionary": "7.3.8", + "cspell-glob": "7.3.8", + "cspell-grammar": "7.3.8", + "cspell-io": "7.3.8", + "cspell-trie-lib": "7.3.8", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.7" + "vscode-uri": "^3.0.8" }, "engines": { "node": ">=16" @@ -5007,13 +5080,13 @@ } }, "node_modules/cspell-trie-lib": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.7.tgz", - "integrity": "sha512-Vv8TdTMZD3DE79SorTwn5NoWj8JD7DnYMeUK+5S6JDNLy4Ck+kTEPN6Ic9hvLAxuDmQjmoZI3TizrWvuCG66aA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.8.tgz", + "integrity": "sha512-UQx1Bazbyz2eQJ/EnMohINnUdZvAQL+OcQU3EPPbNWM1DWF4bJGgmFXKNCRYfJk6wtOZVXG5g5AZXx9KnHeN9A==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8", "gensequence": "^6.0.0" }, "engines": { @@ -5045,12 +5118,12 @@ } }, "node_modules/cspell/node_modules/file-entry-cache": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.0.tgz", - "integrity": "sha512-OWhoO9dvvwspdI7YjGrs5wD7bPggVHc5b1NFAdyd1fEPIeno3Fj70fjBhklAqzUefgX7KCNDBnvrT8rZhS8Shw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", "dev": true, "dependencies": { - "flat-cache": "^3.1.0" + "flat-cache": "^3.1.1" }, "engines": { "node": ">=12.0.0" @@ -5259,6 +5332,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -5604,9 +5690,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.1.0.tgz", - "integrity": "sha512-3wv/TooBst0N4ND+pnvffHuz9gNPmk/NkLwAxOt2JykTl/hcuECe6yhTtLJcZjIxtZwN+GX92ACp/QTLpHA3Hg==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz", + "integrity": "sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -5630,9 +5716,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", @@ -6186,12 +6272,12 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, @@ -6200,9 +6286,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/follow-redirects": { @@ -6281,9 +6367,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/generic-pool": { "version": "3.9.0", @@ -6321,12 +6410,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -6515,6 +6605,28 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -7032,15 +7144,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -7098,9 +7206,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7903,9 +8011,9 @@ } }, "node_modules/jssha": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.0.tgz", - "integrity": "sha512-w9OtT4ALL+fbbwG3gw7erAO0jvS5nfvrukGPMWIAoea359B26ALXGpzy4YJSp9yGnpUvuvOw1nSjSoHDfWSr1w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.1.tgz", + "integrity": "sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==", "engines": { "node": "*" } @@ -8034,27 +8142,27 @@ } }, "node_modules/lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "dependencies": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.3" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" @@ -8073,35 +8181,47 @@ } }, "node_modules/lint-staged/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16.17.0" } }, "node_modules/lint-staged/node_modules/is-stream": { @@ -8170,6 +8290,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -8183,9 +8315,9 @@ } }, "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "dependencies": { "cli-truncate": "^3.1.0", @@ -8197,14 +8329,6 @@ }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } } }, "node_modules/locate-path": { @@ -9984,9 +10108,9 @@ } }, "node_modules/rhea-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rhea-promise/-/rhea-promise-3.0.0.tgz", - "integrity": "sha512-aj0nweqb7avqIo+PANLyOCQV6wlTw3j1Ktk+sPgfiIVUC5U6qt5l1FIXTbXUfNH6pJ3YCDT+bRIYGramJ53pAA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rhea-promise/-/rhea-promise-3.0.1.tgz", + "integrity": "sha512-Fcqgml7lgoyi7fH1ClsSyFr/xwToijEN3rULFgrIcL+7EHeduxkWogFxNHjFzHf2YGScAckJDaDxS1RdlTUQYw==", "dependencies": { "debug": "^3.1.0", "rhea": "^3.0.0", @@ -10181,6 +10305,20 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -11051,9 +11189,9 @@ "dev": true }, "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "dev": true }, "node_modules/walk-back": { @@ -11103,16 +11241,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -11270,9 +11407,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true, "engines": { "node": ">= 14" @@ -11382,9 +11519,9 @@ } }, "@azure/core-amqp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-3.3.0.tgz", - "integrity": "sha512-RYIyC8PtGpMzZRiSokADw0ezFgNq1eUkCPV8rd7tJ85dn8CAhYDEYapzMYxAwIBLWidshu14m9UWjQS7hKYDpA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.0.0.tgz", + "integrity": "sha512-5QhtJ69qLbTKTL3arLHkQCN96C7tqENF4oKkPYp5Pqb+YA5Gh0aREL2aqp98sAT/YB/G8wAfvFLnYB7bUyzFVw==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -11392,7 +11529,6 @@ "@azure/logger": "^1.0.0", "buffer": "^6.0.0", "events": "^3.0.0", - "jssha": "^3.1.0", "process": "^0.11.10", "rhea": "^3.0.0", "rhea-promise": "^3.0.0", @@ -11563,9 +11699,9 @@ } }, "@azure/identity": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.1.tgz", - "integrity": "sha512-96im0LrJt0kzsMqA8XjWxqbd2pPuEZHDlyLM4zdMv6nowLV/ul3dOW5X55OuLoFX+h22tYnMcGmQb3tlkdt/UA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.2.tgz", + "integrity": "sha512-aDLwgMXpNBEXOlfCP9r5Rn+inmbnTbadlOnrKI2dPS9Lpf4gHvpYBV+DEZKttakfJ+qn4iWWb7zONQSO3A4XSA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -11648,12 +11784,12 @@ } }, "@azure/service-bus": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.1.tgz", - "integrity": "sha512-4IqhCOV1aSA2ChqFPOWN/5Qh2V8GDBnYleAmtETcHgKkpTQ3PCKX42gP6ZdhUPdNkHET+eu+KkwKYxRZJjqadw==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.2.tgz", + "integrity": "sha512-w8d1/KhlbUz8DvY3Ca7GvoU5cJ8ONV4QBW25OfUk4Br6waAKWY+1wugEThQNCueRKvNlJlJyRbr9T14ibYMZeQ==", "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-amqp": "^3.3.0", + "@azure/core-amqp": "^4.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-client": "^1.0.0", "@azure/core-paging": "^1.4.0", @@ -11723,12 +11859,71 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -11761,21 +11956,22 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -11805,36 +12001,36 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -11878,23 +12074,23 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/helper-validator-option": { "version": "7.18.6", @@ -11914,13 +12110,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -11983,9 +12179,9 @@ } }, "@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -12114,30 +12310,30 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -12151,12 +12347,12 @@ } }, "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -12167,25 +12363,25 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.7.tgz", - "integrity": "sha512-Mw7J0RAWGpEup/+eIePw3wi+OlMGNicrD1r9OhdgIgO6sHEi01ibS/RzNNbC7UziLaYEHi8+WfLyGzmp1ZISrQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.8.tgz", + "integrity": "sha512-Dj8iSGQyfgIsCjmXk9D/SjV7EpbpQSogeaGcBM66H33pd0GyGmLhn3biRN+vqi/vqWmsp75rT3kd5MKa8X5W9Q==", "dev": true, "requires": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.24", - "@cspell/dict-cpp": "^5.0.5", + "@cspell/dict-companies": "^3.0.26", + "@cspell/dict-cpp": "^5.0.8", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.10", + "@cspell/dict-css": "^4.0.12", "@cspell/dict-dart": "^2.0.3", "@cspell/dict-django": "^4.1.0", "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.8", + "@cspell/dict-en_us": "^4.3.9", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", "@cspell/dict-filetypes": "^3.0.1", @@ -12202,19 +12398,19 @@ "@cspell/dict-k8s": "^1.0.1", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", - "@cspell/dict-lua": "^4.0.1", + "@cspell/dict-lua": "^4.0.2", "@cspell/dict-node": "^4.0.3", - "@cspell/dict-npm": "^5.0.10", + "@cspell/dict-npm": "^5.0.12", "@cspell/dict-php": "^4.0.3", "@cspell/dict-powershell": "^5.0.2", - "@cspell/dict-public-licenses": "^2.0.4", + "@cspell/dict-public-licenses": "^2.0.5", "@cspell/dict-python": "^4.1.9", "@cspell/dict-r": "^2.0.1", - "@cspell/dict-ruby": "^5.0.0", + "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.2", - "@cspell/dict-sql": "^2.1.1", + "@cspell/dict-software-terms": "^3.3.6", + "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", "@cspell/dict-typescript": "^3.1.2", @@ -12222,39 +12418,39 @@ } }, "@cspell/cspell-json-reporter": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.7.tgz", - "integrity": "sha512-bogUQKKZWLttZtxFKjpzHuliIha/ByV2km18gm8dA2uB3IrzD1UJy4sCE8lnaodm6n3VtjnViSkQ5XIVU3gAKQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.8.tgz", + "integrity": "sha512-FxYJWtDgxIQYxdP0RWwRV8nzLfxVx8D8D5L2sbbP/0NFczDbq/zWYep4nSAHJT10aUJrogsVUYwNwdkr562wKA==", "dev": true, "requires": { - "@cspell/cspell-types": "7.3.7" + "@cspell/cspell-types": "7.3.8" } }, "@cspell/cspell-pipe": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.7.tgz", - "integrity": "sha512-ZO8v3EwGhjUvhPo1S48+CKv7EPXMoYF7LGERB34K8EXFByb9+J74ojMYj9UgLRV68lFTrDFde3bHoZPPVS1FsA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.8.tgz", + "integrity": "sha512-/vKPfiHM5bJUkNX12w9j533Lm2JvvSMKUCChM2AxYjy6vL8prc/7ei++4g2xAWwRxLZPg2OfpDJS5EirZNBJdA==", "dev": true }, "@cspell/cspell-resolver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.7.tgz", - "integrity": "sha512-WWZcTI5f2cCjr1yRDTMkcVg7Meil3s+0aaKcLCDTGQf9J2UWWjpqDJ6M6keYei3paAjxW2Pk03IRNNwdA3+igQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.8.tgz", + "integrity": "sha512-CeyQmhqZI5a+T7a6oiVN90TFlzU3qVVYqCaZ9grFrVOsmzY9ipH5gmqfgMavaBOqb0di/+VZS8d02suMOXcKLQ==", "dev": true, "requires": { "global-dirs": "^3.0.1" } }, "@cspell/cspell-service-bus": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.7.tgz", - "integrity": "sha512-pnDOFpjht7dZYydMygcf0brCSk5BGRvbeWRH6MaMhd+3CdyzyEvtZG3IbBQVNyVvDTA2c/K3rljOAo8y3/lpnw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.8.tgz", + "integrity": "sha512-3E7gwY6QILrZH83p69i9CERbRBEqeBiKCIKnAd7U2PbxfFqG/P47fqpnarzSWFwFpU92oyGsYry+wC8TEGISRQ==", "dev": true }, "@cspell/cspell-types": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.7.tgz", - "integrity": "sha512-zM2BuZJ3UUgPwF78bssggi8X20nmW3a95EmbNJKfbO6Zf2ui7UMzeP3BwpCZk30A/EixGlFhLf6Xd+eBT/DQqw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.8.tgz", + "integrity": "sha512-hsOtaULDnawEL4pU0fga941GhvE8mbTbywrJBx+eGX3fnJsaUr8XQzCtnLsW2ko7WCLWFItNEhSSTPQHBFRLsw==", "dev": true }, "@cspell/dict-ada": { @@ -12276,15 +12472,15 @@ "dev": true }, "@cspell/dict-companies": { - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.25.tgz", - "integrity": "sha512-7phQlGJ/4qCx9fQg/kR8YV0n5TPak4+eleQ7M/e7uhsQR8TwOWsPU1dW23WABoTqJbYCgdUYLxqjQ8458w7jZQ==", + "version": "3.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.26.tgz", + "integrity": "sha512-BGRZ/Uykx+IgQoTGqvRqbBMQy7QSuY0pbTHgtmKtc1scgzZMJQKMDwyuE6LJzlhdlrV7TsVY0lyXREybnDpQPQ==", "dev": true }, "@cspell/dict-cpp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", - "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.9.tgz", + "integrity": "sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA==", "dev": true }, "@cspell/dict-cryptocurrencies": { @@ -12300,9 +12496,9 @@ "dev": true }, "@cspell/dict-css": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.11.tgz", - "integrity": "sha512-kHQqg3/3Xra2Xki3K4e6s3BHDw5L82geie4q7jRBxQ9CofIgVEMcOqTr2QWKgIWegmACEe7B/CIMH35d4eiafA==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.12.tgz", + "integrity": "sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==", "dev": true }, "@cspell/dict-dart": { @@ -12342,9 +12538,9 @@ "dev": true }, "@cspell/dict-en_us": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.8.tgz", - "integrity": "sha512-rCPsbDHuRnFUbzWAY6O1H9+cLZt5FNQwjPVw2TdQZfipdb0lim984aLGY+nupi1iKC3lfjyd5SVUgmSZEG1QNA==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.11.tgz", + "integrity": "sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw==", "dev": true }, "@cspell/dict-en-common-misspellings": { @@ -12372,9 +12568,9 @@ "dev": true }, "@cspell/dict-fsharp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.0.tgz", - "integrity": "sha512-dHPkMHwW4dWv3Lv9VWxHuVm4IylqvcfRBSnZ7usJTRThraetSVrOPIJwr6UJh7F5un/lGJx2lxWVApf2WQaB/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz", + "integrity": "sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==", "dev": true }, "@cspell/dict-fullstack": { @@ -12396,9 +12592,9 @@ "dev": true }, "@cspell/dict-golang": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.3.tgz", - "integrity": "sha512-KiNnjAeqDBq6zH4s46hzBrKgqIrkSZ9bbHzQ54PbHfe+jurZkSZ4lXz6E+315RNh2TkRLcNppFvaZqJvKZXomA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.4.tgz", + "integrity": "sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ==", "dev": true }, "@cspell/dict-haskell": { @@ -12426,9 +12622,9 @@ "dev": true }, "@cspell/dict-k8s": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.1.tgz", - "integrity": "sha512-gc5y4Nm3hVdMZNBZfU2M1AsAmObZsRWjCUk01NFPfGhFBXyVne41T7E62rpnzu5330FV/6b/TnFcPgRmak9lLw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.2.tgz", + "integrity": "sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ==", "dev": true }, "@cspell/dict-latex": { @@ -12444,9 +12640,9 @@ "dev": true }, "@cspell/dict-lua": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.1.tgz", - "integrity": "sha512-j0MFmeCouSoC6EdZTbvGe1sJ9V+ruwKSeF+zRkNNNload7R72Co5kX1haW2xLHGdlq0kqSy1ODRZKdVl0e+7hg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.2.tgz", + "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", "dev": true }, "@cspell/dict-node": { @@ -12456,15 +12652,15 @@ "dev": true }, "@cspell/dict-npm": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.11.tgz", - "integrity": "sha512-QlgF92q29mT0LbNqlDHb3UgY5jCLcSn+GnA1pvD5ps/zw2LhVl+ZXMHExwSIi7gwTzP3IyJ1f/dT6rnw9wic4A==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.12.tgz", + "integrity": "sha512-T/+WeQmtbxo7ad6hrdI8URptYstKJP+kXyWJZfuVJJGWJQ7yubxrI5Z5AfM+Dh/ff4xHmdzapxD9adaEQ727uw==", "dev": true }, "@cspell/dict-php": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.3.tgz", - "integrity": "sha512-PxtSmWJCDEB4M8R9ER9ijxBum/tvUqYT26QeuV58q2IFs5IrPZ6hocQKvnFGXItjCWH4oYXyAEAAzINlBC4Opg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.4.tgz", + "integrity": "sha512-fRlLV730fJbulDsLIouZxXoxHt3KIH6hcLFwxaupHL+iTXDg0lo7neRpbqD5MScr/J3idEr7i9G8XWzIikKFug==", "dev": true }, "@cspell/dict-powershell": { @@ -12474,9 +12670,9 @@ "dev": true }, "@cspell/dict-public-licenses": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.4.tgz", - "integrity": "sha512-KjsfuGwMWvPkp6s0nR+s4mZc9SQhh1tHDOyQZfEVRwi+2ev7f8l7R6ts9sP2Mplb8UcxwO6YmKwxHjN+XHoMoA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.5.tgz", + "integrity": "sha512-91HK4dSRri/HqzAypHgduRMarJAleOX5NugoI8SjDLPzWYkwZ1ftuCXSk+fy8DLc3wK7iOaFcZAvbjmnLhVs4A==", "dev": true }, "@cspell/dict-python": { @@ -12495,9 +12691,9 @@ "dev": true }, "@cspell/dict-ruby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.0.tgz", - "integrity": "sha512-ssb96QxLZ76yPqFrikWxItnCbUKhYXJ2owkoIYzUGNFl2CHSoHCb5a6Zetum9mQ/oUA3gNeUhd28ZUlXs0la2A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.1.tgz", + "integrity": "sha512-rruTm7Emhty/BSYavSm8ZxRuVw0OBqzJkwIFXcV0cX7To8D1qbmS9HFHRuRg8IL11+/nJvtdDz+lMFBSmPUagQ==", "dev": true }, "@cspell/dict-rust": { @@ -12513,15 +12709,15 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.3.tgz", - "integrity": "sha512-JKxBPyubapWkeekGquJYo5MLZe1TXAWAC8bqxuarG0cYkWoa7wIqCNH6/9OywRFSBzIYCgoVu2xDP1yRqTEokg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.8.tgz", + "integrity": "sha512-zcwPl+EA5kWyWzPiwE2eF21ltKshzZ5NQ4kKCaND9uo4oeqTrD7hG8FTJTd7kz7GNhNqbT0G1SVMC2BtI+UpVQ==", "dev": true }, "@cspell/dict-sql": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.1.tgz", - "integrity": "sha512-v1mswi9NF40+UDUMuI148YQPEQvWjac72P6ZsjlRdLjEiQEEMEsTQ+zlkIdnzC9QCNyJaqD5Liq9Mn78/8Zxtw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.2.tgz", + "integrity": "sha512-Pi0hAcvsSGtZZeyyAN1VfGtQJbrXos5x2QjJU0niAQKhmITSOrXU/1II1Gogk+FYDjWyV9wP2De0U2f7EWs6oQ==", "dev": true }, "@cspell/dict-svelte": { @@ -12549,18 +12745,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.7.tgz", - "integrity": "sha512-ac52OLDMYBHkRQ8XzihOWnyfqri3M84ELTZdqBhR5YGcHW/mxKhsmXqudA980SdRRKaicD39yhX4idAFb4AsDg==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.8.tgz", + "integrity": "sha512-s8x7dH/ScfW0pFEIvNFo4JOR7YmvM2wZSHOykmWTJCQ8k2EQ/+uECPp6ZxkoJoukTz8sj+3KzF0fRl5mKxPd6g==", "dev": true, "requires": { "import-meta-resolve": "^3.0.0" } }, "@cspell/strong-weak-map": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.7.tgz", - "integrity": "sha512-n+jRgwH0wU+HsfqgCGVzPmWnZl4SyhtvPxusKwXj6L/STGdt8IP2rYl1PFOtyvgjPjh8xXe/jRrq7zH07btiKA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.8.tgz", + "integrity": "sha512-qNnt2wG45wb8JP54mENarnQgxfSYKPp3zlYID/2przbMNmVJRqUlcIBOdLI6plCgGeNkzJTl3T9T1ATbnN+LLw==", "dev": true }, "@cspotcode/source-map-support": { @@ -13611,27 +13807,27 @@ } }, "@types/cors": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", - "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", + "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/debug": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", - "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", + "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", "dev": true, "requires": { "@types/ms": "*" } }, "@types/express": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.19.tgz", - "integrity": "sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -13650,9 +13846,9 @@ } }, "@types/express-session": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.8.tgz", - "integrity": "sha512-bFF7/3wOldMn+56XyFRGY9ZzCr3JWhNSP2ajMPgTlbZR6BQOCHdAbNA9W5dMBPgMywpIP4zkmhxP6Opm/NRYMQ==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.9.tgz", + "integrity": "sha512-yIqficLlTPdloeEPhOVenpOUWILkdaXHUWhTOqFGx9JoSuTgeatNjb97k8VvJehbTk0kUSUAHy5r27PXMga89Q==", "dev": true, "requires": { "@types/express": "*" @@ -13700,9 +13896,9 @@ } }, "@types/jest": { - "version": "29.5.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", - "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", + "version": "29.5.6", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", + "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13710,9 +13906,9 @@ } }, "@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "@types/jsonwebtoken": { @@ -13724,21 +13920,21 @@ } }, "@types/lodash": { - "version": "4.14.199", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", - "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", + "version": "4.14.200", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz", + "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==", "dev": true }, "@types/luxon": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", - "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.3.tgz", + "integrity": "sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==", "dev": true }, "@types/memory-cache": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.3.tgz", - "integrity": "sha512-nDojhELFCY9qk4WR0m/vYyiHLQ1JDA+/Fv4xL9oHRgQ1kkdAaRTqOyLRnTVark9fwo6ohHg/gx3CMg44Fbu2pw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.4.tgz", + "integrity": "sha512-yUj2q3Iav0kuefl+qGtn3d3nZtYDlMG1CI3DYe1UDfJb3zqnH1w1oE8R0lhv1sSua0CR0cAvCgNUzQHahGFI4g==", "dev": true }, "@types/mime": { @@ -13747,9 +13943,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/morgan": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.6.tgz", - "integrity": "sha512-xfKogz5WcKww2DAiVT9zxMgrqQt+Shq8tDVeLT+otoj6dJnkRkyJxMF51mHtUc3JCPKGk5x1EBU0buuGpfftlQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", + "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", "dev": true, "requires": { "@types/node": "*" @@ -13762,9 +13958,9 @@ "dev": true }, "@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", "requires": { "undici-types": "~5.25.1" } @@ -13791,9 +13987,9 @@ } }, "@types/node-jose": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.11.tgz", - "integrity": "sha512-8hEAhDB2A3k0Inhxh71qWfEp9mg970z/NvEPkzJN5KZSlIE47lEeYf3k+pNvk/W4hiSL/A0lW0AO7Fw8QMEtkA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.12.tgz", + "integrity": "sha512-HtSXbirRMuONr/KSNtBgh631xCt/t3lPz0geQ4pe/FA+yu06TUrJrXEU5y8nJFHNy8KhiZrq6OVlqXD1AtT/dQ==", "dev": true, "requires": { "@types/node": "*" @@ -13809,9 +14005,9 @@ } }, "@types/object-path": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.2.tgz", - "integrity": "sha512-STkyj0IQkgbmohF1afXQN64KucE3w7EgSbNJxqkJoq0KHVBV4nU5Pyku+TM9UCiCLXhZlkEFd8zq38P8lDFi6g==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.3.tgz", + "integrity": "sha512-P6V8jUKl0qA/U5ZAWW1y/BxeFf/R3yZucVGnHtD1qRXmFPndKZK4iZ49qX73R0FIwZnk0yKYixmqtYrPtManaA==", "dev": true }, "@types/parse-json": { @@ -13821,18 +14017,18 @@ "dev": true }, "@types/passport": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.13.tgz", - "integrity": "sha512-XXURryL+EZAWtbQFOHX1eNB+RJwz5XMPPz1xrGpEKr2xUZCXM4NCPkHMtZQ3B2tTSG/1IRaAcTHjczRA4sSFCw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", + "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", "dev": true, "requires": { "@types/express": "*" } }, "@types/passport-azure-ad": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.2.tgz", - "integrity": "sha512-EHJcuRCNbvpVlBsIdoHAB+tWKGT43alFr6/f4hZOexfS7Oh4VEC28hycDrHUHBbFmQPPgvYkgNsMwf4KZyv7Fw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.3.tgz", + "integrity": "sha512-dRkF6PXKNAdsQBKLMqHIhnN84KFU94t/p6nJqJAEkP0ux9itsyzM8agErgjYsA7pJ92eVKz8dqzyHpeyM3Tiqw==", "dev": true, "requires": { "@types/express": "*", @@ -13840,9 +14036,9 @@ } }, "@types/passport-github": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.10.tgz", - "integrity": "sha512-fj3FV2uWnE70S8x5afP70TgG8REEvLm2MWNocD28rLZhU4vmf/vchtG3yPrCZOGrme+Csbf1UO/KXZhvCqBElQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.11.tgz", + "integrity": "sha512-V2t1/P8BnnFX8AOYpk0ep9p4p7u2V1KdQBSUIvSvcxMseu7n2+cTLCr3rat8K876caQ1C95Y9vprVBbtLVVYXg==", "dev": true, "requires": { "@types/express": "*", @@ -13862,9 +14058,9 @@ } }, "@types/pg": { - "version": "8.10.4", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.4.tgz", - "integrity": "sha512-6cxJPHzhlJxqAMkWl2w3KubTEM0UjGC0UrtIToa9J/CEuRFJ2bquKt+g9MhYBN9n1+U6UZZ8CW6Z4oLx/Tvh/w==", + "version": "8.10.7", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.7.tgz", + "integrity": "sha512-ksJqHipwYaSEHz9e1fr6H6erjoEdNNaOxwyJgPx9bNeaqOW3iWBQgVHfpwiSAoqGzchfc+ZyRLwEfeCcyYD3uQ==", "dev": true, "requires": { "@types/node": "*", @@ -13917,9 +14113,9 @@ } }, "@types/pug": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.7.tgz", - "integrity": "sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.8.tgz", + "integrity": "sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==", "dev": true }, "@types/qs": { @@ -13933,18 +14129,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-pYLuc3EaFA3SwYfZRC6cSV9TfL+0tLi9Otu2djGavsNhmrEna1yG1EkFOZW7SKJr/nIuDNk4mM6kMMpNLntIhw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-fhOVQ23ki+GB0WGmJJF9OwPBjel2Iv02pmEv58T0DZqIAlKnyhAaC2E9/LuKQLIZF88w7ivXSZXJtvEXGXFgeQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "@types/serve-static": { @@ -13962,9 +14158,9 @@ "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" }, "@types/simple-oauth2": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.5.tgz", - "integrity": "sha512-hsUpJyOQnexMxa2Ilvs1CwmcSN62Y4irIvBbviUJNiyxUGIOQS7CUs0QPq+nuxkaNeNqdjxJ1BE/AoCGiG7L+g==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.6.tgz", + "integrity": "sha512-i1tx1TwdET6m9tit+p+pWABuNWz0W8LThmzwh+cYC9yKJTXD3q3zPWOwstuL8/ELO0HoE0f9r/yYQ3XHaiTjrw==", "dev": true }, "@types/stack-utils": { @@ -13982,9 +14178,9 @@ } }, "@types/validator": { - "version": "13.11.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", - "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==", + "version": "13.11.5", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", + "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==", "dev": true }, "@types/yargs": { @@ -14003,16 +14199,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.5.tgz", - "integrity": "sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/type-utils": "6.7.5", - "@typescript-eslint/utils": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14022,54 +14218,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.5.tgz", - "integrity": "sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.5.tgz", - "integrity": "sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", "dev": true, "requires": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5" + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" } }, "@typescript-eslint/type-utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.5.tgz", - "integrity": "sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", + "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.7.5", - "@typescript-eslint/utils": "6.7.5", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/utils": "6.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.5.tgz", - "integrity": "sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", + "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.5.tgz", - "integrity": "sha512-NhJiJ4KdtwBIxrKl0BqG1Ur+uw7FiOnOThcYx9DpOGJ/Abc9z2xNzLeirCG02Ig3vkvrc2qFLmYSSsaITbKjlg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", + "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/visitor-keys": "6.7.5", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14078,27 +14274,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.5.tgz", - "integrity": "sha512-pfRRrH20thJbzPPlPc4j0UNGvH1PjPlhlCMq4Yx7EGjV7lvEeGX0U6MJYe8+SyFutWgSHsdbJ3BXzZccYggezA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", + "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.7.5", - "@typescript-eslint/types": "6.7.5", - "@typescript-eslint/typescript-estree": "6.7.5", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.7.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.5.tgz", - "integrity": "sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", + "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.7.5", + "@typescript-eslint/types": "6.8.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -14307,9 +14503,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -14626,12 +14822,13 @@ } }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "callsites": { @@ -14791,9 +14988,9 @@ }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" } } }, @@ -14855,9 +15052,9 @@ } }, "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true }, "comment-json": { @@ -15087,29 +15284,29 @@ } }, "cspell": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.7.tgz", - "integrity": "sha512-p23EuTu+7b2qioRxC7sV1TVfxIPm7928BtT4jYBHGeONiYP0EOOWNP8ynaksMYLTifQBzH1Q0LO4L5ogHiQsfw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.8.tgz", + "integrity": "sha512-8AkqsBQAMsKYV5XyJLB6rBs5hgspL4+MPOg6mBKG2j5EvQgRVc6dIfAPWDNLpIeW2a3+7K5BIWqKHapKPeiknQ==", "dev": true, "requires": { - "@cspell/cspell-json-reporter": "7.3.7", - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "@cspell/dynamic-import": "7.3.7", + "@cspell/cspell-json-reporter": "7.3.8", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8", + "@cspell/dynamic-import": "7.3.8", "chalk": "^5.3.0", "chalk-template": "^1.1.0", - "commander": "^11.0.0", - "cspell-gitignore": "7.3.7", - "cspell-glob": "7.3.7", - "cspell-io": "7.3.7", - "cspell-lib": "7.3.7", + "commander": "^11.1.0", + "cspell-gitignore": "7.3.8", + "cspell-glob": "7.3.8", + "cspell-io": "7.3.8", + "cspell-lib": "7.3.8", "fast-glob": "^3.3.1", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^7.0.0", + "file-entry-cache": "^7.0.1", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", - "vscode-uri": "^3.0.7" + "vscode-uri": "^3.0.8" }, "dependencies": { "ansi-regex": { @@ -15125,12 +15322,12 @@ "dev": true }, "file-entry-cache": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.0.tgz", - "integrity": "sha512-OWhoO9dvvwspdI7YjGrs5wD7bPggVHc5b1NFAdyd1fEPIeno3Fj70fjBhklAqzUefgX7KCNDBnvrT8rZhS8Shw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", + "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", "dev": true, "requires": { - "flat-cache": "^3.1.0" + "flat-cache": "^3.1.1" } }, "strip-ansi": { @@ -15145,14 +15342,14 @@ } }, "cspell-dictionary": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.7.tgz", - "integrity": "sha512-mJ0h2BGxYEqb/1FxKD50WuufKhDaCaIk8pwZQryqazXQCvoTpla0yud3KO61Cke92za8z37Rfb+5xATlywEfaw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.8.tgz", + "integrity": "sha512-gkq4t78eLR0xC3P0vDDHPeNY4iZRd5YE6Z8uDJ7RM4UaX/TSdVUN9KNFr34RnJ119NYVHujpL9+uW7wPSAe8Eg==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "cspell-trie-lib": "7.3.7", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8", + "cspell-trie-lib": "7.3.8", "fast-equals": "^4.0.3", "gensequence": "^6.0.0" }, @@ -15166,72 +15363,72 @@ } }, "cspell-gitignore": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.7.tgz", - "integrity": "sha512-nP4Gg+zq5y0njzhiNYTLvaJIMAponBhJoTMzkXCOOKYEHJmiRQocfa3gO4t2s8iZ4YVhscbrB2h+dYvo3MLQqg==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.8.tgz", + "integrity": "sha512-vJzCOUEiw6/MwV/U4Ux3bgSdj9mXB+X5eHL+qzVoyFI7ArlvrkuGTL+iFJThQcS8McM3SGqtvaBNCiKBmAeCkA==", "dev": true, "requires": { - "cspell-glob": "7.3.7", + "cspell-glob": "7.3.8", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.7.tgz", - "integrity": "sha512-DJX5wJ5dhcNzyycukZst+WtbIdpCLTL7DaKS0EKW/57QjzMwwMBgpsF89ufnreGHB8dHrPF85epF9qyOI1SRNg==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.8.tgz", + "integrity": "sha512-wUZC6znyxEs0wlhzGfZ4XHkATPJyazJIFi/VvAdj+KHe7U8SoSgitJVDQqdgectI2y3MxR7lQdVLX9dONFh+7A==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.7.tgz", - "integrity": "sha512-4cyJ4Alq/wBGTctH7fNTbY9EZCihm11fbrGSYVe8w+msRNx6W8rugsMX009aHiw9zlvGrMAeTD08YFPnBVdfpA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.8.tgz", + "integrity": "sha512-nTjAlMAZAVSFhBd9U3MB9l5FfC5JCCr9DTOA2wWxusVOm+36MbSEH90ucLPkhPa9/+0HtbpDhqVMwXCZllRpsg==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7" + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8" } }, "cspell-io": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.7.tgz", - "integrity": "sha512-zqGGllG/OM3Of7zaOELdrSoBpCyG9nJuSRCzLfKgnCG4g2zpoMfDZknJaY9VjZODHP99PvYWooF8E6kVxT34Fw==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.8.tgz", + "integrity": "sha512-XrxPbaiek7EZh+26k9RYVz2wKclaMqM6mXBiu/kpFAHRHHfz91ado6xWvyxZ7UAxQ8ixEwZ+oz9TU+k21gHzyw==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "7.3.7", + "@cspell/cspell-service-bus": "7.3.8", "node-fetch": "^2.7.0" } }, "cspell-lib": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.7.tgz", - "integrity": "sha512-KuFn0WTwmK50Ij1KVaXVuheleSOfv3oFIO3PfMuFg7llkfPfaRawF0b61da/EFGckU/hUc8uHRbBuGELlDo3tA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.8.tgz", + "integrity": "sha512-2L770sI5DdsAKVzO3jxmfP2fz4LryW6dzL93BpN7WU+ebFC6rg4ioa5liOJV4WoDo2fNQMSeqfW4Aawu9zWR7A==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "7.3.7", - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-resolver": "7.3.7", - "@cspell/cspell-types": "7.3.7", - "@cspell/dynamic-import": "7.3.7", - "@cspell/strong-weak-map": "7.3.7", + "@cspell/cspell-bundled-dicts": "7.3.8", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-resolver": "7.3.8", + "@cspell/cspell-types": "7.3.8", + "@cspell/dynamic-import": "7.3.8", + "@cspell/strong-weak-map": "7.3.8", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.3.7", - "cspell-glob": "7.3.7", - "cspell-grammar": "7.3.7", - "cspell-io": "7.3.7", - "cspell-trie-lib": "7.3.7", + "cspell-dictionary": "7.3.8", + "cspell-glob": "7.3.8", + "cspell-grammar": "7.3.8", + "cspell-io": "7.3.8", + "cspell-trie-lib": "7.3.8", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "vscode-languageserver-textdocument": "^1.0.11", - "vscode-uri": "^3.0.7" + "vscode-uri": "^3.0.8" }, "dependencies": { "find-up": { @@ -15286,13 +15483,13 @@ } }, "cspell-trie-lib": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.7.tgz", - "integrity": "sha512-Vv8TdTMZD3DE79SorTwn5NoWj8JD7DnYMeUK+5S6JDNLy4Ck+kTEPN6Ic9hvLAxuDmQjmoZI3TizrWvuCG66aA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.8.tgz", + "integrity": "sha512-UQx1Bazbyz2eQJ/EnMohINnUdZvAQL+OcQU3EPPbNWM1DWF4bJGgmFXKNCRYfJk6wtOZVXG5g5AZXx9KnHeN9A==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.3.7", - "@cspell/cspell-types": "7.3.7", + "@cspell/cspell-pipe": "7.3.8", + "@cspell/cspell-types": "7.3.8", "gensequence": "^6.0.0" } }, @@ -15411,6 +15608,16 @@ "untildify": "^4.0.0" } }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -15663,9 +15870,9 @@ } }, "eslint-plugin-n": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.1.0.tgz", - "integrity": "sha512-3wv/TooBst0N4ND+pnvffHuz9gNPmk/NkLwAxOt2JykTl/hcuECe6yhTtLJcZjIxtZwN+GX92ACp/QTLpHA3Hg==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz", + "integrity": "sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", @@ -15680,9 +15887,9 @@ } }, "eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", + "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0", @@ -16089,20 +16296,20 @@ } }, "flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "requires": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "follow-redirects": { @@ -16151,9 +16358,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "generic-pool": { "version": "3.9.0", @@ -16179,12 +16386,13 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -16313,6 +16521,19 @@ "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -16636,15 +16857,11 @@ "dev": true }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -16687,9 +16904,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -17325,9 +17542,9 @@ } }, "jssha": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.0.tgz", - "integrity": "sha512-w9OtT4ALL+fbbwG3gw7erAO0jvS5nfvrukGPMWIAoea359B26ALXGpzy4YJSp9yGnpUvuvOw1nSjSoHDfWSr1w==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.3.1.tgz", + "integrity": "sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==" }, "jstransformer": { "version": "1.0.0", @@ -17438,21 +17655,21 @@ } }, "lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", + "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", "dev": true, "requires": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", + "execa": "8.0.1", "lilconfig": "2.1.0", - "listr2": "6.6.1", + "listr2": "7.0.2", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.3" }, "dependencies": { "chalk": { @@ -17462,26 +17679,32 @@ "dev": true }, "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true }, "is-stream": { @@ -17520,6 +17743,12 @@ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -17529,9 +17758,9 @@ } }, "listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", + "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -18884,9 +19113,9 @@ } }, "rhea-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rhea-promise/-/rhea-promise-3.0.0.tgz", - "integrity": "sha512-aj0nweqb7avqIo+PANLyOCQV6wlTw3j1Ktk+sPgfiIVUC5U6qt5l1FIXTbXUfNH6pJ3YCDT+bRIYGramJ53pAA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rhea-promise/-/rhea-promise-3.0.1.tgz", + "integrity": "sha512-Fcqgml7lgoyi7fH1ClsSyFr/xwToijEN3rULFgrIcL+7EHeduxkWogFxNHjFzHf2YGScAckJDaDxS1RdlTUQYw==", "requires": { "debug": "^3.1.0", "rhea": "^3.0.0", @@ -19045,6 +19274,17 @@ "send": "0.18.0" } }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -19662,9 +19902,9 @@ "dev": true }, "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "dev": true }, "walk-back": { @@ -19705,16 +19945,15 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "with": { @@ -19820,9 +20059,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index 86a634f68..6bf2588c1 100644 --- a/package.json +++ b/package.json @@ -67,9 +67,9 @@ "dependencies": { "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.3.1", + "@azure/identity": "3.3.2", "@azure/keyvault-secrets": "4.7.0", - "@azure/service-bus": "7.9.1", + "@azure/service-bus": "7.9.2", "@azure/storage-blob": "12.16.0", "@azure/storage-queue": "12.15.0", "@octokit/plugin-paginate-graphql": "4.0.0", @@ -128,38 +128,38 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/cors": "2.8.14", - "@types/debug": "4.1.9", - "@types/express": "4.17.19", - "@types/express-session": "1.17.8", - "@types/jest": "29.5.5", - "@types/lodash": "4.14.199", - "@types/luxon": "3.3.2", - "@types/memory-cache": "0.2.3", - "@types/morgan": "1.9.6", - "@types/node": "20.8.4", - "@types/node-jose": "1.1.11", - "@types/object-path": "0.11.2", - "@types/passport": "1.0.13", - "@types/passport-azure-ad": "4.3.2", - "@types/passport-github": "1.1.10", - "@types/pg": "8.10.4", - "@types/pug": "2.0.7", - "@types/recursive-readdir": "2.2.2", - "@types/semver": "7.5.3", - "@types/simple-oauth2": "5.0.5", - "@types/validator": "13.11.2", - "@typescript-eslint/eslint-plugin": "6.7.5", - "@typescript-eslint/parser": "6.7.5", - "cspell": "7.3.7", + "@types/cors": "2.8.15", + "@types/debug": "4.1.10", + "@types/express": "4.17.20", + "@types/express-session": "1.17.9", + "@types/jest": "29.5.6", + "@types/lodash": "4.14.200", + "@types/luxon": "3.3.3", + "@types/memory-cache": "0.2.4", + "@types/morgan": "1.9.7", + "@types/node": "20.8.7", + "@types/node-jose": "1.1.12", + "@types/object-path": "0.11.3", + "@types/passport": "1.0.14", + "@types/passport-azure-ad": "4.3.3", + "@types/passport-github": "1.1.11", + "@types/pg": "8.10.7", + "@types/pug": "2.0.8", + "@types/recursive-readdir": "2.2.3", + "@types/semver": "7.5.4", + "@types/simple-oauth2": "5.0.6", + "@types/validator": "13.11.5", + "@typescript-eslint/eslint-plugin": "6.8.0", + "@typescript-eslint/parser": "6.8.0", + "cspell": "7.3.8", "eslint": "8.51.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.1.0", - "eslint-plugin-prettier": "5.0.0", + "eslint-plugin-n": "16.2.0", + "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", "jest-junit": "16.0.0", - "lint-staged": "14.0.1", + "lint-staged": "15.0.2", "markdownlint-cli2": "0.10.0", "prettier": "3.0.3", "ts-jest": "29.1.1", From 1c0f0e6e22c98a1a5280bf1ee2183435d663438d Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:54:29 -0700 Subject: [PATCH 34/69] Using standard runners --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e2220f50..772b31edb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,8 @@ on: jobs: test: - runs-on: [self-hosted, 1ES.Pool=ost-ospo-opensource] + runs-on: ubuntu-latest + # runs-on: [self-hosted, 1ES.Pool=ost-ospo-opensource] steps: - name: Checkout repository From b9c47d93e53caf7d1adcd1cf1c82f9d2d4e24943 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 24 Oct 2023 08:32:02 -0700 Subject: [PATCH 35/69] =?UTF-8?q?Deps=20=F0=9F=93=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cspell.json | 1 + package-lock.json | 276 ++++++++++++++++++++++++---------------------- package.json | 10 +- 3 files changed, 151 insertions(+), 136 deletions(-) diff --git a/.cspell.json b/.cspell.json index 6fee4b9fc..bdf68dd47 100644 --- a/.cspell.json +++ b/.cspell.json @@ -690,6 +690,7 @@ "revokedbycorporateid", "rootdir", "rubygem", + "rubygems", "RUNNERDATA", "runtimes", "samplescollaboratorusername", diff --git a/package-lock.json b/package-lock.json index 367c752b5..b29550c45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.6", + "nodemailer": "6.9.7", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", @@ -81,7 +81,7 @@ "@types/luxon": "3.3.3", "@types/memory-cache": "0.2.4", "@types/morgan": "1.9.7", - "@types/node": "20.8.7", + "@types/node": "20.8.8", "@types/node-jose": "1.1.12", "@types/object-path": "0.11.3", "@types/passport": "1.0.14", @@ -93,10 +93,10 @@ "@types/semver": "7.5.4", "@types/simple-oauth2": "5.0.6", "@types/validator": "13.11.5", - "@typescript-eslint/eslint-plugin": "6.8.0", - "@typescript-eslint/parser": "6.8.0", + "@typescript-eslint/eslint-plugin": "6.9.0", + "@typescript-eslint/parser": "6.9.0", "cspell": "7.3.8", - "eslint": "8.51.0", + "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.2.0", "eslint-plugin-prettier": "5.0.1", @@ -1712,9 +1712,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1762,12 +1762,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -1789,9 +1789,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -3081,9 +3081,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "version": "20.8.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.8.tgz", + "integrity": "sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ==", "dependencies": { "undici-types": "~5.25.1" } @@ -3336,16 +3336,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3371,15 +3371,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4" }, "engines": { @@ -3399,13 +3399,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3416,13 +3416,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", - "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3443,9 +3443,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3456,13 +3456,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3483,17 +3483,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", "semver": "^7.5.4" }, "engines": { @@ -3508,12 +3508,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/types": "6.9.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3524,6 +3524,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5605,18 +5611,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -9010,9 +9017,9 @@ "dev": true }, "node_modules/nodemailer": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.6.tgz", - "integrity": "sha512-s7pDtWwe5fLMkQUhw8TkWB/wnZ7SRdd9HRZslq/s24hlZvBP3j32N/ETLmnqTpmj4xoBZL9fOWyCIZ7r2HORHg==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", "engines": { "node": ">=6.0.0" } @@ -12813,9 +12820,9 @@ } }, "@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true }, "@hapi/boom": { @@ -12862,12 +12869,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" } @@ -12879,9 +12886,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -13958,9 +13965,9 @@ "dev": true }, "@types/node": { - "version": "20.8.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", - "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "version": "20.8.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.8.tgz", + "integrity": "sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ==", "requires": { "undici-types": "~5.25.1" } @@ -14199,16 +14206,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14218,54 +14225,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" } }, "@typescript-eslint/type-utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", - "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14274,30 +14281,36 @@ } }, "@typescript-eslint/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/types": "6.9.0", "eslint-visitor-keys": "^3.4.1" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -15808,18 +15821,19 @@ "dev": true }, "eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -18294,9 +18308,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.6.tgz", - "integrity": "sha512-s7pDtWwe5fLMkQUhw8TkWB/wnZ7SRdd9HRZslq/s24hlZvBP3j32N/ETLmnqTpmj4xoBZL9fOWyCIZ7r2HORHg==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==" }, "normalize-path": { "version": "3.0.0", diff --git a/package.json b/package.json index 6bf2588c1..5596f6829 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "moment": "2.29.4", "morgan": "1.10.0", "node-jose": "2.2.0", - "nodemailer": "6.9.6", + "nodemailer": "6.9.7", "object-path": "0.11.8", "passport": "0.6.0", "passport-azure-ad": "4.3.5", @@ -137,7 +137,7 @@ "@types/luxon": "3.3.3", "@types/memory-cache": "0.2.4", "@types/morgan": "1.9.7", - "@types/node": "20.8.7", + "@types/node": "20.8.8", "@types/node-jose": "1.1.12", "@types/object-path": "0.11.3", "@types/passport": "1.0.14", @@ -149,10 +149,10 @@ "@types/semver": "7.5.4", "@types/simple-oauth2": "5.0.6", "@types/validator": "13.11.5", - "@typescript-eslint/eslint-plugin": "6.8.0", - "@typescript-eslint/parser": "6.8.0", + "@typescript-eslint/eslint-plugin": "6.9.0", + "@typescript-eslint/parser": "6.9.0", "cspell": "7.3.8", - "eslint": "8.51.0", + "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.2.0", "eslint-plugin-prettier": "5.0.1", From 69ee614b12204a44e3b48861972be768423d48d5 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:06:24 -0700 Subject: [PATCH 36/69] Spelling update --- .cspell.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index bdf68dd47..7286f0570 100644 --- a/.cspell.json +++ b/.cspell.json @@ -14,7 +14,6 @@ "default-assets-package/resources/repos-css/oss.css", "**/commonKnownExternalCollaborators.json", "jobs/reports/exemptRepositories.json", - "**/hotfixRepos.json", "**/demo/team.json", "**/demo/user.json", "**/*_html.ts", From 60d7c71211df44d86a6c6e728a1cdfa4cb4a3599 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:06:33 -0700 Subject: [PATCH 37/69] Dependency updates --- package-lock.json | 44 ++++++++++++++++++++++---------------------- package.json | 4 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index b29550c45..43015e26d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "app-root-path": "3.1.0", "applicationinsights": "2.9.0", "async-prompt": "1.0.1", - "axios": "1.5.1", + "axios": "1.6.0", "basic-auth": "2.0.1", "body-parser": "1.20.2", "color-contrast-checker": "2.1.0", @@ -81,7 +81,7 @@ "@types/luxon": "3.3.3", "@types/memory-cache": "0.2.4", "@types/morgan": "1.9.7", - "@types/node": "20.8.8", + "@types/node": "20.8.9", "@types/node-jose": "1.1.12", "@types/object-path": "0.11.3", "@types/passport": "1.0.14", @@ -3081,11 +3081,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.8.tgz", - "integrity": "sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ==", + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", "dependencies": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "node_modules/@types/node-fetch": { @@ -3842,9 +3842,9 @@ } }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -11027,9 +11027,9 @@ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" }, "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unique-string": { "version": "3.0.0", @@ -13965,11 +13965,11 @@ "dev": true }, "@types/node": { - "version": "20.8.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.8.tgz", - "integrity": "sha512-YRsdVxq6OaLfmR9Hy816IMp33xOBjfyOgUd77ehqg96CFywxAPbDbXvAsuN2KVg2HOT8Eh6uAfU+l4WffwPVrQ==", + "version": "20.8.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", + "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", "requires": { - "undici-types": "~5.25.1" + "undici-types": "~5.26.4" } }, "@types/node-fetch": { @@ -14541,9 +14541,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -19793,9 +19793,9 @@ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" }, "undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "unique-string": { "version": "3.0.0", diff --git a/package.json b/package.json index 5596f6829..8a9c7b72c 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "app-root-path": "3.1.0", "applicationinsights": "2.9.0", "async-prompt": "1.0.1", - "axios": "1.5.1", + "axios": "1.6.0", "basic-auth": "2.0.1", "body-parser": "1.20.2", "color-contrast-checker": "2.1.0", @@ -137,7 +137,7 @@ "@types/luxon": "3.3.3", "@types/memory-cache": "0.2.4", "@types/morgan": "1.9.7", - "@types/node": "20.8.8", + "@types/node": "20.8.9", "@types/node-jose": "1.1.12", "@types/object-path": "0.11.3", "@types/passport": "1.0.14", From 64bbd7d90f0d7b731bd65a80f1b53b63f24ce6f6 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:06:55 -0700 Subject: [PATCH 38/69] User: fix null ref edge case --- business/user/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/user/index.ts b/business/user/index.ts index 93d52895e..c791cd8c4 100644 --- a/business/user/index.ts +++ b/business/user/index.ts @@ -537,7 +537,7 @@ export class IndividualContext { async isPortalAdministrator(): Promise { const operations = this._operations; - const ghi = this.getGitHubIdentity().username; + const ghi = this.getGitHubIdentity()?.username; const link = this._link; this._isPortalAdministrator = await operations.isPortalSudoer(ghi, link); return this._isPortalAdministrator; From df3bf20e18e127b6748cc86d8544bf4937e953b8 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:07:08 -0700 Subject: [PATCH 39/69] Repo permissions: allow unlinked owner computation of perms --- middleware/github/repoPermissions.ts | 41 +++++++++++++++------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/middleware/github/repoPermissions.ts b/middleware/github/repoPermissions.ts index d94bd9f47..ec3a6071f 100644 --- a/middleware/github/repoPermissions.ts +++ b/middleware/github/repoPermissions.ts @@ -109,30 +109,33 @@ export async function getComputedRepositoryPermissions( repoPermissions, activeContext ); - if (!activeContext.link) { - return repoPermissions; - } - repoPermissions.isLinked = true; - const login = activeContext.getGitHubIdentity().username; - const organization = repository.organization; - const isSudoer = await organization.isSudoer(login, activeContext.link); const isPortalSudoer = await activeContext.isPortalAdministrator(); - if (isSudoer === true || isPortalSudoer === true) { + if (isPortalSudoer) { repoPermissions.sudo = true; } - try { - const collaborator = await repository.getCollaborator(login); - if (collaborator) { - if (collaborator.permission === GitHubCollaboratorPermissionLevel.Admin) { - repoPermissions.admin = repoPermissions.read = repoPermissions.write = true; - } else if (collaborator.permission === GitHubCollaboratorPermissionLevel.Write) { - repoPermissions.read = repoPermissions.write = true; - } else if (collaborator.permission === GitHubCollaboratorPermissionLevel.Read) { - repoPermissions.read = true; + repoPermissions.isLinked = !!activeContext.link; + const hasGitHubIdentity = !!activeContext?.getGitHubIdentity()?.username; + if (hasGitHubIdentity) { + const login = activeContext.getGitHubIdentity().username; + const organization = repository.organization; + const isSudoer = await organization.isSudoer(login, activeContext.link); + if (isSudoer) { + repoPermissions.sudo = true; + } + try { + const collaborator = await repository.getCollaborator(login); + if (collaborator) { + if (collaborator.permission === GitHubCollaboratorPermissionLevel.Admin) { + repoPermissions.admin = repoPermissions.read = repoPermissions.write = true; + } else if (collaborator.permission === GitHubCollaboratorPermissionLevel.Write) { + repoPermissions.read = repoPermissions.write = true; + } else if (collaborator.permission === GitHubCollaboratorPermissionLevel.Read) { + repoPermissions.read = true; + } } + } catch (getCollaboratorPermissionError) { + console.dir(getCollaboratorPermissionError); } - } catch (getCollaboratorPermissionError) { - console.dir(getCollaboratorPermissionError); } if (repoPermissions.admin || repoPermissions.sudo) { repoPermissions.allowAdministration = true; From 3453ebad355b04567f3be07a6e4517e9640412cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 01:42:35 +0000 Subject: [PATCH 40/69] chore(deps): bump actions/setup-node from 3 to 4 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 772b31edb..fad3e3d46 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: cache: npm From d8195d4ed0060f54bfe14a9062456b2df461f4a7 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 1 Nov 2023 08:30:24 -0700 Subject: [PATCH 41/69] Deps --- .cspell.json | 5 +- package-lock.json | 200 +++++++++++++++++++++++----------------------- package.json | 8 +- utils.ts | 23 +++++- 4 files changed, 130 insertions(+), 106 deletions(-) diff --git a/.cspell.json b/.cspell.json index 7286f0570..4d0447657 100644 --- a/.cspell.json +++ b/.cspell.json @@ -107,6 +107,7 @@ "champscount", "champstatus", "chromedriver", + "checkmarks", "citus", "citusdata", "classificationdelegated", @@ -377,6 +378,7 @@ "jabberpl", "joblog", "jobname", + "json", "jsoncontribution", "jsoncreated", "jwilcox", @@ -879,7 +881,8 @@ "xlink", "XSTORE", "xtable", - "yamls" + "yamls", + "yml" ], "maxNumberOfProblems": 1000 } diff --git a/package-lock.json b/package-lock.json index 43015e26d..8dbffe4a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,12 +76,12 @@ "@types/debug": "4.1.10", "@types/express": "4.17.20", "@types/express-session": "1.17.9", - "@types/jest": "29.5.6", + "@types/jest": "29.5.7", "@types/lodash": "4.14.200", "@types/luxon": "3.3.3", "@types/memory-cache": "0.2.4", "@types/morgan": "1.9.7", - "@types/node": "20.8.9", + "@types/node": "20.8.10", "@types/node-jose": "1.1.12", "@types/object-path": "0.11.3", "@types/passport": "1.0.14", @@ -93,8 +93,8 @@ "@types/semver": "7.5.4", "@types/simple-oauth2": "5.0.6", "@types/validator": "13.11.5", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.0", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "cspell": "7.3.8", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", @@ -3019,9 +3019,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", - "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3081,9 +3081,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", "dependencies": { "undici-types": "~5.26.4" } @@ -3336,16 +3336,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", - "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/type-utils": "6.9.0", - "@typescript-eslint/utils": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3371,15 +3371,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", - "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/typescript-estree": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" }, "engines": { @@ -3399,13 +3399,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", - "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3416,13 +3416,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", - "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.0", - "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3443,9 +3443,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", - "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3456,13 +3456,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", - "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3483,17 +3483,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", - "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" }, "engines": { @@ -3508,12 +3508,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", - "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -13903,9 +13903,9 @@ } }, "@types/jest": { - "version": "29.5.6", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.6.tgz", - "integrity": "sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w==", + "version": "29.5.7", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", + "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13965,9 +13965,9 @@ "dev": true }, "@types/node": { - "version": "20.8.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.9.tgz", - "integrity": "sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==", + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", "requires": { "undici-types": "~5.26.4" } @@ -14206,16 +14206,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", - "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", + "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/type-utils": "6.9.0", - "@typescript-eslint/utils": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/type-utils": "6.9.1", + "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14225,54 +14225,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", - "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", + "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/typescript-estree": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", - "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", + "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0" + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1" } }, "@typescript-eslint/type-utils": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", - "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", + "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.9.0", - "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/utils": "6.9.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", - "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", + "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", - "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", + "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/visitor-keys": "6.9.0", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/visitor-keys": "6.9.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14281,27 +14281,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", - "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", + "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.0", - "@typescript-eslint/types": "6.9.0", - "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/scope-manager": "6.9.1", + "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/typescript-estree": "6.9.1", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", - "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", + "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" } }, diff --git a/package.json b/package.json index 8a9c7b72c..dab495de0 100644 --- a/package.json +++ b/package.json @@ -132,12 +132,12 @@ "@types/debug": "4.1.10", "@types/express": "4.17.20", "@types/express-session": "1.17.9", - "@types/jest": "29.5.6", + "@types/jest": "29.5.7", "@types/lodash": "4.14.200", "@types/luxon": "3.3.3", "@types/memory-cache": "0.2.4", "@types/morgan": "1.9.7", - "@types/node": "20.8.9", + "@types/node": "20.8.10", "@types/node-jose": "1.1.12", "@types/object-path": "0.11.3", "@types/passport": "1.0.14", @@ -149,8 +149,8 @@ "@types/semver": "7.5.4", "@types/simple-oauth2": "5.0.6", "@types/validator": "13.11.5", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.0", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "cspell": "7.3.8", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", diff --git a/utils.ts b/utils.ts index 84046d22b..5409fc99a 100644 --- a/utils.ts +++ b/utils.ts @@ -8,8 +8,8 @@ import fs from 'fs'; import path from 'path'; import { URL } from 'url'; import zlib from 'zlib'; -import { type Repository } from './business/repository'; +import { type Repository } from './business/repository'; import type { ReposAppRequest, IAppSession, IReposError, SiteConfiguration } from './interfaces'; import { getProviders } from './transitional'; @@ -363,3 +363,24 @@ export function getDateTimeBasedBlobFolder() { } export const botBracket = '[bot]'; + +const githubAvatarHostnames = [ + 'githubusercontent.com', + 'objects.githubusercontent.com', + 'object.githubusercontent.com', + 'raw.githubusercontent.com', + 'avatars.githubusercontent.com', +]; + +export function getUserIdFromWellFormedAvatar(avatar: string): string { + // https://*.githubusercontent.com/u/userid?v=* + const url = new URL(avatar); + if (githubAvatarHostnames.includes(url.hostname)) { + const { pathname } = url; + const i = pathname.indexOf('/u/'); + if (i >= 0) { + return pathname.substr(i + 3); + } + } + return null; +} From 44719694de63626453b4caf32f3a122ad2bcbefb Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 2 Nov 2023 21:11:55 -0700 Subject: [PATCH 42/69] Organization: get Copilot seat assignments Retrieves the list of Copilot basics when the organization has Copilot for Business attachments. Do note that this API only works to page, slowly, at scale to a point - after 400 pages I am not able to get results due to a hard cap of sorts here, so need to rely on other methods to get the info. --- business/githubApps/index.ts | 9 ++ business/organization.ts | 14 +++ business/organizationCopilot.ts | 68 +++++++++++++ lib/github/collections.ts | 167 ++++++++++++++++++++++++-------- lib/github/restApi.ts | 46 ++++++++- transitional.ts | 6 +- 6 files changed, 264 insertions(+), 46 deletions(-) create mode 100644 business/organizationCopilot.ts diff --git a/business/githubApps/index.ts b/business/githubApps/index.ts index fed0d3a1b..09b3f82ab 100644 --- a/business/githubApps/index.ts +++ b/business/githubApps/index.ts @@ -107,6 +107,15 @@ export function getAppPurposeId(purpose: AppPurposeTypes) { return id; } +export function tryGetAppPurposeAppConfiguration(purpose: AppPurposeTypes, organizationName: string) { + if ( + (purpose as ICustomAppPurpose).isCustomAppPurpose === true && + (purpose as ICustomAppPurpose).getForOrganizationName + ) { + return (purpose as ICustomAppPurpose).getForOrganizationName(organizationName); + } +} + export class GitHubAppPurposes { private static _instance: GitHubAppPurposes = new GitHubAppPurposes(); diff --git a/business/organization.ts b/business/organization.ts index 8097a3fb3..6c7d0c715 100644 --- a/business/organization.ts +++ b/business/organization.ts @@ -67,6 +67,7 @@ import { ConfigGitHubTemplates } from '../config/github.templates.types'; import { GitHubTokenManager } from './githubApps/tokenManager'; import { OrganizationProjects } from './projects'; import { OrganizationDomains } from './domains'; +import { OrganizationCopilot } from './organizationCopilot'; interface IGetMembersParameters { org: string; @@ -219,6 +220,8 @@ export class Organization { private _projects: OrganizationProjects; private _domains: OrganizationDomains; + private _copilot: OrganizationCopilot; + id: number; uncontrolled: boolean; @@ -351,6 +354,17 @@ export class Organization { return this._projects; } + get copilot() { + if (!this._copilot) { + this._copilot = new OrganizationCopilot( + this, + this._getSpecificAuthorizationHeader.bind(this), + this._operations + ); + } + return this._copilot; + } + get domains() { if (!this._domains) { this._domains = new OrganizationDomains( diff --git a/business/organizationCopilot.ts b/business/organizationCopilot.ts new file mode 100644 index 000000000..2c9a4a6c0 --- /dev/null +++ b/business/organizationCopilot.ts @@ -0,0 +1,68 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { + IGetAuthorizationHeader, + IOperationsInstance, + IPagedCacheOptions, + IPurposefulGetAuthorizationHeader, + throwIfNotGitHubCapable, +} from '../interfaces'; +import type { CollectionCopilotSeatsOptions } from '../lib/github/collections'; +import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { CacheDefault, getMaxAgeSeconds, getPageSize } from './operations/core'; +import { Organization } from './organization'; + +export type CopilotSeatData = { + assignee: { + avatar_url: string; + id: number; + login: string; + }; + created_at: string; + updated_at: string; + last_activity_at: string; + last_activity_editor: string; +}; + +export class OrganizationCopilot { + constructor( + private organization: Organization, + private getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + private operations: IOperationsInstance + ) {} + + async getSeatActivity( + options?: IPagedCacheOptions, + appPurpose: AppPurposeTypes = AppPurpose.Data + ): Promise { + options = options || {}; + const operations = throwIfNotGitHubCapable(this.operations); + const getAuthorizationHeader = this.getSpecificAuthorizationHeader.bind( + this, + appPurpose + ) as IGetAuthorizationHeader; + const github = operations.github; + const parameters: CollectionCopilotSeatsOptions = { + org: this.organization.name, + per_page: getPageSize(operations), + }; + const caching = { + maxAgeSeconds: getMaxAgeSeconds(operations, CacheDefault.orgMembersStaleSeconds, options), + backgroundRefresh: true, + pageRequestDelay: options.pageRequestDelay, + }; + if (options && options.backgroundRefresh === false) { + caching.backgroundRefresh = false; + } + (caching as any).pageLimit = 10; + const seats = (await github.collections.getOrganizationCopilotSeats( + getAuthorizationHeader, + parameters, + caching + )) as CopilotSeatData[]; + return seats; + } +} diff --git a/lib/github/collections.ts b/lib/github/collections.ts index 7f69f1229..b490d3876 100644 --- a/lib/github/collections.ts +++ b/lib/github/collections.ts @@ -13,12 +13,7 @@ import { IRestResponse, flattenData } from './core'; import { CompositeApiContext, CompositeIntelligentEngine } from './composite'; import { Collaborator } from '../../business/collaborator'; import { Team } from '../../business/team'; -import { - IPagedCacheOptions, - IGetAuthorizationHeader, - IDictionary, - GitHubRepositoryPermission, -} from '../../interfaces'; +import { IPagedCacheOptions, IGetAuthorizationHeader, IDictionary } from '../../interfaces'; import { RestLibrary } from '.'; import { sleep } from '../../utils'; import GitHubApplication from '../../business/application'; @@ -29,6 +24,13 @@ export interface IGetAppInstallationsParameters { app_id: string; } +type WithPage = T & { page?: number }; + +export type CollectionCopilotSeatsOptions = { + org: string; + per_page?: number; +}; + export enum GitHubPullRequestState { Open = 'open', Closed = 'closed', @@ -57,6 +59,8 @@ export interface IListPullsParameters { direction?: GitHubSortDirection; } +const mostBasicAccountProperties = ['id', 'login', 'avatar_url']; + const branchDetailsToCopy = ['name', 'commit', 'protected']; const repoDetailsToCopy = RepositoryPrimaryProperties; const teamDetailsToCopy = Team.PrimaryProperties; @@ -65,6 +69,21 @@ const appInstallDetailsToCopy = GitHubApplication.PrimaryInstallationProperties; const contributorsDetailsToCopy = [...Collaborator.PrimaryProperties, 'contributions']; const repoInviteDetailsToCopy = RepositoryInvitation.PrimaryProperties; +type SubReducerProperties = Record; + +type WithSubPropertyReducer = any[] & { subPropertiesToReduce?: SubReducerProperties }; + +const copilotSeatPropertiesToCopy: WithSubPropertyReducer = [ + 'created_at', + 'updated_at', + 'last_activity_at', + 'last_activity_editor', + 'assignee', // id, login; mostBasicAccountProperties +]; +copilotSeatPropertiesToCopy.subPropertiesToReduce = { + assignee: mostBasicAccountProperties, +}; + const teamPermissionsToCopy = [ 'id', 'name', @@ -75,6 +94,7 @@ const teamPermissionsToCopy = [ 'privacy', 'permission', ]; + const teamRepoPermissionsToCopy = [ 'id', 'name', @@ -84,6 +104,7 @@ const teamRepoPermissionsToCopy = [ 'fork', 'permissions', ]; + const pullDetailsToCopy = [ 'id', 'number', @@ -205,6 +226,31 @@ export class RestCollections { ); } + getOrganizationCopilotSeats( + token: string | IGetAuthorizationHeader, + options: CollectionCopilotSeatsOptions, + cacheOptions: IPagedCacheOptions + ): Promise { + // technically type CopilotSeatData + const orgName = options.org; + delete options.org; + const params = Object.assign( + { + octokitRequest: `GET /orgs/${orgName}/copilot/billing/seats`, + }, + options + ); + return this.generalizedCollectionWithFilter( + 'orgCopilotSeats', + 'request', + copilotSeatPropertiesToCopy, + token, + params, + cacheOptions, + 'seats' + ); + } + getAppInstallations( token: string | IGetAuthorizationHeader, parameters: IGetAppInstallationsParameters, @@ -376,11 +422,12 @@ export class RestCollections { ); } - private async getGithubCollection( + private async getGithubCollection( token: string | IGetAuthorizationHeader, - methodName, - options, - cacheOptions: IPagedCacheOptions + methodName: string, + options: OptionsType, + cacheOptions: IPagedCacheOptions, + arrayReducePropertyName?: string ): Promise { const hasNextPage = this.libraryContext.hasNextPage; const githubCall = this.githubCall; @@ -390,14 +437,14 @@ export class RestCollections { const requests = []; let pages = 0; let currentPage = 0; - const pageLimit = options.pageLimit || cacheOptions['pageLimit'] || Number.MAX_VALUE; + const pageLimit = (options as any)?.pageLimit || cacheOptions['pageLimit'] || Number.MAX_VALUE; const pageRequestDelay = cacheOptions.pageRequestDelay || null; while (!done) { const method = githubCall; const args = []; const currentToken = typeof token === 'string' ? token : await token(); args.push(currentToken); - const clonedOptions = Object.assign({}, options); + const clonedOptions: WithPage = Object.assign({}, options); if (++currentPage > 1) { clonedOptions.page = currentPage; } @@ -406,6 +453,19 @@ export class RestCollections { let result = null; try { result = await (method as any).apply(null, args); + if ( + arrayReducePropertyName && + result[arrayReducePropertyName] && + Array.isArray(result[arrayReducePropertyName]) + ) { + const originalResultProperties = { + headers: result?.headers, + cost: result?.cost, + }; + result = result[arrayReducePropertyName]; + result.headers = originalResultProperties.headers; + result.cost = originalResultProperties.cost; + } recentResult = result; if (result) { ++pages; @@ -454,17 +514,26 @@ export class RestCollections { return { data, requests }; } - private async getFilteredGithubCollection( + private async getFilteredGithubCollection( token: string | IGetAuthorizationHeader, - methodName, - options, + methodName: string, + options: OptionsType, cacheOptions: IPagedCacheOptions, - propertiesToKeep + propertiesToKeep: string[], + arrayReducePropertyName?: string ): Promise { const keepAll = !propertiesToKeep; + const subReductionProperties = + propertiesToKeep && (propertiesToKeep as WithSubPropertyReducer).subPropertiesToReduce; try { // IRequestWithData - const getCollectionResponse = await this.getGithubCollection(token, methodName, options, cacheOptions); + const getCollectionResponse = await this.getGithubCollection( + token, + methodName, + options, + cacheOptions, + arrayReducePropertyName + ); if (!getCollectionResponse) { throw new Error('No response'); } @@ -484,6 +553,14 @@ export class RestCollections { const r = {}; _.forOwn(doNotModify, (value, key) => { if (keepAll || propertiesToKeep.indexOf(key) >= 0) { + if (subReductionProperties && subReductionProperties[key]) { + const validSubKeys = new Set(subReductionProperties[key]); + for (const subKey of Object.getOwnPropertyNames(value)) { + if (!validSubKeys.has(subKey)) { + delete value[subKey]; + } + } + } r[key] = value; } }); @@ -502,19 +579,21 @@ export class RestCollections { } } - private async getFilteredGithubCollectionWithMetadataAnalysis( + private async getFilteredGithubCollectionWithMetadataAnalysis( token: string | IGetAuthorizationHeader, - methodName, - options, + methodName: string, + options: OptionsType, cacheOptions: IPagedCacheOptions, - propertiesToKeep + propertiesToKeep: string[], + arrayReducePropertyName?: string ): Promise { - const collectionResults = await this.getFilteredGithubCollection( + const collectionResults = await this.getFilteredGithubCollection( token, methodName, options, cacheOptions, - propertiesToKeep + propertiesToKeep, + arrayReducePropertyName ); const results = collectionResults.data as IRestResponse; const requests = collectionResults.requests; @@ -570,37 +649,47 @@ export class RestCollections { return compositeEngine.execute(apiContext); } - private getCollectionAndFilter( + private getCollectionAndFilter( token: string | IGetAuthorizationHeader, - options, + options: OptionsType, cacheOptions: IPagedCacheOptions, - githubClientMethod, - propertiesToKeep + githubClientMethod: string, + propertiesToKeep: string[], + arrayReducePropertyName?: string ) { const capturedThis = this; - return function (token, options) { - return capturedThis.getFilteredGithubCollectionWithMetadataAnalysis( + return function (token: string | IGetAuthorizationHeader, options: OptionsType) { + return capturedThis.getFilteredGithubCollectionWithMetadataAnalysis( token, githubClientMethod, options, cacheOptions, - propertiesToKeep + propertiesToKeep, + arrayReducePropertyName ); }; } - private async generalizedCollectionWithFilter( - name, - githubClientMethod, - propertiesToKeep, - token, - options, - cacheOptions: IPagedCacheOptions - ): Promise { + private async generalizedCollectionWithFilter( + name: string, + githubClientMethod: string, + propertiesToKeep: string[], + token: string | IGetAuthorizationHeader, + options: OptionsType, + cacheOptions: IPagedCacheOptions, + arrayReducePropertyName?: string + ): Promise { const rows = await this.generalizedCollectionMethod( token, name, - this.getCollectionAndFilter(token, options, cacheOptions, githubClientMethod, propertiesToKeep), + this.getCollectionAndFilter( + token, + options, + cacheOptions, + githubClientMethod, + propertiesToKeep, + arrayReducePropertyName + ), options, cacheOptions ); diff --git a/lib/github/restApi.ts b/lib/github/restApi.ts index 7687f2bed..90434ca5b 100644 --- a/lib/github/restApi.ts +++ b/lib/github/restApi.ts @@ -26,7 +26,14 @@ import { import { getEntityDefinitions, GitHubResponseType, ResponseBodyType } from './endpointEntities'; import appPackage from '../../package.json'; -import { IGetAuthorizationHeader, IAuthorizationHeaderValue } from '../../interfaces'; +import { ErrorHelper } from '../../transitional'; + +import type { IGetAuthorizationHeader, IAuthorizationHeaderValue } from '../../interfaces'; +import { + type IGitHubAppConfiguration, + getAppPurposeId, + tryGetAppPurposeAppConfiguration, +} from '../../business/githubApps'; const appVersion = appPackage.version; @@ -101,10 +108,11 @@ export class IntelligentGitHubEngine extends IntelligentEngine { } } } + const purpose = apiContext?.tokenSource?.purpose ? getAppPurposeId(apiContext.tokenSource.purpose) : null; if (optionalMessage) { let apiTypeSuffix = apiContext.tokenSource && apiContext.tokenSource.purpose - ? ' [' + apiContext.tokenSource.purpose + ']' + ? ' [' + (purpose || apiContext.tokenSource.purpose) + ']' : ''; if (!apiTypeSuffix && apiContext.tokenSource && apiContext.tokenSource.source) { apiTypeSuffix = ` [token source=${apiContext.tokenSource.source}]`; @@ -139,8 +147,38 @@ export class IntelligentGitHubEngine extends IntelligentEngine { args.push(argOptions); } const thisArgument = apiMethod.thisInstance || null; - const response = await apiMethod.apply(thisArgument, args); - return response; + try { + const response = await apiMethod.apply(thisArgument, args); + return response; + } catch (error) { + const asAny = error as any; + if ( + ErrorHelper.IsNotAuthorized(error) && + asAny?.message === 'Resource not accessible by integration' && + apiContext.tokenSource + ) { + let appConfig: IGitHubAppConfiguration = null; + if (apiContext?.tokenSource?.purpose && apiContext?.tokenSource?.organizationName) { + appConfig = tryGetAppPurposeAppConfiguration( + apiContext.tokenSource.purpose, + apiContext.tokenSource.organizationName + ); + } + asAny.source = apiContext.tokenSource.source; + const additional: string[] = []; + purpose && additional.push(`purpose=${purpose}`); + appConfig?.appId && additional.push(`appId=${appConfig.appId}`); + appConfig?.slug && additional.push(`slug=${appConfig.slug}`); + apiContext?.tokenSource?.installationId && + additional.push(`installationId=${apiContext.tokenSource.installationId}`); + apiContext?.tokenSource?.organizationName && + additional.push(`organization=${apiContext.tokenSource.organizationName}`); + const extra = ' ' + additional.join(', '); + debug(`Additional installation context added to message for 403: ${extra}`); + asAny.message += extra; + } + throw error; + } } processMetadataBeforeCall(apiContext: ApiContext, metadata: IRestMetadata) { diff --git a/transitional.ts b/transitional.ts index e69b6f228..6aacad5c1 100644 --- a/transitional.ts +++ b/transitional.ts @@ -254,9 +254,6 @@ export class ErrorHelper { if (asAny?.statusCode && typeof asAny.statusCode === 'number') { return asAny.statusCode as number; } - if (asAny?.code && typeof asAny.code === 'number') { - return asAny.code as number; - } if (asAny?.status) { const status = asAny.status; const type = typeof status; @@ -269,6 +266,9 @@ export class ErrorHelper { return null; } } + if (asAny?.code && typeof asAny.code === 'number') { + return asAny.code as number; + } return null; } } From 848d8bab0f37e6e3749ab0079eabf336c304fd0b Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:27:11 -0800 Subject: [PATCH 43/69] Redirect repos by id & org id --- routes/index-authenticated.ts | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/routes/index-authenticated.ts b/routes/index-authenticated.ts index a4ec7d941..01df492c7 100644 --- a/routes/index-authenticated.ts +++ b/routes/index-authenticated.ts @@ -37,6 +37,7 @@ import routePlaceholders from './placeholders'; import routeReleasesSpa from './releasesSpa'; import { ReposAppRequest, UserAlertType } from '../interfaces'; +import { Repository } from '../business'; // - - - Middleware: require that they have a passport - - - router.use(asyncHandler(requireAuthenticatedUserOrSignIn)); @@ -82,6 +83,40 @@ router.get('/news', (req: ReposAppRequest, res: Response, next: NextFunction) => } }); +router.use( + '/', + asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { + // Helper method to allow pasting a GitHub URL into the app to go to a repo + const { rid, oid, action } = req.query; + const { operations } = getProviders(req); + if (!rid && !oid) { + return next(); + } + const repositoryId = Number(rid); + const organizationId = Number(oid); + let organization: Organization = null; + let repository: Repository = null; + try { + organization = operations.getOrganizationById(organizationId); + } catch (error) { + // no-op continue + return next(); + } + if (organization) { + try { + repository = await organization.getRepositoryById(repositoryId); + return res.redirect( + `/orgs/${organization.name}/repos/${repository.name}${action ? `/${action}` : ''}` + ); + } catch (error) { + // no-op continue + return next(); + } + } + return next(); + }) +); + // Link cleanups and check their signed-in username vs their link router.use(RequireLinkMatchesGitHubSessionExceptPrefixedRoute('/unlink')); From 29444525860222f968fd972b2afa05b4820f8d14 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:29:19 -0800 Subject: [PATCH 44/69] Custom token type connections for GitHub Apps --- business/githubApps/index.ts | 100 ++++++++++++++++++++++++++++ business/githubApps/tokenManager.ts | 22 ++++++ middleware/initialize.ts | 2 + 3 files changed, 124 insertions(+) diff --git a/business/githubApps/index.ts b/business/githubApps/index.ts index 09b3f82ab..cd69afbd6 100644 --- a/business/githubApps/index.ts +++ b/business/githubApps/index.ts @@ -7,6 +7,9 @@ import { ExecutionEnvironment } from '../../interfaces'; import { CreateError } from '../../transitional'; import Debug from 'debug'; +import GitHubApplication from '../application'; +import { Operations } from '../operations'; +import { GitHubTokenManager } from './tokenManager'; const debug = Debug('github:tokens'); export enum AppPurpose { @@ -29,6 +32,10 @@ export interface ICustomAppPurpose { export type AppPurposeTypes = AppPurpose | ICustomAppPurpose; +export type CustomAppPurposeWithGetApplications = ICustomAppPurpose & { + getGitHubAppInstances: () => GitHubApplication[]; +}; + export abstract class CustomAppPurpose implements ICustomAppPurpose { get isCustomAppPurpose() { return true; @@ -40,14 +47,19 @@ export abstract class CustomAppPurpose implements ICustomAppPurpose { } export class CustomAppPurposeOrganizationVariance extends CustomAppPurpose { + private _appsByAppId = new Map(); + fallbackIfNotConfiguredOrganizationName = false; + constructor( + private operations: Operations, public id: string, public name: string, private configurations: IGitHubAppConfiguration[] ) { super(id, name); } + getForOrganizationName(organizationName: string) { const configuration = this.configurations.find( (c) => c.specificOrganizationName.toLowerCase() === organizationName.toLowerCase() @@ -57,10 +69,31 @@ export class CustomAppPurposeOrganizationVariance extends CustomAppPurpose { } return configuration || this.configurations[0]; } + + getGitHubAppInstances() { + const uniqueAppIds = new Set(this.configurations.map((c) => c.appId).filter((id) => !!id)); + const appInstances: GitHubApplication[] = []; + for (const appId of uniqueAppIds) { + let instance = this._appsByAppId.get(appId); + if (!instance) { + instance = createGitHubAppInstance( + this.operations, + this.configurations.find((c) => c.appId === appId), + this + ); + this._appsByAppId.set(appId, instance); + } + appInstances.push(instance); + } + return appInstances; + } } export class CustomAppPurposeSingleConfiguration extends CustomAppPurpose { + private _appInstance: GitHubApplication; + constructor( + private operations: Operations, public id: string, public name: string, private configuration: IGitHubAppConfiguration @@ -71,6 +104,44 @@ export class CustomAppPurposeSingleConfiguration extends CustomAppPurpose { getApplicationConfigurationForInitialization() { return this.configuration; } + + getGitHubAppInstances() { + if (!this._appInstance) { + this._appInstance = createGitHubAppInstance(this.operations, this.configuration, this); + } + return this._appInstance; + } +} + +function createGitHubAppInstance( + operations: Operations, + configuration: IGitHubAppConfiguration, + customPurpose: AppPurposeTypes +) { + const app = new GitHubApplication( + operations, + configuration.appId, + configuration.slug, + configuration.description || configuration.slug, + getAppAuthorizationHeader.bind(this, operations, configuration, customPurpose) + ); + return app; +} + +async function getAppAuthorizationHeader( + operations: Operations, + configuration: IGitHubAppConfiguration, + purpose: AppPurposeTypes +): Promise { + const appId = configuration.appId; + const tokenManager = GitHubTokenManager.TryGetTokenManagerForOperations(operations); + const appTokens = await tokenManager.ensureConfigurationAppInitialized(purpose, configuration); + if (!appTokens) { + CreateError.InvalidParameters(`No app tokens found configured for app ID ${appId} in tokens instance.`); + } + const jwt = await appTokens.getAppAuthenticationToken(); + const value = `bearer ${jwt}`; + return value; } export const DefinedAppPurposes = [ @@ -116,7 +187,28 @@ export function tryGetAppPurposeAppConfiguration(purpose: AppPurposeTypes, organ } } +export function tryGetAppPurposeGitHubAppInstances(purpose: AppPurposeTypes) { + if ( + (purpose as ICustomAppPurpose).isCustomAppPurpose === true && + (purpose as CustomAppPurposeWithGetApplications).getGitHubAppInstances + ) { + return (purpose as CustomAppPurposeWithGetApplications).getGitHubAppInstances(); + } + const operations = GitHubAppPurposes.GetOperationsInstanceForBuiltInPurposes(); + const tokenManager = GitHubTokenManager.TryGetTokenManagerForOperations(operations); + const appTokens = tokenManager.getAppForPurpose(purpose); + if (!appTokens) { + throw CreateError.InvalidParameters(`No app tokens found configured for purpose ${purpose}`); + } + const appId = appTokens.appId; + if (!appId) { + throw CreateError.InvalidParameters(`No app ID found configured for purpose ${purpose}`); + } + return [operations.getApplicationById(appId)]; +} + export class GitHubAppPurposes { + private _operations: Operations; private static _instance: GitHubAppPurposes = new GitHubAppPurposes(); static get AllAvailableAppPurposes() { @@ -124,6 +216,14 @@ export class GitHubAppPurposes { return this._instance._purposes; } + static RegisterOperationsInstanceForBuiltInPurposes(operations: Operations) { + this._instance._operations = operations; + } + + static GetOperationsInstanceForBuiltInPurposes() { + return this._instance._operations; + } + static RegisterCustomPurpose(purpose: ICustomAppPurpose) { debug(`Registering custom purpose ${purpose.id} (${purpose.name})`); if (purpose.isCustomAppPurpose !== true) { diff --git a/business/githubApps/tokenManager.ts b/business/githubApps/tokenManager.ts index 66233bcff..a6324f106 100644 --- a/business/githubApps/tokenManager.ts +++ b/business/githubApps/tokenManager.ts @@ -162,6 +162,28 @@ export class GitHubTokenManager { return null; } + async ensureConfigurationAppInitialized( + customPurpose: AppPurposeTypes, + customPurposeConfiguration: IGitHubAppConfiguration + ): Promise { + const appId = customPurposeConfiguration.appId; + const asCustomPurpose = this.getCustomPurpose(customPurpose); + if (!asCustomPurpose?.isCustomAppPurpose) { + throw CreateError.InvalidParameters(`The purpose ${customPurpose} is not a custom app purpose`); + } + let app = this._appsById.get(appId); + if (!app) { + debug(`initializing app for custom purpose ${asCustomPurpose.id} with custom configuration`); + app = await this.initializeApp(asCustomPurpose, customPurposeConfiguration); + } + if (!app) { + throw CreateError.InvalidParameters( + `Error initializing purpose ${this.getPurposeDisplayId(customPurpose)}` + ); + } + return app; + } + async getOrganizationAuthorizationHeader( organizationName: string, preferredPurpose: AppPurposeTypes, diff --git a/middleware/initialize.ts b/middleware/initialize.ts index 01927aaf9..3bec8af11 100644 --- a/middleware/initialize.ts +++ b/middleware/initialize.ts @@ -83,6 +83,7 @@ import type { } from '../interfaces'; import initializeRepositoryProvider from '../entities/repository'; import { tryGetImmutableStorageProvider } from '../lib/immutable'; +import { GitHubAppPurposes } from '../business/githubApps'; const DefaultApplicationProfile: IApplicationProfile = { applicationName: 'Open Source Management Portal', @@ -303,6 +304,7 @@ async function initializeAsync( }); await operations.initialize(); providers.operations = operations; + GitHubAppPurposes.RegisterOperationsInstanceForBuiltInPurposes(operations); } catch (ignoredError2) { console.dir(ignoredError2); throw ignoredError2; From b2991acb0637baccde19ffc1b63c90940ab8f2b5 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:29:30 -0800 Subject: [PATCH 45/69] Dictionary update --- .cspell.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.cspell.json b/.cspell.json index 4d0447657..8ae2626fd 100644 --- a/.cspell.json +++ b/.cspell.json @@ -219,6 +219,7 @@ "dpkg", "dropup", "DSRE", + "Ecosyste", "edgecase", "electionid", "eligibilityend", @@ -389,6 +390,7 @@ "KEYVAULT", "KHTML", "kubeconfig", + "Kusto", "kusto", "KUSTO", "labeljust", From 132d04bb965544916e7ac18eee766bfe72a35896 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:29:35 -0800 Subject: [PATCH 46/69] Typings and dependency updates --- package-lock.json | 1166 +++++++++++++++++++++++---------------------- package.json | 58 +-- 2 files changed, 616 insertions(+), 608 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8dbffe4a1..96c28d6f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.3.2", + "@azure/identity": "4.0.0", "@azure/keyvault-secrets": "4.7.0", - "@azure/service-bus": "7.9.2", + "@azure/service-bus": "7.9.3", "@azure/storage-blob": "12.16.0", "@azure/storage-queue": "12.15.0", "@octokit/auth-app": "6.0.1", @@ -24,7 +24,7 @@ "app-root-path": "3.1.0", "applicationinsights": "2.9.0", "async-prompt": "1.0.1", - "axios": "1.6.0", + "axios": "1.6.1", "basic-auth": "2.0.1", "body-parser": "1.20.2", "color-contrast-checker": "2.1.0", @@ -72,33 +72,33 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/cors": "2.8.15", - "@types/debug": "4.1.10", - "@types/express": "4.17.20", - "@types/express-session": "1.17.9", - "@types/jest": "29.5.7", - "@types/lodash": "4.14.200", - "@types/luxon": "3.3.3", - "@types/memory-cache": "0.2.4", - "@types/morgan": "1.9.7", - "@types/node": "20.8.10", - "@types/node-jose": "1.1.12", - "@types/object-path": "0.11.3", - "@types/passport": "1.0.14", - "@types/passport-azure-ad": "4.3.3", - "@types/passport-github": "1.1.11", - "@types/pg": "8.10.7", - "@types/pug": "2.0.8", - "@types/recursive-readdir": "2.2.3", - "@types/semver": "7.5.4", - "@types/simple-oauth2": "5.0.6", - "@types/validator": "13.11.5", - "@typescript-eslint/eslint-plugin": "6.9.1", - "@typescript-eslint/parser": "6.9.1", - "cspell": "7.3.8", - "eslint": "8.52.0", + "@types/cors": "2.8.16", + "@types/debug": "4.1.11", + "@types/express": "4.17.21", + "@types/express-session": "1.17.10", + "@types/jest": "29.5.8", + "@types/lodash": "4.14.201", + "@types/luxon": "3.3.4", + "@types/memory-cache": "0.2.5", + "@types/morgan": "1.9.9", + "@types/node": "20.9.0", + "@types/node-jose": "1.1.13", + "@types/object-path": "0.11.4", + "@types/passport": "1.0.15", + "@types/passport-azure-ad": "4.3.4", + "@types/passport-github": "1.1.12", + "@types/pg": "8.10.9", + "@types/pug": "2.0.9", + "@types/recursive-readdir": "2.2.4", + "@types/semver": "7.5.5", + "@types/simple-oauth2": "5.0.7", + "@types/validator": "13.11.6", + "@typescript-eslint/eslint-plugin": "6.10.0", + "@typescript-eslint/parser": "6.10.0", + "cspell": "8.0.0", + "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.2.0", + "eslint-plugin-n": "16.3.0", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", @@ -149,9 +149,9 @@ } }, "node_modules/@azure/core-amqp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.0.0.tgz", - "integrity": "sha512-5QhtJ69qLbTKTL3arLHkQCN96C7tqENF4oKkPYp5Pqb+YA5Gh0aREL2aqp98sAT/YB/G8wAfvFLnYB7bUyzFVw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.1.0.tgz", + "integrity": "sha512-tjnviDypSAgjGBZCPw+sH7vDWz27N+z0xtQewp7+xH17/eb67VH4sApl3XHuxVBro6Y6pOfxCDpqFenOoGWz6Q==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -166,7 +166,7 @@ "util": "^0.12.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/core-auth": { @@ -369,9 +369,9 @@ } }, "node_modules/@azure/identity": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.2.tgz", - "integrity": "sha512-aDLwgMXpNBEXOlfCP9r5Rn+inmbnTbadlOnrKI2dPS9Lpf4gHvpYBV+DEZKttakfJ+qn4iWWb7zONQSO3A4XSA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.0.0.tgz", + "integrity": "sha512-gtPYxIL0kI39Dw4t3HvlbfhOdXqKD2MqDgynlklF0j728j51dcKgRo6FLX0QzpBw/1gGfLxjMXqq3nKOSQ2lmA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -380,18 +380,16 @@ "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.0.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.37.1", - "@azure/msal-common": "^13.1.0", - "@azure/msal-node": "^1.17.3", + "@azure/msal-browser": "^3.5.0", + "@azure/msal-node": "^2.5.1", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", "stoppable": "^1.1.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/keyvault-secrets": { @@ -427,35 +425,35 @@ } }, "node_modules/@azure/msal-browser": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.0.tgz", - "integrity": "sha512-gxBh83IumHgEP9uMCm9pJLKLRwICMQTxG9TX3AytdNt3oLUI3tytm/szYD5u5zKJgSkhHvwFSM+NPnM04hYw3w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.5.0.tgz", + "integrity": "sha512-2NtMuel4CI3UEelCPKkNRXgKzpWEX48fvxIvPz7s0/sTcCaI08r05IOkH2GkXW+czUOtuY6+oGafJCpumnjRLg==", "dependencies": { - "@azure/msal-common": "13.2.0" + "@azure/msal-common": "14.4.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.0.tgz", - "integrity": "sha512-rnstQ7Zgn3fSTKNQO+/YNV34/QXJs0vni7IA0/3QB1EEyrJg14xyRmTqlw9ta+pdSuT5OJwUP8kI3D/rBwUIBw==", + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.4.0.tgz", + "integrity": "sha512-ffCymScQuMKVj+YVfwNI52A5Tu+uiZO2eTf+c+3TXxdAssks4nokJhtr+uOOMxH0zDi6d1OjFKFKeXODK0YLSg==", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.0.tgz", - "integrity": "sha512-N6GX1Twxw524e7gaJvj7hKtrPRmZl9qGY7U4pmUdx4XzoWYRFfYk4H1ZjVhQ7pwb5Ks88NNhbXVCagsuYPTEFg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.5.1.tgz", + "integrity": "sha512-PsPRISqCG253HQk1cAS7eJW7NWTbnBGpG+vcGGz5z4JYRdnM2EIXlj1aBpXCdozenEPtXEVvHn2ELleW1w82nQ==", "dependencies": { - "@azure/msal-common": "13.2.0", + "@azure/msal-common": "14.4.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, "engines": { - "node": "10 || 12 || 14 || 16 || 18" + "node": "16|| 18 || 20" } }, "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { @@ -475,12 +473,12 @@ } }, "node_modules/@azure/service-bus": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.2.tgz", - "integrity": "sha512-w8d1/KhlbUz8DvY3Ca7GvoU5cJ8ONV4QBW25OfUk4Br6waAKWY+1wugEThQNCueRKvNlJlJyRbr9T14ibYMZeQ==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.3.tgz", + "integrity": "sha512-6g37YpVTzRHI75BkYPiB4zqbYhQHM1Jvd+sNfRCbXeRW5FLsWoXgFVTw3Jv5kkMMX1pUNtrkaQhEoeTwtm5v3w==", "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-amqp": "^4.0.0", + "@azure/core-amqp": "^4.1.0", "@azure/core-auth": "^1.3.0", "@azure/core-client": "^1.0.0", "@azure/core-paging": "^1.4.0", @@ -499,7 +497,7 @@ "tslib": "^2.2.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/storage-blob": { @@ -1222,16 +1220,16 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.8.tgz", - "integrity": "sha512-Dj8iSGQyfgIsCjmXk9D/SjV7EpbpQSogeaGcBM66H33pd0GyGmLhn3biRN+vqi/vqWmsp75rT3kd5MKa8X5W9Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.0.0.tgz", + "integrity": "sha512-Phbb1ij1TQQuqxuuvxf5P6fvV9U+EVoATNLmDqFHvRZfUyuhgbJuCMzIPeBx4GfTTDWlPs51FYRvZ/Q8xBHsyA==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.26", - "@cspell/dict-cpp": "^5.0.8", + "@cspell/dict-companies": "^3.0.27", + "@cspell/dict-cpp": "^5.0.9", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", "@cspell/dict-css": "^4.0.12", @@ -1240,35 +1238,36 @@ "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.9", + "@cspell/dict-en_us": "^4.3.11", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.1", + "@cspell/dict-filetypes": "^3.0.2", "@cspell/dict-fonts": "^4.0.0", - "@cspell/dict-fsharp": "^1.0.0", + "@cspell/dict-fsharp": "^1.0.1", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.3", + "@cspell/dict-golang": "^6.0.4", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", "@cspell/dict-java": "^5.0.6", - "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-k8s": "^1.0.2", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.2", + "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", "@cspell/dict-npm": "^5.0.12", - "@cspell/dict-php": "^4.0.3", + "@cspell/dict-php": "^4.0.4", "@cspell/dict-powershell": "^5.0.2", "@cspell/dict-public-licenses": "^2.0.5", - "@cspell/dict-python": "^4.1.9", + "@cspell/dict-python": "^4.1.10", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.6", + "@cspell/dict-software-terms": "^3.3.9", "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", @@ -1276,58 +1275,58 @@ "@cspell/dict-vue": "^3.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.8.tgz", - "integrity": "sha512-FxYJWtDgxIQYxdP0RWwRV8nzLfxVx8D8D5L2sbbP/0NFczDbq/zWYep4nSAHJT10aUJrogsVUYwNwdkr562wKA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.0.0.tgz", + "integrity": "sha512-1ltK5N4xMGWjDSIkU+GJd3rXV8buXgO/lAgnpM1RhKWqAmG+u0k6pnhk2vIo/4qZQpgfK0l3J3h/Ky2FcE95vA==", "dev": true, "dependencies": { - "@cspell/cspell-types": "7.3.8" + "@cspell/cspell-types": "8.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspell/cspell-pipe": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.8.tgz", - "integrity": "sha512-/vKPfiHM5bJUkNX12w9j533Lm2JvvSMKUCChM2AxYjy6vL8prc/7ei++4g2xAWwRxLZPg2OfpDJS5EirZNBJdA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.0.0.tgz", + "integrity": "sha512-1MH+9q3AmbzwK1BYhSGla8e4MAAYzzPApGvv8eyv0rWDmgmDTkGqJPTTvYj1wFvll5ximQ5OolpPQGv3JoWvtQ==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspell/cspell-resolver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.8.tgz", - "integrity": "sha512-CeyQmhqZI5a+T7a6oiVN90TFlzU3qVVYqCaZ9grFrVOsmzY9ipH5gmqfgMavaBOqb0di/+VZS8d02suMOXcKLQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.0.0.tgz", + "integrity": "sha512-gtALHFLT2vSZ7BZlIg26AY3W9gkiqxPGE75iypWz06JHJs05ngnAR+h6VOu0+rmgx98hNfzPPEh4g+Tjm8Ma0A==", "dev": true, "dependencies": { "global-dirs": "^3.0.1" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.8.tgz", - "integrity": "sha512-3E7gwY6QILrZH83p69i9CERbRBEqeBiKCIKnAd7U2PbxfFqG/P47fqpnarzSWFwFpU92oyGsYry+wC8TEGISRQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.0.0.tgz", + "integrity": "sha512-1EYhIHoZnhxpfEp6Bno6yVWYBuYfaQrwIfeDMntnezUcSmi7RyroQEcp5U7sLv69vhRD2c81o7r8iUaAbPSmIg==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspell/cspell-types": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.8.tgz", - "integrity": "sha512-hsOtaULDnawEL4pU0fga941GhvE8mbTbywrJBx+eGX3fnJsaUr8XQzCtnLsW2ko7WCLWFItNEhSSTPQHBFRLsw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.0.0.tgz", + "integrity": "sha512-dPdxQI8dLJoJEjylaPYfCJNnm2XNMYPuowHE2FMcsnFR9hEchQAhnKVc/aD63IUYnUtUrPxPlUJdoAoj569e+g==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspell/dict-ada": { @@ -1349,9 +1348,9 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.26", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.26.tgz", - "integrity": "sha512-BGRZ/Uykx+IgQoTGqvRqbBMQy7QSuY0pbTHgtmKtc1scgzZMJQKMDwyuE6LJzlhdlrV7TsVY0lyXREybnDpQPQ==", + "version": "3.0.27", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.27.tgz", + "integrity": "sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ==", "dev": true }, "node_modules/@cspell/dict-cpp": { @@ -1433,9 +1432,9 @@ "dev": true }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", - "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.2.tgz", + "integrity": "sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg==", "dev": true }, "node_modules/@cspell/dict-fonts": { @@ -1522,6 +1521,12 @@ "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", "dev": true }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz", + "integrity": "sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==", + "dev": true + }, "node_modules/@cspell/dict-node": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", @@ -1553,9 +1558,9 @@ "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.9.tgz", - "integrity": "sha512-JMA4v/ZPJWuDt3PPFz+23VIY3iDIB+xOTQ6nw+WkcJU5yr6FUl5zMU9ModKrgujg3jGRuuJqofErZVPqHNHYAA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.10.tgz", + "integrity": "sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^1.0.11" @@ -1586,9 +1591,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.8.tgz", - "integrity": "sha512-zcwPl+EA5kWyWzPiwE2eF21ltKshzZ5NQ4kKCaND9uo4oeqTrD7hG8FTJTd7kz7GNhNqbT0G1SVMC2BtI+UpVQ==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.9.tgz", + "integrity": "sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -1622,24 +1627,24 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.8.tgz", - "integrity": "sha512-s8x7dH/ScfW0pFEIvNFo4JOR7YmvM2wZSHOykmWTJCQ8k2EQ/+uECPp6ZxkoJoukTz8sj+3KzF0fRl5mKxPd6g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.0.0.tgz", + "integrity": "sha512-HNkCepopgiEGuI1QGA6ob4+ayvoSMxvAqetLxP0u1sZzc50LH2DEWwotcNrpVdzZOtERHvIBcGaQKIBEx8pPRQ==", "dev": true, "dependencies": { - "import-meta-resolve": "^3.0.0" + "import-meta-resolve": "^3.1.1" }, "engines": { - "node": ">=16" + "node": ">=18.0" } }, "node_modules/@cspell/strong-weak-map": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.8.tgz", - "integrity": "sha512-qNnt2wG45wb8JP54mENarnQgxfSYKPp3zlYID/2przbMNmVJRqUlcIBOdLI6plCgGeNkzJTl3T9T1ATbnN+LLw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.0.0.tgz", + "integrity": "sha512-fRlqPSdpdub52vFtulDgLPzGPGe75I04ScId1zOO9ABP7/ro8VmaG//m1k7hsPkm6h7FG4jWympoA3aXDAcXaA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@cspotcode/source-map-support": { @@ -1689,9 +1694,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1712,9 +1717,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2930,27 +2935,27 @@ } }, "node_modules/@types/cors": { - "version": "2.8.15", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", - "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", + "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", - "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.11.tgz", + "integrity": "sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2969,9 +2974,9 @@ } }, "node_modules/@types/express-session": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.9.tgz", - "integrity": "sha512-yIqficLlTPdloeEPhOVenpOUWILkdaXHUWhTOqFGx9JoSuTgeatNjb97k8VvJehbTk0kUSUAHy5r27PXMga89Q==", + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.10.tgz", + "integrity": "sha512-U32bC/s0ejXijw5MAzyaV4tuZopCh/K7fPoUDyNbsRXHvPSeymygYD1RFL99YOLhF5PNOkzswvOTRaVHdL1zMw==", "dev": true, "dependencies": { "@types/express": "*" @@ -3019,9 +3024,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.7", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", - "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3029,9 +3034,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/jsonwebtoken": { @@ -3043,21 +3048,21 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.200", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz", - "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==", + "version": "4.14.201", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", + "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.3.tgz", - "integrity": "sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.4.tgz", + "integrity": "sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==", "dev": true }, "node_modules/@types/memory-cache": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.4.tgz", - "integrity": "sha512-yUj2q3Iav0kuefl+qGtn3d3nZtYDlMG1CI3DYe1UDfJb3zqnH1w1oE8R0lhv1sSua0CR0cAvCgNUzQHahGFI4g==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.5.tgz", + "integrity": "sha512-OIKRDDZUFeKT/rsko7/CGnR5qE8xTU8ogzyaaSDSHGkKwlSB/E6RopSF5fReo89khCAcGIoqSi723tDqUe6gYw==", "dev": true }, "node_modules/@types/mime": { @@ -3066,9 +3071,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/morgan": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", - "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -3081,9 +3086,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "dependencies": { "undici-types": "~5.26.4" } @@ -3111,9 +3116,9 @@ } }, "node_modules/@types/node-jose": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.12.tgz", - "integrity": "sha512-HtSXbirRMuONr/KSNtBgh631xCt/t3lPz0geQ4pe/FA+yu06TUrJrXEU5y8nJFHNy8KhiZrq6OVlqXD1AtT/dQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.13.tgz", + "integrity": "sha512-QjMd4yhwy1EvSToQn0YI3cD29YhyfxFwj7NecuymjLys2/P0FwxWnkgBlFxCai6Y3aBCe7rbwmqwJJawxlgcXw==", "dev": true, "dependencies": { "@types/node": "*" @@ -3129,9 +3134,9 @@ } }, "node_modules/@types/object-path": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.3.tgz", - "integrity": "sha512-P6V8jUKl0qA/U5ZAWW1y/BxeFf/R3yZucVGnHtD1qRXmFPndKZK4iZ49qX73R0FIwZnk0yKYixmqtYrPtManaA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==", "dev": true }, "node_modules/@types/parse-json": { @@ -3141,18 +3146,18 @@ "dev": true }, "node_modules/@types/passport": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", - "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", + "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/passport-azure-ad": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.3.tgz", - "integrity": "sha512-dRkF6PXKNAdsQBKLMqHIhnN84KFU94t/p6nJqJAEkP0ux9itsyzM8agErgjYsA7pJ92eVKz8dqzyHpeyM3Tiqw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.4.tgz", + "integrity": "sha512-1sshz8MfQs5DxWYGGX/1XhRYYREjlL3gSzoU38G9BxqijVmPIjAhFbP/PvmbqK05WlLF5VVBhNgt1DmX7Dh6IA==", "dev": true, "dependencies": { "@types/express": "*", @@ -3160,9 +3165,9 @@ } }, "node_modules/@types/passport-github": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.11.tgz", - "integrity": "sha512-V2t1/P8BnnFX8AOYpk0ep9p4p7u2V1KdQBSUIvSvcxMseu7n2+cTLCr3rat8K876caQ1C95Y9vprVBbtLVVYXg==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.12.tgz", + "integrity": "sha512-VJpMEIH+cOoXB694QgcxuvWy2wPd1Oq3gqrg2Y9DMVBYs9TmH9L14qnqPDZsNMZKBDH+SvqRsGZj9SgHYeDgcA==", "dev": true, "dependencies": { "@types/express": "*", @@ -3182,9 +3187,9 @@ } }, "node_modules/@types/pg": { - "version": "8.10.7", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.7.tgz", - "integrity": "sha512-ksJqHipwYaSEHz9e1fr6H6erjoEdNNaOxwyJgPx9bNeaqOW3iWBQgVHfpwiSAoqGzchfc+ZyRLwEfeCcyYD3uQ==", + "version": "8.10.9", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.9.tgz", + "integrity": "sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -3250,9 +3255,9 @@ } }, "node_modules/@types/pug": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.8.tgz", - "integrity": "sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", + "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", "dev": true }, "node_modules/@types/qs": { @@ -3266,18 +3271,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-fhOVQ23ki+GB0WGmJJF9OwPBjel2Iv02pmEv58T0DZqIAlKnyhAaC2E9/LuKQLIZF88w7ivXSZXJtvEXGXFgeQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.4.tgz", + "integrity": "sha512-84REEGT3lcgopvpkmGApzmU5UEG0valme5rQS/KGiguTkJ70/Au8UYZTyrzoZnY9svuX9351+1uvrRPzWDD/uw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@types/serve-static": { @@ -3295,9 +3300,9 @@ "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" }, "node_modules/@types/simple-oauth2": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.6.tgz", - "integrity": "sha512-i1tx1TwdET6m9tit+p+pWABuNWz0W8LThmzwh+cYC9yKJTXD3q3zPWOwstuL8/ELO0HoE0f9r/yYQ3XHaiTjrw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.7.tgz", + "integrity": "sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3315,9 +3320,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==", + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==", "dev": true }, "node_modules/@types/yargs": { @@ -3336,16 +3341,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3371,15 +3376,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" }, "engines": { @@ -3399,13 +3404,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3416,13 +3421,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3443,9 +3448,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3456,13 +3461,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3483,17 +3488,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", "semver": "^7.5.4" }, "engines": { @@ -3508,12 +3513,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3842,9 +3847,9 @@ } }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4856,23 +4861,23 @@ } }, "node_modules/cspell": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.8.tgz", - "integrity": "sha512-8AkqsBQAMsKYV5XyJLB6rBs5hgspL4+MPOg6mBKG2j5EvQgRVc6dIfAPWDNLpIeW2a3+7K5BIWqKHapKPeiknQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.0.0.tgz", + "integrity": "sha512-Nayy25Dh+GAlDFDpVZaQhmidP947rpj1Pn9lmZ3nUFjD9W/yj0h0vrjMLMN4dbonddkmKh4t51C+7NuMP405hg==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "7.3.8", - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8", - "@cspell/dynamic-import": "7.3.8", + "@cspell/cspell-json-reporter": "8.0.0", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0", + "@cspell/dynamic-import": "8.0.0", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.1.0", - "cspell-gitignore": "7.3.8", - "cspell-glob": "7.3.8", - "cspell-io": "7.3.8", - "cspell-lib": "7.3.8", - "fast-glob": "^3.3.1", + "cspell-gitignore": "8.0.0", + "cspell-glob": "8.0.0", + "cspell-io": "8.0.0", + "cspell-lib": "8.0.0", + "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^7.0.1", "get-stdin": "^9.0.0", @@ -4885,26 +4890,26 @@ "cspell-esm": "bin.mjs" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, "node_modules/cspell-dictionary": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.8.tgz", - "integrity": "sha512-gkq4t78eLR0xC3P0vDDHPeNY4iZRd5YE6Z8uDJ7RM4UaX/TSdVUN9KNFr34RnJ119NYVHujpL9+uW7wPSAe8Eg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.0.0.tgz", + "integrity": "sha512-R/AzUj7W7F4O4fAOL8jvIiUqPYGy6jIBlDkxO9SZe/A6D2kOICZZzGSXMZ0M7OKYqxc6cioQUMKOJsLkDXfDXw==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8", - "cspell-trie-lib": "7.3.8", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0", + "cspell-trie-lib": "8.0.0", "fast-equals": "^4.0.3", "gensequence": "^6.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell-dictionary/node_modules/fast-equals": { @@ -4914,83 +4919,82 @@ "dev": true }, "node_modules/cspell-gitignore": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.8.tgz", - "integrity": "sha512-vJzCOUEiw6/MwV/U4Ux3bgSdj9mXB+X5eHL+qzVoyFI7ArlvrkuGTL+iFJThQcS8McM3SGqtvaBNCiKBmAeCkA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.0.0.tgz", + "integrity": "sha512-Uv+ENdUm+EXwQuG9187lKmE1t8b2KW+6VaQHP7r01WiuhkwhfzmWA7C30iXVcwRcsMw07wKiWvMEtG6Zlzi6lQ==", "dev": true, "dependencies": { - "cspell-glob": "7.3.8", + "cspell-glob": "8.0.0", "find-up": "^5.0.0" }, "bin": { "cspell-gitignore": "bin.mjs" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell-glob": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.8.tgz", - "integrity": "sha512-wUZC6znyxEs0wlhzGfZ4XHkATPJyazJIFi/VvAdj+KHe7U8SoSgitJVDQqdgectI2y3MxR7lQdVLX9dONFh+7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.0.0.tgz", + "integrity": "sha512-wOkRA1OTIPhyN7a+k9Qq45yFXM+tBFi9DS5ObiLv6t6VTBIeMQpwRK0KLViHmjTgiA6eWx53Dnr+DZfxcAkcZA==", "dev": true, "dependencies": { "micromatch": "^4.0.5" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell-grammar": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.8.tgz", - "integrity": "sha512-nTjAlMAZAVSFhBd9U3MB9l5FfC5JCCr9DTOA2wWxusVOm+36MbSEH90ucLPkhPa9/+0HtbpDhqVMwXCZllRpsg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.0.0.tgz", + "integrity": "sha512-uxpRvbBxOih6SjFQvKTBPTA+YyqYM5UFTNTFuRnA6g6WZeg+NJaTkbQrTgXja4B2r8MJ6XU22YrKTtHNNcP7bQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8" + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0" }, "bin": { "cspell-grammar": "bin.mjs" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell-io": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.8.tgz", - "integrity": "sha512-XrxPbaiek7EZh+26k9RYVz2wKclaMqM6mXBiu/kpFAHRHHfz91ado6xWvyxZ7UAxQ8ixEwZ+oz9TU+k21gHzyw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.0.0.tgz", + "integrity": "sha512-NVdVmQd7SU/nxYwWtO/6gzux/kp1Dt36zKds0+QHZhQ18JJjXduF5e+WUttqKi2oj/vvmjiG4HGFKQVDBcBz3w==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "7.3.8", - "node-fetch": "^2.7.0" + "@cspell/cspell-service-bus": "8.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell-lib": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.8.tgz", - "integrity": "sha512-2L770sI5DdsAKVzO3jxmfP2fz4LryW6dzL93BpN7WU+ebFC6rg4ioa5liOJV4WoDo2fNQMSeqfW4Aawu9zWR7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.0.0.tgz", + "integrity": "sha512-X/BzUjrzHOx7YlhvSph/OlMu1RmCTnybeZvIE67d1Pd7wT1TmZhFTnmvruUhoHxWEudOEe4HjzuNL9ph6Aw+aA==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "7.3.8", - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-resolver": "7.3.8", - "@cspell/cspell-types": "7.3.8", - "@cspell/dynamic-import": "7.3.8", - "@cspell/strong-weak-map": "7.3.8", + "@cspell/cspell-bundled-dicts": "8.0.0", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-resolver": "8.0.0", + "@cspell/cspell-types": "8.0.0", + "@cspell/dynamic-import": "8.0.0", + "@cspell/strong-weak-map": "8.0.0", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.3.8", - "cspell-glob": "7.3.8", - "cspell-grammar": "7.3.8", - "cspell-io": "7.3.8", - "cspell-trie-lib": "7.3.8", + "cspell-dictionary": "8.0.0", + "cspell-glob": "8.0.0", + "cspell-grammar": "8.0.0", + "cspell-io": "8.0.0", + "cspell-trie-lib": "8.0.0", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^6.0.0", @@ -5000,7 +5004,7 @@ "vscode-uri": "^3.0.8" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell-lib/node_modules/find-up": { @@ -5086,17 +5090,17 @@ } }, "node_modules/cspell-trie-lib": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.8.tgz", - "integrity": "sha512-UQx1Bazbyz2eQJ/EnMohINnUdZvAQL+OcQU3EPPbNWM1DWF4bJGgmFXKNCRYfJk6wtOZVXG5g5AZXx9KnHeN9A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.0.0.tgz", + "integrity": "sha512-0rC5e1C0uM78uuS+lC1T18EojWZyNvq4bPOPCisnwuhuWrAfCqrFrX/qDNslWk3VTOPbsEMlFj6OnIGQnfwSKg==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0", "gensequence": "^6.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/cspell/node_modules/ansi-regex": { @@ -5611,15 +5615,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5697,9 +5701,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz", - "integrity": "sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.0.tgz", + "integrity": "sha512-/XZLH5CUXGK3laz3xYFNza8ZxLCq8ZNW6MsVw5z3d5hc2AwZzi0fPiySFZHQTdVDOHGs2cGv91aqzWmgBdq2gQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -6121,9 +6125,9 @@ } }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6527,9 +6531,9 @@ } }, "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6847,9 +6851,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", - "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", + "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", "dev": true, "funding": { "type": "github", @@ -9870,9 +9874,9 @@ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -11526,9 +11530,9 @@ } }, "@azure/core-amqp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.0.0.tgz", - "integrity": "sha512-5QhtJ69qLbTKTL3arLHkQCN96C7tqENF4oKkPYp5Pqb+YA5Gh0aREL2aqp98sAT/YB/G8wAfvFLnYB7bUyzFVw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@azure/core-amqp/-/core-amqp-4.1.0.tgz", + "integrity": "sha512-tjnviDypSAgjGBZCPw+sH7vDWz27N+z0xtQewp7+xH17/eb67VH4sApl3XHuxVBro6Y6pOfxCDpqFenOoGWz6Q==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", @@ -11706,9 +11710,9 @@ } }, "@azure/identity": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.3.2.tgz", - "integrity": "sha512-aDLwgMXpNBEXOlfCP9r5Rn+inmbnTbadlOnrKI2dPS9Lpf4gHvpYBV+DEZKttakfJ+qn4iWWb7zONQSO3A4XSA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.0.0.tgz", + "integrity": "sha512-gtPYxIL0kI39Dw4t3HvlbfhOdXqKD2MqDgynlklF0j728j51dcKgRo6FLX0QzpBw/1gGfLxjMXqq3nKOSQ2lmA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", @@ -11717,15 +11721,13 @@ "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.0.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^2.37.1", - "@azure/msal-common": "^13.1.0", - "@azure/msal-node": "^1.17.3", + "@azure/msal-browser": "^3.5.0", + "@azure/msal-node": "^2.5.1", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", "stoppable": "^1.1.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "tslib": "^2.2.0" } }, "@azure/keyvault-secrets": { @@ -11755,24 +11757,24 @@ } }, "@azure/msal-browser": { - "version": "2.38.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.38.0.tgz", - "integrity": "sha512-gxBh83IumHgEP9uMCm9pJLKLRwICMQTxG9TX3AytdNt3oLUI3tytm/szYD5u5zKJgSkhHvwFSM+NPnM04hYw3w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.5.0.tgz", + "integrity": "sha512-2NtMuel4CI3UEelCPKkNRXgKzpWEX48fvxIvPz7s0/sTcCaI08r05IOkH2GkXW+czUOtuY6+oGafJCpumnjRLg==", "requires": { - "@azure/msal-common": "13.2.0" + "@azure/msal-common": "14.4.0" } }, "@azure/msal-common": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-13.2.0.tgz", - "integrity": "sha512-rnstQ7Zgn3fSTKNQO+/YNV34/QXJs0vni7IA0/3QB1EEyrJg14xyRmTqlw9ta+pdSuT5OJwUP8kI3D/rBwUIBw==" + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.4.0.tgz", + "integrity": "sha512-ffCymScQuMKVj+YVfwNI52A5Tu+uiZO2eTf+c+3TXxdAssks4nokJhtr+uOOMxH0zDi6d1OjFKFKeXODK0YLSg==" }, "@azure/msal-node": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.18.0.tgz", - "integrity": "sha512-N6GX1Twxw524e7gaJvj7hKtrPRmZl9qGY7U4pmUdx4XzoWYRFfYk4H1ZjVhQ7pwb5Ks88NNhbXVCagsuYPTEFg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.5.1.tgz", + "integrity": "sha512-PsPRISqCG253HQk1cAS7eJW7NWTbnBGpG+vcGGz5z4JYRdnM2EIXlj1aBpXCdozenEPtXEVvHn2ELleW1w82nQ==", "requires": { - "@azure/msal-common": "13.2.0", + "@azure/msal-common": "14.4.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } @@ -11791,12 +11793,12 @@ } }, "@azure/service-bus": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.2.tgz", - "integrity": "sha512-w8d1/KhlbUz8DvY3Ca7GvoU5cJ8ONV4QBW25OfUk4Br6waAKWY+1wugEThQNCueRKvNlJlJyRbr9T14ibYMZeQ==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@azure/service-bus/-/service-bus-7.9.3.tgz", + "integrity": "sha512-6g37YpVTzRHI75BkYPiB4zqbYhQHM1Jvd+sNfRCbXeRW5FLsWoXgFVTw3Jv5kkMMX1pUNtrkaQhEoeTwtm5v3w==", "requires": { "@azure/abort-controller": "^1.0.0", - "@azure/core-amqp": "^4.0.0", + "@azure/core-amqp": "^4.1.0", "@azure/core-auth": "^1.3.0", "@azure/core-client": "^1.0.0", "@azure/core-paging": "^1.4.0", @@ -12370,16 +12372,16 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-7.3.8.tgz", - "integrity": "sha512-Dj8iSGQyfgIsCjmXk9D/SjV7EpbpQSogeaGcBM66H33pd0GyGmLhn3biRN+vqi/vqWmsp75rT3kd5MKa8X5W9Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.0.0.tgz", + "integrity": "sha512-Phbb1ij1TQQuqxuuvxf5P6fvV9U+EVoATNLmDqFHvRZfUyuhgbJuCMzIPeBx4GfTTDWlPs51FYRvZ/Q8xBHsyA==", "dev": true, "requires": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.26", - "@cspell/dict-cpp": "^5.0.8", + "@cspell/dict-companies": "^3.0.27", + "@cspell/dict-cpp": "^5.0.9", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", "@cspell/dict-css": "^4.0.12", @@ -12388,35 +12390,36 @@ "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.9", + "@cspell/dict-en_us": "^4.3.11", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.1", + "@cspell/dict-filetypes": "^3.0.2", "@cspell/dict-fonts": "^4.0.0", - "@cspell/dict-fsharp": "^1.0.0", + "@cspell/dict-fsharp": "^1.0.1", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.3", + "@cspell/dict-golang": "^6.0.4", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", "@cspell/dict-java": "^5.0.6", - "@cspell/dict-k8s": "^1.0.1", + "@cspell/dict-k8s": "^1.0.2", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", "@cspell/dict-lua": "^4.0.2", + "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", "@cspell/dict-npm": "^5.0.12", - "@cspell/dict-php": "^4.0.3", + "@cspell/dict-php": "^4.0.4", "@cspell/dict-powershell": "^5.0.2", "@cspell/dict-public-licenses": "^2.0.5", - "@cspell/dict-python": "^4.1.9", + "@cspell/dict-python": "^4.1.10", "@cspell/dict-r": "^2.0.1", "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.6", + "@cspell/dict-software-terms": "^3.3.9", "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", @@ -12425,39 +12428,39 @@ } }, "@cspell/cspell-json-reporter": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-7.3.8.tgz", - "integrity": "sha512-FxYJWtDgxIQYxdP0RWwRV8nzLfxVx8D8D5L2sbbP/0NFczDbq/zWYep4nSAHJT10aUJrogsVUYwNwdkr562wKA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.0.0.tgz", + "integrity": "sha512-1ltK5N4xMGWjDSIkU+GJd3rXV8buXgO/lAgnpM1RhKWqAmG+u0k6pnhk2vIo/4qZQpgfK0l3J3h/Ky2FcE95vA==", "dev": true, "requires": { - "@cspell/cspell-types": "7.3.8" + "@cspell/cspell-types": "8.0.0" } }, "@cspell/cspell-pipe": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-7.3.8.tgz", - "integrity": "sha512-/vKPfiHM5bJUkNX12w9j533Lm2JvvSMKUCChM2AxYjy6vL8prc/7ei++4g2xAWwRxLZPg2OfpDJS5EirZNBJdA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.0.0.tgz", + "integrity": "sha512-1MH+9q3AmbzwK1BYhSGla8e4MAAYzzPApGvv8eyv0rWDmgmDTkGqJPTTvYj1wFvll5ximQ5OolpPQGv3JoWvtQ==", "dev": true }, "@cspell/cspell-resolver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-7.3.8.tgz", - "integrity": "sha512-CeyQmhqZI5a+T7a6oiVN90TFlzU3qVVYqCaZ9grFrVOsmzY9ipH5gmqfgMavaBOqb0di/+VZS8d02suMOXcKLQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.0.0.tgz", + "integrity": "sha512-gtALHFLT2vSZ7BZlIg26AY3W9gkiqxPGE75iypWz06JHJs05ngnAR+h6VOu0+rmgx98hNfzPPEh4g+Tjm8Ma0A==", "dev": true, "requires": { "global-dirs": "^3.0.1" } }, "@cspell/cspell-service-bus": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-7.3.8.tgz", - "integrity": "sha512-3E7gwY6QILrZH83p69i9CERbRBEqeBiKCIKnAd7U2PbxfFqG/P47fqpnarzSWFwFpU92oyGsYry+wC8TEGISRQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.0.0.tgz", + "integrity": "sha512-1EYhIHoZnhxpfEp6Bno6yVWYBuYfaQrwIfeDMntnezUcSmi7RyroQEcp5U7sLv69vhRD2c81o7r8iUaAbPSmIg==", "dev": true }, "@cspell/cspell-types": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-7.3.8.tgz", - "integrity": "sha512-hsOtaULDnawEL4pU0fga941GhvE8mbTbywrJBx+eGX3fnJsaUr8XQzCtnLsW2ko7WCLWFItNEhSSTPQHBFRLsw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.0.0.tgz", + "integrity": "sha512-dPdxQI8dLJoJEjylaPYfCJNnm2XNMYPuowHE2FMcsnFR9hEchQAhnKVc/aD63IUYnUtUrPxPlUJdoAoj569e+g==", "dev": true }, "@cspell/dict-ada": { @@ -12479,9 +12482,9 @@ "dev": true }, "@cspell/dict-companies": { - "version": "3.0.26", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.26.tgz", - "integrity": "sha512-BGRZ/Uykx+IgQoTGqvRqbBMQy7QSuY0pbTHgtmKtc1scgzZMJQKMDwyuE6LJzlhdlrV7TsVY0lyXREybnDpQPQ==", + "version": "3.0.27", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.27.tgz", + "integrity": "sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ==", "dev": true }, "@cspell/dict-cpp": { @@ -12563,9 +12566,9 @@ "dev": true }, "@cspell/dict-filetypes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.1.tgz", - "integrity": "sha512-8z8mY1IbrTyTRumx2vvD9yzRhNMk9SajM/GtI5hdMM2pPpNSp25bnuauzjRf300eqlqPY2MNb5MmhBFO014DJw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.2.tgz", + "integrity": "sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg==", "dev": true }, "@cspell/dict-fonts": { @@ -12652,6 +12655,12 @@ "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", "dev": true }, + "@cspell/dict-makefile": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz", + "integrity": "sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==", + "dev": true + }, "@cspell/dict-node": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", @@ -12683,9 +12692,9 @@ "dev": true }, "@cspell/dict-python": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.9.tgz", - "integrity": "sha512-JMA4v/ZPJWuDt3PPFz+23VIY3iDIB+xOTQ6nw+WkcJU5yr6FUl5zMU9ModKrgujg3jGRuuJqofErZVPqHNHYAA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.10.tgz", + "integrity": "sha512-ErF/Ohcu6Xk4QVNzFgo8p7CxkxvAKAmFszvso41qOOhu8CVpB35ikBRpGVDw9gsCUtZzi15Yl0izi4do6WcLkA==", "dev": true, "requires": { "@cspell/dict-data-science": "^1.0.11" @@ -12716,9 +12725,9 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.8.tgz", - "integrity": "sha512-zcwPl+EA5kWyWzPiwE2eF21ltKshzZ5NQ4kKCaND9uo4oeqTrD7hG8FTJTd7kz7GNhNqbT0G1SVMC2BtI+UpVQ==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.9.tgz", + "integrity": "sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA==", "dev": true }, "@cspell/dict-sql": { @@ -12752,18 +12761,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-7.3.8.tgz", - "integrity": "sha512-s8x7dH/ScfW0pFEIvNFo4JOR7YmvM2wZSHOykmWTJCQ8k2EQ/+uECPp6ZxkoJoukTz8sj+3KzF0fRl5mKxPd6g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.0.0.tgz", + "integrity": "sha512-HNkCepopgiEGuI1QGA6ob4+ayvoSMxvAqetLxP0u1sZzc50LH2DEWwotcNrpVdzZOtERHvIBcGaQKIBEx8pPRQ==", "dev": true, "requires": { - "import-meta-resolve": "^3.0.0" + "import-meta-resolve": "^3.1.1" } }, "@cspell/strong-weak-map": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-7.3.8.tgz", - "integrity": "sha512-qNnt2wG45wb8JP54mENarnQgxfSYKPp3zlYID/2przbMNmVJRqUlcIBOdLI6plCgGeNkzJTl3T9T1ATbnN+LLw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.0.0.tgz", + "integrity": "sha512-fRlqPSdpdub52vFtulDgLPzGPGe75I04ScId1zOO9ABP7/ro8VmaG//m1k7hsPkm6h7FG4jWympoA3aXDAcXaA==", "dev": true }, "@cspotcode/source-map-support": { @@ -12803,9 +12812,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -12820,9 +12829,9 @@ } }, "@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", + "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", "dev": true }, "@hapi/boom": { @@ -13814,27 +13823,27 @@ } }, "@types/cors": { - "version": "2.8.15", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", - "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", + "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/debug": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", - "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.11.tgz", + "integrity": "sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==", "dev": true, "requires": { "@types/ms": "*" } }, "@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -13853,9 +13862,9 @@ } }, "@types/express-session": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.9.tgz", - "integrity": "sha512-yIqficLlTPdloeEPhOVenpOUWILkdaXHUWhTOqFGx9JoSuTgeatNjb97k8VvJehbTk0kUSUAHy5r27PXMga89Q==", + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.17.10.tgz", + "integrity": "sha512-U32bC/s0ejXijw5MAzyaV4tuZopCh/K7fPoUDyNbsRXHvPSeymygYD1RFL99YOLhF5PNOkzswvOTRaVHdL1zMw==", "dev": true, "requires": { "@types/express": "*" @@ -13903,9 +13912,9 @@ } }, "@types/jest": { - "version": "29.5.7", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.7.tgz", - "integrity": "sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==", + "version": "29.5.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", + "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13913,9 +13922,9 @@ } }, "@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/jsonwebtoken": { @@ -13927,21 +13936,21 @@ } }, "@types/lodash": { - "version": "4.14.200", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz", - "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==", + "version": "4.14.201", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", + "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", "dev": true }, "@types/luxon": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.3.tgz", - "integrity": "sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.4.tgz", + "integrity": "sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==", "dev": true }, "@types/memory-cache": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.4.tgz", - "integrity": "sha512-yUj2q3Iav0kuefl+qGtn3d3nZtYDlMG1CI3DYe1UDfJb3zqnH1w1oE8R0lhv1sSua0CR0cAvCgNUzQHahGFI4g==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@types/memory-cache/-/memory-cache-0.2.5.tgz", + "integrity": "sha512-OIKRDDZUFeKT/rsko7/CGnR5qE8xTU8ogzyaaSDSHGkKwlSB/E6RopSF5fReo89khCAcGIoqSi723tDqUe6gYw==", "dev": true }, "@types/mime": { @@ -13950,9 +13959,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/morgan": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.7.tgz", - "integrity": "sha512-4sJFBUBrIZkP5EvMm1L6VCXp3SQe8dnXqlVpe1jsmTjS1JQVmSjnpMNs8DosQd6omBi/K7BSKJ6z/Mc3ki0K9g==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", "dev": true, "requires": { "@types/node": "*" @@ -13965,9 +13974,9 @@ "dev": true }, "@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "requires": { "undici-types": "~5.26.4" } @@ -13994,9 +14003,9 @@ } }, "@types/node-jose": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.12.tgz", - "integrity": "sha512-HtSXbirRMuONr/KSNtBgh631xCt/t3lPz0geQ4pe/FA+yu06TUrJrXEU5y8nJFHNy8KhiZrq6OVlqXD1AtT/dQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@types/node-jose/-/node-jose-1.1.13.tgz", + "integrity": "sha512-QjMd4yhwy1EvSToQn0YI3cD29YhyfxFwj7NecuymjLys2/P0FwxWnkgBlFxCai6Y3aBCe7rbwmqwJJawxlgcXw==", "dev": true, "requires": { "@types/node": "*" @@ -14012,9 +14021,9 @@ } }, "@types/object-path": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.3.tgz", - "integrity": "sha512-P6V8jUKl0qA/U5ZAWW1y/BxeFf/R3yZucVGnHtD1qRXmFPndKZK4iZ49qX73R0FIwZnk0yKYixmqtYrPtManaA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==", "dev": true }, "@types/parse-json": { @@ -14024,18 +14033,18 @@ "dev": true }, "@types/passport": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", - "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", + "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", "dev": true, "requires": { "@types/express": "*" } }, "@types/passport-azure-ad": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.3.tgz", - "integrity": "sha512-dRkF6PXKNAdsQBKLMqHIhnN84KFU94t/p6nJqJAEkP0ux9itsyzM8agErgjYsA7pJ92eVKz8dqzyHpeyM3Tiqw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.4.tgz", + "integrity": "sha512-1sshz8MfQs5DxWYGGX/1XhRYYREjlL3gSzoU38G9BxqijVmPIjAhFbP/PvmbqK05WlLF5VVBhNgt1DmX7Dh6IA==", "dev": true, "requires": { "@types/express": "*", @@ -14043,9 +14052,9 @@ } }, "@types/passport-github": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.11.tgz", - "integrity": "sha512-V2t1/P8BnnFX8AOYpk0ep9p4p7u2V1KdQBSUIvSvcxMseu7n2+cTLCr3rat8K876caQ1C95Y9vprVBbtLVVYXg==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@types/passport-github/-/passport-github-1.1.12.tgz", + "integrity": "sha512-VJpMEIH+cOoXB694QgcxuvWy2wPd1Oq3gqrg2Y9DMVBYs9TmH9L14qnqPDZsNMZKBDH+SvqRsGZj9SgHYeDgcA==", "dev": true, "requires": { "@types/express": "*", @@ -14065,9 +14074,9 @@ } }, "@types/pg": { - "version": "8.10.7", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.7.tgz", - "integrity": "sha512-ksJqHipwYaSEHz9e1fr6H6erjoEdNNaOxwyJgPx9bNeaqOW3iWBQgVHfpwiSAoqGzchfc+ZyRLwEfeCcyYD3uQ==", + "version": "8.10.9", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.10.9.tgz", + "integrity": "sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ==", "dev": true, "requires": { "@types/node": "*", @@ -14120,9 +14129,9 @@ } }, "@types/pug": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.8.tgz", - "integrity": "sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", + "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", "dev": true }, "@types/qs": { @@ -14136,18 +14145,18 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-fhOVQ23ki+GB0WGmJJF9OwPBjel2Iv02pmEv58T0DZqIAlKnyhAaC2E9/LuKQLIZF88w7ivXSZXJtvEXGXFgeQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.4.tgz", + "integrity": "sha512-84REEGT3lcgopvpkmGApzmU5UEG0valme5rQS/KGiguTkJ70/Au8UYZTyrzoZnY9svuX9351+1uvrRPzWDD/uw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "@types/serve-static": { @@ -14165,9 +14174,9 @@ "integrity": "sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==" }, "@types/simple-oauth2": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.6.tgz", - "integrity": "sha512-i1tx1TwdET6m9tit+p+pWABuNWz0W8LThmzwh+cYC9yKJTXD3q3zPWOwstuL8/ELO0HoE0f9r/yYQ3XHaiTjrw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/simple-oauth2/-/simple-oauth2-5.0.7.tgz", + "integrity": "sha512-8JbWVJbiTSBQP/7eiyGKyXWAqp3dKQZpaA+pdW16FCi32ujkzRMG8JfjoAzdWt6W8U591ZNdHcPtP2D7ILTKuA==", "dev": true }, "@types/stack-utils": { @@ -14185,9 +14194,9 @@ } }, "@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==", + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==", "dev": true }, "@types/yargs": { @@ -14206,16 +14215,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz", - "integrity": "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", + "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/type-utils": "6.10.0", + "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14225,54 +14234,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", + "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" } }, "@typescript-eslint/type-utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz", - "integrity": "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", + "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/utils": "6.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14281,27 +14290,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz", - "integrity": "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", + "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.10.0", + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/typescript-estree": "6.10.0", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", "dev": true, "requires": { - "@typescript-eslint/types": "6.9.1", + "@typescript-eslint/types": "6.10.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -14541,9 +14550,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -15297,23 +15306,23 @@ } }, "cspell": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-7.3.8.tgz", - "integrity": "sha512-8AkqsBQAMsKYV5XyJLB6rBs5hgspL4+MPOg6mBKG2j5EvQgRVc6dIfAPWDNLpIeW2a3+7K5BIWqKHapKPeiknQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.0.0.tgz", + "integrity": "sha512-Nayy25Dh+GAlDFDpVZaQhmidP947rpj1Pn9lmZ3nUFjD9W/yj0h0vrjMLMN4dbonddkmKh4t51C+7NuMP405hg==", "dev": true, "requires": { - "@cspell/cspell-json-reporter": "7.3.8", - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8", - "@cspell/dynamic-import": "7.3.8", + "@cspell/cspell-json-reporter": "8.0.0", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0", + "@cspell/dynamic-import": "8.0.0", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.1.0", - "cspell-gitignore": "7.3.8", - "cspell-glob": "7.3.8", - "cspell-io": "7.3.8", - "cspell-lib": "7.3.8", - "fast-glob": "^3.3.1", + "cspell-gitignore": "8.0.0", + "cspell-glob": "8.0.0", + "cspell-io": "8.0.0", + "cspell-lib": "8.0.0", + "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^7.0.1", "get-stdin": "^9.0.0", @@ -15355,14 +15364,14 @@ } }, "cspell-dictionary": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-7.3.8.tgz", - "integrity": "sha512-gkq4t78eLR0xC3P0vDDHPeNY4iZRd5YE6Z8uDJ7RM4UaX/TSdVUN9KNFr34RnJ119NYVHujpL9+uW7wPSAe8Eg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.0.0.tgz", + "integrity": "sha512-R/AzUj7W7F4O4fAOL8jvIiUqPYGy6jIBlDkxO9SZe/A6D2kOICZZzGSXMZ0M7OKYqxc6cioQUMKOJsLkDXfDXw==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8", - "cspell-trie-lib": "7.3.8", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0", + "cspell-trie-lib": "8.0.0", "fast-equals": "^4.0.3", "gensequence": "^6.0.0" }, @@ -15376,65 +15385,64 @@ } }, "cspell-gitignore": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-7.3.8.tgz", - "integrity": "sha512-vJzCOUEiw6/MwV/U4Ux3bgSdj9mXB+X5eHL+qzVoyFI7ArlvrkuGTL+iFJThQcS8McM3SGqtvaBNCiKBmAeCkA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.0.0.tgz", + "integrity": "sha512-Uv+ENdUm+EXwQuG9187lKmE1t8b2KW+6VaQHP7r01WiuhkwhfzmWA7C30iXVcwRcsMw07wKiWvMEtG6Zlzi6lQ==", "dev": true, "requires": { - "cspell-glob": "7.3.8", + "cspell-glob": "8.0.0", "find-up": "^5.0.0" } }, "cspell-glob": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-7.3.8.tgz", - "integrity": "sha512-wUZC6znyxEs0wlhzGfZ4XHkATPJyazJIFi/VvAdj+KHe7U8SoSgitJVDQqdgectI2y3MxR7lQdVLX9dONFh+7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.0.0.tgz", + "integrity": "sha512-wOkRA1OTIPhyN7a+k9Qq45yFXM+tBFi9DS5ObiLv6t6VTBIeMQpwRK0KLViHmjTgiA6eWx53Dnr+DZfxcAkcZA==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-7.3.8.tgz", - "integrity": "sha512-nTjAlMAZAVSFhBd9U3MB9l5FfC5JCCr9DTOA2wWxusVOm+36MbSEH90ucLPkhPa9/+0HtbpDhqVMwXCZllRpsg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.0.0.tgz", + "integrity": "sha512-uxpRvbBxOih6SjFQvKTBPTA+YyqYM5UFTNTFuRnA6g6WZeg+NJaTkbQrTgXja4B2r8MJ6XU22YrKTtHNNcP7bQ==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8" + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0" } }, "cspell-io": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-7.3.8.tgz", - "integrity": "sha512-XrxPbaiek7EZh+26k9RYVz2wKclaMqM6mXBiu/kpFAHRHHfz91ado6xWvyxZ7UAxQ8ixEwZ+oz9TU+k21gHzyw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.0.0.tgz", + "integrity": "sha512-NVdVmQd7SU/nxYwWtO/6gzux/kp1Dt36zKds0+QHZhQ18JJjXduF5e+WUttqKi2oj/vvmjiG4HGFKQVDBcBz3w==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "7.3.8", - "node-fetch": "^2.7.0" + "@cspell/cspell-service-bus": "8.0.0" } }, "cspell-lib": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-7.3.8.tgz", - "integrity": "sha512-2L770sI5DdsAKVzO3jxmfP2fz4LryW6dzL93BpN7WU+ebFC6rg4ioa5liOJV4WoDo2fNQMSeqfW4Aawu9zWR7A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.0.0.tgz", + "integrity": "sha512-X/BzUjrzHOx7YlhvSph/OlMu1RmCTnybeZvIE67d1Pd7wT1TmZhFTnmvruUhoHxWEudOEe4HjzuNL9ph6Aw+aA==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "7.3.8", - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-resolver": "7.3.8", - "@cspell/cspell-types": "7.3.8", - "@cspell/dynamic-import": "7.3.8", - "@cspell/strong-weak-map": "7.3.8", + "@cspell/cspell-bundled-dicts": "8.0.0", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-resolver": "8.0.0", + "@cspell/cspell-types": "8.0.0", + "@cspell/dynamic-import": "8.0.0", + "@cspell/strong-weak-map": "8.0.0", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", "cosmiconfig": "8.0.0", - "cspell-dictionary": "7.3.8", - "cspell-glob": "7.3.8", - "cspell-grammar": "7.3.8", - "cspell-io": "7.3.8", - "cspell-trie-lib": "7.3.8", + "cspell-dictionary": "8.0.0", + "cspell-glob": "8.0.0", + "cspell-grammar": "8.0.0", + "cspell-io": "8.0.0", + "cspell-trie-lib": "8.0.0", "fast-equals": "^5.0.1", "find-up": "^6.3.0", "gensequence": "^6.0.0", @@ -15496,13 +15504,13 @@ } }, "cspell-trie-lib": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-7.3.8.tgz", - "integrity": "sha512-UQx1Bazbyz2eQJ/EnMohINnUdZvAQL+OcQU3EPPbNWM1DWF4bJGgmFXKNCRYfJk6wtOZVXG5g5AZXx9KnHeN9A==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.0.0.tgz", + "integrity": "sha512-0rC5e1C0uM78uuS+lC1T18EojWZyNvq4bPOPCisnwuhuWrAfCqrFrX/qDNslWk3VTOPbsEMlFj6OnIGQnfwSKg==", "dev": true, "requires": { - "@cspell/cspell-pipe": "7.3.8", - "@cspell/cspell-types": "7.3.8", + "@cspell/cspell-pipe": "8.0.0", + "@cspell/cspell-types": "8.0.0", "gensequence": "^6.0.0" } }, @@ -15821,15 +15829,15 @@ "dev": true }, "eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.53.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", + "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.53.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -15884,9 +15892,9 @@ } }, "eslint-plugin-n": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz", - "integrity": "sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.0.tgz", + "integrity": "sha512-/XZLH5CUXGK3laz3xYFNza8ZxLCq8ZNW6MsVw5z3d5hc2AwZzi0fPiySFZHQTdVDOHGs2cGv91aqzWmgBdq2gQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", @@ -16182,9 +16190,9 @@ "dev": true }, "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -16474,9 +16482,9 @@ } }, "globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -16686,9 +16694,9 @@ } }, "import-meta-resolve": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", - "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", + "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", "dev": true }, "imurmurhash": { @@ -18964,9 +18972,9 @@ "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "pure-rand": { diff --git a/package.json b/package.json index dab495de0..fc49020e1 100644 --- a/package.json +++ b/package.json @@ -67,9 +67,9 @@ "dependencies": { "@azure/cosmos": "4.0.0", "@azure/data-tables": "13.2.2", - "@azure/identity": "3.3.2", + "@azure/identity": "4.0.0", "@azure/keyvault-secrets": "4.7.0", - "@azure/service-bus": "7.9.2", + "@azure/service-bus": "7.9.3", "@azure/storage-blob": "12.16.0", "@azure/storage-queue": "12.15.0", "@octokit/plugin-paginate-graphql": "4.0.0", @@ -80,7 +80,7 @@ "app-root-path": "3.1.0", "applicationinsights": "2.9.0", "async-prompt": "1.0.1", - "axios": "1.6.0", + "axios": "1.6.1", "basic-auth": "2.0.1", "body-parser": "1.20.2", "color-contrast-checker": "2.1.0", @@ -128,33 +128,33 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/cors": "2.8.15", - "@types/debug": "4.1.10", - "@types/express": "4.17.20", - "@types/express-session": "1.17.9", - "@types/jest": "29.5.7", - "@types/lodash": "4.14.200", - "@types/luxon": "3.3.3", - "@types/memory-cache": "0.2.4", - "@types/morgan": "1.9.7", - "@types/node": "20.8.10", - "@types/node-jose": "1.1.12", - "@types/object-path": "0.11.3", - "@types/passport": "1.0.14", - "@types/passport-azure-ad": "4.3.3", - "@types/passport-github": "1.1.11", - "@types/pg": "8.10.7", - "@types/pug": "2.0.8", - "@types/recursive-readdir": "2.2.3", - "@types/semver": "7.5.4", - "@types/simple-oauth2": "5.0.6", - "@types/validator": "13.11.5", - "@typescript-eslint/eslint-plugin": "6.9.1", - "@typescript-eslint/parser": "6.9.1", - "cspell": "7.3.8", - "eslint": "8.52.0", + "@types/cors": "2.8.16", + "@types/debug": "4.1.11", + "@types/express": "4.17.21", + "@types/express-session": "1.17.10", + "@types/jest": "29.5.8", + "@types/lodash": "4.14.201", + "@types/luxon": "3.3.4", + "@types/memory-cache": "0.2.5", + "@types/morgan": "1.9.9", + "@types/node": "20.9.0", + "@types/node-jose": "1.1.13", + "@types/object-path": "0.11.4", + "@types/passport": "1.0.15", + "@types/passport-azure-ad": "4.3.4", + "@types/passport-github": "1.1.12", + "@types/pg": "8.10.9", + "@types/pug": "2.0.9", + "@types/recursive-readdir": "2.2.4", + "@types/semver": "7.5.5", + "@types/simple-oauth2": "5.0.7", + "@types/validator": "13.11.6", + "@typescript-eslint/eslint-plugin": "6.10.0", + "@typescript-eslint/parser": "6.10.0", + "cspell": "8.0.0", + "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.2.0", + "eslint-plugin-n": "16.3.0", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", From cdf8fdaeb68fb4e47b66a53fe85ba81759635504 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:09:58 -0500 Subject: [PATCH 47/69] Deps --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index fc49020e1..ad3c1467c 100644 --- a/package.json +++ b/package.json @@ -70,15 +70,15 @@ "@azure/identity": "4.0.0", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.3", - "@azure/storage-blob": "12.16.0", - "@azure/storage-queue": "12.15.0", + "@azure/storage-blob": "12.17.0", + "@azure/storage-queue": "12.16.0", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.4", + "@octokit/request": "8.1.5", "@octokit/auth-app": "6.0.1", "@octokit/rest": "20.0.2", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", - "applicationinsights": "2.9.0", + "applicationinsights": "2.9.1", "async-prompt": "1.0.1", "axios": "1.6.1", "basic-auth": "2.0.1", @@ -129,7 +129,7 @@ }, "devDependencies": { "@types/cors": "2.8.16", - "@types/debug": "4.1.11", + "@types/debug": "4.1.12", "@types/express": "4.17.21", "@types/express-session": "1.17.10", "@types/jest": "29.5.8", @@ -154,7 +154,7 @@ "cspell": "8.0.0", "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.3.0", + "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", From c18cc72eec6d135dedd3b9765d56958fee48c387 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:10:07 -0500 Subject: [PATCH 48/69] Dictionary update --- .cspell.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.cspell.json b/.cspell.json index 8ae2626fd..ffbf04cb2 100644 --- a/.cspell.json +++ b/.cspell.json @@ -390,7 +390,6 @@ "KEYVAULT", "KHTML", "kubeconfig", - "Kusto", "kusto", "KUSTO", "labeljust", From 9bf880975f548a788106c12edd0b6cd2920d3539 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:10:20 -0500 Subject: [PATCH 49/69] Dockerfile: quieter tdnf --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 43794ac39..320494b8d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,9 +10,9 @@ FROM $IMAGE_NAME AS build ARG NPM_TOKEN # Make Git available for NPM and rsync in the build image -RUN tdnf -y update && \ - tdnf -y install ca-certificates git && \ - tdnf clean all +RUN tdnf -y update --quiet && \ + tdnf -y install ca-certificates git --quiet && \ + tdnf clean all --quiet WORKDIR /build From 00eb7c2ddc27ec02a45a4f237f728ec7575c0c33 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:24:15 -0500 Subject: [PATCH 50/69] Custom properties, token refactor, open access teams - Removes CENTRAL_OPERATIONS_TOKEN - System teams - open access - adds open access concept, which is a broad access team anyone in the org can join without approval - open access teams are not recommended the same way as broad access teams during new repo setup - TypeScript: prefer types to interfaces - GitHub Apps and REST APIs: - Simplifying bound function calls - Relocated app and token management files - Improves types for header/tokens - Allow custom app purposes to retrieve app token instances - Custom app purpose debug display fix - PAT/app token type identification helper method - Collections now expose "collectAllPages" and "collectAllPagesViaHttpGet" to move specific code out of the file - Fix for custom apps initialized after startup - Custom Properties Beta support --- .secrets.env.example | 1 - api/client/context/organization/index.ts | 1 - api/client/newOrgRepo.ts | 6 + business/account.ts | 17 +- business/application.ts | 10 +- business/domains.ts | 25 +- business/operations/core.ts | 91 ++++++- business/operations/index.ts | 184 +++++++------ business/organization.ts | 106 ++++---- business/organizationCopilot.ts | 10 +- business/organizationProperties.ts | 242 ++++++++++++++++++ business/project.ts | 25 +- business/projectView.ts | 25 +- business/projects.ts | 25 +- business/repository.ts | 38 ++- business/repositoryActions.ts | 18 +- business/repositoryIssue.ts | 17 +- business/repositoryProject.ts | 18 +- business/repositoryProjectCard.ts | 19 +- business/repositoryProjectColumn.ts | 14 +- business/repositoryPullRequest.ts | 17 +- business/team.ts | 29 ++- config/github.operations.json | 1 - config/github.organizations.types.ts | 1 + docs/configuration.md | 2 +- .../organizationSetting.ts | 40 ++- features/newRepositories/actions/lockdown.ts | 6 +- interfaces/github/operations.ts | 11 +- interfaces/github/rest.ts | 23 +- .../index.ts => lib/github/appPurposes.ts | 9 +- .../githubApps => lib/github}/appTokens.ts | 53 +++- lib/github/collections.ts | 100 ++++++-- lib/github/composite.ts | 8 +- lib/github/core.ts | 4 +- lib/github/crossOrganization.ts | 26 +- lib/github/index.ts | 71 +++-- lib/github/restApi.ts | 12 +- .../githubApps => lib/github}/tokenManager.ts | 175 +++++++++++-- middleware/initialize.ts | 12 +- package-lock.json | 128 ++++++--- routes/administration/app.ts | 17 +- routes/org/repos.ts | 4 +- routes/org/team/index.ts | 23 +- webhooks/tasks/automaticTeams.ts | 2 +- 44 files changed, 1168 insertions(+), 498 deletions(-) create mode 100644 business/organizationProperties.ts rename business/githubApps/index.ts => lib/github/appPurposes.ts (97%) rename {business/githubApps => lib/github}/appTokens.ts (80%) rename {business/githubApps => lib/github}/tokenManager.ts (71%) diff --git a/.secrets.env.example b/.secrets.env.example index a81c4a1ee..896300ed7 100644 --- a/.secrets.env.example +++ b/.secrets.env.example @@ -1,4 +1,3 @@ -GITHUB_CENTRAL_OPERATIONS_TOKEN= GITHUB_CLIENT_ID= GITHUB_CLIENT_SECRET= GITHUB_CALLBACK_URL=http://localhost:3000/auth/github/callback diff --git a/api/client/context/organization/index.ts b/api/client/context/organization/index.ts index 3d39a1e77..f410aa286 100644 --- a/api/client/context/organization/index.ts +++ b/api/client/context/organization/index.ts @@ -115,7 +115,6 @@ router.get( } const userAggregateContext = activeContext.aggregations; const maintainedTeams = new Set(); - const broadTeams = new Set(req.organization.broadAccessTeams); const userTeams = userAggregateContext.reduceOrganizationTeams( organization, await userAggregateContext.teams() diff --git a/api/client/newOrgRepo.ts b/api/client/newOrgRepo.ts index cde490050..f4dd18efe 100644 --- a/api/client/newOrgRepo.ts +++ b/api/client/newOrgRepo.ts @@ -51,6 +51,7 @@ router.get( const userAggregateContext = req.apiContext.aggregations; const maintainedTeams = new Set(); const broadTeams = new Set(req.organization.broadAccessTeams); + const openAccessTeams = new Set(req.organization.openAccessTeams); const userTeams = userAggregateContext.reduceOrganizationTeams( organization, await userAggregateContext.teams() @@ -62,6 +63,7 @@ router.get( const personalizedTeams = Array.from(combinedTeams.values()).map((combinedTeam) => { return { broad: broadTeams.has(Number(combinedTeam.id)), + isOpenAccessTeam: openAccessTeams.has(Number(combinedTeam.id)), description: combinedTeam.description, id: Number(combinedTeam.id), name: combinedTeam.name, @@ -86,6 +88,7 @@ router.get( const queryCache = providers.queryCache; const organization = req.organization as Organization; const broadTeams = new Set(organization.broadAccessTeams); + const openAccessTeams = new Set(req.organization.openAccessTeams); if (req.query.refresh === undefined && queryCache && queryCache.supportsTeams) { // Use the newer method in this case... const organizationTeams = await queryCache.organizationTeams(organization.id.toString()); @@ -96,6 +99,9 @@ router.get( if (broadTeams.has(Number(t.id))) { t['broad'] = true; } + if (openAccessTeams.has(Number(t.id))) { + t['openAccess'] = true; + } return t; }), }) as unknown as void; diff --git a/business/account.ts b/business/account.ts index 17a6277a0..b35dff849 100644 --- a/business/account.ts +++ b/business/account.ts @@ -10,7 +10,7 @@ import * as common from './common'; import { wrapError } from '../utils'; import { corporateLinkToJson } from './corporateLink'; import { Organization } from './organization'; -import { AppPurpose } from './githubApps'; +import { AppPurpose } from '../lib/github/appPurposes'; import { ILinkProvider } from '../lib/linkProviders'; import { CacheDefault, getMaxAgeSeconds } from '.'; import { @@ -18,7 +18,7 @@ import { CoreCapability, ICacheOptions, ICorporateLink, - IGetAuthorizationHeader, + GetAuthorizationHeader, IGitHubAccountDetails, IOperationsInstance, IOperationsLinks, @@ -46,7 +46,7 @@ const secondaryAccountProperties = []; export class Account { private _operations: IOperationsInstance; - private _getAuthorizationHeader: IGetAuthorizationHeader; + private _getAuthorizationHeader: GetAuthorizationHeader; private _link: ICorporateLink; private _id: number; @@ -137,7 +137,7 @@ export class Account { return this._originalEntity ? this._originalEntity.name : undefined; } - constructor(entity, operations: IOperationsInstance, getAuthorizationHeader: IGetAuthorizationHeader) { + constructor(entity, operations: IOperationsInstance, getAuthorizationHeader: GetAuthorizationHeader) { common.assignKnownFieldsPrefixed( this, entity, @@ -150,7 +150,7 @@ export class Account { this._getAuthorizationHeader = getAuthorizationHeader; } - overrideAuthorization(getAuthorizationHeader: IGetAuthorizationHeader) { + overrideAuthorization(getAuthorizationHeader: GetAuthorizationHeader) { this._getAuthorizationHeader = getAuthorizationHeader; } @@ -571,11 +571,8 @@ export class Account { return { history, error }; } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/application.ts b/business/application.ts index c837d95b8..cd8c37ce3 100644 --- a/business/application.ts +++ b/business/application.ts @@ -7,7 +7,7 @@ import { OrganizationSetting } from '../entities/organizationSettings/organizati import { IOperationsGitHubRestLibrary, IOperationsDefaultCacheTimes, - IGetAuthorizationHeader, + GetAuthorizationHeader, IGitHubAppInstallation, ICacheOptions, } from '../interfaces'; @@ -50,7 +50,7 @@ export default class GitHubApplication { public id: number, public slug: string, public friendlyName: string, - private getAuthorizationHeader: IGetAuthorizationHeader + private getAuthorizationHeader: GetAuthorizationHeader ) {} static PrimaryInstallationProperties = primaryInstallationProperties; @@ -115,7 +115,7 @@ export default class GitHubApplication { async getInstallations(options?: ICacheOptions): Promise { options = options || {}; const operations = this.operations; - const getAuthorizationHeader = this.getAuthorizationHeader.bind(this) as IGetAuthorizationHeader; + const getAuthorizationHeader = this.getAuthorizationHeader.bind(this) as GetAuthorizationHeader; const github = operations.github; const caching = { maxAgeSeconds: options.maxAgeSeconds || operations.defaults.orgRepoDetailsStaleSeconds, // borrowing from another value @@ -132,8 +132,8 @@ export default class GitHubApplication { return installations; } - private authorize(): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this.getAuthorizationHeader.bind(this) as IGetAuthorizationHeader; + private authorize(): GetAuthorizationHeader | string { + const getAuthorizationHeader = this.getAuthorizationHeader.bind(this) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/domains.ts b/business/domains.ts index d283dac00..db5f42f5b 100644 --- a/business/domains.ts +++ b/business/domains.ts @@ -3,13 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { Organization } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, throwIfNotGitHubCapable, - IGetAuthorizationHeader, + GetAuthorizationHeader, } from '../interfaces'; import { decorateIterable, @@ -44,15 +44,15 @@ export class OrganizationDomains { private _organization: Organization; private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _purpose: AppPurpose; constructor( organization: Organization, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader ) { this._getAuthorizationHeader = getAuthorizationHeader; this._getSpecificAuthorizationHeader = getSpecificAuthorizationHeader; @@ -110,19 +110,16 @@ export class OrganizationDomains { } } - private authorize(purpose: AppPurpose = this._purpose): IGetAuthorizationHeader { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose = this._purpose): GetAuthorizationHeader { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/operations/core.ts b/business/operations/core.ts index 13f8dad5e..4a56d132f 100644 --- a/business/operations/core.ts +++ b/business/operations/core.ts @@ -4,8 +4,13 @@ // import { OrganizationSetting } from '../../entities/organizationSettings/organizationSetting'; -import { GitHubAppAuthenticationType, AppPurpose, ICustomAppPurpose, AppPurposeTypes } from '../githubApps'; -import { GitHubTokenManager } from '../githubApps/tokenManager'; +import { + GitHubAppAuthenticationType, + AppPurpose, + ICustomAppPurpose, + AppPurposeTypes, +} from '../../lib/github/appPurposes'; +import { GitHubTokenManager } from '../../lib/github/tokenManager'; import { IProviders, ICacheDefaultTimes, @@ -19,9 +24,11 @@ import { throwIfNotGitHubCapable, throwIfNotCapable, IOperationsCentralOperationsToken, - IAuthorizationHeaderValue, + AuthorizationHeaderValue, SiteConfiguration, ExecutionEnvironment, + IPagedCacheOptions, + ICacheOptionsWithPurpose, } from '../../interfaces'; import { RestLibrary } from '../../lib/github'; import { CreateError } from '../../transitional'; @@ -32,6 +39,28 @@ import GitHubApplication from '../application'; import Debug from 'debug'; const debugGitHubTokens = Debug('github:tokens'); +const symbolCost = Symbol('cost'); +const symbolHeaders = Symbol('headers'); + +export function symbolizeApiResponse(response: any): T { + if (response && response.headers) { + response[symbolHeaders] = response.headers; + delete response.headers; + } + if (response && response.cost) { + response[symbolCost] = response.cost; + delete response.cost; + } + return response; +} + +export function getApiSymbolMetadata(response: any) { + if (response) { + return { headers: response[symbolHeaders], cost: response[symbolCost] }; + } + throw CreateError.ParameterRequired('response'); +} + export interface IOperationsCoreOptions { github: RestLibrary; providers: IProviders; @@ -63,6 +92,7 @@ export enum CacheDefault { teamDetailStaleSeconds = 'teamDetailStaleSeconds', orgRepoWebhooksStaleSeconds = 'orgRepoWebhooksStaleSeconds', teamRepositoryPermissionStaleSeconds = 'teamRepositoryPermissionStaleSeconds', + defaultStaleSeconds = 'defaultStaleSeconds', } // defaults could move to configuration alternatively @@ -90,6 +120,7 @@ const defaults: ICacheDefaultTimes = { [CacheDefault.teamDetailStaleSeconds]: 60 * 60 * 2 /* 2h */, [CacheDefault.orgRepoWebhooksStaleSeconds]: 60 * 60 * 8 /* 8h */, [CacheDefault.teamRepositoryPermissionStaleSeconds]: 0 /* 0m */, + [CacheDefault.defaultStaleSeconds]: 60 /* 1m */, }; export const DefaultPageSize = 100; @@ -108,6 +139,46 @@ export function getPageSize(operations: IOperationsInstance, options?: IOptionWi return DefaultPageSize; } +export function createCacheOptions( + operations: IOperationsInstance, + options?: ICacheOptions, + cacheDefault: CacheDefault = CacheDefault.defaultStaleSeconds +) { + const cacheOptions: ICacheOptions = { + maxAgeSeconds: getMaxAgeSeconds(operations, cacheDefault, options, 60), + }; + if (options.backgroundRefresh !== undefined) { + cacheOptions.backgroundRefresh = options.backgroundRefresh; + } + return cacheOptions; +} + +export function createPagedCacheOptions( + operations: IOperationsInstance, + options?: IPagedCacheOptions, + cacheDefault: CacheDefault = CacheDefault.defaultStaleSeconds +) { + const cacheOptions: IPagedCacheOptions = { + maxAgeSeconds: getMaxAgeSeconds(operations, cacheDefault, options, 60), + }; + if (options.pageRequestDelay !== undefined) { + cacheOptions.pageRequestDelay = options.pageRequestDelay; + } + if (options.backgroundRefresh !== undefined) { + cacheOptions.backgroundRefresh = options.backgroundRefresh; + } + return cacheOptions; +} + +export function popPurpose(options: ICacheOptionsWithPurpose, defaultPurpose: AppPurposeTypes) { + if (options.purpose) { + const purpose = options.purpose; + delete options.purpose; + return purpose; + } + return defaultPurpose; +} + export function getMaxAgeSeconds( operations: IOperationsInstance, cacheDefault: CacheDefault, @@ -197,7 +268,7 @@ export abstract class OperationsCore async getAccountByUsername(username: string, options?: ICacheOptions): Promise { options = options || {}; const operations = throwIfNotGitHubCapable(this); - const centralOperations = throwIfNotCapable( + const ops = throwIfNotCapable( this, CoreCapability.GitHubCentralOperations ); @@ -214,10 +285,9 @@ export abstract class OperationsCore cacheOptions.backgroundRefresh = options.backgroundRefresh; } try { - const getHeaderFunction = centralOperations.getCentralOperationsToken(); - const authorizationHeader = await getHeaderFunction(AppPurpose.Data); + const getHeaderFunction = ops.getPublicAuthorizationToken(); const entity = await operations.github.call( - authorizationHeader, + getHeaderFunction, 'users.getByUsername', parameters, cacheOptions @@ -337,17 +407,16 @@ export abstract class OperationsCore organizationName: string, organizationSettings: OrganizationSetting, legacyOwnerToken: string, - centralOperationsFallbackToken: string, appAuthenticationType: GitHubAppAuthenticationType, purpose: AppPurposeTypes - ): Promise { + ): Promise { const customPurpose = purpose as ICustomAppPurpose; const isCustomPurpose = customPurpose?.isCustomAppPurpose === true; if ( !isCustomPurpose && !this.tokenManager.organizationSupportsAnyPurpose(organizationName, organizationSettings) ) { - const legacyTokenValue = legacyOwnerToken || centralOperationsFallbackToken; + const legacyTokenValue = legacyOwnerToken; if (!legacyTokenValue) { throw new Error( `Organization ${organizationName} is not configured with a GitHub app, Personal Access Token ownerToken configuration value, or a fallback central operations token for the ${ @@ -358,7 +427,7 @@ export abstract class OperationsCore return { value: `token ${legacyTokenValue}`, purpose: null, - source: legacyOwnerToken ? 'legacyOwnerToken' : 'centralOperationsFallbackToken', + source: 'legacyOwnerToken', }; } if (!purpose) { diff --git a/business/operations/index.ts b/business/operations/index.ts index d2cde96f6..1f5717759 100644 --- a/business/operations/index.ts +++ b/business/operations/index.ts @@ -5,11 +5,12 @@ import axios from 'axios'; import throat from 'throat'; +import { shuffle } from 'lodash'; import { Account } from '../account'; import { GraphManager } from '../graphManager'; import { GitHubOrganizationResponse, Organization } from '../organization'; -import { GitHubTokenManager } from '../githubApps/tokenManager'; +import { GitHubTokenManager } from '../../lib/github/tokenManager'; import RenderHtmlMail from '../../lib/emailRender'; import { wrapError, sortByCaseInsensitive } from '../../utils'; import { Repository } from '../repository'; @@ -20,7 +21,7 @@ import { GitHubAppAuthenticationType, GitHubAppPurposes, IGitHubAppConfiguration, -} from '../githubApps'; +} from '../../lib/github/appPurposes'; import { OrganizationFeature, OrganizationSetting, @@ -42,7 +43,7 @@ import { ICreateLinkOptions, ICrossOrganizationMembershipByOrganization, ICrossOrganizationTeamMembership, - IGetAuthorizationHeader, + GetAuthorizationHeader, IGitHubAppInstallation, IMapPlusMetaCost, IOperationsCentralOperationsToken, @@ -56,7 +57,7 @@ import { IOperationsTemplates, IPagedCrossOrganizationCacheOptions, IPromisedLinks, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, ISupportedLinkTypeOutcome, IUnlinkMailStatus, NoCacheNoBackground, @@ -68,6 +69,7 @@ import { Team } from '../team'; import { IRepositoryMetadataProvider } from '../../entities/repositoryMetadata/repositoryMetadataProvider'; import { isAuthorizedSystemAdministrator } from './administration'; import type { ConfigGitHubOrganizationsSpecializedList } from '../../config/github.organizations.types'; +import { type GitHubTokenType, getGitHubTokenTypeFromValue } from '../../lib/github/appTokens'; export * from './core'; @@ -116,7 +118,7 @@ export class Operations private _invisibleOrganizations: Map; private _uncontrolledOrganizations: Map; private _organizationOriginalNames: any; - private _organizationNamesWithAuthorizationHeaders: Map; + private _organizationNamesWithAuthorizationHeaders: Map; private _defaultPageSize: number; private _organizationIds: Map; private _organizationSettings: OrganizationSetting[]; @@ -172,10 +174,10 @@ export class Operations } } this._tokenManager = new GitHubTokenManager({ + operations: this, configurations: purposesToConfigurations, executionEnvironment: options.executionEnvironment, }); - GitHubTokenManager.RegisterManagerForOperations(this, this._tokenManager); this._dynamicOrganizationIds = new Set(); this._organizationSettings = []; } @@ -339,7 +341,6 @@ export class Operations private createOrganization( name: string, settings: OrganizationSetting, - centralOperationsFallbackToken: string, appAuthenticationType: GitHubAppAuthenticationType ): Organization { name = name.toLowerCase(); @@ -355,20 +356,12 @@ export class Operations this, name, settings, + this.getAuthorizationHeader.bind(this, name, settings, ownerToken, appAuthenticationType), this.getAuthorizationHeader.bind( this, name, settings, ownerToken, - centralOperationsFallbackToken, - appAuthenticationType - ), - this.getAuthorizationHeader.bind( - this, - name, - settings, - ownerToken, - centralOperationsFallbackToken, GitHubAppAuthenticationType.ForceSpecificInstallation ), hasDynamicSettings @@ -379,7 +372,6 @@ export class Operations if (!this._organizations) { const organizations = new Map(); const names = this.organizationNames; - const centralOperationsToken = this.config.github.operations.centralOperationsToken; for (let i = 0; i < names.length; i++) { const name = names[i]; let settings: OrganizationSetting = null; @@ -395,7 +387,6 @@ export class Operations const organization = this.createOrganization( name, settings, - centralOperationsToken, GitHubAppAuthenticationType.BestAvailable ); organizations.set(name, organization); @@ -416,11 +407,9 @@ export class Operations for (let i = 0; i < list.length; i++) { const settings = list[i]; if (settings && settings.name && settings.name.toLowerCase() === lowercase) { - const centralOperationsToken = this.config.github.operations.centralOperationsToken; return this.createOrganization( lowercase, OrganizationSetting.CreateFromStaticSettings(settings), - centralOperationsToken, GitHubAppAuthenticationType.BestAvailable ); } @@ -441,7 +430,6 @@ export class Operations return this.createOrganization( settings.organizationName.toLowerCase(), settings, - null, GitHubAppAuthenticationType.BestAvailable ); } @@ -474,7 +462,7 @@ export class Operations dynamicSettings = options.settings; } const authenticationType = options?.authenticationType || GitHubAppAuthenticationType.BestAvailable; - const organization = this.createOrganization(name, dynamicSettings, null, authenticationType); + const organization = this.createOrganization(name, dynamicSettings, authenticationType); if (!options || options?.storeInstanceByName) { this._invisibleOrganizations.set(name, organization); } @@ -492,11 +480,9 @@ export class Operations } const emptySettings = new OrganizationSetting(); emptySettings.operationsNotes = `Uncontrolled Organization - ${organizationName}`; - const centralOperationsToken = this.config.github.operations.centralOperationsToken; const org = this.createOrganization( organizationName, emptySettings, - centralOperationsToken, GitHubAppAuthenticationType.ForceSpecificInstallation ); this._uncontrolledOrganizations.set(organizationName, org); @@ -506,16 +492,18 @@ export class Operations getPublicOnlyAccessOrganization(organizationName: string, organizationId?: number): Organization { organizationName = organizationName.toLowerCase(); - const emptySettings = new OrganizationSetting(); - emptySettings.operationsNotes = `Uncontrolled public organization - ${organizationName}`; const publicAccessToken = this.config.github.operations.publicAccessToken; if (!publicAccessToken) { - throw new Error('not configured for public read-only tokens'); + throw CreateError.InvalidParameters('not configured for public read-only tokens'); } + const emptySettings = OrganizationSetting.CreateEmptyWithOldToken( + publicAccessToken, + `Uncontrolled public organization - ${organizationName}`, + organizationId + ); const org = this.createOrganization( organizationName, emptySettings, - publicAccessToken, GitHubAppAuthenticationType.ForceSpecificInstallation ); this._uncontrolledOrganizations.set(organizationName, org); @@ -593,7 +581,7 @@ export class Operations get organizationNamesWithAuthorizationHeaders() { if (!this._organizationNamesWithAuthorizationHeaders) { - const tokens = new Map(); + const tokens = new Map(); const visited = new Set(); for (const entry of this._organizationSettings) { const lowercase = entry.organizationName.toLowerCase(); @@ -825,7 +813,8 @@ export class Operations const lc = name.toLowerCase(); const organization = this.organizations.get(lc); if (!organization) { - throw CreateError.NotFound(`Could not find configuration for the "${name}" organization.`); + // will this impact things? + throw CreateError.InvalidParameters(`Could not find configuration for the "${name}" organization.`); } return organization; } @@ -913,6 +902,45 @@ export class Operations } async getOrganizationProfileById(id: number, options?: ICacheOptions): Promise { + options = options || {}; + if (!id) { + throw new Error('Must provide a repository ID to retrieve the repository.'); + } + const organization = this._organizationIds.get(id); + return this._getOrganizationProfileById(id, organization ? id : null, options); + } + + async getOrganizationPublicProfileById( + id: number, + options?: ICacheOptions + ): Promise { + options = options || {}; + if (!id) { + throw new Error('Must provide a repository ID to retrieve the repository.'); + } + let lookupId: number | null = this._organizationIds.get(id) ? id : null; + if (lookupId) { + const allIdsExcludingOrg = this.getOrganizationIds().filter((orgId) => orgId !== id); + const shuffledIds = shuffle(allIdsExcludingOrg); + if (shuffledIds.length > 0) { + lookupId = shuffledIds[0]; + } + } + if (lookupId === null) { + throw CreateError.InvalidParameters( + 'This approach requires configuring at least two organizations (getOrganizationPublicProfileById).' + ); + } + return this._getOrganizationProfileById(id, lookupId, options); + } + + private async _getOrganizationProfileById( + id: number, + lookupUsingIdOrCentralToken: number | null, + options?: ICacheOptions + ): Promise { + // EMU note: you need to use an EMU-installed app vs public... + // Cache note: this will be a cache miss if you switch between public/non-public entrypoints options = options || {}; if (!id) { throw new Error('Must provide a repository ID to retrieve the repository.'); @@ -926,13 +954,15 @@ export class Operations if (options.backgroundRefresh !== undefined) { cacheOptions.backgroundRefresh = options.backgroundRefresh; } + const organization = this._organizationIds.get(lookupUsingIdOrCentralToken); + let header: GetAuthorizationHeader = null; + if (organization) { + header = organization.getAuthorizationHeader() as GetAuthorizationHeader; // fallback will happen + } else { + header = this.getPublicAuthorizationToken(); + } try { - const entity = await this.github.request( - this.getCentralOperationsToken(), - 'GET /organizations/:id', - parameters, - cacheOptions - ); + const entity = await this.github.request(header, 'GET /organizations/:id', parameters, cacheOptions); return entity; } catch (error) { if (error.status && error.status === 404) { @@ -1278,19 +1308,32 @@ export class Operations return false; } - getCentralOperationsToken(): IGetAuthorizationHeader { - const func = getCentralOperationsAuthorizationHeader.bind(null, this) as IGetAuthorizationHeader; - return func; + getPublicReadOnlyStaticToken(): GetAuthorizationHeader { + const { config } = this.providers; + if (config?.github?.operations?.publicAccessToken) { + const capturedToken = config.github.operations.publicAccessToken; + return async () => { + return { + value: `token ${capturedToken}`, + purpose: null, + source: 'public read-only token', + }; + }; + } + throw CreateError.InvalidParameters('No configured read-only static token'); } - getPublicReadOnlyToken(): IGetAuthorizationHeader { - const func = getReadOnlyAuthorizationHeader.bind(null, this) as IGetAuthorizationHeader; - return func; + getPublicAuthorizationToken(): GetAuthorizationHeader { + try { + return this._tokenManager.getAuthorizationHeaderForAnyApp.bind(this._tokenManager); + } catch (error) { + return this.getPublicReadOnlyStaticToken(); + } } getAccount(id: string) { const entity = { id }; - return new Account(entity, this, getCentralOperationsAuthorizationHeader.bind(null, this)); + return new Account(entity, this, this.getPublicAuthorizationToken.bind(this)); } async getAccountWithDetailsAndLink(id: string): Promise { @@ -1299,14 +1342,27 @@ export class Operations } async getAuthenticatedAccount(token: string): Promise { + // Returns an account instance based on the account identified in the token. const github = this.github; const parameters = {}; + const fullToken = `token ${token}`; + let tokenType: GitHubTokenType = null; + try { + tokenType = getGitHubTokenTypeFromValue(fullToken); + } catch (error) { + // ignoring any issue here on identifying the type of token + } try { - const entity = await github.post(`token ${token}`, 'users.getAuthenticated', parameters); - const account = new Account(entity, this, getCentralOperationsAuthorizationHeader.bind(null, this)); + const entity = await github.post(fullToken, 'users.getAuthenticated', parameters); + const account = new Account(entity, this, this.getPublicAuthorizationToken.bind(this)); return account; } catch (error) { - throw wrapError(error, 'Could not get details about the authenticated account'); + throw wrapError( + error, + `Could not get details about the authenticated account${ + tokenType ? ' using token type "' + tokenType + '"' : '.' + }` + ); } } @@ -1420,42 +1476,6 @@ async function fireEvent(config, configurationName, value): Promise { - return { - value: `token ${capturedToken}`, - purpose: null, - source: 'public read-only token', - }; - }; - } else { - throw new Error('No public read-only token configured.'); - } -} - -export function getCentralOperationsAuthorizationHeader(self: Operations): IPurposefulGetAuthorizationHeader { - const s = (self || this) as Operations; - if (s.config.github && s.config.github.operations && s.config.github.operations.centralOperationsToken) { - const capturedToken = s.config.github.operations.centralOperationsToken; - return async () => { - return { - value: `token ${capturedToken}`, - purpose: null, // legacy - source: 'central operations token', - }; - }; - } else if (s.getOrganizations().length === 0) { - throw new Error('No central operations token nor any organizations configured.'); - } - // Fallback to the first configured organization as a convenience - // CONSIDER: would randomizing the organization be better, or a priority based on known-rate limit remaining? - const firstOrganization = s.getOrganizations()[0]; - return firstOrganization.getAuthorizationHeader(); -} - function crossOrganizationResults(operations: Operations, results, keyProperty) { keyProperty = keyProperty || 'id'; const map: IMapPlusMetaCost = new Map(); diff --git a/business/organization.ts b/business/organization.ts index 6c7d0c715..199d9b63c 100644 --- a/business/organization.ts +++ b/business/organization.ts @@ -13,11 +13,11 @@ import { Repository } from './repository'; import { wrapError } from '../utils'; import { StripGitHubEntity } from '../lib/github/restApi'; import { GitHubResponseType } from '../lib/github/endpointEntities'; -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { OrganizationFeature, OrganizationSetting, - SpecialTeam, + SystemTeam, } from '../entities/organizationSettings/organizationSetting'; import { createOrganizationSudoInstance, IOrganizationSudo } from '../features'; import { CacheDefault, getMaxAgeSeconds, getPageSize, OperationsCore } from './operations/core'; @@ -28,12 +28,12 @@ import { GitHubRepositoryVisibility, IAccountBasics, IAddOrganizationMembershipOptions, - IAuthorizationHeaderValue, + AuthorizationHeaderValue, ICacheOptions, ICacheOptionsWithPurpose, ICorporateLink, ICreateRepositoryResult, - IGetAuthorizationHeader, + type GetAuthorizationHeader, IGetOrganizationAuditLogOptions, IGetOrganizationMembersOptions, IGitHubAccountDetails, @@ -49,7 +49,7 @@ import { IOrganizationMemberPair, IOrganizationMembership, IPagedCacheOptions, - IPurposefulGetAuthorizationHeader, + type PurposefulGetAuthorizationHeader, IReposError, IReposRestRedisCacheCost, NoCacheNoBackground, @@ -64,10 +64,11 @@ import { CreateError, ErrorHelper } from '../transitional'; import { jsonError } from '../middleware'; import getCompanySpecificDeployment from '../middleware/companySpecificDeployment'; import { ConfigGitHubTemplates } from '../config/github.templates.types'; -import { GitHubTokenManager } from './githubApps/tokenManager'; +import { GitHubTokenManager } from '../lib/github/tokenManager'; import { OrganizationProjects } from './projects'; import { OrganizationDomains } from './domains'; import { OrganizationCopilot } from './organizationCopilot'; +import { OrganizationProperties } from './organizationProperties'; interface IGetMembersParameters { org: string; @@ -208,8 +209,8 @@ export class Organization { private _nativeManagementUrl: string; private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _usesGitHubApp: boolean; private _settings: OrganizationSetting; @@ -221,6 +222,7 @@ export class Organization { private _domains: OrganizationDomains; private _copilot: OrganizationCopilot; + private _customProperties: OrganizationProperties; id: number; uncontrolled: boolean; @@ -229,8 +231,8 @@ export class Organization { operations: IOperationsInstance, name: string, settings: OrganizationSetting, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, public hasDynamicSettings: boolean ) { this._name = settings.organizationName || name; @@ -365,6 +367,17 @@ export class Organization { return this._copilot; } + get customProperties() { + if (!this._customProperties) { + this._customProperties = new OrganizationProperties( + this, + this._getSpecificAuthorizationHeader.bind(this), + this._operations + ); + } + return this._customProperties; + } + get domains() { if (!this._domains) { this._domains = new OrganizationDomains( @@ -568,7 +581,11 @@ export class Organization { } get broadAccessTeams(): number[] { - return this.getSpecialTeam(SpecialTeam.Everyone, 'everyone membership'); + return this.getSystemTeam(SystemTeam.Everyone, 'everyone membership'); + } + + get openAccessTeams(): number[] { + return this.getSystemTeam(SystemTeam.OpenAccess, 'open access'); } get invitationTeam(): Team { @@ -580,7 +597,7 @@ export class Organization { } get systemSudoersTeam(): Team { - const teams = this.getSpecialTeam(SpecialTeam.GlobalSudo, 'system sudoers'); + const teams = this.getSystemTeam(SystemTeam.GlobalSudo, 'system sudoers'); if (teams.length > 1) { throw new Error('Multiple system sudoer teams are not supported.'); } @@ -592,7 +609,7 @@ export class Organization { } get sudoersTeam(): Team { - const teams = this.getSpecialTeam(SpecialTeam.Sudo, 'organization sudoers'); + const teams = this.getSystemTeam(SystemTeam.Sudo, 'organization sudoers'); if (teams.length > 1) { throw new Error('Multiple sudoer teams are not supported.'); } @@ -606,15 +623,15 @@ export class Organization { return this._settings; } - get specialRepositoryPermissionTeams() { + get specialSystemTeams() { return { - read: this.getSpecialTeam(SpecialTeam.SystemRead, 'read everything'), - write: this.getSpecialTeam(SpecialTeam.SystemWrite, 'write everything'), - admin: this.getSpecialTeam(SpecialTeam.SystemAdmin, 'administer everything'), + read: this.getSystemTeam(SystemTeam.SystemRead, 'read everything'), + write: this.getSystemTeam(SystemTeam.SystemWrite, 'write everything'), + admin: this.getSystemTeam(SystemTeam.SystemAdmin, 'administer everything'), }; } - getAuthorizationHeader(): IPurposefulGetAuthorizationHeader { + getAuthorizationHeader(): PurposefulGetAuthorizationHeader { return this._getAuthorizationHeader; } @@ -688,7 +705,13 @@ export class Organization { teamIds.push(broadAccessTeams[i]); // is the actual ID, not the team object } } - const specialTeams = this.specialRepositoryPermissionTeams; + const openAccessTeams = this.openAccessTeams; + if (openAccessTeams) { + for (let i = 0; i < openAccessTeams.length; i++) { + teamIds.push(openAccessTeams[i]); // is the actual ID, not the team object + } + } + const specialTeams = this.specialSystemTeams; const keys = Object.getOwnPropertyNames(specialTeams); keys.forEach((type) => { const values = specialTeams[type]; @@ -721,12 +744,12 @@ export class Organization { ); } - async getRepositoryCreateGitHubToken(): Promise { + async getRepositoryCreateGitHubToken(): Promise { // This method leaks/releases the owner token. In the future a more crisp // way of accomplishing this without exposing the token should be created. // The function name is specific to the intended use instead of a general- // purpose token name. - const token = await (this.authorize(AppPurpose.Operations) as IGetAuthorizationHeader)(); + const token = await (this.authorize(AppPurpose.Operations) as GetAuthorizationHeader)(); token.source = 'repository create token'; return token; } @@ -1190,7 +1213,7 @@ export class Organization { const getAuthorizationHeader = this._getAuthorizationHeader.bind( this, AppPurpose.Data - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; const github = operations.github; const parameters: IGetMembersParameters = { org: this.name, @@ -1299,7 +1322,7 @@ export class Organization { const getAuthorizationHeader = this._getAuthorizationHeader.bind( this, AppPurpose.Data - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; const teamEntities = await github.collections.getOrgTeams(getAuthorizationHeader, parameters, caching); const teams = common.createInstances(this, this.teamFromEntity, teamEntities); return teams; @@ -1325,12 +1348,12 @@ export class Organization { if (queryCache?.supportsOrganizationMembership) { try { if (!optionalId) { - const centralOps = operationsWithCapability( + const ops = operationsWithCapability( operations, CoreCapability.GitHubCentralOperations ); - if (centralOps) { - const account = await centralOps.getAccountByUsername(login); + if (ops) { + const account = await ops.getAccountByUsername(login); optionalId = account.id.toString(); } } @@ -1362,19 +1385,16 @@ export class Organization { } } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose): GetAuthorizationHeader { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } @@ -1516,23 +1536,15 @@ export class Organization { return { settings, operations }; } - private getSpecialTeam(specialTeam: SpecialTeam, friendlyName: string, throwIfMissing?: boolean): number[] { - let teamId: number = null; - for (const entry of this._settings.specialTeams) { - if (entry.specialTeam === specialTeam) { - teamId = entry.teamId; - break; - } - } - if (throwIfMissing) { + private getSystemTeam(teamType: SystemTeam, friendlyName: string, throwIfMissing?: boolean): number[] { + const allOrgSystemTeams = this._settings.specialTeams; + const matchingSystemTeamTypes = allOrgSystemTeams.filter((t) => t.specialTeam === teamType); + const teams: number[] = matchingSystemTeamTypes.map((t) => t.teamId); + if (throwIfMissing && teams.length === 0) { throw new Error( - `Missing configured organization "${this.name}" special team ${specialTeam} - ${friendlyName}` + `Missing configured organization "${this.name}" special team ${teamType} - ${friendlyName}` ); } - const teams: number[] = []; - if (teamId) { - teams.push(teamId); - } return teams; } diff --git a/business/organizationCopilot.ts b/business/organizationCopilot.ts index 2c9a4a6c0..fb837d520 100644 --- a/business/organizationCopilot.ts +++ b/business/organizationCopilot.ts @@ -4,14 +4,14 @@ // import { - IGetAuthorizationHeader, + GetAuthorizationHeader, IOperationsInstance, IPagedCacheOptions, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, throwIfNotGitHubCapable, } from '../interfaces'; import type { CollectionCopilotSeatsOptions } from '../lib/github/collections'; -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { CacheDefault, getMaxAgeSeconds, getPageSize } from './operations/core'; import { Organization } from './organization'; @@ -30,7 +30,7 @@ export type CopilotSeatData = { export class OrganizationCopilot { constructor( private organization: Organization, - private getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + private getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, private operations: IOperationsInstance ) {} @@ -43,7 +43,7 @@ export class OrganizationCopilot { const getAuthorizationHeader = this.getSpecificAuthorizationHeader.bind( this, appPurpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; const github = operations.github; const parameters: CollectionCopilotSeatsOptions = { org: this.organization.name, diff --git a/business/organizationProperties.ts b/business/organizationProperties.ts new file mode 100644 index 000000000..023237a3f --- /dev/null +++ b/business/organizationProperties.ts @@ -0,0 +1,242 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { + ICacheOptions, + ICacheOptionsWithPurpose, + GetAuthorizationHeader, + IOperationsInstance, + PurposefulGetAuthorizationHeader, + PagedCacheOptionsWithPurpose, + throwIfNotGitHubCapable, +} from '../interfaces'; +import { HttpMethod } from '../lib/github'; +import { CreateError } from '../transitional'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; +import { + CacheDefault, + createCacheOptions, + createPagedCacheOptions, + getMaxAgeSeconds, + getPageSize, + popPurpose, + symbolizeApiResponse, +} from './operations/core'; +import { Organization } from './organization'; + +export enum CustomPropertyValueType { + String = 'string', + SingleSelect = 'single_select', +} + +export type OrganizationCustomPropertyEntity = { + property_name: string; + value_type: CustomPropertyValueType; + required: boolean; + description?: string; + default_value?: string; + allowed_values?: string[]; +}; + +type SetPropertyValue = { + property_name: string; + value: string; +}; + +type CreateOrUpdateResponse = { + properties: OrganizationCustomPropertyEntity[]; +}; + +export class OrganizationProperties { + private _defaultPurpose = AppPurpose.Data; + + constructor( + private organization: Organization, + private getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, + private operations: IOperationsInstance + ) {} + + private authorize(purpose: AppPurposeTypes): GetAuthorizationHeader | string { + const getAuthorizationHeader = this.getSpecificAuthorizationHeader.bind( + this, + purpose + ) as GetAuthorizationHeader; + return getAuthorizationHeader; + } + + async getRepositoryCustomProperties( + repositoryName: string, + options?: ICacheOptionsWithPurpose + ): Promise> { + options = options || {}; + const operations = throwIfNotGitHubCapable(this.operations); + const { github } = operations; + const purpose = popPurpose(options, this._defaultPurpose); + const parameters = { + owner: this.organization.name, + repo: repositoryName, + }; + const cacheOptions = createCacheOptions(operations, options); + try { + const responseArray = await github.request( + this.authorize(purpose), + 'GET /repos/:owner/:repo/properties/values', + parameters, + cacheOptions + ); + return symbolizeApiResponse(arrayToSetProperties(responseArray)); + } catch (error) { + throw error; + } + } + + async getCustomProperties( + options?: PagedCacheOptionsWithPurpose + ): Promise { + options = options || {}; + const operations = throwIfNotGitHubCapable(this.operations); + const { github } = operations; + const purpose = popPurpose(options, this._defaultPurpose); + const parameters = { + org: this.organization.name, + per_page: getPageSize(operations), + }; + const cacheOptions = createPagedCacheOptions(operations, options); + try { + const entities = await github.collections.collectAllPagesViaHttpGet< + any, + OrganizationCustomPropertyEntity + >( + this.authorize(purpose), + 'orgCustomProps', + 'GET /orgs/:org/properties/schema', + parameters, + cacheOptions + ); + return symbolizeApiResponse(entities); + } catch (error) { + throw error; + } + } + + async getCustomProperty( + propertyName: string, + options?: ICacheOptionsWithPurpose + ): Promise { + options = options || {}; + const operations = throwIfNotGitHubCapable(this.operations); + const { github } = operations; + if (!propertyName) { + throw CreateError.InvalidParameters('propertyName'); + } + const purpose = popPurpose(options, this._defaultPurpose); + const parameters = { + org: this.organization.name, + custom_property_name: propertyName, + }; + const cacheOptions: ICacheOptions = { + maxAgeSeconds: getMaxAgeSeconds(operations, CacheDefault.accountDetailStaleSeconds, options, 60), + }; + if (options.backgroundRefresh !== undefined) { + cacheOptions.backgroundRefresh = options.backgroundRefresh; + } + try { + const entity = (await github.request( + this.authorize(purpose), + 'GET /orgs/:org/properties/schema/:custom_property_name', + parameters, + cacheOptions + )) as OrganizationCustomPropertyEntity; + return symbolizeApiResponse(entity); + } catch (error) { + throw error; + } + } + + async deleteProperty(propertyName: string, purpose?: AppPurposeTypes): Promise { + const operations = throwIfNotGitHubCapable(this.operations); + const parameters = { + org: this.organization.name, + custom_property_name: propertyName, + }; + await operations.github.restApi( + this.authorize(purpose || this._defaultPurpose), + HttpMethod.Delete, + '/orgs/:org/properties/schema/:custom_property_name', + parameters + ); + } + + async createOrUpdate( + properties: OrganizationCustomPropertyEntity[], + purpose?: AppPurposeTypes + ): Promise { + const operations = throwIfNotGitHubCapable(this.operations); + const parameters = { + org: this.organization.name, + properties, + }; + const res = (await operations.github.restApi( + this.authorize(purpose || this._defaultPurpose), + HttpMethod.Patch, + '/orgs/:org/properties/schema', + parameters + )) as CreateOrUpdateResponse; + return res.properties; + } + + createOrUpdateRepositoryProperties( + repositoryName: string, + propertiesAndValues: Record, + purpose?: AppPurposeTypes + ): Promise { + const names = [repositoryName]; + return this.createOrUpdateRepositoriesProperties(names, propertiesAndValues, purpose); + } + + async createOrUpdateRepositoriesProperties( + organizationRepositoryNames: string[], + propertiesAndValues: Record, + purpose?: AppPurposeTypes + ): Promise { + const operations = throwIfNotGitHubCapable(this.operations); + if (organizationRepositoryNames.length > 30) { + throw CreateError.InvalidParameters( + 'GitHub has a hard limit of 30 repositories to update in a single patch' + ); + } + const parameters = { + repository_names: organizationRepositoryNames, + org: this.organization.name, + properties: setPropertiesRecordToArray(propertiesAndValues), + }; + (await operations.github.restApi( + this.authorize(purpose || this._defaultPurpose), + HttpMethod.Patch, + '/orgs/:org/properties/values', + parameters + )) as CreateOrUpdateResponse; + } +} + +function setPropertiesRecordToArray(propertiesAndValues: Record) { + const keys = Object.getOwnPropertyNames(propertiesAndValues); + const properties: SetPropertyValue[] = []; + for (const key of keys) { + properties.push({ + property_name: key, + value: propertiesAndValues[key], + }); + } + return properties; +} + +function arrayToSetProperties(properties: SetPropertyValue[]) { + const propertiesAndValues: Record = {}; + for (const property of properties) { + propertiesAndValues[property.property_name] = property.value; + } + return propertiesAndValues; +} diff --git a/business/project.ts b/business/project.ts index e1fb54c80..cc0187ce7 100644 --- a/business/project.ts +++ b/business/project.ts @@ -3,13 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { Organization, Repository } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, throwIfNotGitHubCapable, - IGetAuthorizationHeader, + GetAuthorizationHeader, } from '../interfaces'; import { decorateIterable, @@ -117,8 +117,8 @@ export class OrganizationProject { private _projects: OrganizationProjects; private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _purpose: AppPurpose; private _id: string; @@ -126,8 +126,8 @@ export class OrganizationProject { constructor( organizationProjects: OrganizationProjects, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, projectId: string ) { this._getAuthorizationHeader = getAuthorizationHeader; @@ -413,19 +413,16 @@ export class OrganizationProject { } } - private authorize(purpose: AppPurpose = this._purpose): IGetAuthorizationHeader { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose = this._purpose): GetAuthorizationHeader { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/projectView.ts b/business/projectView.ts index 0ab645ae8..c90e6181b 100644 --- a/business/projectView.ts +++ b/business/projectView.ts @@ -3,13 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { Organization } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, throwIfNotGitHubCapable, - IGetAuthorizationHeader, + GetAuthorizationHeader, } from '../interfaces'; import { decorateIterable, @@ -30,8 +30,8 @@ export class OrganizationProjectView { private _project: OrganizationProject; private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _purpose: AppPurpose; private _id: string; @@ -41,8 +41,8 @@ export class OrganizationProjectView { constructor( organizationProject: OrganizationProject, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, projectId: string, essentials?: ProjectViewEssentials ) { @@ -217,19 +217,16 @@ export class OrganizationProjectView { // } // } - private authorize(purpose: AppPurpose = this._purpose): IGetAuthorizationHeader { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose = this._purpose): GetAuthorizationHeader { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/projects.ts b/business/projects.ts index f010b3aaa..3842c383b 100644 --- a/business/projects.ts +++ b/business/projects.ts @@ -3,13 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { Organization } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, throwIfNotGitHubCapable, - IGetAuthorizationHeader, + GetAuthorizationHeader, } from '../interfaces'; import { decorateIterable, @@ -35,15 +35,15 @@ export class OrganizationProjects { private _organization: Organization; private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _purpose: AppPurpose; constructor( organization: Organization, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader ) { this._getAuthorizationHeader = getAuthorizationHeader; this._getSpecificAuthorizationHeader = getSpecificAuthorizationHeader; @@ -134,19 +134,16 @@ export class OrganizationProjects { } } - private authorize(purpose: AppPurpose = this._purpose): IGetAuthorizationHeader { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose = this._purpose): GetAuthorizationHeader { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/repository.ts b/business/repository.ts index aa3453777..4c8aeb2cd 100644 --- a/business/repository.ts +++ b/business/repository.ts @@ -17,9 +17,9 @@ import { RepositoryIssue, } from '.'; import { RepositoryMetadataEntity } from '../entities/repositoryMetadata/repositoryMetadata'; -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, IOperationsInstance, ICacheOptions, throwIfNotGitHubCapable, @@ -42,7 +42,7 @@ import { IGitHubSecretScanningAlert, operationsWithCapability, IOperationsServiceAccounts, - IGetAuthorizationHeader, + GetAuthorizationHeader, IRepositoryGetIssuesOptions, IOperationsRepositoryMetadataProvider, IOperationsUrls, @@ -214,8 +214,8 @@ export class Repository { private _awesomeness: number; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _operations: IOperationsInstance; private _organization: Organization; @@ -366,8 +366,8 @@ export class Repository { constructor( organization: Organization, entity: any, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, operations: IOperationsInstance ) { this._organization = organization; @@ -884,9 +884,8 @@ export class Repository { cacheOptions.backgroundRefresh = options.backgroundRefresh; } try { - // CONSIDER: need a fallback authentication approach: try and app for a specific capability (the installation knows) and fallback to central ops - // const centralOps = operationsWithCapability(operations, CoreCapability.GitHubCentralOperations); - const tokenSource = this._getSpecificAuthorizationHeader(AppPurpose.Data); // centralOps ? centralOps.getCentralOperationsToken()(AppPurpose.Data) : + // CONSIDER: need a fallback authentication approach: try and app for a specific capability + const tokenSource = this._getSpecificAuthorizationHeader(AppPurpose.Data); const token = await tokenSource; return await operations.github.call(token, 'repos.getPages', parameters, cacheOptions); } catch (error) { @@ -1365,9 +1364,6 @@ export class Repository { private: options.private, } ); - // BUG: GitHub Apps do not work with locking down no repository permissions as documented here: https://github.community/t5/GitHub-API-Development-and/GitHub-App-cannot-patch-repo-visibility-in-org-with-repo/m-p/33448#M3150 - // const token = this._operations.getCentralOperationsToken(); - // return this._operations.github.post(token, 'repos.update', parameters); return operations.github.post(this.authorize(AppPurpose.Operations), 'repos.update', parameters); } @@ -1589,7 +1585,10 @@ export class Repository { const teams = (await this.getTeamPermissions()).filter((tp) => tp.permission === 'admin'); for (let i = 0; i < teams.length; i++) { const team = teams[i]; - if (excludeBroadAndSystemTeams && (team.team.isSystemTeam || team.team.isBroadAccessTeam)) { + if ( + excludeBroadAndSystemTeams && + (team.team.isSystemTeam || team.team.isBroadAccessTeam || team.team.isOpenAccessTeam) + ) { // Do not include broad access teams continue; } @@ -1699,19 +1698,16 @@ export class Repository { return Array.from(users.values()); } - private authorize(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurposeTypes): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } - private specificAuthorization(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private specificAuthorization(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getSpecificHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getSpecificHeader; } diff --git a/business/repositoryActions.ts b/business/repositoryActions.ts index 524a0559b..fff60e0c7 100644 --- a/business/repositoryActions.ts +++ b/business/repositoryActions.ts @@ -5,13 +5,13 @@ import { Repository } from './repository'; import { getPageSize, getMaxAgeSeconds, CacheDefault } from '.'; -import { AppPurpose } from './githubApps'; +import { AppPurpose } from '../lib/github/appPurposes'; import { - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, IOperationsInstance, throwIfNotGitHubCapable, ICacheOptions, - IGetAuthorizationHeader, + GetAuthorizationHeader, } from '../interfaces'; export interface IGitHubActionWorkflowsResponse { @@ -33,16 +33,16 @@ export interface IGitHubActionWorkflow { } export class RepositoryActions { - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _operations: IOperationsInstance; private _repository: Repository; constructor( repository: Repository, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, operations: IOperationsInstance ) { this._repository = repository; @@ -175,11 +175,11 @@ export class RepositoryActions { return entity; } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader | string { + private authorize(purpose: AppPurpose): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/repositoryIssue.ts b/business/repositoryIssue.ts index 936bc606b..adb8f4ac7 100644 --- a/business/repositoryIssue.ts +++ b/business/repositoryIssue.ts @@ -5,16 +5,16 @@ import { Repository } from './repository'; import { wrapError } from '../utils'; -import { AppPurpose } from './githubApps'; +import { AppPurpose } from '../lib/github/appPurposes'; import { CacheDefault, getMaxAgeSeconds, Operations } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, GitHubIssueState, IIssueLabel, throwIfNotGitHubCapable, ICacheOptions, - IGetAuthorizationHeader, + GetAuthorizationHeader, GitHubIssuePatchParameters, GitHubStateReason, } from '../interfaces'; @@ -22,7 +22,7 @@ import { CreateError, ErrorHelper } from '../transitional'; export class RepositoryIssue { private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; private _number: number; private _repository: Repository; @@ -33,7 +33,7 @@ export class RepositoryIssue { repository: Repository, issueNumber: number, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, entity?: any ) { this._getAuthorizationHeader = getAuthorizationHeader; @@ -211,11 +211,8 @@ export class RepositoryIssue { return false; } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } diff --git a/business/repositoryProject.ts b/business/repositoryProject.ts index 5bf5d084e..4f30cb193 100644 --- a/business/repositoryProject.ts +++ b/business/repositoryProject.ts @@ -5,15 +5,15 @@ import { Repository } from './repository'; import { wrapError } from '../utils'; -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { CacheDefault, getMaxAgeSeconds } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, GitHubIssueState, throwIfNotGitHubCapable, ICacheOptions, - IGetAuthorizationHeader, + GetAuthorizationHeader, ICacheOptionsWithPurpose, } from '../interfaces'; import { ErrorHelper } from '../transitional'; @@ -22,8 +22,8 @@ import * as common from './common'; export class RepositoryProject { private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _id: number; private _repository: Repository; @@ -36,8 +36,8 @@ export class RepositoryProject { repository: Repository, projectId: number, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, entity?: any ) { this._getAuthorizationHeader = getAuthorizationHeader; @@ -213,11 +213,11 @@ export class RepositoryProject { return false; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/repositoryProjectCard.ts b/business/repositoryProjectCard.ts index 596c3a14d..2e052422c 100644 --- a/business/repositoryProjectCard.ts +++ b/business/repositoryProjectCard.ts @@ -3,17 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { AppPurpose } from './githubApps'; -import { - IOperationsInstance, - IPurposefulGetAuthorizationHeader, - IGetAuthorizationHeader, -} from '../interfaces'; +import { AppPurpose } from '../lib/github/appPurposes'; +import { IOperationsInstance, PurposefulGetAuthorizationHeader, GetAuthorizationHeader } from '../interfaces'; import { RepositoryProjectColumn } from './repositoryProjectColumn'; export class RepositoryProjectCard { private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; private _id: number; private _column: RepositoryProjectColumn; @@ -24,7 +20,7 @@ export class RepositoryProjectCard { column: RepositoryProjectColumn, cardId: number, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, entity?: any ) { this._getAuthorizationHeader = getAuthorizationHeader; @@ -64,11 +60,8 @@ export class RepositoryProjectCard { return this._column; } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } diff --git a/business/repositoryProjectColumn.ts b/business/repositoryProjectColumn.ts index c69fc7017..79417335a 100644 --- a/business/repositoryProjectColumn.ts +++ b/business/repositoryProjectColumn.ts @@ -4,11 +4,11 @@ // import { CacheDefault, getMaxAgeSeconds, RepositoryIssue } from '.'; -import { AppPurpose, AppPurposeTypes } from './githubApps'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, - IGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, + GetAuthorizationHeader, ICacheOptionsWithPurpose, throwIfNotGitHubCapable, ICacheOptions, @@ -20,7 +20,7 @@ import { CreateError } from '../transitional'; export class RepositoryProjectColumn { private _operations: IOperationsInstance; - private _getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; private _id: number; private _project: RepositoryProject; @@ -31,7 +31,7 @@ export class RepositoryProjectColumn { project: RepositoryProject, columnId: number, operations: IOperationsInstance, - getSpecificAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader, entity?: any ) { this._getSpecificAuthorizationHeader = getSpecificAuthorizationHeader; @@ -136,11 +136,11 @@ export class RepositoryProjectColumn { return card; } - private authorizeSpecificPurpose(purpose: AppPurposeTypes): IGetAuthorizationHeader | string { + private authorizeSpecificPurpose(purpose: AppPurposeTypes): GetAuthorizationHeader | string { const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( this, purpose - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/repositoryPullRequest.ts b/business/repositoryPullRequest.ts index 81d2b8a51..c8af3f180 100644 --- a/business/repositoryPullRequest.ts +++ b/business/repositoryPullRequest.ts @@ -5,16 +5,16 @@ import { Repository } from './repository'; import { wrapError } from '../utils'; -import { AppPurpose } from './githubApps'; +import { AppPurpose } from '../lib/github/appPurposes'; import { CacheDefault, getMaxAgeSeconds } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, GitHubIssueState, IIssueLabel, throwIfNotGitHubCapable, ICacheOptions, - IGetAuthorizationHeader, + GetAuthorizationHeader, } from '../interfaces'; import { ErrorHelper } from '../transitional'; @@ -23,7 +23,7 @@ import { ErrorHelper } from '../transitional'; export class RepositoryPullRequest { private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; private _number: number; private _repository: Repository; @@ -34,7 +34,7 @@ export class RepositoryPullRequest { repository: Repository, pullRequestNumber: number, operations: IOperationsInstance, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, entity?: any ) { this._getAuthorizationHeader = getAuthorizationHeader; @@ -219,11 +219,8 @@ export class RepositoryPullRequest { return false; } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/business/team.ts b/business/team.ts index d2950b1e6..1232b043e 100644 --- a/business/team.ts +++ b/business/team.ts @@ -13,11 +13,11 @@ import { TeamMember } from './teamMember'; import { TeamRepositoryPermission } from './teamRepositoryPermission'; import { IApprovalProvider } from '../entities/teamJoinApproval/approvalProvider'; import { TeamJoinApprovalEntity } from '../entities/teamJoinApproval/teamJoinApproval'; -import { AppPurpose } from './githubApps'; +import { AppPurpose } from '../lib/github/appPurposes'; import { CacheDefault, getMaxAgeSeconds, getPageSize, Organization } from '.'; import { IOperationsInstance, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, TeamJsonFormat, throwIfNotCapable, IOperationsUrls, @@ -25,7 +25,7 @@ import { ICacheOptions, throwIfNotGitHubCapable, IPagedCacheOptions, - IGetAuthorizationHeader, + GetAuthorizationHeader, IUpdateTeamMembershipOptions, GitHubTeamRole, ITeamMembershipRoleState, @@ -82,7 +82,7 @@ export class Team { private _organization: Organization; private _operations: IOperationsInstance; - private _getAuthorizationHeader: IPurposefulGetAuthorizationHeader; + private _getAuthorizationHeader: PurposefulGetAuthorizationHeader; private _id: number; @@ -139,7 +139,7 @@ export class Team { constructor( organization: Organization, entity, - getAuthorizationHeader: IPurposefulGetAuthorizationHeader, + getAuthorizationHeader: PurposefulGetAuthorizationHeader, operations: IOperationsInstance ) { if (!entity || !entity.id) { @@ -181,6 +181,7 @@ export class Team { clone.corporateMetadata = { isSystemTeam: this.isSystemTeam, isBroadAccessTeam: this.isBroadAccessTeam, + isOpenAccessTeam: this.isOpenAccessTeam, }; return clone; } @@ -303,7 +304,7 @@ export class Team { const getAuthorizationHeader = this._getAuthorizationHeader.bind( this, AppPurpose.Data - ) as IGetAuthorizationHeader; + ) as GetAuthorizationHeader; const teamEntities = await github.collections.getTeamChildTeams( getAuthorizationHeader, parameters, @@ -323,6 +324,15 @@ export class Team { return res >= 0; } + get isOpenAccessTeam(): boolean { + const teams = this._organization.openAccessTeams; + if (typeof this._id !== 'number') { + throw new Error('Team.id must be a number'); + } + const res = teams.indexOf(this._id); + return res >= 0; + } + get isSystemTeam(): boolean { const systemTeams = this._organization.systemTeamIds; const res = systemTeams.indexOf(this._id); @@ -687,11 +697,8 @@ export class Team { }; } - private authorize(purpose: AppPurpose): IGetAuthorizationHeader | string { - const getAuthorizationHeader = this._getAuthorizationHeader.bind( - this, - purpose - ) as IGetAuthorizationHeader; + private authorize(purpose: AppPurpose): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getAuthorizationHeader.bind(this, purpose) as GetAuthorizationHeader; return getAuthorizationHeader; } } diff --git a/config/github.operations.json b/config/github.operations.json index 73b95dee3..22222b72d 100644 --- a/config/github.operations.json +++ b/config/github.operations.json @@ -1,5 +1,4 @@ { - "centralOperationsToken": "env://GITHUB_CENTRAL_OPERATIONS_TOKEN", "publicAccessToken": "env://GITHUB_PUBLIC_OPERATIONS_TOKEN", "primaryOrganizationId": "env://GITHUB_PRIMARY_ORGANIZATION_ID?type=integer" } diff --git a/config/github.organizations.types.ts b/config/github.organizations.types.ts index b33c37ada..3e0ba49a1 100644 --- a/config/github.organizations.types.ts +++ b/config/github.organizations.types.ts @@ -19,6 +19,7 @@ export type ConfigGitHubOrganization = { teamAllReposRead: string; // | number teamAllReposWrite: string; // | number teamAllReposAdmin: string; + teamOpenAccess: string; teamSudoers: string; templates: string[]; onboarding: boolean; diff --git a/docs/configuration.md b/docs/configuration.md index 53cd38b68..bab72f661 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -85,7 +85,7 @@ Here is a short overview about the meanings of the different parameters: - **setupbycorporateusername** (string) - Username (from the corporate identity system) of the user who set up the organization - **setupbycorporateid** (string) - Unique identifier (from the corporate identity system) for the user who set up the organization - **setupbycorporatedisplayname** (string) - Display name (from the corporate identity system) for the user who set up the organization -- **specialteams** (object{specialTeam: string, teamId: integer}) - Special team configuration for the organization supported values for `specialTeam` types are: `everyone, sudo, globalSudo, systemWrite, systemRead, systemAdmin`. The `teamId` is the GitHub team ID for the special team. +- **specialteams** (object{specialTeam: string, teamId: integer}) - Special team configuration for the organization supported values for `specialTeam` types are: `everyone, sudo, globalSudo, systemWrite, systemRead, systemAdmin, openAccess`. The `teamId` is the GitHub team ID for the special team. ### Static settings diff --git a/entities/organizationSettings/organizationSetting.ts b/entities/organizationSettings/organizationSetting.ts index 3b1705f60..d49cf7b89 100644 --- a/entities/organizationSettings/organizationSetting.ts +++ b/entities/organizationSettings/organizationSetting.ts @@ -29,8 +29,9 @@ export interface IBasicGitHubAppInstallation { appPurposeId?: string; } -export enum SpecialTeam { +export enum SystemTeam { Everyone = 'everyone', // teamAllMembers + OpenAccess = 'openAccess', Sudo = 'sudo', // teamSudoers GlobalSudo = 'globalSudo', // teamPortalSudoers SystemWrite = 'systemWrite', // teamAllReposWrite @@ -56,7 +57,7 @@ export enum OrganizationProperty { } export interface ISpecialTeam { - specialTeam: SpecialTeam; + specialTeam: SystemTeam; teamId: number; } @@ -158,6 +159,16 @@ export class OrganizationSetting implements IOrganizationSettingProperties { return this.#ownerToken; } + static CreateEmptyWithOldToken(token: string, notes: string, organizationId?: number) { + const settings = new OrganizationSetting(); + settings.#ownerToken = token; + if (organizationId) { + settings.organizationId = organizationId; + } + settings.operationsNotes = notes; + return settings; + } + static CreateFromStaticSettings(staticSettings: ConfigGitHubOrganization): OrganizationSetting { const clone = { ...staticSettings }; const settings = new OrganizationSetting(); @@ -260,20 +271,33 @@ export class OrganizationSetting implements IOrganizationSettingProperties { : [clone.teamAllMembers as any]; for (const value of arr) { settings.specialTeams.push({ - specialTeam: SpecialTeam.Everyone, + specialTeam: SystemTeam.Everyone, teamId: Number(value), }); } } delete clone.teamAllMembers; + if (clone.teamOpenAccess) { + const arr = Array.isArray(clone.teamOpenAccess) + ? (clone.teamOpenAccess as any[]) + : [clone.teamOpenAccess as any]; + for (const value of arr) { + settings.specialTeams.push({ + specialTeam: SystemTeam.OpenAccess, + teamId: Number(value), + }); + } + } + delete clone.teamOpenAccess; + if (clone.teamAllReposRead) { const arr = Array.isArray(clone.teamAllReposRead) ? (clone.teamAllReposRead as any[]) : [clone.teamAllReposRead as any]; for (const value of arr) { settings.specialTeams.push({ - specialTeam: SpecialTeam.SystemRead, + specialTeam: SystemTeam.SystemRead, teamId: Number(value), }); } @@ -286,7 +310,7 @@ export class OrganizationSetting implements IOrganizationSettingProperties { : [clone.teamAllReposWrite as any]; for (const value of arr) { settings.specialTeams.push({ - specialTeam: SpecialTeam.SystemWrite, + specialTeam: SystemTeam.SystemWrite, teamId: Number(value), }); } @@ -299,7 +323,7 @@ export class OrganizationSetting implements IOrganizationSettingProperties { : [clone.teamAllReposAdmin as any]; for (const value of arr) { settings.specialTeams.push({ - specialTeam: SpecialTeam.SystemAdmin, + specialTeam: SystemTeam.SystemAdmin, teamId: Number(value), }); } @@ -312,7 +336,7 @@ export class OrganizationSetting implements IOrganizationSettingProperties { : [clone.teamSudoers as any]; for (const value of arr) { settings.specialTeams.push({ - specialTeam: SpecialTeam.Sudo, + specialTeam: SystemTeam.Sudo, teamId: Number(value), }); } @@ -325,7 +349,7 @@ export class OrganizationSetting implements IOrganizationSettingProperties { : [clone.teamPortalSudoers as any]; for (const value of arr) { settings.specialTeams.push({ - specialTeam: SpecialTeam.GlobalSudo, + specialTeam: SystemTeam.GlobalSudo, teamId: Number(value), }); } diff --git a/features/newRepositories/actions/lockdown.ts b/features/newRepositories/actions/lockdown.ts index 212537b83..a3331be07 100644 --- a/features/newRepositories/actions/lockdown.ts +++ b/features/newRepositories/actions/lockdown.ts @@ -18,9 +18,9 @@ export async function lockdownRepository( const organization = repository.organization; try { const specialPermittedTeams = new Set([ - ...organization.specialRepositoryPermissionTeams.admin, - ...organization.specialRepositoryPermissionTeams.write, - ...organization.specialRepositoryPermissionTeams.read, + ...organization.specialSystemTeams.admin, + ...organization.specialSystemTeams.write, + ...organization.specialSystemTeams.read, ]); const teamPermissions = await repository.getTeamPermissions(); for (const tp of teamPermissions) { diff --git a/interfaces/github/operations.ts b/interfaces/github/operations.ts index 614b38f53..3c567e446 100644 --- a/interfaces/github/operations.ts +++ b/interfaces/github/operations.ts @@ -3,7 +3,13 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { CoreCapability, ICacheDefaultTimes, IPurposefulGetAuthorizationHeader, ICacheOptions } from '.'; +import { + CoreCapability, + ICacheDefaultTimes, + PurposefulGetAuthorizationHeader, + ICacheOptions, + GetAuthorizationHeader, +} from '.'; import { IProviders, ICorporateLink, ICachedEmployeeInformation } from '..'; import { IRepositoryMetadataProvider } from '../../entities/repositoryMetadata/repositoryMetadataProvider'; import { RestLibrary } from '../../lib/github'; @@ -78,8 +84,9 @@ export interface IOperationsLockdownFeatureFlags { } export interface IOperationsCentralOperationsToken { - getCentralOperationsToken(): IPurposefulGetAuthorizationHeader; // IGetAuthorizationHeader ?; getAccountByUsername(username: string, options?: ICacheOptions): Promise; + getPublicReadOnlyStaticToken(): GetAuthorizationHeader; + getPublicAuthorizationToken(): GetAuthorizationHeader; } export function operationsIsCapable( diff --git a/interfaces/github/rest.ts b/interfaces/github/rest.ts index c8ed62096..9d43fc236 100644 --- a/interfaces/github/rest.ts +++ b/interfaces/github/rest.ts @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { AppPurposeTypes } from '../../business/githubApps'; +import { AppPurposeTypes } from '../../lib/github/appPurposes'; export interface ICacheOptions { backgroundRefresh?: any | null | undefined; @@ -14,25 +14,29 @@ export interface ICacheOptionsWithPurpose extends ICacheOptions { purpose?: AppPurposeTypes; } +export type WithOptionalPurpose = { + purpose?: AppPurposeTypes; +}; + export interface IPagedCacheOptions extends ICacheOptions { pageRequestDelay?: number | null | undefined; // FUTURE: could be a function, too } -export interface IPurposefulGetAuthorizationHeader { - (purpose: AppPurposeTypes): Promise; -} +export type PagedCacheOptionsWithPurpose = IPagedCacheOptions & WithOptionalPurpose; -export interface IGetAuthorizationHeader { - (): Promise; -} +export type PurposefulGetAuthorizationHeader = ( + purpose: AppPurposeTypes +) => Promise; + +export type GetAuthorizationHeader = () => Promise; -export interface IAuthorizationHeaderValue { +export type AuthorizationHeaderValue = { value: string; purpose: AppPurposeTypes; source?: string; installationId?: number; organizationName?: string; -} +}; export interface ICacheDefaultTimes { orgReposStaleSeconds: number; @@ -58,6 +62,7 @@ export interface ICacheDefaultTimes { teamDetailStaleSeconds: number; orgRepoWebhooksStaleSeconds: number; teamRepositoryPermissionStaleSeconds: number; + defaultStaleSeconds: number; } // These "core capabilities" were created when the GitHub operations diff --git a/business/githubApps/index.ts b/lib/github/appPurposes.ts similarity index 97% rename from business/githubApps/index.ts rename to lib/github/appPurposes.ts index cd69afbd6..f91b08bf2 100644 --- a/business/githubApps/index.ts +++ b/lib/github/appPurposes.ts @@ -7,9 +7,10 @@ import { ExecutionEnvironment } from '../../interfaces'; import { CreateError } from '../../transitional'; import Debug from 'debug'; -import GitHubApplication from '../application'; -import { Operations } from '../operations'; import { GitHubTokenManager } from './tokenManager'; +import GitHubApplication from '../../business/application'; +import { Operations, OperationsCore } from '../../business'; + const debug = Debug('github:tokens'); export enum AppPurpose { @@ -167,6 +168,9 @@ const appPurposeToConfigurationName = { }; export function getAppPurposeId(purpose: AppPurposeTypes) { + if (!purpose) { + return 'n/a'; + } if ((purpose as ICustomAppPurpose).isCustomAppPurpose === true) { return (purpose as ICustomAppPurpose).id; } @@ -266,6 +270,7 @@ export interface IGitHubAppConfiguration { } export interface IGitHubAppsOptions { + operations: OperationsCore; // app: IReposApplication; configurations: Map; executionEnvironment: ExecutionEnvironment; diff --git a/business/githubApps/appTokens.ts b/lib/github/appTokens.ts similarity index 80% rename from business/githubApps/appTokens.ts rename to lib/github/appTokens.ts index 56c694f16..6fe19afb2 100644 --- a/business/githubApps/appTokens.ts +++ b/lib/github/appTokens.ts @@ -7,10 +7,11 @@ import { request } from '@octokit/request'; import { createAppAuth, InstallationAccessTokenAuthentication } from '@octokit/auth-app'; import { AppAuthentication, AuthInterface } from '@octokit/auth-app/dist-types/types'; -import { AppPurposeTypes, ICustomAppPurpose } from '.'; -import { IAuthorizationHeaderValue } from '../../interfaces'; +import { AppPurposeTypes, ICustomAppPurpose } from './appPurposes'; +import { AuthorizationHeaderValue } from '../../interfaces'; import Debug from 'debug'; +import { CreateError } from '../../transitional'; const debug = Debug('github:tokens'); interface IInstallationToken { @@ -27,6 +28,45 @@ interface IInstallationToken { const InstallationTokenLifetimeMilliseconds = 1000 * 60 * 60; const ValidityOffsetAfterNowMilliseconds = 1000 * 120; // how long to require validity in the future +export enum GitHubTokenType { + PersonalAccessToken = 'ghp', + OAuthAccessToken = 'gho', + UserToServerToken = 'ghu', + ServerToServerToken = 'ghs', + RefreshToken = 'ghr', + FineGrainedPersonalAccessToken = 'github_pat', +} + +export const GitHubTokenTypes = [ + GitHubTokenType.PersonalAccessToken, + GitHubTokenType.OAuthAccessToken, + GitHubTokenType.UserToServerToken, + GitHubTokenType.ServerToServerToken, + GitHubTokenType.RefreshToken, + GitHubTokenType.FineGrainedPersonalAccessToken, +]; + +export function getGitHubTokenTypeFromValue(value: string | AuthorizationHeaderValue): GitHubTokenType { + if (!value) { + throw CreateError.ParameterRequired('value'); + } + if (typeof value === 'object') { + value = value.value; + } else if (typeof value !== 'string') { + throw CreateError.InvalidParameters('value must be a string or AuthorizationHeaderValue'); + } + if (!value.startsWith('token ')) { + throw CreateError.InvalidParameters('value must start with "token "'); + } + const tokenValue = value.substr(6); + for (const tokenType of GitHubTokenTypes) { + if (tokenValue.startsWith(tokenType)) { + return tokenType; + } + } + throw CreateError.InvalidParameters('value does not appear to be a GitHub token'); +} + export class GitHubAppTokens { #privateKey: string; private _appId: number; @@ -39,23 +79,25 @@ export class GitHubAppTokens { static CreateFromBase64EncodedFileString( purpose: AppPurposeTypes, + slug: string, friendlyName: string, applicationId: number, fileContents: string, baseUrl?: string ): GitHubAppTokens { const keyContents = Buffer.from(fileContents, 'base64').toString('utf8').replace(/\r\n/g, '\n'); - return new GitHubAppTokens(purpose, friendlyName, applicationId, keyContents, baseUrl); + return new GitHubAppTokens(purpose, slug, friendlyName, applicationId, keyContents, baseUrl); } static CreateFromString( purpose: AppPurposeTypes, + slug: string, friendlyName: string, applicationId: number, value: string, baseUrl?: string ): GitHubAppTokens { - return new GitHubAppTokens(purpose, friendlyName, applicationId, value, baseUrl); + return new GitHubAppTokens(purpose, slug, friendlyName, applicationId, value, baseUrl); } get appId() { @@ -68,6 +110,7 @@ export class GitHubAppTokens { constructor( purpose: AppPurposeTypes, + public slug: string, public friendlyName: string, appId: number, privateKey: string, @@ -114,7 +157,7 @@ export class GitHubAppTokens { async getInstallationToken( installationId: number, organizationName: string - ): Promise { + ): Promise { const now = new Date(); const requiredValidityPeriod = new Date(now.getTime() + ValidityOffsetAfterNowMilliseconds); const latestToken = this.getLatestValidToken(installationId, requiredValidityPeriod); diff --git a/lib/github/collections.ts b/lib/github/collections.ts index b490d3876..d0fb364a9 100644 --- a/lib/github/collections.ts +++ b/lib/github/collections.ts @@ -13,7 +13,7 @@ import { IRestResponse, flattenData } from './core'; import { CompositeApiContext, CompositeIntelligentEngine } from './composite'; import { Collaborator } from '../../business/collaborator'; import { Team } from '../../business/team'; -import { IPagedCacheOptions, IGetAuthorizationHeader, IDictionary } from '../../interfaces'; +import { IPagedCacheOptions, GetAuthorizationHeader, IDictionary } from '../../interfaces'; import { RestLibrary } from '.'; import { sleep } from '../../utils'; import GitHubApplication from '../../business/application'; @@ -26,6 +26,8 @@ export interface IGetAppInstallationsParameters { type WithPage = T & { page?: number }; +type WithOctokitRequest = T & { octokitRequest?: string }; + export type CollectionCopilotSeatsOptions = { org: string; per_page?: number; @@ -151,8 +153,56 @@ export class RestCollections { this.githubCall = githubCall; } + collectAllPages( + token: string | GetAuthorizationHeader, + collectionCacheKey: string, + octokitApiName: string, + parameters: ParametersType, + cacheOptions: IPagedCacheOptions, + fieldNamesToKeep?: string[] | WithSubPropertyReducer, + arrayReducePropertyName?: string + ): Promise { + return this.generalizedCollectionWithFilter( + collectionCacheKey, + octokitApiName, + fieldNamesToKeep, + token, + parameters, + cacheOptions, + arrayReducePropertyName + ); + } + + collectAllPagesViaHttpGet( + token: string | GetAuthorizationHeader, + collectionCacheKey: string, + getRestUrl: string, + parameters: ParametersType, + cacheOptions: IPagedCacheOptions, + fieldNamesToKeep?: string[] | WithSubPropertyReducer, + arrayReducePropertyName?: string + ): Promise { + const expandedOptions: WithOctokitRequest = Object.assign( + { + octokitRequest: getRestUrl.startsWith('GET ') ? getRestUrl.substr(4) : getRestUrl, + }, + parameters + ); + return this.collectAllPages( + token, + collectionCacheKey, + 'request', + expandedOptions, + cacheOptions, + fieldNamesToKeep, + arrayReducePropertyName + ); + } + + // --- + getOrgRepos( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -167,7 +217,7 @@ export class RestCollections { } getOrgTeams( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -182,7 +232,7 @@ export class RestCollections { } getTeamChildTeams( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -197,7 +247,7 @@ export class RestCollections { } getUserActivity( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -212,7 +262,7 @@ export class RestCollections { } getOrgMembers( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -227,7 +277,7 @@ export class RestCollections { } getOrganizationCopilotSeats( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options: CollectionCopilotSeatsOptions, cacheOptions: IPagedCacheOptions ): Promise { @@ -252,7 +302,7 @@ export class RestCollections { } getAppInstallations( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, parameters: IGetAppInstallationsParameters, cacheOptions: IPagedCacheOptions ): Promise { @@ -273,7 +323,7 @@ export class RestCollections { } getRepoIssues( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -288,7 +338,7 @@ export class RestCollections { } getRepoProjects( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -303,7 +353,7 @@ export class RestCollections { } getRepoTeams( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -318,7 +368,7 @@ export class RestCollections { } getRepoContributors( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -333,7 +383,7 @@ export class RestCollections { } getRepoCollaborators( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -348,7 +398,7 @@ export class RestCollections { } getRepoInvitations( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -363,7 +413,7 @@ export class RestCollections { } getRepoBranches( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -378,7 +428,7 @@ export class RestCollections { } getRepoPullRequests( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options: IListPullsParameters, cacheOptions: IPagedCacheOptions ): Promise { @@ -393,7 +443,7 @@ export class RestCollections { } getTeamMembers( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -408,7 +458,7 @@ export class RestCollections { } getTeamRepos( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options, cacheOptions: IPagedCacheOptions ): Promise { @@ -423,7 +473,7 @@ export class RestCollections { } private async getGithubCollection( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, methodName: string, options: OptionsType, cacheOptions: IPagedCacheOptions, @@ -515,7 +565,7 @@ export class RestCollections { } private async getFilteredGithubCollection( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, methodName: string, options: OptionsType, cacheOptions: IPagedCacheOptions, @@ -580,7 +630,7 @@ export class RestCollections { } private async getFilteredGithubCollectionWithMetadataAnalysis( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, methodName: string, options: OptionsType, cacheOptions: IPagedCacheOptions, @@ -632,7 +682,7 @@ export class RestCollections { } private generalizedCollectionMethod( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, apiName: string, method, options, @@ -650,7 +700,7 @@ export class RestCollections { } private getCollectionAndFilter( - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options: OptionsType, cacheOptions: IPagedCacheOptions, githubClientMethod: string, @@ -658,7 +708,7 @@ export class RestCollections { arrayReducePropertyName?: string ) { const capturedThis = this; - return function (token: string | IGetAuthorizationHeader, options: OptionsType) { + return function (token: string | GetAuthorizationHeader, options: OptionsType) { return capturedThis.getFilteredGithubCollectionWithMetadataAnalysis( token, githubClientMethod, @@ -674,7 +724,7 @@ export class RestCollections { name: string, githubClientMethod: string, propertiesToKeep: string[], - token: string | IGetAuthorizationHeader, + token: string | GetAuthorizationHeader, options: OptionsType, cacheOptions: IPagedCacheOptions, arrayReducePropertyName?: string diff --git a/lib/github/composite.ts b/lib/github/composite.ts index ab9ae1d6a..aca88d167 100644 --- a/lib/github/composite.ts +++ b/lib/github/composite.ts @@ -22,7 +22,7 @@ import { IRestMetadata, IRestResponse, } from './core'; -import { IGetAuthorizationHeader } from '../../interfaces'; +import { GetAuthorizationHeader } from '../../interfaces'; import appPackage from '../../package.json'; @@ -34,7 +34,7 @@ const acceleratedExpirationMinutes = 60; // 1 hour export class CompositeApiContext extends ApiContext { private _apiMethod: any; private _apiTypePrefix: string; - private _token: string | IGetAuthorizationHeader; + private _token: string | GetAuthorizationHeader; private _cacheValues: IApiContextCacheValues; private _redisKeys: IApiContextRedisKeys; @@ -74,11 +74,11 @@ export class CompositeApiContext extends ApiContext { return this._cacheValues; } - get token(): string | IGetAuthorizationHeader { + get token(): string | GetAuthorizationHeader { return this._token; } - overrideToken(token: string | IGetAuthorizationHeader) { + overrideToken(token: string | GetAuthorizationHeader) { this._token = token; } diff --git a/lib/github/core.ts b/lib/github/core.ts index 99e3f875b..f00843b44 100644 --- a/lib/github/core.ts +++ b/lib/github/core.ts @@ -8,7 +8,7 @@ import { randomUUID } from 'crypto'; import moment from 'moment'; import { RestLibrary } from '.'; -import { IAuthorizationHeaderValue } from '../../interfaces'; +import { AuthorizationHeaderValue } from '../../interfaces'; import { sleep } from '../../utils'; import cost from './cost'; @@ -99,7 +99,7 @@ export abstract class ApiContext { libraryContext: RestLibrary; etag?: string; - tokenSource: IAuthorizationHeaderValue; + tokenSource: AuthorizationHeaderValue; abstract get apiTypePrefix(): string; abstract get cacheValues(): IApiContextCacheValues; diff --git a/lib/github/crossOrganization.ts b/lib/github/crossOrganization.ts index a1e72dde1..7aa58b534 100644 --- a/lib/github/crossOrganization.ts +++ b/lib/github/crossOrganization.ts @@ -11,10 +11,10 @@ import { ICacheOptions, IGetOrganizationMembersOptions, IPagedCrossOrganizationCacheOptions, - IPurposefulGetAuthorizationHeader, + PurposefulGetAuthorizationHeader, ITeamMembershipOptions, } from '../../interfaces'; -import { AppPurpose } from '../../business/githubApps'; +import { AppPurpose } from './appPurposes'; interface IOrganizationsResponse extends IRestResponse { orgs?: any; @@ -42,7 +42,7 @@ export class CrossOrganizationCollator { } async orgMembers( - orgsAndTokens: Map, + orgsAndTokens: Map, options: IGetOrganizationMembersOptions, cacheOptions: ICacheOptions ): Promise { @@ -57,13 +57,13 @@ export class CrossOrganizationCollator { return flattenData(data); } - async teams(orgsAndTokens: Map, options, cacheOptions) { + async teams(orgsAndTokens: Map, options, cacheOptions) { const allTeams = await this.getAllTeams(orgsAndTokens, options, cacheOptions); return flattenData(allTeams); } async teamMembers( - orgsAndTokens: Map, + orgsAndTokens: Map, options: ITeamMembershipOptions, cacheOptions: ICacheOptions ): Promise { @@ -90,7 +90,7 @@ export class CrossOrganizationCollator { } async repos( - orgsAndTokens: Map, + orgsAndTokens: Map, options, cacheOptions: ICacheOptions ): Promise { @@ -99,7 +99,7 @@ export class CrossOrganizationCollator { } async repoCollaborators( - orgsAndTokens: Map, + orgsAndTokens: Map, options, cacheOptions: ICacheOptions ): Promise { @@ -126,7 +126,7 @@ export class CrossOrganizationCollator { } async repoTeams( - orgsAndTokens: Map, + orgsAndTokens: Map, options, cacheOptions: ICacheOptions ): Promise { @@ -173,7 +173,7 @@ export class CrossOrganizationCollator { } private async getCrossOrganizationMethod( - orgsAndTokens: Map, + orgsAndTokens: Map, apiName: string, methodName: string, options, @@ -242,7 +242,7 @@ export class CrossOrganizationCollator { private crossOrganizationCollection( capturedThis: CrossOrganizationCollator, - orgsAndTokens: Map, + orgsAndTokens: Map, options, cacheOptions: IPagedCrossOrganizationCacheOptions, innerKeyType, @@ -303,7 +303,7 @@ export class CrossOrganizationCollator { const localOptions = Object.assign(localOptionsTarget, options); delete localOptions.maxAgeSeconds; delete localOptions.backgroundRefresh; - const token = orgsAndTokens.get(orgName.toLowerCase()) as IPurposefulGetAuthorizationHeader; + const token = orgsAndTokens.get(orgName.toLowerCase()) as PurposefulGetAuthorizationHeader; if (!token) { throw new Error(`No token available for the organization ${orgName}`); } @@ -348,7 +348,7 @@ export class CrossOrganizationCollator { } private async getAllTeams( - orgsAndTokens: Map, + orgsAndTokens: Map, options, cacheOptions: IPagedCrossOrganizationCacheOptions ): Promise { @@ -364,7 +364,7 @@ export class CrossOrganizationCollator { } private async getAllRepos( - orgsAndTokens: Map, + orgsAndTokens: Map, options, cacheOptions: IPagedCrossOrganizationCacheOptions ): Promise { diff --git a/lib/github/index.ts b/lib/github/index.ts index ebe0aa8b4..38fb781b0 100644 --- a/lib/github/index.ts +++ b/lib/github/index.ts @@ -13,17 +13,26 @@ import { CompositeIntelligentEngine } from './composite'; import { RestCollections } from './collections'; import { CrossOrganizationCollator } from './crossOrganization'; import { LinkMethods } from './links'; -import { IGetAuthorizationHeader, IAuthorizationHeaderValue } from '../../interfaces'; +import { GetAuthorizationHeader, AuthorizationHeaderValue } from '../../interfaces'; import { ICacheHelper } from '../caching'; -import { ICustomAppPurpose } from '../../business/githubApps'; +import { ICustomAppPurpose } from './appPurposes'; +import { CreateError } from '../../transitional'; export enum CacheMode { ValidateCache = 'ValidateCache', BackgroundRefresh = 'BackgroundRefresh', } +export enum HttpMethod { + Get = 'GET', + Post = 'POST', + Put = 'PUT', + Patch = 'PATCH', + Delete = 'DELETE', +} + export interface IGitHubPostFunction { - (awaitToken: IGetAuthorizationHeader, api: string, parameters: any): Promise; + (awaitToken: GetAuthorizationHeader, api: string, parameters: any): Promise; } export type OctokitGraphqlOptions = { @@ -128,25 +137,27 @@ export class RestLibrary { hasNextPage?: (any) => boolean; private async resolveAuthorizationHeader( - authorizationHeader: IGetAuthorizationHeader | IAuthorizationHeaderValue | string - ): Promise { + authorizationHeader: GetAuthorizationHeader | AuthorizationHeaderValue | string + ): Promise { let authorizationValue = null; try { - if (typeof authorizationHeader === 'string') { + if (!authorizationHeader) { + throw CreateError.InvalidParameters('No authorization header'); + } else if (typeof authorizationHeader === 'string') { authorizationValue = authorizationHeader as string; } else if (typeof authorizationHeader === 'function') { - let asFunc = authorizationHeader as IGetAuthorizationHeader; - let resolved = asFunc.call(null) as Promise; + let asFunc = authorizationHeader as GetAuthorizationHeader; + let resolved = asFunc.call(null) as Promise; authorizationValue = await resolved; if (typeof resolved === 'function') { - asFunc = resolved as IGetAuthorizationHeader; - resolved = asFunc.call(null) as Promise; + asFunc = resolved as GetAuthorizationHeader; + resolved = asFunc.call(null) as Promise; authorizationValue = await resolved; } } else if (authorizationHeader && authorizationHeader['value']) { - authorizationValue = authorizationHeader as IAuthorizationHeaderValue; + authorizationValue = authorizationHeader as AuthorizationHeaderValue; } else { - throw new Error('Invalid resolveAuthorizationHeader'); + throw CreateError.InvalidParameters('Unknown resolveAuthorizationHeader type'); } } catch (getTokenError) { console.dir(getTokenError); @@ -156,7 +167,7 @@ export class RestLibrary { } async call( - awaitToken: IGetAuthorizationHeader | IAuthorizationHeaderValue | string, + awaitToken: GetAuthorizationHeader | AuthorizationHeaderValue | string, api: string, options, cacheOptions = null @@ -181,20 +192,32 @@ export class RestLibrary { return result; } - request(token, restEndpoint, parameters: any, cacheOptions): Promise { + request(token: GetAuthorizationHeader | string, restEndpoint, parameters: any, cacheOptions): Promise { parameters = parameters || {}; parameters['octokitRequest'] = restEndpoint; return this.call(token, 'request', parameters, cacheOptions); } - requestAsPost(token, restEndpoint, parameters: any): Promise { + requestAsPost(token: GetAuthorizationHeader | string, restEndpoint, parameters: any): Promise { parameters = parameters || {}; parameters['octokitRequest'] = restEndpoint; return this.post(token, 'request', parameters); } + restApi( + token: GetAuthorizationHeader | string, + httpMethod: HttpMethod, + restEndpoint: string, + parameters: any + ): Promise { + const requestUrlValue = `${httpMethod} ${restEndpoint}`; + return httpMethod === HttpMethod.Get + ? this.request(token, requestUrlValue, parameters, {}) + : this.requestAsPost(token, requestUrlValue, parameters); + } + graphql( - token, + token: GetAuthorizationHeader | string, query: string, parameters: any, graphqlOptions: OctokitGraphqlOptions = {} @@ -203,7 +226,7 @@ export class RestLibrary { } graphqlIteration( - token, + token: GetAuthorizationHeader | string, query: string, parameters: any, graphqlOptions: OctokitGraphqlOptions = {} @@ -228,7 +251,7 @@ export class RestLibrary { return this.post(token, api, parameters); } - async post(awaitToken: IGetAuthorizationHeader | string, api: string, options: any): Promise { + async post(awaitToken: GetAuthorizationHeader | string, api: string, options: any): Promise { const method = restApi.IntelligentGitHubEngine.findLibraryMethod(this.github, api); if (!options.headers) { options.headers = {}; @@ -239,14 +262,14 @@ export class RestLibrary { delete options.allowEmptyResponse; massageData = noDataMassage; } - let diagnosticHeaderInformation: IAuthorizationHeaderValue = null; + let diagnosticHeaderInformation: AuthorizationHeaderValue = null; if (!options.headers.authorization) { const value = await this.resolveAuthorizationHeader(awaitToken); - if ((value as IAuthorizationHeaderValue)?.purpose) { - diagnosticHeaderInformation = value as IAuthorizationHeaderValue; + if ((value as AuthorizationHeaderValue)?.purpose) { + diagnosticHeaderInformation = value as AuthorizationHeaderValue; } options.headers.authorization = - typeof value === 'string' ? (value as string) : (value as IAuthorizationHeaderValue).value; + typeof value === 'string' ? (value as string) : (value as AuthorizationHeaderValue).value; } const diagnostic: Record = {}; try { @@ -283,6 +306,10 @@ export class RestLibrary { return finalized; } catch (error) { console.log(`API ${api} POST error: ${error.message}`); + if (error?.message?.includes('Unexpected end of JSON input')) { + console.log('Usually a unicorn and bad GitHub 500'); + console.dir(error); + } if ( error?.message?.includes('Resource not accessible by integration') || error?.message?.includes('Not Found') diff --git a/lib/github/restApi.ts b/lib/github/restApi.ts index 90434ca5b..7cb46ac0f 100644 --- a/lib/github/restApi.ts +++ b/lib/github/restApi.ts @@ -28,12 +28,12 @@ import { getEntityDefinitions, GitHubResponseType, ResponseBodyType } from './en import appPackage from '../../package.json'; import { ErrorHelper } from '../../transitional'; -import type { IGetAuthorizationHeader, IAuthorizationHeaderValue } from '../../interfaces'; +import type { GetAuthorizationHeader, AuthorizationHeaderValue } from '../../interfaces'; import { type IGitHubAppConfiguration, getAppPurposeId, tryGetAppPurposeAppConfiguration, -} from '../../business/githubApps'; +} from './appPurposes'; const appVersion = appPackage.version; @@ -446,7 +446,7 @@ export class GitHubApiContext extends ApiContext { private _apiMethod: any; private _redisKeys: IApiContextRedisKeys; private _cacheValues: IApiContextCacheValues; - private _token: string | IGetAuthorizationHeader | IAuthorizationHeaderValue; + private _token: string | GetAuthorizationHeader | AuthorizationHeaderValue; public fakeLink?: IGitHubLink; @@ -472,7 +472,7 @@ export class GitHubApiContext extends ApiContext { }; } - get token(): string | IGetAuthorizationHeader | IAuthorizationHeaderValue { + get token(): string | GetAuthorizationHeader | AuthorizationHeaderValue { return this._token; } @@ -511,9 +511,9 @@ export class GitHubApiContext extends ApiContext { this.libraryContext = libraryContext; } - overrideToken(token: string | IGetAuthorizationHeader | IAuthorizationHeaderValue) { + overrideToken(token: string | GetAuthorizationHeader | AuthorizationHeaderValue) { if (token && token['value']) { - const asPair = token as IAuthorizationHeaderValue; + const asPair = token as AuthorizationHeaderValue; this._token = asPair.value; this.tokenSource = asPair; } else if (typeof token === 'string') { diff --git a/business/githubApps/tokenManager.ts b/lib/github/tokenManager.ts similarity index 71% rename from business/githubApps/tokenManager.ts rename to lib/github/tokenManager.ts index a6324f106..54f0057f6 100644 --- a/business/githubApps/tokenManager.ts +++ b/lib/github/tokenManager.ts @@ -15,20 +15,20 @@ import { GitHubAppPurposes, AppPurposeTypes, getAppPurposeId, -} from '.'; +} from './appPurposes'; import { GitHubAppTokens } from './appTokens'; -import { IAuthorizationHeaderValue, NoCacheNoBackground } from '../../interfaces'; +import { AuthorizationHeaderValue, GetAuthorizationHeader, NoCacheNoBackground } from '../../interfaces'; import { OrganizationSetting } from '../../entities/organizationSettings/organizationSetting'; import { readFileToText } from '../../utils'; -import { Operations, OperationsCore, Organization } from '..'; +import { Operations, OperationsCore, Organization } from '../../business'; import { CreateError } from '../../transitional'; -export interface IGitHubRateLimit { +export type GitHubRateLimit = { limit: number; remaining: number; reset: number; used: number; -} +}; // Installation redirect format: // /setup/app/APP_ID?installation_id=INSTALLATION_ID&setup_action=install @@ -53,7 +53,7 @@ export class GitHubTokenManager { private _forceInstanceTokensToPurpose: AppPurposeTypes; private _allowReadOnlyFallbackToOtherInstallations: boolean; - static RegisterManagerForOperations(operations: OperationsCore, manager: GitHubTokenManager) { + private static RegisterManagerForOperations(operations: OperationsCore, manager: GitHubTokenManager) { GitHubTokenManager._managersForOperations.set(operations, manager); } @@ -69,6 +69,11 @@ export class GitHubTokenManager { this.#options = options; GitHubTokenManager._forceBackgroundTokens = executionEnvironment.isJob && !executionEnvironment.enableAllGitHubApps; + GitHubTokenManager.RegisterManagerForOperations(options.operations, this); + } + + private operations() { + return this.#options.operations as Operations; } private getFallbackList(input: AppPurposeTypes[]) { @@ -147,6 +152,8 @@ export class GitHubTokenManager { } private getPurposeDisplayId(purpose: AppPurposeTypes) { + // is this identical to the method getAppPurposeId? + const asCustom = purpose as ICustomAppPurpose; if (asCustom?.isCustomAppPurpose === true) { return asCustom.id; @@ -189,9 +196,11 @@ export class GitHubTokenManager { preferredPurpose: AppPurposeTypes, organizationSettings: OrganizationSetting, appAuthenticationType: GitHubAppAuthenticationType - ): Promise { + ): Promise { debug( - `getOrganizationAuthorizationHeader(${organizationName}, ${preferredPurpose}, ${appAuthenticationType})` + `getOrganizationAuthorizationHeader(${organizationName}, ${this.getPurposeDisplayId( + preferredPurpose + )}, ${appAuthenticationType})` ); const installationIdPair = this.getPrioritizedOrganizationInstallationId( preferredPurpose, @@ -200,8 +209,10 @@ export class GitHubTokenManager { appAuthenticationType ); if (!installationIdPair) { - throw new Error( - `GitHubTokenManager: organization ${organizationName} does not have a configured GitHub App installation, or, the installation information is not in this environment. The API preferred purpose was ${preferredPurpose} with the selection type ${appAuthenticationType}.` + throw CreateError.InvalidParameters( + `GitHubTokenManager: organization ${organizationName} does not have a configured GitHub App installation, or, the installation information is not in this environment. The API preferred purpose was ${getAppPurposeId( + preferredPurpose + )} with the selection type ${appAuthenticationType}.` ); } if ( @@ -255,7 +266,9 @@ export class GitHubTokenManager { ); const value = await app.getInstallationToken(installationIdPair.installationId, organizationName); debug( - `returned installation ID pair: installationId=${value?.installationId}, source=${value?.source}, purpose=${value?.purpose}` + `returned installation ID pair: installationId=${value?.installationId}, source=${value?.source}, purpose=${this.getPurposeDisplayId( + value?.purpose + )}` ); return value; } @@ -264,7 +277,7 @@ export class GitHubTokenManager { appId: number, installationId: number, organizationName: string - ): Promise { + ): Promise { const app = this._appsById.get(appId); if (!app) { throw new Error(`App ID=${appId} is not configured in this application instance`); @@ -272,10 +285,50 @@ export class GitHubTokenManager { return app.getInstallationToken(installationId, organizationName); } - getAppForPurpose(purpose: AppPurposeTypes) { + getAppForPurpose(purpose: AppPurposeTypes, organizationName?: string) { + const asCustomPurpose = this.getCustomPurpose(purpose); + if (asCustomPurpose?.getForOrganizationName) { + const configForOrganization = asCustomPurpose.getForOrganizationName(organizationName); + const appId = configForOrganization.appId; + if (appId) { + return this._appsById.get(appId); + } + } else if (asCustomPurpose?.getApplicationConfigurationForInitialization) { + const config = asCustomPurpose.getApplicationConfigurationForInitialization(); + const appId = config.appId; + if (appId) { + return this._appsById.get(appId); + } + } return this._apps.get(purpose); } + getAnyConfiguredInstallationIdForAppId(operations: Operations, appId: number) { + const orgs = operations.getOrganizations(); + for (const org of orgs) { + const settings = org.getDynamicSettings(); + if (settings?.installations) { + for (const { appId: appConfiguredId, installationId } of settings.installations) { + if (appConfiguredId === appId) { + return { installationId, organizationName: org.name }; + } + } + } + } + } + + getAnyConfiguredInstallationIdForAnyApp(operations: Operations) { + const orgs = operations.getOrganizations(); + for (const org of orgs) { + const settings = org.getDynamicSettings(); + if (settings?.installations) { + for (const { installationId, appId } of settings.installations) { + return { installationId, organizationName: org.name, appId }; + } + } + } + } + getInstallationIdForOrganization(purpose: AppPurposeTypes, organization: Organization) { const settings = organization.getDynamicSettings(); if (settings?.installations) { @@ -286,7 +339,18 @@ export class GitHubTokenManager { } } } - // CONSIDER: custom purposes could expose the installation ID here + const asCustomPurpose = this.getCustomPurpose(purpose); + if (asCustomPurpose?.getForOrganizationName) { + const configForOrganization = asCustomPurpose.getForOrganizationName(organization.name); + if (configForOrganization.slug) { + throw CreateError.NotImplemented( + `While a custom purpose is configured for the "${organization.name}" with the app ${configForOrganization.slug}, the installation ID is not yet available with this call. This is a known limitation.` + ); + } + throw CreateError.NotImplemented( + `This custom purpose is not configured for the "${organization.name}" org with the app ${configForOrganization.slug}, the installation ID is not yet available with this call. This is a known limitation.` + ); + } if (!organization.hasDynamicSettings) { throw CreateError.InvalidParameters( `Organization ${organization.name} does not have dynamic settings or purpose-directed configuration` @@ -294,6 +358,74 @@ export class GitHubTokenManager { } } + getAuthorizationHeaderForAnyApp(): AuthorizationHeaderValue { + const anyConfigured = this.getAnyConfiguredInstallationIdForAnyApp(this.operations()); + if (anyConfigured) { + return this.getInstallationAuthorizationHeader.bind( + this, + anyConfigured.appId, + anyConfigured.installationId, + anyConfigured.organizationName + ); + } + throw CreateError.InvalidParameters('No configured applications available.'); + } + + async getAppInformation(purpose: AppPurposeTypes, organizationName?: string) { + const appTokens = this.getAppForPurpose(purpose, organizationName); + if (!appTokens) { + throw CreateError.InvalidParameters(`No app configured yet for purpose ${purpose}`); + } + const slug = appTokens.slug; + if (!slug) { + throw CreateError.InvalidParameters(`No slug configured for purpose ${purpose}`); + } + return this.getAppInformationBySlug(this.operations(), slug); + } + + async getAppInformationBySlug(operations: Operations, slug: string) { + let appId: number = null; + for (const entry of this._appSlugs.entries()) { + if (entry[1] === slug) { + appId = entry[0]; + break; + } + } + let authorizationHeader: GetAuthorizationHeader = null; + // Have the app call itself via the slug-based API (works if it's a private single-org app) + if (appId) { + const anyConfiguredForApp = this.getAnyConfiguredInstallationIdForAppId(operations, appId); + if (anyConfiguredForApp) { + authorizationHeader = this.getInstallationAuthorizationHeader.bind( + this, + appId, + anyConfiguredForApp.installationId, + anyConfiguredForApp.organizationName + ); + } + } + // Call using any configured app + if (!authorizationHeader) { + const anyConfigured = this.getAnyConfiguredInstallationIdForAnyApp(operations); + if (anyConfigured) { + authorizationHeader = this.getInstallationAuthorizationHeader.bind( + this, + anyConfigured.appId, + anyConfigured.installationId, + anyConfigured.organizationName + ); + } + } + // Fallback to a static token + if (!authorizationHeader) { + authorizationHeader = operations.getPublicReadOnlyStaticToken.bind(operations); + } + const value = await operations.github.post(authorizationHeader, 'apps.getBySlug', { + app_slug: slug, + }); + return value; + } + async getRateLimitInformation(purpose: AppPurposeTypes, organization: Organization) { const settings = organization.getDynamicSettings(); if (settings?.installations) { @@ -312,7 +444,7 @@ export class GitHubTokenManager { NoCacheNoBackground ); if (value?.rate) { - return value.rate as IGitHubRateLimit; + return value.rate as GitHubRateLimit; } console.warn(value); throw CreateError.InvalidParameters('No rate limit information returned'); @@ -348,12 +480,18 @@ export class GitHubTokenManager { const allPurposes = GitHubAppPurposes.AllAvailableAppPurposes; const fallbackPurposePriorities = this.getFallbackList(allPurposes); const customPurposes = allPurposes.filter((p) => (p as ICustomAppPurpose).isCustomAppPurpose === true); + const matchingCustomPurposes = + (preferredPurpose as ICustomAppPurpose)?.isCustomAppPurpose === true + ? customPurposes.filter( + (cp) => (cp as ICustomAppPurpose).id === (preferredPurpose as ICustomAppPurpose).id + ) + : customPurposes; let order = this.isForcingBackgroundJobType() === true ? fallbackPurposePriorities : [preferredPurpose, ...fallbackPurposePriorities]; if (appAuthenticationType === GitHubAppAuthenticationType.ForceSpecificInstallation) { - order = [preferredPurpose, ...customPurposes]; + order = [preferredPurpose, ...matchingCustomPurposes]; } for (const purpose of order) { let customAppPurpose = purpose as ICustomAppPurpose; @@ -406,11 +544,12 @@ export class GitHubTokenManager { // Not base64-encoded, use the CreateFromString method. skipDecodingBase64 = true; } + const slug = appConfig.slug; const friendlyName = customPurpose?.name || appConfig.description || 'Unknown'; const baseUrl = appConfig.baseUrl; const app = skipDecodingBase64 - ? GitHubAppTokens.CreateFromString(purpose, friendlyName, appId, key, baseUrl) - : GitHubAppTokens.CreateFromBase64EncodedFileString(purpose, friendlyName, appId, key, baseUrl); + ? GitHubAppTokens.CreateFromString(purpose, slug, friendlyName, appId, key, baseUrl) + : GitHubAppTokens.CreateFromBase64EncodedFileString(purpose, slug, friendlyName, appId, key, baseUrl); const hasCustomConfigurationByOrganization = customPurpose?.getForOrganizationName; const standardPurpose = purpose as AppPurpose; if (!hasCustomConfigurationByOrganization) { diff --git a/middleware/initialize.ts b/middleware/initialize.ts index 3bec8af11..588dae76e 100644 --- a/middleware/initialize.ts +++ b/middleware/initialize.ts @@ -83,7 +83,7 @@ import type { } from '../interfaces'; import initializeRepositoryProvider from '../entities/repository'; import { tryGetImmutableStorageProvider } from '../lib/immutable'; -import { GitHubAppPurposes } from '../business/githubApps'; +import { GitHubAppPurposes } from '../lib/github/appPurposes'; const DefaultApplicationProfile: IApplicationProfile = { applicationName: 'Open Source Management Portal', @@ -319,16 +319,6 @@ async function initializeAsync( } function configureGitHubLibrary(cacheProvider: ICacheHelper, config): RestLibrary { - if ( - config && - config.github && - config.github.operations && - !config.github.operations.centralOperationsToken - ) { - debug( - 'WARNING: no central GitHub operations token is defined, some library operations may not succeed. ref: config.github.operations.centralOperationsToken var: GITHUB_CENTRAL_OPERATIONS_TOKEN' - ); - } const libraryContext = new RestLibrary({ config, cacheProvider, diff --git a/package-lock.json b/package-lock.json index 96c28d6f1..2faae0644 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,15 @@ "@azure/identity": "4.0.0", "@azure/keyvault-secrets": "4.7.0", "@azure/service-bus": "7.9.3", - "@azure/storage-blob": "12.16.0", - "@azure/storage-queue": "12.15.0", + "@azure/storage-blob": "12.17.0", + "@azure/storage-queue": "12.16.0", "@octokit/auth-app": "6.0.1", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.4", + "@octokit/request": "8.1.5", "@octokit/rest": "20.0.2", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", - "applicationinsights": "2.9.0", + "applicationinsights": "2.9.1", "async-prompt": "1.0.1", "axios": "1.6.1", "basic-auth": "2.0.1", @@ -73,7 +73,7 @@ }, "devDependencies": { "@types/cors": "2.8.16", - "@types/debug": "4.1.11", + "@types/debug": "4.1.12", "@types/express": "4.17.21", "@types/express-session": "1.17.10", "@types/jest": "29.5.8", @@ -98,7 +98,7 @@ "cspell": "8.0.0", "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", - "eslint-plugin-n": "16.3.0", + "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", @@ -501,9 +501,9 @@ } }, "node_modules/@azure/storage-blob": { - "version": "12.16.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.16.0.tgz", - "integrity": "sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==", + "version": "12.17.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.17.0.tgz", + "integrity": "sha512-sM4vpsCpcCApagRW5UIjQNlNylo02my2opgp0Emi8x888hZUvJ3dN69Oq20cEGXkMUWnoCrBaB0zyS3yeB87sQ==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -531,9 +531,9 @@ } }, "node_modules/@azure/storage-queue": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.15.0.tgz", - "integrity": "sha512-qotyfMcmocaT1r9bfX7RyQQnkRJcTXGSG/m6LIchtEsNmqLu3ulVqkOlNM+O0XP9wwJ6Da1XQbWz5jQtrDe3DQ==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.16.0.tgz", + "integrity": "sha512-HzwzMsNAh2PwLtx9WfXndj9elUr6duDFak5CjM6BxdWhLqf37VywPCWmEzjxuFfrq30c1T34+MjMXnN6YgqRUw==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -2528,9 +2528,9 @@ } }, "node_modules/@octokit/request": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz", - "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", + "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", @@ -2944,9 +2944,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.11.tgz", - "integrity": "sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" @@ -3684,9 +3684,9 @@ } }, "node_modules/applicationinsights": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.0.tgz", - "integrity": "sha512-W90WNjtvZ10GUInpkyNM0xBGe2qRYChHhdb44SE5KU7hXtCZLxs3IZjWw1gJINQem0qGAgtZlxrVvKPj5SlTbQ==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.1.tgz", + "integrity": "sha512-hrpe/OvHFZlq+SQERD1fxaYICyunxzEBh9SolJebzYnIXkyA9zxIR87dZAh+F3+weltbqdIP8W038cvtpMNhQg==", "dependencies": { "@azure/core-auth": "^1.5.0", "@azure/core-rest-pipeline": "1.10.1", @@ -4180,6 +4180,18 @@ "node": ">=4" } }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -5701,9 +5713,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.0.tgz", - "integrity": "sha512-/XZLH5CUXGK3laz3xYFNza8ZxLCq8ZNW6MsVw5z3d5hc2AwZzi0fPiySFZHQTdVDOHGs2cGv91aqzWmgBdq2gQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.1.tgz", + "integrity": "sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -5711,6 +5723,7 @@ "eslint-plugin-es-x": "^7.1.0", "get-tsconfig": "^4.7.0", "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", "is-core-module": "^2.12.1", "minimatch": "^3.1.2", "resolve": "^1.22.2", @@ -6942,6 +6955,21 @@ "node": ">=4" } }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -11818,9 +11846,9 @@ } }, "@azure/storage-blob": { - "version": "12.16.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.16.0.tgz", - "integrity": "sha512-jz33rUSUGUB65FgYrTRgRDjG6hdPHwfvHe+g/UrwVG8MsyLqSxg9TaW7Yuhjxu1v1OZ5xam2NU6+IpCN0xJO8Q==", + "version": "12.17.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.17.0.tgz", + "integrity": "sha512-sM4vpsCpcCApagRW5UIjQNlNylo02my2opgp0Emi8x888hZUvJ3dN69Oq20cEGXkMUWnoCrBaB0zyS3yeB87sQ==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -11844,9 +11872,9 @@ } }, "@azure/storage-queue": { - "version": "12.15.0", - "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.15.0.tgz", - "integrity": "sha512-qotyfMcmocaT1r9bfX7RyQQnkRJcTXGSG/m6LIchtEsNmqLu3ulVqkOlNM+O0XP9wwJ6Da1XQbWz5jQtrDe3DQ==", + "version": "12.16.0", + "resolved": "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.16.0.tgz", + "integrity": "sha512-HzwzMsNAh2PwLtx9WfXndj9elUr6duDFak5CjM6BxdWhLqf37VywPCWmEzjxuFfrq30c1T34+MjMXnN6YgqRUw==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-http": "^3.0.0", @@ -13483,9 +13511,9 @@ } }, "@octokit/request": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.4.tgz", - "integrity": "sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", + "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", "requires": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", @@ -13832,9 +13860,9 @@ } }, "@types/debug": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.11.tgz", - "integrity": "sha512-R2qflTjHDs4CL6D/6TkqBeIHr54WzZfIxN729xvCNlYIVp2LknlnCro5Yo3frNaX2E5gO9pZ3/QAPVdGmu+q9w==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "requires": { "@types/ms": "*" @@ -14421,9 +14449,9 @@ "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" }, "applicationinsights": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.0.tgz", - "integrity": "sha512-W90WNjtvZ10GUInpkyNM0xBGe2qRYChHhdb44SE5KU7hXtCZLxs3IZjWw1gJINQem0qGAgtZlxrVvKPj5SlTbQ==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.1.tgz", + "integrity": "sha512-hrpe/OvHFZlq+SQERD1fxaYICyunxzEBh9SolJebzYnIXkyA9zxIR87dZAh+F3+weltbqdIP8W038cvtpMNhQg==", "requires": { "@azure/core-auth": "^1.5.0", "@azure/core-rest-pipeline": "1.10.1", @@ -14792,6 +14820,12 @@ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -15892,9 +15926,9 @@ } }, "eslint-plugin-n": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.0.tgz", - "integrity": "sha512-/XZLH5CUXGK3laz3xYFNza8ZxLCq8ZNW6MsVw5z3d5hc2AwZzi0fPiySFZHQTdVDOHGs2cGv91aqzWmgBdq2gQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.3.1.tgz", + "integrity": "sha512-w46eDIkxQ2FaTHcey7G40eD+FhTXOdKudDXPUO2n9WNcslze/i/HT2qJ3GXjHngYSGDISIgPNhwGtgoix4zeOw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", @@ -15902,6 +15936,7 @@ "eslint-plugin-es-x": "^7.1.0", "get-tsconfig": "^4.7.0", "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", "is-core-module": "^2.12.1", "minimatch": "^3.1.2", "resolve": "^1.22.2", @@ -16749,6 +16784,15 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, + "is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", diff --git a/routes/administration/app.ts b/routes/administration/app.ts index 6bf902870..846777056 100644 --- a/routes/administration/app.ts +++ b/routes/administration/app.ts @@ -11,7 +11,7 @@ import { getProviders } from '../../transitional'; import { OrganizationSetting, IBasicGitHubAppInstallation, - SpecialTeam, + SystemTeam, } from '../../entities/organizationSettings/organizationSetting'; import { IndividualContext } from '../../business/user'; import { Operations, Organization } from '../../business'; @@ -296,22 +296,25 @@ router.post( // explicitly now allowing globalSudo to be set here throw new Error(`Unsupported team type: ${teamType}`); } - let specialTeamType: SpecialTeam = null; + let specialTeamType: SystemTeam = null; switch (teamType) { case 'everyone': - specialTeamType = SpecialTeam.Everyone; + specialTeamType = SystemTeam.Everyone; + break; + case 'openAccess': + specialTeamType = SystemTeam.OpenAccess; break; case 'systemAdmin': - specialTeamType = SpecialTeam.SystemAdmin; + specialTeamType = SystemTeam.SystemAdmin; break; case 'systemWrite': - specialTeamType = SpecialTeam.SystemWrite; + specialTeamType = SystemTeam.SystemWrite; break; case 'systemRead': - specialTeamType = SpecialTeam.SystemRead; + specialTeamType = SystemTeam.SystemRead; break; case 'sudo': - specialTeamType = SpecialTeam.Sudo; + specialTeamType = SystemTeam.Sudo; break; // case 'globalSudo': // specialTeamType = SpecialTeam.GlobalSudo; diff --git a/routes/org/repos.ts b/routes/org/repos.ts index 414b809fd..0a413a4ff 100644 --- a/routes/org/repos.ts +++ b/routes/org/repos.ts @@ -386,7 +386,7 @@ export async function calculateGroupedPermissionsViewForRepository(repository: R collaborators, // Collaborator[] outsideCollaborators, // Collaborator[] } = await calculateRepoPermissions(organization, repository); - const systemTeams = combineAllTeams(organization.specialRepositoryPermissionTeams); // number[] + const systemTeams = combineAllTeams(organization.specialSystemTeams); // number[] const teamBasedPermissions = consolidateTeamPermissions(permissions, systemTeams); // busted? const groupedPermissions = slicePermissionsForView( filterSystemTeams(teamsFilterType.systemTeamsExcluded, systemTeams, permissions) @@ -443,7 +443,7 @@ router.get( organization, repository ); - const systemTeams = combineAllTeams(organization.specialRepositoryPermissionTeams); + const systemTeams = combineAllTeams(organization.specialSystemTeams); const teamBasedPermissions = consolidateTeamPermissions(permissions, systemTeams); const title = `${repository.name} - Repository`; const details = await repository.organization.getDetails(); diff --git a/routes/org/team/index.ts b/routes/org/team/index.ts index abc44a640..11302d4f4 100644 --- a/routes/org/team/index.ts +++ b/routes/org/team/index.ts @@ -155,10 +155,11 @@ router.get( asyncHandler(async function (req: ILocalRequest, res: Response, next: NextFunction) { const team2 = req.team2 as Team; const organization = req.organization as Organization; - // The broad access "all members" team is always open for automatic joining without - // approval. This short circuit is to show that option. - const broadAccessTeams = new Set(organization.broadAccessTeams); - if (broadAccessTeams.has(team2.id)) { + // The broad access "all members" team and any "easy access" teams are + // always open for automatic joining without approval. This short circuit + // is to show that option. + const allowSelfJoinTeams = new Set([...organization.broadAccessTeams, ...organization.openAccessTeams]); + if (allowSelfJoinTeams.has(team2.id)) { req.individualContext.webContext.render({ view: 'org/team/join', title: `Join ${team2.name}`, @@ -255,7 +256,8 @@ export async function submitTeamJoinRequest( ): Promise { const { approvalProvider, config, graphProvider, mailProvider, insights, operations } = providers; const organization = team.organization; - const broadAccessTeams = new Set(organization.broadAccessTeams); + const { broadAccessTeams, openAccessTeams } = organization; + const allowSelfJoinTeams = new Set([...broadAccessTeams, ...openAccessTeams]); if (!approvalProvider) { return { error: new Error('No approval provider available') }; } @@ -263,8 +265,17 @@ export async function submitTeamJoinRequest( if (!username) { return { error: new Error('Active context required') }; } - if (broadAccessTeams.has(team.id)) { + if (allowSelfJoinTeams.has(team.id)) { try { + const eventName = broadAccessTeams.includes(team.id) ? 'JoinBroadAccessTeam' : 'JoinOpenAccessTeam'; + insights?.trackEvent({ + name: eventName, + properties: { + organization: organization.name, + id: team.id, + slug: team.slug, + }, + }); await team.addMembership(username); } catch (error) { insights?.trackEvent({ diff --git a/webhooks/tasks/automaticTeams.ts b/webhooks/tasks/automaticTeams.ts index b17cdcb2c..4cceedcc5 100644 --- a/webhooks/tasks/automaticTeams.ts +++ b/webhooks/tasks/automaticTeams.ts @@ -31,7 +31,7 @@ interface ICustomDataEventName { export default class AutomaticTeamsWebhookProcessor implements WebhookProcessor { processOrgSpecialTeams(organization: Organization) { - const specialTeams = organization.specialRepositoryPermissionTeams; + const specialTeams = organization.specialSystemTeams; const specials = []; const specialTeamIds = new Set(); const specialTeamLevels = new Map(); From ce034b0c9ef78f75e614b99f41d54a4097a5b96a Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Tue, 14 Nov 2023 12:42:30 -0500 Subject: [PATCH 51/69] Relocate repo-scoped custom properties calls --- Dockerfile | 9 +- business/organizationProperties.ts | 48 +----- business/repository.ts | 13 ++ features/graphTeamSync.ts | 31 ---- middleware/initialize.ts | 4 +- package-lock.json | 230 ++++++++++++++--------------- package.json | 10 +- routes/org/repos.ts | 8 +- 8 files changed, 146 insertions(+), 207 deletions(-) delete mode 100644 features/graphTeamSync.ts diff --git a/Dockerfile b/Dockerfile index 320494b8d..43e749481 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,10 +9,11 @@ FROM $IMAGE_NAME AS build ARG NPM_TOKEN -# Make Git available for NPM and rsync in the build image -RUN tdnf -y update --quiet && \ - tdnf -y install ca-certificates git --quiet && \ - tdnf clean all --quiet +RUN tdnf -y update --quiet + +# We used to also make Git available for NPM and rsync in build +# tdnf clean all --quiet && \ +# tdnf -y install ca-certificates git --quiet && \ WORKDIR /build diff --git a/business/organizationProperties.ts b/business/organizationProperties.ts index 023237a3f..9f4ac1d57 100644 --- a/business/organizationProperties.ts +++ b/business/organizationProperties.ts @@ -17,7 +17,6 @@ import { CreateError } from '../transitional'; import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; import { CacheDefault, - createCacheOptions, createPagedCacheOptions, getMaxAgeSeconds, getPageSize, @@ -40,7 +39,7 @@ export type OrganizationCustomPropertyEntity = { allowed_values?: string[]; }; -type SetPropertyValue = { +export type OrganizationCustomPropertySetPropertyValue = { property_name: string; value: string; }; @@ -66,32 +65,6 @@ export class OrganizationProperties { return getAuthorizationHeader; } - async getRepositoryCustomProperties( - repositoryName: string, - options?: ICacheOptionsWithPurpose - ): Promise> { - options = options || {}; - const operations = throwIfNotGitHubCapable(this.operations); - const { github } = operations; - const purpose = popPurpose(options, this._defaultPurpose); - const parameters = { - owner: this.organization.name, - repo: repositoryName, - }; - const cacheOptions = createCacheOptions(operations, options); - try { - const responseArray = await github.request( - this.authorize(purpose), - 'GET /repos/:owner/:repo/properties/values', - parameters, - cacheOptions - ); - return symbolizeApiResponse(arrayToSetProperties(responseArray)); - } catch (error) { - throw error; - } - } - async getCustomProperties( options?: PagedCacheOptionsWithPurpose ): Promise { @@ -187,15 +160,6 @@ export class OrganizationProperties { return res.properties; } - createOrUpdateRepositoryProperties( - repositoryName: string, - propertiesAndValues: Record, - purpose?: AppPurposeTypes - ): Promise { - const names = [repositoryName]; - return this.createOrUpdateRepositoriesProperties(names, propertiesAndValues, purpose); - } - async createOrUpdateRepositoriesProperties( organizationRepositoryNames: string[], propertiesAndValues: Record, @@ -223,7 +187,7 @@ export class OrganizationProperties { function setPropertiesRecordToArray(propertiesAndValues: Record) { const keys = Object.getOwnPropertyNames(propertiesAndValues); - const properties: SetPropertyValue[] = []; + const properties: OrganizationCustomPropertySetPropertyValue[] = []; for (const key of keys) { properties.push({ property_name: key, @@ -232,11 +196,3 @@ function setPropertiesRecordToArray(propertiesAndValues: Record) } return properties; } - -function arrayToSetProperties(properties: SetPropertyValue[]) { - const propertiesAndValues: Record = {}; - for (const property of properties) { - propertiesAndValues[property.property_name] = property.value; - } - return propertiesAndValues; -} diff --git a/business/repository.ts b/business/repository.ts index 4c8aeb2cd..8a9f52b62 100644 --- a/business/repository.ts +++ b/business/repository.ts @@ -57,6 +57,7 @@ import { RepositoryPullRequest } from './repositoryPullRequest'; import { ErrorHelper } from '../transitional'; import { augmentInertiaPreview, RepositoryProject } from './repositoryProject'; import { RepositoryInvitation } from './repositoryInvitation'; +import { RepositoryProperties } from './repositoryProperties'; interface IRepositoryMoments { created?: moment.Moment; @@ -219,6 +220,7 @@ export class Repository { private _operations: IOperationsInstance; private _organization: Organization; + private _customProperties: RepositoryProperties; private _name: string; @@ -388,6 +390,17 @@ export class Repository { this._operations = operations; } + get customProperties() { + if (!this._customProperties) { + this._customProperties = new RepositoryProperties( + this, + this._operations, + this._getSpecificAuthorizationHeader.bind(this) + ); + } + return this._customProperties; + } + get moment(): IRepositoryMoments { if (!this._moments) { this._moments = { diff --git a/features/graphTeamSync.ts b/features/graphTeamSync.ts deleted file mode 100644 index e1c8c4777..000000000 --- a/features/graphTeamSync.ts +++ /dev/null @@ -1,31 +0,0 @@ -// -// Copyright (c) Microsoft. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -// - -import { Team } from '../business'; -import { IProviders } from '../interfaces'; - -export class GraphTeamSync { - #team: Team; - #providers: IProviders; - - constructor(providers: IProviders, team: Team) { - this.#providers = providers; - this.#team = team; - } - - // On the GitHub side, they define: - // - The team must not have any sub-teams (must be a leaf node) - // - Can have up to 5 directory groups assigned to the team - // - Team Maintainers are not touched (TBD need to confirm) - // - If you suspend sync, it removes all the members - - // Unknowns: - // - What happens if the sole maint leaves... guess it just becomes an orphan team - // - How to handle removed directory groups - // - How much to store, log, show in the UI, or notify people about - - // Value-adds: - // - When a user links for the first time, kick off a job to evaluate the directory groups they're in -} diff --git a/middleware/initialize.ts b/middleware/initialize.ts index 588dae76e..106c62e7c 100644 --- a/middleware/initialize.ts +++ b/middleware/initialize.ts @@ -355,8 +355,8 @@ export default async function initialize( const containerPurpose = executionEnvironment.isJob ? 'job' : applicationProfile.webServer - ? 'web application' - : 'application'; + ? 'web application' + : 'application'; if (executionEnvironment.entrypointName) { debug(`${containerPurpose} name: ${executionEnvironment.entrypointName}`); } diff --git a/package-lock.json b/package-lock.json index 2faae0644..29cf681b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,7 +46,7 @@ "jwks-rsa": "3.1.0", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.4.3", + "luxon": "3.4.4", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", @@ -93,8 +93,8 @@ "@types/semver": "7.5.5", "@types/simple-oauth2": "5.0.7", "@types/validator": "13.11.6", - "@typescript-eslint/eslint-plugin": "6.10.0", - "@typescript-eslint/parser": "6.10.0", + "@typescript-eslint/eslint-plugin": "6.11.0", + "@typescript-eslint/parser": "6.11.0", "cspell": "8.0.0", "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", @@ -103,9 +103,9 @@ "husky": "8.0.3", "jest": "29.7.0", "jest-junit": "16.0.0", - "lint-staged": "15.0.2", + "lint-staged": "15.1.0", "markdownlint-cli2": "0.10.0", - "prettier": "3.0.3", + "prettier": "3.1.0", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", @@ -3341,16 +3341,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", + "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/type-utils": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3376,15 +3376,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4" }, "engines": { @@ -3404,13 +3404,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3421,13 +3421,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", + "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/utils": "6.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3448,9 +3448,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3461,13 +3461,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3488,17 +3488,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", + "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", "semver": "^7.5.4" }, "engines": { @@ -3513,12 +3513,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/types": "6.11.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -8181,9 +8181,9 @@ } }, "node_modules/lint-staged": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", - "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", "dev": true, "dependencies": { "chalk": "5.3.0", @@ -8195,7 +8195,7 @@ "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.3" + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -8555,9 +8555,9 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, "node_modules/luxon": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", - "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } @@ -9681,9 +9681,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -11446,9 +11446,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -14243,16 +14243,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", + "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/type-utils": "6.11.0", + "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14262,54 +14262,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", + "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", "dev": true, "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" } }, "@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", + "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/utils": "6.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14318,27 +14318,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", + "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/types": "6.11.0", "eslint-visitor-keys": "^3.4.1" } }, @@ -17721,9 +17721,9 @@ } }, "lint-staged": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz", - "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", + "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", "dev": true, "requires": { "chalk": "5.3.0", @@ -17735,7 +17735,7 @@ "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.3" + "yaml": "2.3.4" }, "dependencies": { "chalk": { @@ -17987,9 +17987,9 @@ } }, "luxon": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", - "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==" + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==" }, "make-dir": { "version": "4.0.0", @@ -18823,9 +18823,9 @@ "dev": true }, "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true }, "prettier-linter-helpers": { @@ -20125,9 +20125,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true }, "yargs": { diff --git a/package.json b/package.json index ad3c1467c..3a6a26b5e 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "jwks-rsa": "3.1.0", "language-map": "1.5.0", "lodash": "4.17.21", - "luxon": "3.4.3", + "luxon": "3.4.4", "memory-cache": "0.2.0", "moment": "2.29.4", "morgan": "1.10.0", @@ -149,8 +149,8 @@ "@types/semver": "7.5.5", "@types/simple-oauth2": "5.0.7", "@types/validator": "13.11.6", - "@typescript-eslint/eslint-plugin": "6.10.0", - "@typescript-eslint/parser": "6.10.0", + "@typescript-eslint/eslint-plugin": "6.11.0", + "@typescript-eslint/parser": "6.11.0", "cspell": "8.0.0", "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", @@ -159,9 +159,9 @@ "husky": "8.0.3", "jest": "29.7.0", "jest-junit": "16.0.0", - "lint-staged": "15.0.2", + "lint-staged": "15.1.0", "markdownlint-cli2": "0.10.0", - "prettier": "3.0.3", + "prettier": "3.1.0", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", diff --git a/routes/org/repos.ts b/routes/org/repos.ts index 0a413a4ff..85f8e5eed 100644 --- a/routes/org/repos.ts +++ b/routes/org/repos.ts @@ -85,10 +85,10 @@ function sliceCollaboratorsForView(collaborators) { const destination = permission.admin ? collabView.administrators : permission.push - ? collabView.writers - : permission.pull - ? collabView.readers - : null; + ? collabView.writers + : permission.pull + ? collabView.readers + : null; if (destination) { destination.push(collab); } From 1eebad909377bf7ab3e4b2d8a1975388590a27c2 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:14:19 -0800 Subject: [PATCH 52/69] FOSS Fund message update The FOSS Fund template in this project is specific to Microsoft, we should eventually relocate it. --- views/email/fossfund-vote.pug | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/views/email/fossfund-vote.pug b/views/email/fossfund-vote.pug index 25b0f8987..94f43ceaf 100644 --- a/views/email/fossfund-vote.pug +++ b/views/email/fossfund-vote.pug @@ -48,16 +48,16 @@ block content p= election.description if userSettings && userSettings.contributionShareOptIn === true - //-h2 Launching soon, featuring you: the new opensource.microsoft.com + //-h2 Featuring you: the opensource.microsoft.com //-p Thanks for opting in to public data sharing. Your GitHub avatar and/or public contributions on GitHub may be featured. We will let you know when the new site launches. //-p: a(href='https://aka.ms/opensource/publicdatasharing') More info at aka.ms/opensource/publicdatasharing else if userSettings && userSettings.contributionShareOptIn === false - //-h2 The new opensource.microsoft.com site launches this month featuring many of your coworkers + //-h2 opensource.microsoft.com site features many of your coworkers //-p You have opted out of participating in the new site at this time. If you change your mind... //-p: a(href='https://aka.ms/opensource/publicdatasharing') More info and ability to opt-in at aka.ms/opensource/publicdatasharing else - h2 Want to be featured on the new opensource.microsoft.com site? - p Launched earlier this year, the new site features Microsoft employees who contribute to open source, whether part of their job, a hobby, or just something they do. + h2 Want to be featured on the opensource.microsoft.com site? + p The site features Microsoft employees who contribute to open source, whether part of their job, a hobby, or just something they do. p If you'd like to have your GitHub avatar appear on the homepage at times, and your contributions to other projects highlighted when they're made as part of the new "ecosystem" page, you can opt-in to sharing that already-public info. p: a(href='https://aka.ms/opensource/publicdatasharing') More info and ability to opt-in at aka.ms/opensource/publicdatasharing @@ -79,19 +79,20 @@ block content p We are trying to drive a change across Microsoft. We'd like to see more Microsofties contributing to open source communities, whether as part of your role, a Day of Learning project, updating project dependencies, hobbies, or pursuing off-hours projects and interests. h2 About the FOSS Fund - p Microsoft's FOSS Fund gives $10,000 to the most-voted-for open source software project. Projects are nominated and selected by those at Microsoft who contribute to communities that are not primarily Microsoft communities. + p Microsoft's FOSS Fund gives up to $10,000 to the most-voted-for open source software projects. Projects are nominated and selected by those at Microsoft who contribute to communities that are not primarily Microsoft communities. p Public information about the fund can be found at #[a(href='https://aka.ms/microsoftfossfund') https://aka.ms/microsoftfossfund], including previous fund winners. h3 Nominated projects p Projects must: ul - li Be used by Microsoft - li Have an OSI-approved license such as MIT, Apache 2.0, GPL, etc. + li Be used by Microsoft (used in Microsoft products and services) + li Have an #[a(href='https://opensource.org/licenses', target='_new') OSI-approved license] such as MIT, Apache 2.0, GPL, etc. li Must have a mechanism for receiving funds (the GitHub Sponsors team may be able to help) li Cannot be a Microsoft employee-led project + li Have a public-facing details of #[a(href='https://aka.ms/fossfundform/#funding', target='_new') who and how project sponsorship is distributed] h3 How to nominate a project for the next fund - p New FOSS Fund rounds are announced monthly via the #[a(href='https://idwebelements/GroupManagement.aspx?Group=osblast&Operation=join') osblast] discussion list. + p Nominate at any time using this #[a(href='https://aka.ms/fossfundform') form]. h3 Selection eligibility p Eligibility requirements: From 21b50d9e359ede415c80244565e683bb2e1cc061 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:14:59 -0800 Subject: [PATCH 53/69] Adding Entra to cspell --- .cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.cspell.json b/.cspell.json index ffbf04cb2..6570c5d40 100644 --- a/.cspell.json +++ b/.cspell.json @@ -254,6 +254,7 @@ "enterprisevisited", "entityid", "entitytype", + "entra", "esbody", "esemail", "eshead", From 06fdd7acd15dca931a028da315a7052b01533587 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:15:24 -0800 Subject: [PATCH 54/69] =?UTF-8?q?=F0=9F=A7=B0=20Updated=20dependencies?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 680 ++++++++++++++++++++++++++-------------------- package.json | 39 +-- 2 files changed, 402 insertions(+), 317 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29cf681b8..ec3648224 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,13 +18,14 @@ "@azure/storage-queue": "12.16.0", "@octokit/auth-app": "6.0.1", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.5", + "@octokit/request": "8.1.6", "@octokit/rest": "20.0.2", + "@ospo/environment-business": "6.0.23951", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", "applicationinsights": "2.9.1", "async-prompt": "1.0.1", - "axios": "1.6.1", + "axios": "1.6.2", "basic-auth": "2.0.1", "body-parser": "1.20.2", "color-contrast-checker": "2.1.0", @@ -53,7 +54,7 @@ "node-jose": "2.2.0", "nodemailer": "6.9.7", "object-path": "0.11.8", - "passport": "0.6.0", + "passport": "0.7.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", "pg": "8.11.3", @@ -61,7 +62,7 @@ "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.10", + "redis": "4.6.11", "secure-compare": "3.0.1", "semver": "7.5.4", "serve-favicon": "2.5.0", @@ -72,31 +73,31 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/cors": "2.8.16", + "@types/cors": "2.8.17", "@types/debug": "4.1.12", "@types/express": "4.17.21", "@types/express-session": "1.17.10", - "@types/jest": "29.5.8", - "@types/lodash": "4.14.201", - "@types/luxon": "3.3.4", + "@types/jest": "29.5.10", + "@types/lodash": "4.14.202", + "@types/luxon": "3.3.5", "@types/memory-cache": "0.2.5", "@types/morgan": "1.9.9", - "@types/node": "20.9.0", + "@types/node": "20.10.0", "@types/node-jose": "1.1.13", "@types/object-path": "0.11.4", - "@types/passport": "1.0.15", - "@types/passport-azure-ad": "4.3.4", + "@types/passport": "1.0.16", + "@types/passport-azure-ad": "4.3.5", "@types/passport-github": "1.1.12", "@types/pg": "8.10.9", - "@types/pug": "2.0.9", + "@types/pug": "2.0.10", "@types/recursive-readdir": "2.2.4", - "@types/semver": "7.5.5", + "@types/semver": "7.5.6", "@types/simple-oauth2": "5.0.7", - "@types/validator": "13.11.6", - "@typescript-eslint/eslint-plugin": "6.11.0", - "@typescript-eslint/parser": "6.11.0", + "@types/validator": "13.11.7", + "@typescript-eslint/eslint-plugin": "6.13.1", + "@typescript-eslint/parser": "6.13.1", "cspell": "8.0.0", - "eslint": "8.53.0", + "eslint": "8.54.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", @@ -104,12 +105,12 @@ "jest": "29.7.0", "jest-junit": "16.0.0", "lint-staged": "15.1.0", - "markdownlint-cli2": "0.10.0", + "markdownlint-cli2": "0.11.0", "prettier": "3.1.0", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.2.2" + "typescript": "5.3.2" }, "engines": { "node": ">=18" @@ -1717,9 +1718,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2528,14 +2529,13 @@ } }, "node_modules/@octokit/request": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", - "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", + "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -2669,6 +2669,12 @@ "node": ">=14" } }, + "node_modules/@ospo/environment-business": { + "version": "6.0.23951", + "resolved": "https://pkgs.dev.azure.com/ospo/_packaging/PrivateNpm/npm/registry/@ospo/environment-business/-/environment-business-6.0.23951.tgz", + "integrity": "sha1-yJ4HaFC42BqON2LJnv0mgX8Woms=", + "license": "UNLICENSED" + }, "node_modules/@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -2736,9 +2742,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.11.tgz", - "integrity": "sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA==", + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.12.tgz", + "integrity": "sha512-/ZjE18HRzMd80eXIIUIPcH81UoZpwulbo8FmbElrjPqH0QC0SeIKu1BOU49bO5trM5g895kAjhvalt5h77q+4A==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -2749,9 +2755,9 @@ } }, "node_modules/@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", "peerDependencies": { "@redis/client": "^1.0.0" } @@ -2765,9 +2771,9 @@ } }, "node_modules/@redis/search": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.5.tgz", - "integrity": "sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", + "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", "peerDependencies": { "@redis/client": "^1.0.0" } @@ -2809,6 +2815,18 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -2935,9 +2953,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.16", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", - "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "dependencies": { "@types/node": "*" @@ -3024,9 +3042,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3048,15 +3066,15 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.201", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", - "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.4.tgz", - "integrity": "sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.5.tgz", + "integrity": "sha512-1cyf6Ge/94zlaWIZA2ei1pE6SZ8xpad2hXaYa5JEFiaUH0YS494CZwyi4MXNpXD9oEuv6ZH0Bmh0e7F9sPhmZA==", "dev": true }, "node_modules/@types/memory-cache": { @@ -3086,9 +3104,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -3146,18 +3164,18 @@ "dev": true }, "node_modules/@types/passport": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", - "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.16.tgz", + "integrity": "sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/passport-azure-ad": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.4.tgz", - "integrity": "sha512-1sshz8MfQs5DxWYGGX/1XhRYYREjlL3gSzoU38G9BxqijVmPIjAhFbP/PvmbqK05WlLF5VVBhNgt1DmX7Dh6IA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.5.tgz", + "integrity": "sha512-dzWBDye7VvzWgKQbxImEvT0x1b0Vi37AYZrjN/XitTkstHsegDT97Wha5Aknoh4vPpv68DdaxZ4defK8YIk7kA==", "dev": true, "dependencies": { "@types/express": "*", @@ -3255,9 +3273,9 @@ } }, "node_modules/@types/pug": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", - "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", "dev": true }, "node_modules/@types/qs": { @@ -3280,9 +3298,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/serve-static": { @@ -3320,9 +3338,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.6", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", - "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==", + "version": "13.11.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", + "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==", "dev": true }, "node_modules/@types/yargs": { @@ -3341,16 +3359,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", - "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/type-utils": "6.11.0", - "@typescript-eslint/utils": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3376,15 +3394,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" }, "engines": { @@ -3404,13 +3422,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3421,13 +3439,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", - "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3448,9 +3466,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3461,13 +3479,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3488,17 +3506,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", - "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" }, "engines": { @@ -3513,12 +3531,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -3847,9 +3865,9 @@ } }, "node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -5627,15 +5645,15 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8593,9 +8611,9 @@ } }, "node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dev": true, "dependencies": { "argparse": "^2.0.1", @@ -8609,30 +8627,33 @@ } }, "node_modules/markdownlint": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", - "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.32.1.tgz", + "integrity": "sha512-3sx9xpi4xlHlokGyHO9k0g3gJbNY4DI6oNEeEYq5gQ4W7UkiJ90VDAnuDl2U+yyXOUa6BX+0gf69ZlTUGIBp6A==", "dev": true, "dependencies": { - "markdown-it": "13.0.1", + "markdown-it": "13.0.2", "markdownlint-micromark": "0.1.7" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli2": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", - "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.11.0.tgz", + "integrity": "sha512-RmFpr+My5in8KT+H/A6ozKIVYVzZtL5t9c8DYdv0YJdljl385z44CcCVBrclpHxCGMY2tr0hZ/ca+meGGvgdnQ==", "dev": true, "dependencies": { - "globby": "13.2.2", - "markdownlint": "0.31.1", + "globby": "14.0.0", + "markdownlint": "0.32.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.1", - "yaml": "2.3.2" + "yaml": "2.3.4" }, "bin": { "markdownlint-cli2": "markdownlint-cli2.js", @@ -8640,7 +8661,10 @@ "markdownlint-cli2-fix": "markdownlint-cli2-fix.js" }, "engines": { - "node": ">=16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli2-formatter-default": { @@ -8653,28 +8677,29 @@ } }, "node_modules/markdownlint-cli2/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdownlint-cli2/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/markdownlint-cli2/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "engines": { "node": ">=12" @@ -8683,10 +8708,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdownlint-cli2/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "node_modules/markdownlint-cli2/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "engines": { "node": ">=14.16" @@ -8695,13 +8720,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/markdownlint-cli2/node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "node_modules/markdownlint-cli2/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "dev": true, "engines": { - "node": ">= 14" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/markdownlint-micromark": { @@ -9275,9 +9303,9 @@ } }, "node_modules/passport": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -9336,6 +9364,23 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/passport-azure-ad/node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, "node_modules/passport-github": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/passport-github/-/passport-github-1.1.0.tgz", @@ -10008,15 +10053,15 @@ } }, "node_modules/redis": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.10.tgz", - "integrity": "sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg==", + "version": "4.6.11", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.11.tgz", + "integrity": "sha512-kg1Lt4NZLYkAjPOj/WcyIGWfZfnyfKo1Wg9YKVSlzhFwxpFIl3LYI8BWy1Ab963LLDsTz2+OwdsesHKljB3WMQ==", "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.11", - "@redis/graph": "1.1.0", + "@redis/client": "1.5.12", + "@redis/graph": "1.1.1", "@redis/json": "1.0.6", - "@redis/search": "1.1.5", + "@redis/search": "1.1.6", "@redis/time-series": "1.0.5" } }, @@ -11024,9 +11069,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11063,6 +11108,18 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", @@ -12857,9 +12914,9 @@ } }, "@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true }, "@hapi/boom": { @@ -13511,14 +13568,13 @@ } }, "@octokit/request": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.5.tgz", - "integrity": "sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==", + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz", + "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==", "requires": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", "@octokit/types": "^12.0.0", - "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "dependencies": { @@ -13615,6 +13671,11 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz", "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw==" }, + "@ospo/environment-business": { + "version": "6.0.23951", + "resolved": "https://pkgs.dev.azure.com/ospo/_packaging/PrivateNpm/npm/registry/@ospo/environment-business/-/environment-business-6.0.23951.tgz", + "integrity": "sha1-yJ4HaFC42BqON2LJnv0mgX8Woms=" + }, "@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -13664,9 +13725,9 @@ "requires": {} }, "@redis/client": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.11.tgz", - "integrity": "sha512-cV7yHcOAtNQ5x/yQl7Yw1xf53kO0FNDTdDU6bFIMbW6ljB7U7ns0YRM+QIkpoqTAt6zK5k9Fq0QWlUbLcq9AvA==", + "version": "1.5.12", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.12.tgz", + "integrity": "sha512-/ZjE18HRzMd80eXIIUIPcH81UoZpwulbo8FmbElrjPqH0QC0SeIKu1BOU49bO5trM5g895kAjhvalt5h77q+4A==", "requires": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -13674,9 +13735,9 @@ } }, "@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", "requires": {} }, "@redis/json": { @@ -13686,9 +13747,9 @@ "requires": {} }, "@redis/search": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.5.tgz", - "integrity": "sha512-hPP8w7GfGsbtYEJdn4n7nXa6xt6hVZnnDktKW4ArMaFQ/m/aR7eFvsLQmG/mn1Upq99btPJk+F27IQ2dYpCoUg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", + "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", "requires": {} }, "@redis/time-series": { @@ -13728,6 +13789,12 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "@sindresorhus/merge-streams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", + "integrity": "sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==", + "dev": true + }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -13851,9 +13918,9 @@ } }, "@types/cors": { - "version": "2.8.16", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", - "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "requires": { "@types/node": "*" @@ -13940,9 +14007,9 @@ } }, "@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", + "version": "29.5.10", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", + "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13964,15 +14031,15 @@ } }, "@types/lodash": { - "version": "4.14.201", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", - "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, "@types/luxon": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.4.tgz", - "integrity": "sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.5.tgz", + "integrity": "sha512-1cyf6Ge/94zlaWIZA2ei1pE6SZ8xpad2hXaYa5JEFiaUH0YS494CZwyi4MXNpXD9oEuv6ZH0Bmh0e7F9sPhmZA==", "dev": true }, "@types/memory-cache": { @@ -14002,9 +14069,9 @@ "dev": true }, "@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", "requires": { "undici-types": "~5.26.4" } @@ -14061,18 +14128,18 @@ "dev": true }, "@types/passport": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", - "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.16.tgz", + "integrity": "sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==", "dev": true, "requires": { "@types/express": "*" } }, "@types/passport-azure-ad": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.4.tgz", - "integrity": "sha512-1sshz8MfQs5DxWYGGX/1XhRYYREjlL3gSzoU38G9BxqijVmPIjAhFbP/PvmbqK05WlLF5VVBhNgt1DmX7Dh6IA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/passport-azure-ad/-/passport-azure-ad-4.3.5.tgz", + "integrity": "sha512-dzWBDye7VvzWgKQbxImEvT0x1b0Vi37AYZrjN/XitTkstHsegDT97Wha5Aknoh4vPpv68DdaxZ4defK8YIk7kA==", "dev": true, "requires": { "@types/express": "*", @@ -14157,9 +14224,9 @@ } }, "@types/pug": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz", - "integrity": "sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", "dev": true }, "@types/qs": { @@ -14182,9 +14249,9 @@ } }, "@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "@types/serve-static": { @@ -14222,9 +14289,9 @@ } }, "@types/validator": { - "version": "13.11.6", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", - "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==", + "version": "13.11.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.7.tgz", + "integrity": "sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==", "dev": true }, "@types/yargs": { @@ -14243,16 +14310,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.11.0.tgz", - "integrity": "sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", + "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/type-utils": "6.11.0", - "@typescript-eslint/utils": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/type-utils": "6.13.1", + "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14262,54 +14329,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.11.0.tgz", - "integrity": "sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", + "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", - "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", + "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0" + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1" } }, "@typescript-eslint/type-utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.11.0.tgz", - "integrity": "sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", + "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.11.0", - "@typescript-eslint/utils": "6.11.0", + "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/utils": "6.13.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", - "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", + "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", - "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", + "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/visitor-keys": "6.11.0", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/visitor-keys": "6.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14318,27 +14385,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", - "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.11.0", - "@typescript-eslint/types": "6.11.0", - "@typescript-eslint/typescript-estree": "6.11.0", + "@typescript-eslint/scope-manager": "6.13.1", + "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.1", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", - "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", + "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/types": "6.13.1", "eslint-visitor-keys": "^3.4.1" } }, @@ -14578,9 +14645,9 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -15863,15 +15930,15 @@ "dev": true }, "eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -18016,9 +18083,9 @@ } }, "markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dev": true, "requires": { "argparse": "^2.0.1", @@ -18029,46 +18096,53 @@ } }, "markdownlint": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.31.1.tgz", - "integrity": "sha512-CKMR2hgcIBrYlIUccDCOvi966PZ0kJExDrUi1R+oF9PvqQmCrTqjOsgIvf2403OmJ+CWomuzDoylr6KbuMyvHA==", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.32.1.tgz", + "integrity": "sha512-3sx9xpi4xlHlokGyHO9k0g3gJbNY4DI6oNEeEYq5gQ4W7UkiJ90VDAnuDl2U+yyXOUa6BX+0gf69ZlTUGIBp6A==", "dev": true, "requires": { - "markdown-it": "13.0.1", + "markdown-it": "13.0.2", "markdownlint-micromark": "0.1.7" } }, "markdownlint-cli2": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.10.0.tgz", - "integrity": "sha512-kVxjPyKFC+eW7iqcxiNI50RDzwugpXkEX5eQlDso/0IUs9M73jXYguLFHDzgi5KatcxU/57Fu8KoGtkFft9lfA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.11.0.tgz", + "integrity": "sha512-RmFpr+My5in8KT+H/A6ozKIVYVzZtL5t9c8DYdv0YJdljl385z44CcCVBrclpHxCGMY2tr0hZ/ca+meGGvgdnQ==", "dev": true, "requires": { - "globby": "13.2.2", - "markdownlint": "0.31.1", + "globby": "14.0.0", + "markdownlint": "0.32.1", "markdownlint-cli2-formatter-default": "0.0.4", "micromatch": "4.0.5", "strip-json-comments": "5.0.1", - "yaml": "2.3.2" + "yaml": "2.3.4" }, "dependencies": { "globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.0.tgz", + "integrity": "sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==", "dev": true, "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^1.0.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" } }, + "path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true + }, "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true }, "strip-json-comments": { @@ -18076,12 +18150,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "dev": true - }, - "yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", - "dev": true } } }, @@ -18520,9 +18588,9 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "passport": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", "requires": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -18570,6 +18638,16 @@ "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } + }, + "passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + } } } }, @@ -19077,15 +19155,15 @@ } }, "redis": { - "version": "4.6.10", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.10.tgz", - "integrity": "sha512-mmbyhuKgDiJ5TWUhiKhBssz+mjsuSI/lSZNPI9QvZOYzWvYGejtb+W3RlDDf8LD6Bdl5/mZeG8O1feUGhXTxEg==", + "version": "4.6.11", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.11.tgz", + "integrity": "sha512-kg1Lt4NZLYkAjPOj/WcyIGWfZfnyfKo1Wg9YKVSlzhFwxpFIl3LYI8BWy1Ab963LLDsTz2+OwdsesHKljB3WMQ==", "requires": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.11", - "@redis/graph": "1.1.0", + "@redis/client": "1.5.12", + "@redis/graph": "1.1.1", "@redis/json": "1.0.6", - "@redis/search": "1.1.5", + "@redis/search": "1.1.6", "@redis/time-series": "1.0.5" } }, @@ -19820,9 +19898,9 @@ } }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "dev": true }, "uc.micro": { @@ -19849,6 +19927,12 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, "unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", diff --git a/package.json b/package.json index 3a6a26b5e..4da83409c 100644 --- a/package.json +++ b/package.json @@ -73,14 +73,15 @@ "@azure/storage-blob": "12.17.0", "@azure/storage-queue": "12.16.0", "@octokit/plugin-paginate-graphql": "4.0.0", - "@octokit/request": "8.1.5", + "@octokit/request": "8.1.6", "@octokit/auth-app": "6.0.1", "@octokit/rest": "20.0.2", + "@ospo/environment-business": "6.0.23951", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", "applicationinsights": "2.9.1", "async-prompt": "1.0.1", - "axios": "1.6.1", + "axios": "1.6.2", "basic-auth": "2.0.1", "body-parser": "1.20.2", "color-contrast-checker": "2.1.0", @@ -109,7 +110,7 @@ "node-jose": "2.2.0", "nodemailer": "6.9.7", "object-path": "0.11.8", - "passport": "0.6.0", + "passport": "0.7.0", "passport-azure-ad": "4.3.5", "passport-github": "1.1.0", "pg": "8.11.3", @@ -117,7 +118,7 @@ "pug": "3.0.2", "pug-load": "3.0.0", "recursive-readdir": "2.2.3", - "redis": "4.6.10", + "redis": "4.6.11", "secure-compare": "3.0.1", "semver": "7.5.4", "serve-favicon": "2.5.0", @@ -128,31 +129,31 @@ "walk-back": "5.1.0" }, "devDependencies": { - "@types/cors": "2.8.16", + "@types/cors": "2.8.17", "@types/debug": "4.1.12", "@types/express": "4.17.21", "@types/express-session": "1.17.10", - "@types/jest": "29.5.8", - "@types/lodash": "4.14.201", - "@types/luxon": "3.3.4", + "@types/jest": "29.5.10", + "@types/lodash": "4.14.202", + "@types/luxon": "3.3.5", "@types/memory-cache": "0.2.5", "@types/morgan": "1.9.9", - "@types/node": "20.9.0", + "@types/node": "20.10.0", "@types/node-jose": "1.1.13", "@types/object-path": "0.11.4", - "@types/passport": "1.0.15", - "@types/passport-azure-ad": "4.3.4", + "@types/passport": "1.0.16", + "@types/passport-azure-ad": "4.3.5", "@types/passport-github": "1.1.12", "@types/pg": "8.10.9", - "@types/pug": "2.0.9", + "@types/pug": "2.0.10", "@types/recursive-readdir": "2.2.4", - "@types/semver": "7.5.5", + "@types/semver": "7.5.6", "@types/simple-oauth2": "5.0.7", - "@types/validator": "13.11.6", - "@typescript-eslint/eslint-plugin": "6.11.0", - "@typescript-eslint/parser": "6.11.0", + "@types/validator": "13.11.7", + "@typescript-eslint/eslint-plugin": "6.13.1", + "@typescript-eslint/parser": "6.13.1", "cspell": "8.0.0", - "eslint": "8.53.0", + "eslint": "8.54.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", @@ -160,12 +161,12 @@ "jest": "29.7.0", "jest-junit": "16.0.0", "lint-staged": "15.1.0", - "markdownlint-cli2": "0.10.0", + "markdownlint-cli2": "0.11.0", "prettier": "3.1.0", "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.2.2" + "typescript": "5.3.2" }, "engines": { "node": ">=18" From 8dd23dc44e0f017f5df777a19e919d1d1748489d Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:16:05 -0800 Subject: [PATCH 55/69] Perf fix, CSD --- middleware/companySpecificDeployment.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/middleware/companySpecificDeployment.ts b/middleware/companySpecificDeployment.ts index d42009bff..14d38df2a 100644 --- a/middleware/companySpecificDeployment.ts +++ b/middleware/companySpecificDeployment.ts @@ -18,13 +18,13 @@ function getCompanySpecificDeploymentName() { } function getCompanySpecificDeployment(): ICompanySpecificStartup { + if (instance) { + return instance; + } const name = getCompanySpecificDeploymentName(); if (!name) { return null; } - if (instance) { - return instance; - } try { const pn = path.join(__dirname, '..', name); const dynamicInclude = require(pn); From 6514aba85bf652bd42dbab8512e983d703ca90cc Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:16:26 -0800 Subject: [PATCH 56/69] CreateError helper: use 'cause' Moves from a customer 'innerError' approach that's legacy to using modern JS and its 'cause' for wrapping errors. --- transitional.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/transitional.ts b/transitional.ts index 6aacad5c1..e23cdb8ed 100644 --- a/transitional.ts +++ b/transitional.ts @@ -147,8 +147,8 @@ export function projectCollaboratorPermissionToGitHubRepositoryPermission( } export class CreateError { - static CreateStatusCodeError(code: number, message?: string): Error { - const error = new Error(message); + static CreateStatusCodeError(code: number, message?: string, cause?: Error): Error { + const error = cause ? new Error(message, { cause }) : new Error(message); error['status'] = code; return error; } @@ -170,20 +170,20 @@ export class CreateError { return ErrorHelper.SetInnerError(CreateError.CreateStatusCodeError(400, message), innerError); } - static NotAuthenticated(message: string): Error { - return CreateError.CreateStatusCodeError(401, message); + static NotAuthenticated(message: string, cause?: Error): Error { + return CreateError.CreateStatusCodeError(401, message, cause); } - static NotImplemented(message?: string): Error { - return CreateError.CreateStatusCodeError(500, message || 'This scenario is not yet implemented'); + static NotImplemented(message?: string, cause?: Error): Error { + return CreateError.CreateStatusCodeError(500, message || 'This scenario is not yet implemented', cause); } - static NotAuthorized(message: string): Error { - return CreateError.CreateStatusCodeError(403, message); + static NotAuthorized(message: string, cause?: Error): Error { + return CreateError.CreateStatusCodeError(403, message, cause); } - static ServerError(message: string, innerError?: Error): Error { - return ErrorHelper.SetInnerError(CreateError.CreateStatusCodeError(500, message), innerError); + static ServerError(message: string, cause?: Error): Error { + return CreateError.CreateStatusCodeError(500, message, cause); } } From 2941b038b45d26614278d9820a1487c387de5b42 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:17:30 -0800 Subject: [PATCH 57/69] Org: getTeamById direct API call --- business/organization.ts | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/business/organization.ts b/business/organization.ts index 199d9b63c..299e6c6be 100644 --- a/business/organization.ts +++ b/business/organization.ts @@ -319,7 +319,7 @@ export class Organization { ); } - return values; + return values as object; } getManagementApproach() { @@ -829,6 +829,42 @@ export class Organization { return metadata; } + async getTeamById(id: number, options?: ICacheOptions): Promise { + options = options || {}; + const operations = throwIfNotGitHubCapable(this._operations); + const cacheOptions = { + maxAgeSeconds: getMaxAgeSeconds(operations, CacheDefault.orgTeamDetailsStaleSeconds, options), + backgroundRefresh: false, + }; + if (options.backgroundRefresh !== undefined) { + cacheOptions.backgroundRefresh = options.backgroundRefresh; + } + const orgId = this.id; + if (!orgId) { + throw CreateError.InvalidParameters('The organization ID is not available.'); + } + const parameters = { + org_id: orgId, + team_id: id, + }; + try { + const entity = await operations.github.request( + this.authorize(AppPurpose.Data), + 'GET /organizations/:org_id/team/:team_id', + parameters, + cacheOptions + ); + return this.teamFromEntity(entity); + } catch (error) { + if (error.status && error.status === 404) { + throw CreateError.NotFound( + `The GitHub team with the ID ${id} could not be found for organization ${this.name} with ID ${orgId}.` + ); + } + throw error; + } + } + async getTeamFromSlug(slug: string, options?: ICacheOptions): Promise { options = options || {}; const operations = throwIfNotGitHubCapable(this._operations); From 036cddcc726addb2dc2642461026517d32e1123a Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:17:56 -0800 Subject: [PATCH 58/69] Team: type JSON --- business/teamMember.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/business/teamMember.ts b/business/teamMember.ts index bca38e787..7e68c535f 100644 --- a/business/teamMember.ts +++ b/business/teamMember.ts @@ -23,6 +23,12 @@ const memberPrimaryProperties = [ ]; const memberSecondaryProperties = []; +export type TeamMemberJson = { + id: number; + login: string; + avatar_url: string; +}; + export class TeamMember { private _team: Team; private _operations: IOperationsInstance; @@ -76,7 +82,7 @@ export class TeamMember { this._operations = operations; } - asJson() { + asJson(): TeamMemberJson { return { id: this.id, login: this.login, From 2d794015fb444dd59358d4746c5c7f7e1538f4fd Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:18:37 -0800 Subject: [PATCH 59/69] Config as code: error condition helpful message There are rare cases where an interrupted TS build can leave some files missing for the configuration to bootstrap. This improves the error message in that case. --- lib/config/painlessConfigAsCode.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/config/painlessConfigAsCode.ts b/lib/config/painlessConfigAsCode.ts index de5aeb95b..10e32d226 100644 --- a/lib/config/painlessConfigAsCode.ts +++ b/lib/config/painlessConfigAsCode.ts @@ -10,6 +10,7 @@ import path from 'path'; import walkBack from 'walk-back'; import { InnerError, IPainlessConfigGet, IProviderOptions } from '.'; import { processEnvironmentProvider } from './environmentConfigurationResolver'; +import { CreateError } from '../../transitional'; const debug = Debug.debug('config'); @@ -70,10 +71,14 @@ function configurePackageEnvironments( try { values = environmentPackage(environment); } catch (problemCalling) { - const asText = problemCalling.toString(); - throw new Error( - `While calling the environment package "${npmName}" for the "${environment}" environment an error was thrown: ${asText}`, - { cause: problemCalling } + const asText = problemCalling.toString() as string; + let suggestion = ''; + if (asText.includes('Unable to require environment') && asText.includes('dist')) { + suggestion = 'Consider deleting and rebuilding the `dist` directory. '; + } + throw CreateError.ServerError( + `${suggestion}While calling the environment package "${npmName}" for the "${environment}" environment an error was thrown: ${asText}`, + problemCalling ); } } else if (typeof environmentPackage === 'object') { From 2a83cc61a0bb90a3d1c50deb1d508d5449eda549 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:20:13 -0800 Subject: [PATCH 60/69] MS Graph: cache options Updates the Microsoft Graph client to allow for configurable cache options at call time. Also in some methods such as getting the members of a team, improves types, allows for direct or transitive membership. --- lib/graphProvider/microsoftGraphProvider.ts | 144 ++++++++++++++++---- 1 file changed, 118 insertions(+), 26 deletions(-) diff --git a/lib/graphProvider/microsoftGraphProvider.ts b/lib/graphProvider/microsoftGraphProvider.ts index 0dbaab3f4..a95ee8c51 100644 --- a/lib/graphProvider/microsoftGraphProvider.ts +++ b/lib/graphProvider/microsoftGraphProvider.ts @@ -8,6 +8,7 @@ import cache from 'memory-cache'; import axios, { AxiosError } from 'axios'; import querystring from 'querystring'; +import validator from 'validator'; import { IGraphProvider, @@ -32,20 +33,60 @@ export interface IMicrosoftGraphProviderOptions { skipManagerLookupForIds?: string; } +export type MicrosoftGraphGroupMembersOptions = { + getCount?: boolean; + maximumPages?: number; + throwOnMaximumPages?: boolean; + skipCache?: boolean; + additionalSelectValues?: string[]; + membership?: MicrosoftGraphGroupMembershipType; +}; + +export enum MicrosoftGraphGroupMembershipType { + Transitive = 'transitiveMembers', + Direct = 'members', +} + +export type MicrosoftGraphGroupMember = IGraphGroupMember & { + userType?: GraphUserType; +}; + +export function microsoftGraphUserTypeFromString(type: string): GraphUserType { + if (!type) { + return; + } + switch (type) { + case GraphUserType.Guest: + return GraphUserType.Guest; + case GraphUserType.Member: + return GraphUserType.Member; + default: + return GraphUserType.Unknown; + } +} + const graphBaseUrl = 'https://graph.microsoft.com/v1.0/'; const odataNextLink = '@odata.nextLink'; const defaultCachePeriodMinutes = 60 * 36; // 36 hours const attemptCacheGet = true; -interface IGraphOptions { +type MicrosoftGraphCallOptions = { selectValues?: string; filterValues?: string; orderBy?: string; body?: any; count?: boolean; consistencyLevel?: 'eventual'; -} +}; + +type GraphCacheOptions = { + skipCache?: boolean; + maximumPages?: number; + throwOnMaximumPages?: boolean; +}; + +type GraphOptions = MicrosoftGraphCallOptions & GraphCacheOptions; export class MicrosoftGraphProvider implements IGraphProvider { #_tokenCacheMilliseconds: number; @@ -162,12 +203,18 @@ export class MicrosoftGraphProvider implements IGraphProvider { } async getGroup(corporateGroupId: string): Promise { + const selectValues = 'description,displayName,id,mail,mailNickname'; + // if (additionalSelectValues) { + // selectValues = Array.from( + // new Set([...selectValues.split(','), ...additionalSelectValues]).values() + // ).join(','); + // } // prettier-ignore const response = await this.lookupInGraph([ 'groups', corporateGroupId, ], { - selectValues: 'description,displayName,id,mail,mailNickname', + selectValues, }); return response; } @@ -357,26 +404,50 @@ export class MicrosoftGraphProvider implements IGraphProvider { }); } - async getGroupMembers(corporateGroupId: string): Promise { + async getGroupMembers( + corporateGroupId: string, + options?: MicrosoftGraphGroupMembersOptions + ): Promise { + const defaultSelectSet = ['id', 'userPrincipalName']; + const selectValuesSet = new Set([ + ...defaultSelectSet, + ...(options?.additionalSelectValues || []), + ]); + const graphOptions: GraphOptions = { + selectValues: Array.from(selectValuesSet.values()).join(','), + }; + if (options?.getCount) { + graphOptions.count = true; + graphOptions.consistencyLevel = 'eventual'; + } + if (options?.maximumPages) { + graphOptions.maximumPages = options.maximumPages; + } + if (options?.throwOnMaximumPages) { + graphOptions.throwOnMaximumPages = options.throwOnMaximumPages; + } + const lookupType = options?.membership || MicrosoftGraphGroupMembershipType.Transitive; + const includesUserType = selectValuesSet.has('userType'); const response = (await this.lookupInGraph( - [ - 'groups', - corporateGroupId, - 'transitiveMembers', // transitiveMembers or members - ], - { - selectValues: 'id,userPrincipalName', - } + ['groups', corporateGroupId, lookupType], + graphOptions )) as any[]; - // may be a caching bug: if (Array.isArray(response)) { return response.map((entry) => { - return { id: entry.id, userPrincipalName: entry.userPrincipalName }; + return { + id: entry.id, + userPrincipalName: entry.userPrincipalName, + userType: includesUserType ? microsoftGraphUserTypeFromString(entry.userType) : undefined, + }; }); } const subResponse = (response as any).value ? (response as any).value : []; return subResponse.map((entry) => { - return { id: entry.id, userPrincipalName: entry.userPrincipalName }; + return { + id: entry.id, + userPrincipalName: entry.userPrincipalName, + userType: includesUserType ? microsoftGraphUserTypeFromString(entry.userType) : undefined, + }; }); } @@ -384,12 +455,18 @@ export class MicrosoftGraphProvider implements IGraphProvider { if (!minimum3Characters || minimum3Characters.length < 3) { throw new Error(`Minimum 3 characters required: ${minimum3Characters}`); } + + let filterValues = `securityEnabled eq true and (startswith(displayName, '${minimum3Characters}') or startswith(mailNickname, '${minimum3Characters}'))`; + if (validator.isUUID(minimum3Characters)) { + filterValues = `securityEnabled eq true and (id eq '${minimum3Characters}' or startswith(displayName, '${minimum3Characters}') or startswith(mailNickname, '${minimum3Characters}'))`; + } + // NOTE: this is currently explicitly looking for Security Groups only // prettier-ignore let response = (await this.lookupInGraph([ 'groups', ], { - filterValues: `securityEnabled eq true and (startswith(displayName, '${minimum3Characters}') or startswith(mailNickname, '${minimum3Characters}'))`, + filterValues, selectValues: 'id,displayName,mailNickname', })) as any[]; if (!response.filter && (response as any).value?.filter) { @@ -488,8 +565,9 @@ export class MicrosoftGraphProvider implements IGraphProvider { } } - private async lookupInGraph(entityPath: string[], options: IGraphOptions): Promise { + private async lookupInGraph(entityPath: string[], options: GraphOptions): Promise { // initial hacking on top of the API + const skipCache = options?.skipCache === true; const subUrl = entityPath.map((item) => encodeURIComponent(item)).join('/'); const queries = {}; if (options.filterValues) { @@ -501,12 +579,15 @@ export class MicrosoftGraphProvider implements IGraphProvider { if (options.orderBy) { queries['$orderby'] = options.orderBy; } + if (options.count === true) { + queries['$count'] = 'true'; + } let hasArray = false; let value = null; let url = `${graphBaseUrl}${subUrl}?${querystring.stringify(queries)}`; const originalUrl = url; try { - if (this.#_cache && attemptCacheGet) { + if (this.#_cache && attemptCacheGet && !skipCache) { value = await this.#_cache.getObject(url); if (value?.cache) { if (Array.isArray(value.cache) && value.cache.length === 0) { @@ -522,9 +603,10 @@ export class MicrosoftGraphProvider implements IGraphProvider { console.warn(error); } let pages = 0; + const maximumPages = options?.maximumPages; do { const consistencyLevel = options.consistencyLevel; - const body = await this.request(url, options.body, consistencyLevel); + const body = await this.request(url, options.body, consistencyLevel, skipCache); if (body.value && pages === 0) { hasArray = body && body.value && Array.isArray(body.value); if (hasArray) { @@ -541,12 +623,18 @@ export class MicrosoftGraphProvider implements IGraphProvider { } ++pages; url = body && body[odataNextLink] ? body[odataNextLink] : null; - } while (url); + } while (url && (maximumPages ? pages < maximumPages : true)); + if (pages >= maximumPages) { + if (options.throwOnMaximumPages) { + throw CreateError.InvalidParameters('Maximum pages exceeded for this resource'); + } + console.warn(`Maximum pages exceeded for this resource: ${originalUrl}`); + } if (this.#_cache) { try { this.#_cache .setObjectWithExpire(originalUrl, { cache: value }, defaultCachePeriodMinutes) - .then((ok) => {}) + .then(() => {}) .catch((err) => { console.warn(err); }); @@ -557,10 +645,15 @@ export class MicrosoftGraphProvider implements IGraphProvider { return value; } - private async request(url: string, body?: any, eventualConsistency?: string): Promise { + private async request( + url: string, + body?: any, + eventualConsistency?: string, + skipCache?: boolean + ): Promise { const token = await this.getToken(); const method = body ? 'post' : 'get'; - if (this.#_cache && attemptCacheGet && method === 'get') { + if (this.#_cache && attemptCacheGet && method === 'get' && !skipCache) { try { const value = await this.#_cache.getObject(url); if (value?.cache) { @@ -596,13 +689,12 @@ export class MicrosoftGraphProvider implements IGraphProvider { throw CreateError.ServerError('Empty response'); } if ((response.data as any).error?.message) { - // axios returns unknown now - throw CreateError.InvalidParameters((response.data as any).error.message); // axios returns unknown now + throw CreateError.InvalidParameters((response.data as any).error.message); } if (this.#_cache && method === 'get') { this.#_cache .setObjectWithExpire(url, { cache: response.data }, defaultCachePeriodMinutes) - .then((ok) => {}) + .then(() => {}) .catch((err) => {}); } return response.data; From b60baf7fc035c21482547f137564d87ada1b0098 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:21:10 -0800 Subject: [PATCH 61/69] Mail provider interface: attachments Updates the basic interface for mail providers to also support linked (inline MIME) and attachments to mails. --- lib/mailProvider/index.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/mailProvider/index.ts b/lib/mailProvider/index.ts index 349a42cff..6a125f793 100644 --- a/lib/mailProvider/index.ts +++ b/lib/mailProvider/index.ts @@ -3,6 +3,9 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // +import { promises as fs } from 'fs'; +import { randomUUID } from 'crypto'; + import MockMailService from './mockMailService'; import SmtpMailService from './smtpMailService'; import getCompanySpecificDeployment from '../../middleware/companySpecificDeployment'; @@ -19,6 +22,31 @@ export interface IMail { correlationId?: string; senderProfile?: string; replyTo?: string; + attachments?: MailAttachment[]; + linkedResources?: MailAttachment[]; +} + +export type MailAttachment = { + name: string; + contentId: string; + contentType: string; + base64Value: string; +}; + +export async function createMailAttachment( + localPath: string, + name: string, + contentType: string, + contentId?: string +): Promise { + const realContentId = contentId || randomUUID(); + const content = await fs.readFile(localPath, 'base64'); + return { + name, + contentId: realContentId, + contentType, + base64Value: content, + }; } export interface IMailProvider { From 1cb132a2b85930c273377977560253de6313200e Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:21:50 -0800 Subject: [PATCH 62/69] Adds Repository Custom Properties beta support --- business/repositoryProperties.ts | 77 ++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 business/repositoryProperties.ts diff --git a/business/repositoryProperties.ts b/business/repositoryProperties.ts new file mode 100644 index 000000000..f653ebff6 --- /dev/null +++ b/business/repositoryProperties.ts @@ -0,0 +1,77 @@ +// +// Copyright (c) Microsoft. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +import { Repository } from './repository'; +import { AppPurpose, AppPurposeTypes } from '../lib/github/appPurposes'; +import { createCacheOptions, popPurpose, symbolizeApiResponse } from '.'; +import { + IOperationsInstance, + PurposefulGetAuthorizationHeader, + throwIfNotGitHubCapable, + GetAuthorizationHeader, + ICacheOptionsWithPurpose, +} from '../interfaces'; +import { OrganizationCustomPropertySetPropertyValue } from './organizationProperties'; + +export class RepositoryProperties { + private _defaultPurpose = AppPurpose.Data; + private _getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader; + + constructor( + public readonly repository: Repository, + private operations: IOperationsInstance, + getSpecificAuthorizationHeader: PurposefulGetAuthorizationHeader + ) { + this._getSpecificAuthorizationHeader = getSpecificAuthorizationHeader; + } + + createOrUpdateProperties( + propertiesAndValues: Record, + purpose?: AppPurposeTypes + ): Promise { + const names = [this.repository.name]; + const organizationProperties = this.repository.organization.customProperties; + return organizationProperties.createOrUpdateRepositoriesProperties(names, propertiesAndValues, purpose); + } + + async getProperties(options?: ICacheOptionsWithPurpose): Promise> { + options = options || {}; + const operations = throwIfNotGitHubCapable(this.operations); + const { github } = operations; + const purpose = popPurpose(options, this._defaultPurpose); + const parameters = { + owner: this.repository.organization.name, + repo: this.repository.name, + }; + const cacheOptions = createCacheOptions(operations, options); + try { + const responseArray = await github.request( + this.authorize(purpose), + 'GET /repos/:owner/:repo/properties/values', + parameters, + cacheOptions + ); + return symbolizeApiResponse(arrayToSetProperties(responseArray)); + } catch (error) { + throw error; + } + } + + private authorize(purpose: AppPurposeTypes): GetAuthorizationHeader | string { + const getAuthorizationHeader = this._getSpecificAuthorizationHeader.bind( + this, + purpose + ) as GetAuthorizationHeader; + return getAuthorizationHeader; + } +} + +function arrayToSetProperties(properties: OrganizationCustomPropertySetPropertyValue[]) { + const propertiesAndValues: Record = {}; + for (const property of properties) { + propertiesAndValues[property.property_name] = property.value; + } + return propertiesAndValues; +} From 89e3d29621da8c6933606e0e458958efd836b98d Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:22:07 -0800 Subject: [PATCH 63/69] Company-specific team extensions To support newer scenarios that are Microsoft-specific for automating some types of team membership, this adds new extension points to evaluate team join request conditions sooner in the middleware and pipeline. Also augments the JSON for client APIs about the team(s) to allow inserting company-specific configuration or state into those responses. --- api/client/context/organization/team.ts | 20 +++++++++++++++++++ api/client/organization/team.ts | 17 +++++++++++++--- .../features/augmentApiMetadata.ts | 17 +++++++++++----- interfaces/companySpecific/features/index.ts | 2 +- interfaces/companySpecific/middleware.ts | 6 ++++++ .../companySpecific/routes/api/index.ts | 1 + middleware/github/teamPermissions.ts | 6 +++++- 7 files changed, 59 insertions(+), 10 deletions(-) diff --git a/api/client/context/organization/team.ts b/api/client/context/organization/team.ts index e110e4727..c30b2c980 100644 --- a/api/client/context/organization/team.ts +++ b/api/client/context/organization/team.ts @@ -26,6 +26,7 @@ import { postActionDecision, TeamApprovalDecision } from '../../../../routes/org import { PermissionWorkflowEngine } from '../../../../routes/org/team/approvals'; import { CreateError, getProviders } from '../../../../transitional'; import { IndividualContext } from '../../../../business/user'; +import getCompanySpecificDeployment from '../../../../middleware/companySpecificDeployment'; const router: Router = Router(); @@ -85,6 +86,21 @@ router.post( } const team = getContextualTeam(req); const activeContext = (req.individualContext || req.apiContext) as IndividualContext; + const companySpecific = getCompanySpecificDeployment(); + if (companySpecific?.middleware?.teamPermissions.beforeJoinRequest) { + try { + const optionalOutcome = await companySpecific.middleware.teamPermissions.beforeJoinRequest( + providers, + activeContext, + team + ); + if (optionalOutcome) { + return res.json(optionalOutcome) as unknown as void; + } + } catch (error) { + return next(error); + } + } // no point query currently implemented let approvals = await approvalProvider.queryPendingApprovalsForTeam(String(team.id)); approvals = approvals.filter((approval) => approval.corporateId === activeContext.corporateIdentity.id); @@ -242,6 +258,10 @@ router.post( }) ); +const deployment = getCompanySpecificDeployment(); +deployment?.routes?.api?.context?.organization?.team && + deployment?.routes?.api?.context?.organization?.team(router); + router.use('*', (req, res: Response, next: NextFunction) => { return next(jsonError('no API or function available for contextual team', 404)); }); diff --git a/api/client/organization/team.ts b/api/client/organization/team.ts index da5a65cff..5458a9767 100644 --- a/api/client/organization/team.ts +++ b/api/client/organization/team.ts @@ -16,16 +16,27 @@ import { equivalentLegacyPeopleSearch } from './people'; import { TeamRepositoryPermission, OrganizationMember, corporateLinkToJson } from '../../../business'; import { ReposAppRequest, TeamJsonFormat, NoCacheNoBackground, ICorporateLink } from '../../../interfaces'; import { sortRepositoriesByNameCaseInsensitive } from '../../../utils'; +import getCompanySpecificDeployment from '../../../middleware/companySpecificDeployment'; const router: Router = Router(); router.get( '/', asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { + const providers = getProviders(req); const team = getContextualTeam(req); - return res.json( - team.asJson(TeamJsonFormat.Augmented /* includes corporateMetadata */) - ) as unknown as void; + const format = TeamJsonFormat.Augmented; // includes corporateMetadata + let json = team.asJson(format); + const companySpecific = getCompanySpecificDeployment(); + if (companySpecific?.features?.augmentApiMetadata?.augmentTeamClientJson) { + json = await companySpecific.features.augmentApiMetadata.augmentTeamClientJson( + providers, + team, + json, + format + ); + } + return res.json(json) as unknown as void; }) ); diff --git a/interfaces/companySpecific/features/augmentApiMetadata.ts b/interfaces/companySpecific/features/augmentApiMetadata.ts index 9dab4d716..9dc19e10c 100644 --- a/interfaces/companySpecific/features/augmentApiMetadata.ts +++ b/interfaces/companySpecific/features/augmentApiMetadata.ts @@ -3,13 +3,20 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -import { Organization } from '../../../business'; -import { IProviders } from '../../../interfaces'; +import { Organization, Team } from '../../../business'; +import type { IProviders, TeamJsonFormat } from '../../../interfaces'; export interface ICompanySpecificAugmentApiMetadata { - augmentOrganizationClientJson: ( + augmentOrganizationClientJson?: ( providers: IProviders, organization: Organization, - standardJsonMetadata: any - ) => any; + standardJsonMetadata: object + ) => object; + + augmentTeamClientJson?: ( + providers: IProviders, + team: Team, + standardJsonMetadata: object, + jsonFormat: TeamJsonFormat + ) => Promise; } diff --git a/interfaces/companySpecific/features/index.ts b/interfaces/companySpecific/features/index.ts index 2c821d92b..1e2a4695c 100644 --- a/interfaces/companySpecific/features/index.ts +++ b/interfaces/companySpecific/features/index.ts @@ -22,7 +22,7 @@ export * from './organizationJoinAcl'; export * from './augmentApiMetadata'; export interface ICompanySpecificFeatures { - augmentApiMetadata: ICompanySpecificAugmentApiMetadata; + augmentApiMetadata?: ICompanySpecificAugmentApiMetadata; organizationSudo?: ICompanySpecificFeatureOrganizationSudo; organizationJoinAcl?: ICompanySpecificFeatureOrganizationJoinAcl; portalSudo?: ICompanySpecificFeaturePortalSudo; diff --git a/interfaces/companySpecific/middleware.ts b/interfaces/companySpecific/middleware.ts index 8f9c96fb9..f7c9e5e50 100644 --- a/interfaces/companySpecific/middleware.ts +++ b/interfaces/companySpecific/middleware.ts @@ -9,6 +9,7 @@ import { IProviders, ReposAppRequest } from '../../interfaces'; import { IndividualContext } from '../../business/user'; import { IRequestTeamPermissions } from '../../middleware/github/teamPermissions'; import type { ApiClientGroupDisplay } from '../api'; +import { ITeamJoinRequestSubmitOutcome } from '../../routes/org/team'; export interface ICompanySpecificRepoPermissionsMiddlewareCalls { afterPermissionsInitialized?: ( @@ -36,6 +37,11 @@ export interface ICompanySpecificTeamPermissionsMiddlewareCalls { activeContext: IndividualContext, team: Team ) => Promise; + beforeJoinRequest?: ( + providers: IProviders, + activeContext: IndividualContext, + team: Team + ) => Promise; } export interface ICompanySpecificAuthenticationCalls { diff --git a/interfaces/companySpecific/routes/api/index.ts b/interfaces/companySpecific/routes/api/index.ts index a8c324252..0f5a5fae1 100644 --- a/interfaces/companySpecific/routes/api/index.ts +++ b/interfaces/companySpecific/routes/api/index.ts @@ -22,6 +22,7 @@ export interface IAttachCompanySpecificRoutesApiContextual { export interface IAttachCompanySpecificRoutesApiContextualOrganization { index?: ConnectRouter; repo?: ConnectRouter; + team?: ConnectRouter; } export interface IAttachCompanySpecificRoutesApiContextualAdministration { diff --git a/middleware/github/teamPermissions.ts b/middleware/github/teamPermissions.ts index dcc44b67e..92ae3c334 100644 --- a/middleware/github/teamPermissions.ts +++ b/middleware/github/teamPermissions.ts @@ -9,6 +9,7 @@ import { Team } from '../../business'; import { GitHubTeamRole, ITeamMembershipRoleState, + NoCacheNoBackground, OrganizationMembershipState, ReposAppRequest, } from '../../interfaces'; @@ -46,6 +47,7 @@ export async function AddTeamMembershipToRequest(req: ReposAppRequest, res: Resp if (req[teamStatusCacheKeyName]) { return next(); } + const skipCache = req.query.cache === '0'; const team2 = req['team2'] as Team; if (!team2) { return next(new Error('team2 required')); @@ -61,7 +63,9 @@ export async function AddTeamMembershipToRequest(req: ReposAppRequest, res: Resp } else { const login = activeContext.getGitHubIdentity().username; try { - const statusResult = await team2.getMembershipEfficiently(login); + const statusResult = skipCache + ? await team2.getMembership(login, NoCacheNoBackground) + : await team2.getMembershipEfficiently(login); const value: IRequestTeamMembershipStatus = { membershipStatus: statusResult && (statusResult as ITeamMembershipRoleState).role From a9cc31ee24012c01117d47d4b771ea60f97f4826 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:24:48 -0800 Subject: [PATCH 64/69] Removes unused pkg --- package-lock.json | 12 ------------ package.json | 1 - 2 files changed, 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec3648224..29de0e44c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "@octokit/plugin-paginate-graphql": "4.0.0", "@octokit/request": "8.1.6", "@octokit/rest": "20.0.2", - "@ospo/environment-business": "6.0.23951", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", "applicationinsights": "2.9.1", @@ -2669,12 +2668,6 @@ "node": ">=14" } }, - "node_modules/@ospo/environment-business": { - "version": "6.0.23951", - "resolved": "https://pkgs.dev.azure.com/ospo/_packaging/PrivateNpm/npm/registry/@ospo/environment-business/-/environment-business-6.0.23951.tgz", - "integrity": "sha1-yJ4HaFC42BqON2LJnv0mgX8Woms=", - "license": "UNLICENSED" - }, "node_modules/@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -13671,11 +13664,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz", "integrity": "sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw==" }, - "@ospo/environment-business": { - "version": "6.0.23951", - "resolved": "https://pkgs.dev.azure.com/ospo/_packaging/PrivateNpm/npm/registry/@ospo/environment-business/-/environment-business-6.0.23951.tgz", - "integrity": "sha1-yJ4HaFC42BqON2LJnv0mgX8Woms=" - }, "@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", diff --git a/package.json b/package.json index 4da83409c..19716cce1 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "@octokit/request": "8.1.6", "@octokit/auth-app": "6.0.1", "@octokit/rest": "20.0.2", - "@ospo/environment-business": "6.0.23951", "@primer/octicons": "19.8.0", "app-root-path": "3.1.0", "applicationinsights": "2.9.1", From d6320139d9150570ce9540f6aad6f4ce6ad24c0f Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Mon, 4 Dec 2023 22:45:01 -0800 Subject: [PATCH 65/69] Dependency updates --- package-lock.json | 1135 +++++++++++++++++++++------------------------ package.json | 12 +- 2 files changed, 544 insertions(+), 603 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29de0e44c..a8e67e440 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,10 +78,10 @@ "@types/express-session": "1.17.10", "@types/jest": "29.5.10", "@types/lodash": "4.14.202", - "@types/luxon": "3.3.5", + "@types/luxon": "3.3.6", "@types/memory-cache": "0.2.5", "@types/morgan": "1.9.9", - "@types/node": "20.10.0", + "@types/node": "20.10.3", "@types/node-jose": "1.1.13", "@types/object-path": "0.11.4", "@types/passport": "1.0.16", @@ -95,15 +95,15 @@ "@types/validator": "13.11.7", "@typescript-eslint/eslint-plugin": "6.13.1", "@typescript-eslint/parser": "6.13.1", - "cspell": "8.0.0", - "eslint": "8.54.0", - "eslint-config-prettier": "9.0.0", + "cspell": "8.1.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", "jest-junit": "16.0.0", - "lint-staged": "15.1.0", + "lint-staged": "15.2.0", "markdownlint-cli2": "0.11.0", "prettier": "3.1.0", "ts-jest": "29.1.1", @@ -1220,16 +1220,16 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.0.0.tgz", - "integrity": "sha512-Phbb1ij1TQQuqxuuvxf5P6fvV9U+EVoATNLmDqFHvRZfUyuhgbJuCMzIPeBx4GfTTDWlPs51FYRvZ/Q8xBHsyA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.1.0.tgz", + "integrity": "sha512-o/R/kR1QO9SQV2hUroaguTlHD6MDDtrVY6Xj5eG0loM7T0Pm3TEdlGYQ0LP6O9/CfUiHTntIFUM+PJ999+LuHQ==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.27", - "@cspell/dict-cpp": "^5.0.9", + "@cspell/dict-companies": "^3.0.28", + "@cspell/dict-cpp": "^5.0.10", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", "@cspell/dict-css": "^4.0.12", @@ -1238,16 +1238,16 @@ "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.11", + "@cspell/dict-en_us": "^4.3.12", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.2", + "@cspell/dict-filetypes": "^3.0.3", "@cspell/dict-fonts": "^4.0.0", "@cspell/dict-fsharp": "^1.0.1", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.4", + "@cspell/dict-golang": "^6.0.5", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", @@ -1258,7 +1258,7 @@ "@cspell/dict-lua": "^4.0.2", "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", - "@cspell/dict-npm": "^5.0.12", + "@cspell/dict-npm": "^5.0.13", "@cspell/dict-php": "^4.0.4", "@cspell/dict-powershell": "^5.0.2", "@cspell/dict-public-licenses": "^2.0.5", @@ -1267,7 +1267,7 @@ "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.9", + "@cspell/dict-software-terms": "^3.3.11", "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", @@ -1279,51 +1279,51 @@ } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.0.0.tgz", - "integrity": "sha512-1ltK5N4xMGWjDSIkU+GJd3rXV8buXgO/lAgnpM1RhKWqAmG+u0k6pnhk2vIo/4qZQpgfK0l3J3h/Ky2FcE95vA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.1.0.tgz", + "integrity": "sha512-Iss9dq5XBc5wYADv/Z59W4DgRQYs8BSHNVD6+LbQctuqmeJAte426/oi4x0Y76AJtEe0N6BZouj8HXykovwP5w==", "dev": true, "dependencies": { - "@cspell/cspell-types": "8.0.0" + "@cspell/cspell-types": "8.1.0" }, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-pipe": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.0.0.tgz", - "integrity": "sha512-1MH+9q3AmbzwK1BYhSGla8e4MAAYzzPApGvv8eyv0rWDmgmDTkGqJPTTvYj1wFvll5ximQ5OolpPQGv3JoWvtQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.1.0.tgz", + "integrity": "sha512-HDNX7MFAPAJ9acyYBa1bG+P4WiHHMFNYeywYBf3h6ScVhHobAqnhqS6b8R7MVhVRivwnKIQPG3zK7UpcwfyRcw==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-resolver": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.0.0.tgz", - "integrity": "sha512-gtALHFLT2vSZ7BZlIg26AY3W9gkiqxPGE75iypWz06JHJs05ngnAR+h6VOu0+rmgx98hNfzPPEh4g+Tjm8Ma0A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.1.0.tgz", + "integrity": "sha512-nlppKh2o6g0zz+oIQ/dZB+oFQFf8lvn3mJKBpDwoeQY7/o9ZORPibXjtqXM83OhhdpoUVuk+3RFMsnFBBffa2Q==", "dev": true, "dependencies": { - "global-dirs": "^3.0.1" + "global-directory": "^4.0.1" }, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.0.0.tgz", - "integrity": "sha512-1EYhIHoZnhxpfEp6Bno6yVWYBuYfaQrwIfeDMntnezUcSmi7RyroQEcp5U7sLv69vhRD2c81o7r8iUaAbPSmIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.1.0.tgz", + "integrity": "sha512-9Enayhkef732f15kHgiUe4QKyJgKk1dcZ4EFq4eyzUUDFF/eBv6qTQo5k2juUhPIjaKosqqMBHg4ffXcpkhr+Q==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.0.0.tgz", - "integrity": "sha512-dPdxQI8dLJoJEjylaPYfCJNnm2XNMYPuowHE2FMcsnFR9hEchQAhnKVc/aD63IUYnUtUrPxPlUJdoAoj569e+g==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.1.0.tgz", + "integrity": "sha512-1SxBjQdZtVjrTs3Ftw5I3nNpuDjdpsFMvfbbt6EnxqMpmZiUwkqxLCKla0pEy5R9CZcFFlntlOTMTmNsIkgmWg==", "dev": true, "engines": { "node": ">=18" @@ -1348,15 +1348,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.27", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.27.tgz", - "integrity": "sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ==", + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.28.tgz", + "integrity": "sha512-UinHkMYB/1pUkLKm1PGIm9PBFYxeAa6YvbB1Rq/RAAlrs0WDwiDBr3BAYdxydukG1IqqwT5z9WtU+8D/yV/5lw==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.9.tgz", - "integrity": "sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.10.tgz", + "integrity": "sha512-WCRuDrkFdpmeIR6uXQYKU9loMQKNFS4bUhtHdv5fu4qVyJSh3k/kgmtTm1h1BDTj8EwPRc/RGxS+9Z3b2mnabA==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -1414,9 +1414,9 @@ "dev": true }, "node_modules/@cspell/dict-en_us": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.11.tgz", - "integrity": "sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.12.tgz", + "integrity": "sha512-1bsUxFjgxF30FTzcU5uvmCvH3lyqVKR9dbwsJhomBlUM97f0edrd6590SiYBXDm7ruE68m3lJd4vs0Ev2D6FtQ==", "dev": true }, "node_modules/@cspell/dict-en-common-misspellings": { @@ -1432,9 +1432,9 @@ "dev": true }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.2.tgz", - "integrity": "sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.3.tgz", + "integrity": "sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==", "dev": true }, "node_modules/@cspell/dict-fonts": { @@ -1468,9 +1468,9 @@ "dev": true }, "node_modules/@cspell/dict-golang": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.4.tgz", - "integrity": "sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.5.tgz", + "integrity": "sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==", "dev": true }, "node_modules/@cspell/dict-haskell": { @@ -1534,9 +1534,9 @@ "dev": true }, "node_modules/@cspell/dict-npm": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.12.tgz", - "integrity": "sha512-T/+WeQmtbxo7ad6hrdI8URptYstKJP+kXyWJZfuVJJGWJQ7yubxrI5Z5AfM+Dh/ff4xHmdzapxD9adaEQ727uw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.13.tgz", + "integrity": "sha512-uPb3DlQA/FvlmzT5RjZoy7fy91mxMRZW1B+K3atVM5A/cmP1QlDaSW/iCtde5kHET1MOV7uxz+vy0Yha2OI5pQ==", "dev": true }, "node_modules/@cspell/dict-php": { @@ -1591,9 +1591,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.9.tgz", - "integrity": "sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.11.tgz", + "integrity": "sha512-a2Zml4G47dbQ6GDdN7+YlIWs3nFnIcJkZOLT88m/LzxjApiF7AOZLqQiKwow03hyvGSuZy8itgQZmQHoPlw2vQ==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -1627,21 +1627,21 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.0.0.tgz", - "integrity": "sha512-HNkCepopgiEGuI1QGA6ob4+ayvoSMxvAqetLxP0u1sZzc50LH2DEWwotcNrpVdzZOtERHvIBcGaQKIBEx8pPRQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.1.0.tgz", + "integrity": "sha512-TJ1OnP0ubdVr5YTMU15rVs8R6ROuPvP/Z5lY2gtHscEsf9tZxvIt3924uMc9fTJXgNsITNWSoCzgwJYcDvGM6A==", "dev": true, "dependencies": { - "import-meta-resolve": "^3.1.1" + "import-meta-resolve": "^4.0.0" }, "engines": { "node": ">=18.0" } }, "node_modules/@cspell/strong-weak-map": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.0.0.tgz", - "integrity": "sha512-fRlqPSdpdub52vFtulDgLPzGPGe75I04ScId1zOO9ABP7/ro8VmaG//m1k7hsPkm6h7FG4jWympoA3aXDAcXaA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.1.0.tgz", + "integrity": "sha512-yBc3ejGpx3QLbfS+Sec8ycS+lKuou5rnnpfz3aVBCnNHUPozosFuNYPFB6Iah2CBY6v6rkDCkIp5vnp1IwQzdA==", "dev": true, "engines": { "node": ">=18" @@ -1694,9 +1694,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -1717,9 +1717,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3065,9 +3065,9 @@ "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.5.tgz", - "integrity": "sha512-1cyf6Ge/94zlaWIZA2ei1pE6SZ8xpad2hXaYa5JEFiaUH0YS494CZwyi4MXNpXD9oEuv6ZH0Bmh0e7F9sPhmZA==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.6.tgz", + "integrity": "sha512-LblarKeI26YsMLxHDIQ0295wPSLjkl98eNwDcVhz3zbo1H+kfnkzR01H5Ai5LBzSeddX0ZJSpGwKEZihGb5diw==", "dev": true }, "node_modules/@types/memory-cache": { @@ -3097,9 +3097,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", "dependencies": { "undici-types": "~5.26.4" } @@ -4417,16 +4417,16 @@ } }, "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4800,21 +4800,6 @@ "node": ">= 0.10" } }, - "node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -4884,25 +4869,25 @@ } }, "node_modules/cspell": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.0.0.tgz", - "integrity": "sha512-Nayy25Dh+GAlDFDpVZaQhmidP947rpj1Pn9lmZ3nUFjD9W/yj0h0vrjMLMN4dbonddkmKh4t51C+7NuMP405hg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.1.0.tgz", + "integrity": "sha512-oxQLyhW3yIAfvDdtoobvriWqfWVqOBo1o+WWRxlDyJdKDBH6my++p6KU3ZjxcJb7VG+CRLGfU7zASWwTPxMXRA==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "8.0.0", - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0", - "@cspell/dynamic-import": "8.0.0", + "@cspell/cspell-json-reporter": "8.1.0", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0", + "@cspell/dynamic-import": "8.1.0", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.1.0", - "cspell-gitignore": "8.0.0", - "cspell-glob": "8.0.0", - "cspell-io": "8.0.0", - "cspell-lib": "8.0.0", + "cspell-gitignore": "8.1.0", + "cspell-glob": "8.1.0", + "cspell-io": "8.1.0", + "cspell-lib": "8.1.0", "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^7.0.1", + "file-entry-cache": "^7.0.2", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", @@ -4919,36 +4904,44 @@ "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, + "node_modules/cspell-config-lib": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.1.0.tgz", + "integrity": "sha512-mIv8etMAp05OapdxJQt0nkfzclMti8AfACPryWnVePrwB89A2KjErHYBa7hX6gn20B4K+KgD7ckPcOi6L8vLYA==", + "dev": true, + "dependencies": { + "@cspell/cspell-types": "8.1.0", + "comment-json": "^4.2.3", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/cspell-dictionary": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.0.0.tgz", - "integrity": "sha512-R/AzUj7W7F4O4fAOL8jvIiUqPYGy6jIBlDkxO9SZe/A6D2kOICZZzGSXMZ0M7OKYqxc6cioQUMKOJsLkDXfDXw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.1.0.tgz", + "integrity": "sha512-nwvlPiM7jsZThZ2bUS2CYzqwAbxWC4OL5GozQfbGEwW/8unNhifBpJzlOZuzLyX4Vu94ETExeIc625wBqPWjVA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0", - "cspell-trie-lib": "8.0.0", - "fast-equals": "^4.0.3", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0", + "cspell-trie-lib": "8.1.0", + "fast-equals": "^5.0.1", "gensequence": "^6.0.0" }, "engines": { "node": ">=18" } }, - "node_modules/cspell-dictionary/node_modules/fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", - "dev": true - }, "node_modules/cspell-gitignore": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.0.0.tgz", - "integrity": "sha512-Uv+ENdUm+EXwQuG9187lKmE1t8b2KW+6VaQHP7r01WiuhkwhfzmWA7C30iXVcwRcsMw07wKiWvMEtG6Zlzi6lQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.1.0.tgz", + "integrity": "sha512-upMIEjbBz1g92Vt80h2hMMRZ9057iAmCWxi05l0WrwGrtc3CGsA8gQQIFIbVZ0x86Sbmv1cBZms1Y/hKWPWuvg==", "dev": true, "dependencies": { - "cspell-glob": "8.0.0", - "find-up": "^5.0.0" + "cspell-glob": "8.1.0", + "find-up-simple": "^1.0.0" }, "bin": { "cspell-gitignore": "bin.mjs" @@ -4958,9 +4951,9 @@ } }, "node_modules/cspell-glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.0.0.tgz", - "integrity": "sha512-wOkRA1OTIPhyN7a+k9Qq45yFXM+tBFi9DS5ObiLv6t6VTBIeMQpwRK0KLViHmjTgiA6eWx53Dnr+DZfxcAkcZA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.1.0.tgz", + "integrity": "sha512-onPRqJqPZaaUQ1CKeuh2fJJ9UjIBicRq6Ffd6bqWCu7IdwfEBPtjWa/nlEjCVp1CMRwhS3Y0zG3jHkKLydsR4Q==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -4970,13 +4963,13 @@ } }, "node_modules/cspell-grammar": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.0.0.tgz", - "integrity": "sha512-uxpRvbBxOih6SjFQvKTBPTA+YyqYM5UFTNTFuRnA6g6WZeg+NJaTkbQrTgXja4B2r8MJ6XU22YrKTtHNNcP7bQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.1.0.tgz", + "integrity": "sha512-E28SDJYOOuHk8eBtMSIGyCu8qiKb/H4LX1J/kw8+eV0RLvnllmq2FAYFBk8jtu4uW49TW5n/eLg7J2TvPONYAA==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0" + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0" }, "bin": { "cspell-grammar": "bin.mjs" @@ -4986,40 +4979,39 @@ } }, "node_modules/cspell-io": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.0.0.tgz", - "integrity": "sha512-NVdVmQd7SU/nxYwWtO/6gzux/kp1Dt36zKds0+QHZhQ18JJjXduF5e+WUttqKi2oj/vvmjiG4HGFKQVDBcBz3w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.1.0.tgz", + "integrity": "sha512-oPRMS/XUWcdZXMj6Zhs65mgOVyRZajAhHLm18o6cPLOGUD0770oMqi8ZNKj7LuvubkyP/NL0m4AEcWwvmz/Cbw==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "8.0.0" + "@cspell/cspell-service-bus": "8.1.0" }, "engines": { "node": ">=18" } }, "node_modules/cspell-lib": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.0.0.tgz", - "integrity": "sha512-X/BzUjrzHOx7YlhvSph/OlMu1RmCTnybeZvIE67d1Pd7wT1TmZhFTnmvruUhoHxWEudOEe4HjzuNL9ph6Aw+aA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.1.0.tgz", + "integrity": "sha512-tatdY9teElqqPtKHAY1osOhV68h/f3x+4Niw7rV12OXmJ9El1lPka59bVTV401fODWRoF3WWJXUpTg012zhdrQ==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "8.0.0", - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-resolver": "8.0.0", - "@cspell/cspell-types": "8.0.0", - "@cspell/dynamic-import": "8.0.0", - "@cspell/strong-weak-map": "8.0.0", + "@cspell/cspell-bundled-dicts": "8.1.0", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-resolver": "8.1.0", + "@cspell/cspell-types": "8.1.0", + "@cspell/dynamic-import": "8.1.0", + "@cspell/strong-weak-map": "8.1.0", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", - "cosmiconfig": "8.0.0", - "cspell-dictionary": "8.0.0", - "cspell-glob": "8.0.0", - "cspell-grammar": "8.0.0", - "cspell-io": "8.0.0", - "cspell-trie-lib": "8.0.0", + "cspell-config-lib": "8.1.0", + "cspell-dictionary": "8.1.0", + "cspell-glob": "8.1.0", + "cspell-grammar": "8.1.0", + "cspell-io": "8.1.0", + "cspell-trie-lib": "8.1.0", "fast-equals": "^5.0.1", - "find-up": "^6.3.0", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", @@ -5030,96 +5022,14 @@ "node": ">=18" } }, - "node_modules/cspell-lib/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cspell-lib/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cspell-lib/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cspell-lib/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cspell-lib/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/cspell-lib/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cspell-trie-lib": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.0.0.tgz", - "integrity": "sha512-0rC5e1C0uM78uuS+lC1T18EojWZyNvq4bPOPCisnwuhuWrAfCqrFrX/qDNslWk3VTOPbsEMlFj6OnIGQnfwSKg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.1.0.tgz", + "integrity": "sha512-OF5ZNuGPIGg2CCMdMeAgd1I2iVDjoelpMjVDyqpuNu+RVpAkmNRqMFDBlsnJPWCCeOLn7blWPMBZW2KXctsm3Q==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0", "gensequence": "^6.0.0" }, "engines": { @@ -5151,12 +5061,12 @@ } }, "node_modules/cspell/node_modules/file-entry-cache": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", - "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", + "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", "dev": true, "dependencies": { - "flat-cache": "^3.1.1" + "flat-cache": "^3.2.0" }, "engines": { "node": ">=12.0.0" @@ -5527,12 +5437,6 @@ "node": ">=0.10" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -5573,9 +5477,9 @@ } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/encodeurl": { @@ -5638,15 +5542,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5693,9 +5597,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -6306,10 +6210,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -6317,7 +6233,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -6444,6 +6360,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -6539,16 +6467,16 @@ "node": ">=10.13.0" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "dependencies": { - "ini": "2.0.0" + "ini": "4.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6875,9 +6803,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", - "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", "dev": true, "funding": { "type": "github", @@ -6908,12 +6836,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/ipaddr.js": { @@ -8163,12 +8091,12 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/limiter": { @@ -8192,17 +8120,17 @@ } }, "node_modules/lint-staged": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", - "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", + "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", "dev": true, "dependencies": { "chalk": "5.3.0", "commander": "11.1.0", "debug": "4.3.4", "execa": "8.0.1", - "lilconfig": "2.1.0", - "listr2": "7.0.2", + "lilconfig": "3.0.0", + "listr2": "8.0.0", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", @@ -8365,20 +8293,20 @@ } }, "node_modules/listr2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", - "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", + "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", "dev": true, "dependencies": { - "cli-truncate": "^3.1.0", + "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", + "log-update": "^6.0.0", "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/locate-path": { @@ -8454,34 +8382,34 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "ansi-escapes": "^5.0.0", + "ansi-escapes": "^6.2.0", "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "dependencies": { - "type-fest": "^1.0.2" + "type-fest": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8499,6 +8427,49 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -8515,12 +8486,12 @@ } }, "node_modules/log-update/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==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10599,17 +10570,17 @@ } }, "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11362,17 +11333,17 @@ } }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -12450,16 +12421,16 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.0.0.tgz", - "integrity": "sha512-Phbb1ij1TQQuqxuuvxf5P6fvV9U+EVoATNLmDqFHvRZfUyuhgbJuCMzIPeBx4GfTTDWlPs51FYRvZ/Q8xBHsyA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.1.0.tgz", + "integrity": "sha512-o/R/kR1QO9SQV2hUroaguTlHD6MDDtrVY6Xj5eG0loM7T0Pm3TEdlGYQ0LP6O9/CfUiHTntIFUM+PJ999+LuHQ==", "dev": true, "requires": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", "@cspell/dict-bash": "^4.1.2", - "@cspell/dict-companies": "^3.0.27", - "@cspell/dict-cpp": "^5.0.9", + "@cspell/dict-companies": "^3.0.28", + "@cspell/dict-cpp": "^5.0.10", "@cspell/dict-cryptocurrencies": "^4.0.0", "@cspell/dict-csharp": "^4.0.2", "@cspell/dict-css": "^4.0.12", @@ -12468,16 +12439,16 @@ "@cspell/dict-docker": "^1.1.7", "@cspell/dict-dotnet": "^5.0.0", "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.11", + "@cspell/dict-en_us": "^4.3.12", "@cspell/dict-en-common-misspellings": "^1.0.2", "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.2", + "@cspell/dict-filetypes": "^3.0.3", "@cspell/dict-fonts": "^4.0.0", "@cspell/dict-fsharp": "^1.0.1", "@cspell/dict-fullstack": "^3.1.5", "@cspell/dict-gaming-terms": "^1.0.4", "@cspell/dict-git": "^2.0.0", - "@cspell/dict-golang": "^6.0.4", + "@cspell/dict-golang": "^6.0.5", "@cspell/dict-haskell": "^4.0.1", "@cspell/dict-html": "^4.0.5", "@cspell/dict-html-symbol-entities": "^4.0.0", @@ -12488,7 +12459,7 @@ "@cspell/dict-lua": "^4.0.2", "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", - "@cspell/dict-npm": "^5.0.12", + "@cspell/dict-npm": "^5.0.13", "@cspell/dict-php": "^4.0.4", "@cspell/dict-powershell": "^5.0.2", "@cspell/dict-public-licenses": "^2.0.5", @@ -12497,7 +12468,7 @@ "@cspell/dict-ruby": "^5.0.1", "@cspell/dict-rust": "^4.0.1", "@cspell/dict-scala": "^5.0.0", - "@cspell/dict-software-terms": "^3.3.9", + "@cspell/dict-software-terms": "^3.3.11", "@cspell/dict-sql": "^2.1.2", "@cspell/dict-svelte": "^1.0.2", "@cspell/dict-swift": "^2.0.1", @@ -12506,39 +12477,39 @@ } }, "@cspell/cspell-json-reporter": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.0.0.tgz", - "integrity": "sha512-1ltK5N4xMGWjDSIkU+GJd3rXV8buXgO/lAgnpM1RhKWqAmG+u0k6pnhk2vIo/4qZQpgfK0l3J3h/Ky2FcE95vA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.1.0.tgz", + "integrity": "sha512-Iss9dq5XBc5wYADv/Z59W4DgRQYs8BSHNVD6+LbQctuqmeJAte426/oi4x0Y76AJtEe0N6BZouj8HXykovwP5w==", "dev": true, "requires": { - "@cspell/cspell-types": "8.0.0" + "@cspell/cspell-types": "8.1.0" } }, "@cspell/cspell-pipe": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.0.0.tgz", - "integrity": "sha512-1MH+9q3AmbzwK1BYhSGla8e4MAAYzzPApGvv8eyv0rWDmgmDTkGqJPTTvYj1wFvll5ximQ5OolpPQGv3JoWvtQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.1.0.tgz", + "integrity": "sha512-HDNX7MFAPAJ9acyYBa1bG+P4WiHHMFNYeywYBf3h6ScVhHobAqnhqS6b8R7MVhVRivwnKIQPG3zK7UpcwfyRcw==", "dev": true }, "@cspell/cspell-resolver": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.0.0.tgz", - "integrity": "sha512-gtALHFLT2vSZ7BZlIg26AY3W9gkiqxPGE75iypWz06JHJs05ngnAR+h6VOu0+rmgx98hNfzPPEh4g+Tjm8Ma0A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.1.0.tgz", + "integrity": "sha512-nlppKh2o6g0zz+oIQ/dZB+oFQFf8lvn3mJKBpDwoeQY7/o9ZORPibXjtqXM83OhhdpoUVuk+3RFMsnFBBffa2Q==", "dev": true, "requires": { - "global-dirs": "^3.0.1" + "global-directory": "^4.0.1" } }, "@cspell/cspell-service-bus": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.0.0.tgz", - "integrity": "sha512-1EYhIHoZnhxpfEp6Bno6yVWYBuYfaQrwIfeDMntnezUcSmi7RyroQEcp5U7sLv69vhRD2c81o7r8iUaAbPSmIg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.1.0.tgz", + "integrity": "sha512-9Enayhkef732f15kHgiUe4QKyJgKk1dcZ4EFq4eyzUUDFF/eBv6qTQo5k2juUhPIjaKosqqMBHg4ffXcpkhr+Q==", "dev": true }, "@cspell/cspell-types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.0.0.tgz", - "integrity": "sha512-dPdxQI8dLJoJEjylaPYfCJNnm2XNMYPuowHE2FMcsnFR9hEchQAhnKVc/aD63IUYnUtUrPxPlUJdoAoj569e+g==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.1.0.tgz", + "integrity": "sha512-1SxBjQdZtVjrTs3Ftw5I3nNpuDjdpsFMvfbbt6EnxqMpmZiUwkqxLCKla0pEy5R9CZcFFlntlOTMTmNsIkgmWg==", "dev": true }, "@cspell/dict-ada": { @@ -12560,15 +12531,15 @@ "dev": true }, "@cspell/dict-companies": { - "version": "3.0.27", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.27.tgz", - "integrity": "sha512-gaPR/luf+4oKGyxvW4GbxGGPdHiC5kj/QefnmQqrLFrLiCSXMZg5/NL+Lr4E5lcHsd35meX61svITQAvsT7lyQ==", + "version": "3.0.28", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.28.tgz", + "integrity": "sha512-UinHkMYB/1pUkLKm1PGIm9PBFYxeAa6YvbB1Rq/RAAlrs0WDwiDBr3BAYdxydukG1IqqwT5z9WtU+8D/yV/5lw==", "dev": true }, "@cspell/dict-cpp": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.9.tgz", - "integrity": "sha512-ql9WPNp8c+fhdpVpjpZEUWmxBHJXs9CJuiVVfW/iwv5AX7VuMHyEwid+9/6nA8qnCxkUQ5pW83Ums1lLjn8ScA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.10.tgz", + "integrity": "sha512-WCRuDrkFdpmeIR6uXQYKU9loMQKNFS4bUhtHdv5fu4qVyJSh3k/kgmtTm1h1BDTj8EwPRc/RGxS+9Z3b2mnabA==", "dev": true }, "@cspell/dict-cryptocurrencies": { @@ -12626,9 +12597,9 @@ "dev": true }, "@cspell/dict-en_us": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.11.tgz", - "integrity": "sha512-GhdavZFlS2YbUNcRtPbgJ9j6aUyq116LmDQ2/Q5SpQxJ5/6vVs8Yj5WxV1JD+Zh/Zim1NJDcneTOuLsUGi+Czw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.12.tgz", + "integrity": "sha512-1bsUxFjgxF30FTzcU5uvmCvH3lyqVKR9dbwsJhomBlUM97f0edrd6590SiYBXDm7ruE68m3lJd4vs0Ev2D6FtQ==", "dev": true }, "@cspell/dict-en-common-misspellings": { @@ -12644,9 +12615,9 @@ "dev": true }, "@cspell/dict-filetypes": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.2.tgz", - "integrity": "sha512-StoC0wPmFNav6F6P8/FYFN1BpZfPgOmktb8gQ9wTauelWofPeBW+A0t5ncZt9hXHtnbGDA98v4ukacV+ucbnUg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.3.tgz", + "integrity": "sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw==", "dev": true }, "@cspell/dict-fonts": { @@ -12680,9 +12651,9 @@ "dev": true }, "@cspell/dict-golang": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.4.tgz", - "integrity": "sha512-jOfewPEyN6U9Q80okE3b1PTYBfqZgHh7w4o271GSuAX+VKJ1lUDhdR4bPKRxSDdO5jHArw2u5C8nH2CWGuygbQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.5.tgz", + "integrity": "sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA==", "dev": true }, "@cspell/dict-haskell": { @@ -12746,9 +12717,9 @@ "dev": true }, "@cspell/dict-npm": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.12.tgz", - "integrity": "sha512-T/+WeQmtbxo7ad6hrdI8URptYstKJP+kXyWJZfuVJJGWJQ7yubxrI5Z5AfM+Dh/ff4xHmdzapxD9adaEQ727uw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.13.tgz", + "integrity": "sha512-uPb3DlQA/FvlmzT5RjZoy7fy91mxMRZW1B+K3atVM5A/cmP1QlDaSW/iCtde5kHET1MOV7uxz+vy0Yha2OI5pQ==", "dev": true }, "@cspell/dict-php": { @@ -12803,9 +12774,9 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.9.tgz", - "integrity": "sha512-/O3EWe0SIznx18S7J3GAXPDe7sexn3uTsf4IlnGYK9WY6ZRuEywkXCB+5/USLTGf4+QC05pkHofphdvVSifDyA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.11.tgz", + "integrity": "sha512-a2Zml4G47dbQ6GDdN7+YlIWs3nFnIcJkZOLT88m/LzxjApiF7AOZLqQiKwow03hyvGSuZy8itgQZmQHoPlw2vQ==", "dev": true }, "@cspell/dict-sql": { @@ -12839,18 +12810,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.0.0.tgz", - "integrity": "sha512-HNkCepopgiEGuI1QGA6ob4+ayvoSMxvAqetLxP0u1sZzc50LH2DEWwotcNrpVdzZOtERHvIBcGaQKIBEx8pPRQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.1.0.tgz", + "integrity": "sha512-TJ1OnP0ubdVr5YTMU15rVs8R6ROuPvP/Z5lY2gtHscEsf9tZxvIt3924uMc9fTJXgNsITNWSoCzgwJYcDvGM6A==", "dev": true, "requires": { - "import-meta-resolve": "^3.1.1" + "import-meta-resolve": "^4.0.0" } }, "@cspell/strong-weak-map": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.0.0.tgz", - "integrity": "sha512-fRlqPSdpdub52vFtulDgLPzGPGe75I04ScId1zOO9ABP7/ro8VmaG//m1k7hsPkm6h7FG4jWympoA3aXDAcXaA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.1.0.tgz", + "integrity": "sha512-yBc3ejGpx3QLbfS+Sec8ycS+lKuou5rnnpfz3aVBCnNHUPozosFuNYPFB6Iah2CBY6v6rkDCkIp5vnp1IwQzdA==", "dev": true }, "@cspotcode/source-map-support": { @@ -12890,9 +12861,9 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -12907,9 +12878,9 @@ } }, "@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true }, "@hapi/boom": { @@ -14025,9 +13996,9 @@ "dev": true }, "@types/luxon": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.5.tgz", - "integrity": "sha512-1cyf6Ge/94zlaWIZA2ei1pE6SZ8xpad2hXaYa5JEFiaUH0YS494CZwyi4MXNpXD9oEuv6ZH0Bmh0e7F9sPhmZA==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.6.tgz", + "integrity": "sha512-LblarKeI26YsMLxHDIQ0295wPSLjkl98eNwDcVhz3zbo1H+kfnkzR01H5Ai5LBzSeddX0ZJSpGwKEZihGb5diw==", "dev": true }, "@types/memory-cache": { @@ -14057,9 +14028,9 @@ "dev": true }, "@types/node": { - "version": "20.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", - "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "version": "20.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", + "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", "requires": { "undici-types": "~5.26.4" } @@ -15032,13 +15003,13 @@ } }, "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "requires": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" } }, "cliui": { @@ -15333,18 +15304,6 @@ "vary": "^1" } }, - "cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, "create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -15395,25 +15354,25 @@ } }, "cspell": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.0.0.tgz", - "integrity": "sha512-Nayy25Dh+GAlDFDpVZaQhmidP947rpj1Pn9lmZ3nUFjD9W/yj0h0vrjMLMN4dbonddkmKh4t51C+7NuMP405hg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.1.0.tgz", + "integrity": "sha512-oxQLyhW3yIAfvDdtoobvriWqfWVqOBo1o+WWRxlDyJdKDBH6my++p6KU3ZjxcJb7VG+CRLGfU7zASWwTPxMXRA==", "dev": true, "requires": { - "@cspell/cspell-json-reporter": "8.0.0", - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0", - "@cspell/dynamic-import": "8.0.0", + "@cspell/cspell-json-reporter": "8.1.0", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0", + "@cspell/dynamic-import": "8.1.0", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.1.0", - "cspell-gitignore": "8.0.0", - "cspell-glob": "8.0.0", - "cspell-io": "8.0.0", - "cspell-lib": "8.0.0", + "cspell-gitignore": "8.1.0", + "cspell-glob": "8.1.0", + "cspell-io": "8.1.0", + "cspell-lib": "8.1.0", "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^7.0.1", + "file-entry-cache": "^7.0.2", "get-stdin": "^9.0.0", "semver": "^7.5.4", "strip-ansi": "^7.1.0", @@ -15433,12 +15392,12 @@ "dev": true }, "file-entry-cache": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.1.tgz", - "integrity": "sha512-uLfFktPmRetVCbHe5UPuekWrQ6hENufnA46qEGbfACkK5drjTTdQYUragRgMjHldcbYG+nslUerqMPjbBSHXjQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz", + "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==", "dev": true, "requires": { - "flat-cache": "^3.1.1" + "flat-cache": "^3.2.0" } }, "strip-ansi": { @@ -15452,154 +15411,105 @@ } } }, + "cspell-config-lib": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.1.0.tgz", + "integrity": "sha512-mIv8etMAp05OapdxJQt0nkfzclMti8AfACPryWnVePrwB89A2KjErHYBa7hX6gn20B4K+KgD7ckPcOi6L8vLYA==", + "dev": true, + "requires": { + "@cspell/cspell-types": "8.1.0", + "comment-json": "^4.2.3", + "yaml": "^2.3.4" + } + }, "cspell-dictionary": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.0.0.tgz", - "integrity": "sha512-R/AzUj7W7F4O4fAOL8jvIiUqPYGy6jIBlDkxO9SZe/A6D2kOICZZzGSXMZ0M7OKYqxc6cioQUMKOJsLkDXfDXw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.1.0.tgz", + "integrity": "sha512-nwvlPiM7jsZThZ2bUS2CYzqwAbxWC4OL5GozQfbGEwW/8unNhifBpJzlOZuzLyX4Vu94ETExeIc625wBqPWjVA==", "dev": true, "requires": { - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0", - "cspell-trie-lib": "8.0.0", - "fast-equals": "^4.0.3", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0", + "cspell-trie-lib": "8.1.0", + "fast-equals": "^5.0.1", "gensequence": "^6.0.0" - }, - "dependencies": { - "fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", - "dev": true - } } }, "cspell-gitignore": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.0.0.tgz", - "integrity": "sha512-Uv+ENdUm+EXwQuG9187lKmE1t8b2KW+6VaQHP7r01WiuhkwhfzmWA7C30iXVcwRcsMw07wKiWvMEtG6Zlzi6lQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.1.0.tgz", + "integrity": "sha512-upMIEjbBz1g92Vt80h2hMMRZ9057iAmCWxi05l0WrwGrtc3CGsA8gQQIFIbVZ0x86Sbmv1cBZms1Y/hKWPWuvg==", "dev": true, "requires": { - "cspell-glob": "8.0.0", - "find-up": "^5.0.0" + "cspell-glob": "8.1.0", + "find-up-simple": "^1.0.0" } }, "cspell-glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.0.0.tgz", - "integrity": "sha512-wOkRA1OTIPhyN7a+k9Qq45yFXM+tBFi9DS5ObiLv6t6VTBIeMQpwRK0KLViHmjTgiA6eWx53Dnr+DZfxcAkcZA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.1.0.tgz", + "integrity": "sha512-onPRqJqPZaaUQ1CKeuh2fJJ9UjIBicRq6Ffd6bqWCu7IdwfEBPtjWa/nlEjCVp1CMRwhS3Y0zG3jHkKLydsR4Q==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.0.0.tgz", - "integrity": "sha512-uxpRvbBxOih6SjFQvKTBPTA+YyqYM5UFTNTFuRnA6g6WZeg+NJaTkbQrTgXja4B2r8MJ6XU22YrKTtHNNcP7bQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.1.0.tgz", + "integrity": "sha512-E28SDJYOOuHk8eBtMSIGyCu8qiKb/H4LX1J/kw8+eV0RLvnllmq2FAYFBk8jtu4uW49TW5n/eLg7J2TvPONYAA==", "dev": true, "requires": { - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0" + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0" } }, "cspell-io": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.0.0.tgz", - "integrity": "sha512-NVdVmQd7SU/nxYwWtO/6gzux/kp1Dt36zKds0+QHZhQ18JJjXduF5e+WUttqKi2oj/vvmjiG4HGFKQVDBcBz3w==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.1.0.tgz", + "integrity": "sha512-oPRMS/XUWcdZXMj6Zhs65mgOVyRZajAhHLm18o6cPLOGUD0770oMqi8ZNKj7LuvubkyP/NL0m4AEcWwvmz/Cbw==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "8.0.0" + "@cspell/cspell-service-bus": "8.1.0" } }, "cspell-lib": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.0.0.tgz", - "integrity": "sha512-X/BzUjrzHOx7YlhvSph/OlMu1RmCTnybeZvIE67d1Pd7wT1TmZhFTnmvruUhoHxWEudOEe4HjzuNL9ph6Aw+aA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.1.0.tgz", + "integrity": "sha512-tatdY9teElqqPtKHAY1osOhV68h/f3x+4Niw7rV12OXmJ9El1lPka59bVTV401fODWRoF3WWJXUpTg012zhdrQ==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "8.0.0", - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-resolver": "8.0.0", - "@cspell/cspell-types": "8.0.0", - "@cspell/dynamic-import": "8.0.0", - "@cspell/strong-weak-map": "8.0.0", + "@cspell/cspell-bundled-dicts": "8.1.0", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-resolver": "8.1.0", + "@cspell/cspell-types": "8.1.0", + "@cspell/dynamic-import": "8.1.0", + "@cspell/strong-weak-map": "8.1.0", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", - "cosmiconfig": "8.0.0", - "cspell-dictionary": "8.0.0", - "cspell-glob": "8.0.0", - "cspell-grammar": "8.0.0", - "cspell-io": "8.0.0", - "cspell-trie-lib": "8.0.0", + "cspell-config-lib": "8.1.0", + "cspell-dictionary": "8.1.0", + "cspell-glob": "8.1.0", + "cspell-grammar": "8.1.0", + "cspell-io": "8.1.0", + "cspell-trie-lib": "8.1.0", "fast-equals": "^5.0.1", - "find-up": "^6.3.0", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", "resolve-from": "^5.0.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } } }, "cspell-trie-lib": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.0.0.tgz", - "integrity": "sha512-0rC5e1C0uM78uuS+lC1T18EojWZyNvq4bPOPCisnwuhuWrAfCqrFrX/qDNslWk3VTOPbsEMlFj6OnIGQnfwSKg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.1.0.tgz", + "integrity": "sha512-OF5ZNuGPIGg2CCMdMeAgd1I2iVDjoelpMjVDyqpuNu+RVpAkmNRqMFDBlsnJPWCCeOLn7blWPMBZW2KXctsm3Q==", "dev": true, "requires": { - "@cspell/cspell-pipe": "8.0.0", - "@cspell/cspell-types": "8.0.0", + "@cspell/cspell-pipe": "8.1.0", + "@cspell/cspell-types": "8.1.0", "gensequence": "^6.0.0" } }, @@ -15831,12 +15741,6 @@ "nan": "^2.14.0" } }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -15871,9 +15775,9 @@ "dev": true }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "encodeurl": { @@ -15918,15 +15822,15 @@ "dev": true }, "eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -15964,9 +15868,9 @@ } }, "eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "requires": {} }, @@ -16407,10 +16311,16 @@ "path-exists": "^4.0.0" } }, + "find-up-simple": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", + "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "dev": true + }, "flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { "flatted": "^3.2.9", @@ -16497,6 +16407,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true + }, "get-intrinsic": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", @@ -16562,13 +16478,13 @@ "is-glob": "^4.0.3" } }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "requires": { - "ini": "2.0.0" + "ini": "4.1.1" } }, "globals": { @@ -16784,9 +16700,9 @@ } }, "import-meta-resolve": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz", - "integrity": "sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", "dev": true }, "imurmurhash": { @@ -16810,9 +16726,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true }, "ipaddr.js": { @@ -17750,9 +17666,9 @@ } }, "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true }, "limiter": { @@ -17776,17 +17692,17 @@ } }, "lint-staged": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz", - "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", + "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", "dev": true, "requires": { "chalk": "5.3.0", "commander": "11.1.0", "debug": "4.3.4", "execa": "8.0.1", - "lilconfig": "2.1.0", - "listr2": "7.0.2", + "lilconfig": "3.0.0", + "listr2": "8.0.0", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", @@ -17879,17 +17795,17 @@ } }, "listr2": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz", - "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", + "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", "dev": true, "requires": { - "cli-truncate": "^3.1.0", + "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", + "log-update": "^6.0.0", "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" + "wrap-ansi": "^9.0.0" } }, "locate-path": { @@ -17959,25 +17875,25 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "requires": { - "ansi-escapes": "^5.0.0", + "ansi-escapes": "^6.2.0", "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "dependencies": { "ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "requires": { - "type-fest": "^1.0.2" + "type-fest": "^3.0.0" } }, "ansi-regex": { @@ -17986,6 +17902,31 @@ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "requires": { + "get-east-asian-width": "^1.0.0" + } + }, + "slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "requires": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + } + }, "strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -17996,9 +17937,9 @@ } }, "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==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true } } @@ -19575,14 +19516,14 @@ } }, "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", "dev": true, "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "dependencies": { "ansi-regex": { @@ -20106,14 +20047,14 @@ } }, "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "dependencies": { "ansi-regex": { diff --git a/package.json b/package.json index 19716cce1..3ab02c513 100644 --- a/package.json +++ b/package.json @@ -134,10 +134,10 @@ "@types/express-session": "1.17.10", "@types/jest": "29.5.10", "@types/lodash": "4.14.202", - "@types/luxon": "3.3.5", + "@types/luxon": "3.3.6", "@types/memory-cache": "0.2.5", "@types/morgan": "1.9.9", - "@types/node": "20.10.0", + "@types/node": "20.10.3", "@types/node-jose": "1.1.13", "@types/object-path": "0.11.4", "@types/passport": "1.0.16", @@ -151,15 +151,15 @@ "@types/validator": "13.11.7", "@typescript-eslint/eslint-plugin": "6.13.1", "@typescript-eslint/parser": "6.13.1", - "cspell": "8.0.0", - "eslint": "8.54.0", - "eslint-config-prettier": "9.0.0", + "cspell": "8.1.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", "eslint-plugin-n": "16.3.1", "eslint-plugin-prettier": "5.0.1", "husky": "8.0.3", "jest": "29.7.0", "jest-junit": "16.0.0", - "lint-staged": "15.1.0", + "lint-staged": "15.2.0", "markdownlint-cli2": "0.11.0", "prettier": "3.1.0", "ts-jest": "29.1.1", From c63dc75cba294007f51a88585e2ad8373755cb73 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Mon, 4 Dec 2023 22:45:04 -0800 Subject: [PATCH 66/69] Uncontrolled organization fix For modern apps using GitHub Apps instead of PATs or OAuth tokens, this makes sure that the Uncontrolled Organization method can still be used to retrieve other GitHub organizations that are not managed by the apps for purposes such as pulling org details and basics. --- api/client/context/index.ts | 1 + business/operations/index.ts | 99 +++++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 40 deletions(-) diff --git a/api/client/context/index.ts b/api/client/context/index.ts index c974f2680..6cbe7fba0 100644 --- a/api/client/context/index.ts +++ b/api/client/context/index.ts @@ -125,6 +125,7 @@ router.use( return next(); } catch (noOrgError) { if (ErrorHelper.IsNotFound(noOrgError)) { + // Could be either the org truly does not exist, OR, it's uncontrolled. if (await isUnmanagedOrganization(providers, orgName)) { res.status(204); res.end(); diff --git a/business/operations/index.ts b/business/operations/index.ts index 1f5717759..0b0ef5055 100644 --- a/business/operations/index.ts +++ b/business/operations/index.ts @@ -98,6 +98,12 @@ export type GetInvisibleOrganizationOptions = { storeInstanceByName?: boolean; }; +type CreateOrganizationOptions = { + settings: OrganizationSetting; + appAuthenticationType: GitHubAppAuthenticationType; + asUncontrolledPublicOnly?: boolean; +}; + export class Operations extends OperationsCore implements @@ -338,32 +344,46 @@ export class Operations return Array.from(this._organizationIds.keys()); } - private createOrganization( - name: string, - settings: OrganizationSetting, - appAuthenticationType: GitHubAppAuthenticationType - ): Organization { + private createOrganization(name: string, options: CreateOrganizationOptions): Organization { name = name.toLowerCase(); + if (!options) { + throw CreateError.ParameterRequired('options'); + } + const { settings, appAuthenticationType, asUncontrolledPublicOnly } = options; if (!settings) { - throw new Error(`This application is not configured for the ${name} organization`); + throw CreateError.InvalidParameters( + `This application does not have configuration information for the ${name} organization` + ); } const ownerToken = settings.getOwnerToken(); const hasDynamicSettings = this._dynamicOrganizationIds && settings.organizationId && this._dynamicOrganizationIds.has(Number(settings.organizationId)); + let configuredGetAuthorizationHeader: GetAuthorizationHeader = this.getAuthorizationHeader.bind( + this, + name, + settings, + ownerToken, + appAuthenticationType + ); + let forcedGetAuthorizationHeader: GetAuthorizationHeader = this.getAuthorizationHeader.bind( + this, + name, + settings, + ownerToken, + GitHubAppAuthenticationType.ForceSpecificInstallation + ); + if (!ownerToken && asUncontrolledPublicOnly) { + configuredGetAuthorizationHeader = this.getPublicAuthorizationToken(); + forcedGetAuthorizationHeader = configuredGetAuthorizationHeader; + } return new Organization( this, name, settings, - this.getAuthorizationHeader.bind(this, name, settings, ownerToken, appAuthenticationType), - this.getAuthorizationHeader.bind( - this, - name, - settings, - ownerToken, - GitHubAppAuthenticationType.ForceSpecificInstallation - ), + configuredGetAuthorizationHeader, + forcedGetAuthorizationHeader, hasDynamicSettings ); } @@ -384,11 +404,10 @@ export class Operations settings = dos; } } - const organization = this.createOrganization( - name, + const organization = this.createOrganization(name, { settings, - GitHubAppAuthenticationType.BestAvailable - ); + appAuthenticationType: GitHubAppAuthenticationType.BestAvailable, + }); organizations.set(name, organization); } this._organizations = organizations; @@ -407,11 +426,10 @@ export class Operations for (let i = 0; i < list.length; i++) { const settings = list[i]; if (settings && settings.name && settings.name.toLowerCase() === lowercase) { - return this.createOrganization( - lowercase, - OrganizationSetting.CreateFromStaticSettings(settings), - GitHubAppAuthenticationType.BestAvailable - ); + return this.createOrganization(lowercase, { + settings: OrganizationSetting.CreateFromStaticSettings(settings), + appAuthenticationType: GitHubAppAuthenticationType.BestAvailable, + }); } } } @@ -427,11 +445,10 @@ export class Operations } getUnconfiguredOrganization(settings: OrganizationSetting): Organization { - return this.createOrganization( - settings.organizationName.toLowerCase(), + return this.createOrganization(settings.organizationName.toLowerCase(), { settings, - GitHubAppAuthenticationType.BestAvailable - ); + appAuthenticationType: GitHubAppAuthenticationType.BestAvailable, + }); } // An invisible organization does not appear in the cross-organization @@ -462,7 +479,10 @@ export class Operations dynamicSettings = options.settings; } const authenticationType = options?.authenticationType || GitHubAppAuthenticationType.BestAvailable; - const organization = this.createOrganization(name, dynamicSettings, authenticationType); + const organization = this.createOrganization(name, { + settings: dynamicSettings, + appAuthenticationType: authenticationType, + }); if (!options || options?.storeInstanceByName) { this._invisibleOrganizations.set(name, organization); } @@ -480,11 +500,12 @@ export class Operations } const emptySettings = new OrganizationSetting(); emptySettings.operationsNotes = `Uncontrolled Organization - ${organizationName}`; - const org = this.createOrganization( - organizationName, - emptySettings, - GitHubAppAuthenticationType.ForceSpecificInstallation - ); + const asUncontrolledPublicOnly = true; + const org = this.createOrganization(organizationName, { + settings: emptySettings, + appAuthenticationType: GitHubAppAuthenticationType.ForceSpecificInstallation, + asUncontrolledPublicOnly, + }); this._uncontrolledOrganizations.set(organizationName, org); org.uncontrolled = true; return org; @@ -501,11 +522,10 @@ export class Operations `Uncontrolled public organization - ${organizationName}`, organizationId ); - const org = this.createOrganization( - organizationName, - emptySettings, - GitHubAppAuthenticationType.ForceSpecificInstallation - ); + const org = this.createOrganization(organizationName, { + settings: emptySettings, + appAuthenticationType: GitHubAppAuthenticationType.ForceSpecificInstallation, + }); this._uncontrolledOrganizations.set(organizationName, org); org.uncontrolled = true; return org; @@ -813,8 +833,7 @@ export class Operations const lc = name.toLowerCase(); const organization = this.organizations.get(lc); if (!organization) { - // will this impact things? - throw CreateError.InvalidParameters(`Could not find configuration for the "${name}" organization.`); + throw CreateError.NotFound(`Could not find configuration for the "${name}" organization.`); } return organization; } From 96671b3a7d8cecd82ab916955bedc0b18fa88bf4 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:45:35 -0800 Subject: [PATCH 67/69] Person page 404 should bubble --- api/client/person.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/client/person.ts b/api/client/person.ts index 7b58e626a..1df8919b8 100644 --- a/api/client/person.ts +++ b/api/client/person.ts @@ -10,7 +10,7 @@ import { ReposAppRequest, AccountJsonFormat } from '../../interfaces'; import { IGraphEntry } from '../../lib/graphProvider'; import { jsonError } from '../../middleware'; -import { getProviders } from '../../transitional'; +import { CreateError, ErrorHelper, getProviders } from '../../transitional'; const getPerson = asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); @@ -74,7 +74,11 @@ const getPerson = asyncHandler(async (req: ReposAppRequest, res: Response, next: ); return res.json(combined) as unknown as void; } catch (error) { - return next(jsonError(`login ${login} error: ${error}`, 500)); + return next( + ErrorHelper.IsNotFound(error) + ? error + : CreateError.InvalidParameters(`Invalid issue retrieving user ${login}: ${error.message}`) + ); } }); From 2623ea6a53b31d2f8775a66e53c5dbc47b8f0511 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:46:04 -0800 Subject: [PATCH 68/69] Updated deps and typings --- package-lock.json | 602 +++++++++++++++++++++++----------------------- package.json | 14 +- 2 files changed, 308 insertions(+), 308 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8e67e440..fc2ba7c9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,12 +76,12 @@ "@types/debug": "4.1.12", "@types/express": "4.17.21", "@types/express-session": "1.17.10", - "@types/jest": "29.5.10", + "@types/jest": "29.5.11", "@types/lodash": "4.14.202", - "@types/luxon": "3.3.6", + "@types/luxon": "3.3.7", "@types/memory-cache": "0.2.5", "@types/morgan": "1.9.9", - "@types/node": "20.10.3", + "@types/node": "20.10.4", "@types/node-jose": "1.1.13", "@types/object-path": "0.11.4", "@types/passport": "1.0.16", @@ -93,9 +93,9 @@ "@types/semver": "7.5.6", "@types/simple-oauth2": "5.0.7", "@types/validator": "13.11.7", - "@typescript-eslint/eslint-plugin": "6.13.1", - "@typescript-eslint/parser": "6.13.1", - "cspell": "8.1.0", + "@typescript-eslint/eslint-plugin": "6.13.2", + "@typescript-eslint/parser": "6.13.2", + "cspell": "8.1.3", "eslint": "8.55.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-n": "16.3.1", @@ -109,7 +109,7 @@ "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.3.2" + "typescript": "5.3.3" }, "engines": { "node": ">=18" @@ -1220,14 +1220,14 @@ "dev": true }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.1.0.tgz", - "integrity": "sha512-o/R/kR1QO9SQV2hUroaguTlHD6MDDtrVY6Xj5eG0loM7T0Pm3TEdlGYQ0LP6O9/CfUiHTntIFUM+PJ999+LuHQ==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.1.3.tgz", + "integrity": "sha512-TwLyL2bCtetXGhMudjOIgFPAsWF2UkT0E7T+DAZG8aUBfHoC/eco/sTmR6UJVpi6Crjs0YOQkFUBGrQ2pxJPcA==", "dev": true, "dependencies": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", - "@cspell/dict-bash": "^4.1.2", + "@cspell/dict-bash": "^4.1.3", "@cspell/dict-companies": "^3.0.28", "@cspell/dict-cpp": "^5.0.10", "@cspell/dict-cryptocurrencies": "^4.0.0", @@ -1255,7 +1255,7 @@ "@cspell/dict-k8s": "^1.0.2", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", - "@cspell/dict-lua": "^4.0.2", + "@cspell/dict-lua": "^4.0.3", "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", "@cspell/dict-npm": "^5.0.13", @@ -1279,30 +1279,30 @@ } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.1.0.tgz", - "integrity": "sha512-Iss9dq5XBc5wYADv/Z59W4DgRQYs8BSHNVD6+LbQctuqmeJAte426/oi4x0Y76AJtEe0N6BZouj8HXykovwP5w==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.1.3.tgz", + "integrity": "sha512-9iOU0Y733XuF0cqC7xwzJkOKFdJ65rYGnHFdUHzr5lxEqeG9X/jhlkzyHuGGOhPxkUeFP1x9XoLhXo1isMDbKA==", "dev": true, "dependencies": { - "@cspell/cspell-types": "8.1.0" + "@cspell/cspell-types": "8.1.3" }, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-pipe": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.1.0.tgz", - "integrity": "sha512-HDNX7MFAPAJ9acyYBa1bG+P4WiHHMFNYeywYBf3h6ScVhHobAqnhqS6b8R7MVhVRivwnKIQPG3zK7UpcwfyRcw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.1.3.tgz", + "integrity": "sha512-/dcnyLDeyFuoX4seZv7VsDQyRpt3ZY0vjZiDpqFul8hPydM8czLyRPPMD6Za+Gqg6dZmh9+VsQWK52hVsqc0QA==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-resolver": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.1.0.tgz", - "integrity": "sha512-nlppKh2o6g0zz+oIQ/dZB+oFQFf8lvn3mJKBpDwoeQY7/o9ZORPibXjtqXM83OhhdpoUVuk+3RFMsnFBBffa2Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.1.3.tgz", + "integrity": "sha512-bGyJYqkHRilqhyKGL/NvODN5U+UvCuQo7kxgt0i3Vd7m7k6XYLsSLYZ4w6r1S5IQ/ybU8I5lh6/6fNqKwvo9eg==", "dev": true, "dependencies": { "global-directory": "^4.0.1" @@ -1312,18 +1312,18 @@ } }, "node_modules/@cspell/cspell-service-bus": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.1.0.tgz", - "integrity": "sha512-9Enayhkef732f15kHgiUe4QKyJgKk1dcZ4EFq4eyzUUDFF/eBv6qTQo5k2juUhPIjaKosqqMBHg4ffXcpkhr+Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.1.3.tgz", + "integrity": "sha512-8E5ZveQKneNfK+cuFMy0y6tDsho71UPppEHNoLZsEFDbIxDdtQcAfs0pk4nwEzxPBt+dBB+Yl8KExQ6x2FAYQw==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@cspell/cspell-types": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.1.0.tgz", - "integrity": "sha512-1SxBjQdZtVjrTs3Ftw5I3nNpuDjdpsFMvfbbt6EnxqMpmZiUwkqxLCKla0pEy5R9CZcFFlntlOTMTmNsIkgmWg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.1.3.tgz", + "integrity": "sha512-j14FENj+DzWu6JjzTl+0X5/OJv9AEckpEp6Jaw9YglxirrBBzTkZGfoLePe/AWo/MlIYp0asl92C1UHEjgz+FQ==", "dev": true, "engines": { "node": ">=18" @@ -1342,9 +1342,9 @@ "dev": true }, "node_modules/@cspell/dict-bash": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.2.tgz", - "integrity": "sha512-AEBWjbaMaJEyAjOHW0F15P2izBjli2cNerG3NjuVH7xX/HUUeNoTj8FF1nwpMufKwGQCvuyO2hCmkVxhJ0y55Q==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.3.tgz", + "integrity": "sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==", "dev": true }, "node_modules/@cspell/dict-companies": { @@ -1516,9 +1516,9 @@ "dev": true }, "node_modules/@cspell/dict-lua": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.2.tgz", - "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.3.tgz", + "integrity": "sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==", "dev": true }, "node_modules/@cspell/dict-makefile": { @@ -1591,9 +1591,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.11.tgz", - "integrity": "sha512-a2Zml4G47dbQ6GDdN7+YlIWs3nFnIcJkZOLT88m/LzxjApiF7AOZLqQiKwow03hyvGSuZy8itgQZmQHoPlw2vQ==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.12.tgz", + "integrity": "sha512-6aa4T9VqOMc0SFNBt6gxp0CWjvRqMg/uxvgpRbil+ToHWcU+Q+As0WKhPLaOniuTdCM85WWzRouD0O1XUGqg5Q==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -1627,9 +1627,9 @@ "dev": true }, "node_modules/@cspell/dynamic-import": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.1.0.tgz", - "integrity": "sha512-TJ1OnP0ubdVr5YTMU15rVs8R6ROuPvP/Z5lY2gtHscEsf9tZxvIt3924uMc9fTJXgNsITNWSoCzgwJYcDvGM6A==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.1.3.tgz", + "integrity": "sha512-/lXFLa92v4oOcZ2PbdRpOqBvnqWlYmGaV7iCy8+QhIWlMdzi+7tBX3LVTm9Jzvt/rJseVHQQ6RvfTsSmhbUMFQ==", "dev": true, "dependencies": { "import-meta-resolve": "^4.0.0" @@ -1639,9 +1639,9 @@ } }, "node_modules/@cspell/strong-weak-map": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.1.0.tgz", - "integrity": "sha512-yBc3ejGpx3QLbfS+Sec8ycS+lKuou5rnnpfz3aVBCnNHUPozosFuNYPFB6Iah2CBY6v6rkDCkIp5vnp1IwQzdA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.1.3.tgz", + "integrity": "sha512-GhWyximzk8tumo0zhrDV3+nFYiETYefiTBWAEVbXJMibuvitFocVZwddqN85J0UdZ2M7q6tvBleEaI9ME/16gA==", "dev": true, "engines": { "node": ">=18" @@ -3035,9 +3035,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.10", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", - "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", + "version": "29.5.11", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", + "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3065,9 +3065,9 @@ "dev": true }, "node_modules/@types/luxon": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.6.tgz", - "integrity": "sha512-LblarKeI26YsMLxHDIQ0295wPSLjkl98eNwDcVhz3zbo1H+kfnkzR01H5Ai5LBzSeddX0ZJSpGwKEZihGb5diw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", + "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==", "dev": true }, "node_modules/@types/memory-cache": { @@ -3097,9 +3097,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", - "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "dependencies": { "undici-types": "~5.26.4" } @@ -3352,16 +3352,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", - "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/type-utils": "6.13.1", - "@typescript-eslint/utils": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3387,15 +3387,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", - "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4" }, "engines": { @@ -3415,13 +3415,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", - "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1" + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3432,13 +3432,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", - "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3459,9 +3459,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", - "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3472,13 +3472,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", - "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3499,17 +3499,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", - "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", "semver": "^7.5.4" }, "engines": { @@ -3524,12 +3524,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", - "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/types": "6.13.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4869,22 +4869,22 @@ } }, "node_modules/cspell": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.1.0.tgz", - "integrity": "sha512-oxQLyhW3yIAfvDdtoobvriWqfWVqOBo1o+WWRxlDyJdKDBH6my++p6KU3ZjxcJb7VG+CRLGfU7zASWwTPxMXRA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.1.3.tgz", + "integrity": "sha512-SU4Su6002bPoJYaiMeNV4wwLoS8TwaOgIwaTxhys3GDbJIxZV6CrDgwksezHcG7TZrC4yrveDVsdpnrzmQ7T5Q==", "dev": true, "dependencies": { - "@cspell/cspell-json-reporter": "8.1.0", - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0", - "@cspell/dynamic-import": "8.1.0", + "@cspell/cspell-json-reporter": "8.1.3", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3", + "@cspell/dynamic-import": "8.1.3", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.1.0", - "cspell-gitignore": "8.1.0", - "cspell-glob": "8.1.0", - "cspell-io": "8.1.0", - "cspell-lib": "8.1.0", + "cspell-gitignore": "8.1.3", + "cspell-glob": "8.1.3", + "cspell-io": "8.1.3", + "cspell-lib": "8.1.3", "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^7.0.2", @@ -4905,12 +4905,12 @@ } }, "node_modules/cspell-config-lib": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.1.0.tgz", - "integrity": "sha512-mIv8etMAp05OapdxJQt0nkfzclMti8AfACPryWnVePrwB89A2KjErHYBa7hX6gn20B4K+KgD7ckPcOi6L8vLYA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.1.3.tgz", + "integrity": "sha512-whzJYxcxos3vnywn0alCFZ+Myc0K/C62pUurfOGhgvIba7ArmlXhNRaL2r5noBxWARtpBOtzz3vrzSBK7Lq6jg==", "dev": true, "dependencies": { - "@cspell/cspell-types": "8.1.0", + "@cspell/cspell-types": "8.1.3", "comment-json": "^4.2.3", "yaml": "^2.3.4" }, @@ -4919,14 +4919,14 @@ } }, "node_modules/cspell-dictionary": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.1.0.tgz", - "integrity": "sha512-nwvlPiM7jsZThZ2bUS2CYzqwAbxWC4OL5GozQfbGEwW/8unNhifBpJzlOZuzLyX4Vu94ETExeIc625wBqPWjVA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.1.3.tgz", + "integrity": "sha512-nkRQDPNnA6tw+hJFBqq26M0nK306q5rtyv/AUIWa8ZHhQkwzACnpMSpuJA7/DV5GVvPKltMK5M4A6vgfpoaFHw==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0", - "cspell-trie-lib": "8.1.0", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3", + "cspell-trie-lib": "8.1.3", "fast-equals": "^5.0.1", "gensequence": "^6.0.0" }, @@ -4935,12 +4935,12 @@ } }, "node_modules/cspell-gitignore": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.1.0.tgz", - "integrity": "sha512-upMIEjbBz1g92Vt80h2hMMRZ9057iAmCWxi05l0WrwGrtc3CGsA8gQQIFIbVZ0x86Sbmv1cBZms1Y/hKWPWuvg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.1.3.tgz", + "integrity": "sha512-NHx5lg44eCKb6yJmUPOCz4prcuYowzoo5GJ5hOcCfbk7ZEBWV1E2/kDRuQMOK2W0y1hNGr45CSxO3UxWJlYg7w==", "dev": true, "dependencies": { - "cspell-glob": "8.1.0", + "cspell-glob": "8.1.3", "find-up-simple": "^1.0.0" }, "bin": { @@ -4951,9 +4951,9 @@ } }, "node_modules/cspell-glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.1.0.tgz", - "integrity": "sha512-onPRqJqPZaaUQ1CKeuh2fJJ9UjIBicRq6Ffd6bqWCu7IdwfEBPtjWa/nlEjCVp1CMRwhS3Y0zG3jHkKLydsR4Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.1.3.tgz", + "integrity": "sha512-Likr7UVUXBpthQnM5r6yao3X0YBNRbJ9AHWXTC2RJfzwZOFKF+pKPfeo3FU+Px8My96M4RC2bVMbrbZUwN5NJw==", "dev": true, "dependencies": { "micromatch": "^4.0.5" @@ -4963,13 +4963,13 @@ } }, "node_modules/cspell-grammar": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.1.0.tgz", - "integrity": "sha512-E28SDJYOOuHk8eBtMSIGyCu8qiKb/H4LX1J/kw8+eV0RLvnllmq2FAYFBk8jtu4uW49TW5n/eLg7J2TvPONYAA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.1.3.tgz", + "integrity": "sha512-dTOwNq6a5wcVzOsi4xY5/tq2r2w/+wLVU+WfyySTsPe66Rjqx/QceFl4OinImks/ZMKF7Zyjd3WGyQ5TcSsJFQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0" + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3" }, "bin": { "cspell-grammar": "bin.mjs" @@ -4979,38 +4979,38 @@ } }, "node_modules/cspell-io": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.1.0.tgz", - "integrity": "sha512-oPRMS/XUWcdZXMj6Zhs65mgOVyRZajAhHLm18o6cPLOGUD0770oMqi8ZNKj7LuvubkyP/NL0m4AEcWwvmz/Cbw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.1.3.tgz", + "integrity": "sha512-QkcFeYd79oIl7PgSqFSZyvwXnZQhXmdCI733n54IN2+iXDcf7W0mwptxoC/cE19RkEwAwEFLG81UAy6L/BXI6A==", "dev": true, "dependencies": { - "@cspell/cspell-service-bus": "8.1.0" + "@cspell/cspell-service-bus": "8.1.3" }, "engines": { "node": ">=18" } }, "node_modules/cspell-lib": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.1.0.tgz", - "integrity": "sha512-tatdY9teElqqPtKHAY1osOhV68h/f3x+4Niw7rV12OXmJ9El1lPka59bVTV401fODWRoF3WWJXUpTg012zhdrQ==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.1.3.tgz", + "integrity": "sha512-Kk8bpHVkDZO4MEiPkDvRf/LgJ0h5mufbKLTWModq6k0Ca8EkZ/qgQlZ0ve0rIivbleSqebuWjpJHKDM+IHmzHA==", "dev": true, "dependencies": { - "@cspell/cspell-bundled-dicts": "8.1.0", - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-resolver": "8.1.0", - "@cspell/cspell-types": "8.1.0", - "@cspell/dynamic-import": "8.1.0", - "@cspell/strong-weak-map": "8.1.0", + "@cspell/cspell-bundled-dicts": "8.1.3", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-resolver": "8.1.3", + "@cspell/cspell-types": "8.1.3", + "@cspell/dynamic-import": "8.1.3", + "@cspell/strong-weak-map": "8.1.3", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", - "cspell-config-lib": "8.1.0", - "cspell-dictionary": "8.1.0", - "cspell-glob": "8.1.0", - "cspell-grammar": "8.1.0", - "cspell-io": "8.1.0", - "cspell-trie-lib": "8.1.0", + "cspell-config-lib": "8.1.3", + "cspell-dictionary": "8.1.3", + "cspell-glob": "8.1.3", + "cspell-grammar": "8.1.3", + "cspell-io": "8.1.3", + "cspell-trie-lib": "8.1.3", "fast-equals": "^5.0.1", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", @@ -5023,13 +5023,13 @@ } }, "node_modules/cspell-trie-lib": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.1.0.tgz", - "integrity": "sha512-OF5ZNuGPIGg2CCMdMeAgd1I2iVDjoelpMjVDyqpuNu+RVpAkmNRqMFDBlsnJPWCCeOLn7blWPMBZW2KXctsm3Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.1.3.tgz", + "integrity": "sha512-EDSYU9MCtzPSJDrfvDrTKmc0rzl50Ehjg1c5rUCqn33p2LCRe/G8hW0FxXe0mxrZxrMO2b8l0PVSGlrCXCQ8RQ==", "dev": true, "dependencies": { - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3", "gensequence": "^6.0.0" }, "engines": { @@ -11033,9 +11033,9 @@ } }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12421,14 +12421,14 @@ "dev": true }, "@cspell/cspell-bundled-dicts": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.1.0.tgz", - "integrity": "sha512-o/R/kR1QO9SQV2hUroaguTlHD6MDDtrVY6Xj5eG0loM7T0Pm3TEdlGYQ0LP6O9/CfUiHTntIFUM+PJ999+LuHQ==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.1.3.tgz", + "integrity": "sha512-TwLyL2bCtetXGhMudjOIgFPAsWF2UkT0E7T+DAZG8aUBfHoC/eco/sTmR6UJVpi6Crjs0YOQkFUBGrQ2pxJPcA==", "dev": true, "requires": { "@cspell/dict-ada": "^4.0.2", "@cspell/dict-aws": "^4.0.0", - "@cspell/dict-bash": "^4.1.2", + "@cspell/dict-bash": "^4.1.3", "@cspell/dict-companies": "^3.0.28", "@cspell/dict-cpp": "^5.0.10", "@cspell/dict-cryptocurrencies": "^4.0.0", @@ -12456,7 +12456,7 @@ "@cspell/dict-k8s": "^1.0.2", "@cspell/dict-latex": "^4.0.0", "@cspell/dict-lorem-ipsum": "^4.0.0", - "@cspell/dict-lua": "^4.0.2", + "@cspell/dict-lua": "^4.0.3", "@cspell/dict-makefile": "^1.0.0", "@cspell/dict-node": "^4.0.3", "@cspell/dict-npm": "^5.0.13", @@ -12477,39 +12477,39 @@ } }, "@cspell/cspell-json-reporter": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.1.0.tgz", - "integrity": "sha512-Iss9dq5XBc5wYADv/Z59W4DgRQYs8BSHNVD6+LbQctuqmeJAte426/oi4x0Y76AJtEe0N6BZouj8HXykovwP5w==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.1.3.tgz", + "integrity": "sha512-9iOU0Y733XuF0cqC7xwzJkOKFdJ65rYGnHFdUHzr5lxEqeG9X/jhlkzyHuGGOhPxkUeFP1x9XoLhXo1isMDbKA==", "dev": true, "requires": { - "@cspell/cspell-types": "8.1.0" + "@cspell/cspell-types": "8.1.3" } }, "@cspell/cspell-pipe": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.1.0.tgz", - "integrity": "sha512-HDNX7MFAPAJ9acyYBa1bG+P4WiHHMFNYeywYBf3h6ScVhHobAqnhqS6b8R7MVhVRivwnKIQPG3zK7UpcwfyRcw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.1.3.tgz", + "integrity": "sha512-/dcnyLDeyFuoX4seZv7VsDQyRpt3ZY0vjZiDpqFul8hPydM8czLyRPPMD6Za+Gqg6dZmh9+VsQWK52hVsqc0QA==", "dev": true }, "@cspell/cspell-resolver": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.1.0.tgz", - "integrity": "sha512-nlppKh2o6g0zz+oIQ/dZB+oFQFf8lvn3mJKBpDwoeQY7/o9ZORPibXjtqXM83OhhdpoUVuk+3RFMsnFBBffa2Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.1.3.tgz", + "integrity": "sha512-bGyJYqkHRilqhyKGL/NvODN5U+UvCuQo7kxgt0i3Vd7m7k6XYLsSLYZ4w6r1S5IQ/ybU8I5lh6/6fNqKwvo9eg==", "dev": true, "requires": { "global-directory": "^4.0.1" } }, "@cspell/cspell-service-bus": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.1.0.tgz", - "integrity": "sha512-9Enayhkef732f15kHgiUe4QKyJgKk1dcZ4EFq4eyzUUDFF/eBv6qTQo5k2juUhPIjaKosqqMBHg4ffXcpkhr+Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.1.3.tgz", + "integrity": "sha512-8E5ZveQKneNfK+cuFMy0y6tDsho71UPppEHNoLZsEFDbIxDdtQcAfs0pk4nwEzxPBt+dBB+Yl8KExQ6x2FAYQw==", "dev": true }, "@cspell/cspell-types": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.1.0.tgz", - "integrity": "sha512-1SxBjQdZtVjrTs3Ftw5I3nNpuDjdpsFMvfbbt6EnxqMpmZiUwkqxLCKla0pEy5R9CZcFFlntlOTMTmNsIkgmWg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.1.3.tgz", + "integrity": "sha512-j14FENj+DzWu6JjzTl+0X5/OJv9AEckpEp6Jaw9YglxirrBBzTkZGfoLePe/AWo/MlIYp0asl92C1UHEjgz+FQ==", "dev": true }, "@cspell/dict-ada": { @@ -12525,9 +12525,9 @@ "dev": true }, "@cspell/dict-bash": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.2.tgz", - "integrity": "sha512-AEBWjbaMaJEyAjOHW0F15P2izBjli2cNerG3NjuVH7xX/HUUeNoTj8FF1nwpMufKwGQCvuyO2hCmkVxhJ0y55Q==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.3.tgz", + "integrity": "sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==", "dev": true }, "@cspell/dict-companies": { @@ -12699,9 +12699,9 @@ "dev": true }, "@cspell/dict-lua": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.2.tgz", - "integrity": "sha512-eeC20Q+UnHcTVBK6pgwhSjGIVugO2XqU7hv4ZfXp2F9DxGx1RME0+1sKX4qAGhdFGwOBsEzb2fwUsAEP6Mibpg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.3.tgz", + "integrity": "sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==", "dev": true }, "@cspell/dict-makefile": { @@ -12774,9 +12774,9 @@ "dev": true }, "@cspell/dict-software-terms": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.11.tgz", - "integrity": "sha512-a2Zml4G47dbQ6GDdN7+YlIWs3nFnIcJkZOLT88m/LzxjApiF7AOZLqQiKwow03hyvGSuZy8itgQZmQHoPlw2vQ==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.3.12.tgz", + "integrity": "sha512-6aa4T9VqOMc0SFNBt6gxp0CWjvRqMg/uxvgpRbil+ToHWcU+Q+As0WKhPLaOniuTdCM85WWzRouD0O1XUGqg5Q==", "dev": true }, "@cspell/dict-sql": { @@ -12810,18 +12810,18 @@ "dev": true }, "@cspell/dynamic-import": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.1.0.tgz", - "integrity": "sha512-TJ1OnP0ubdVr5YTMU15rVs8R6ROuPvP/Z5lY2gtHscEsf9tZxvIt3924uMc9fTJXgNsITNWSoCzgwJYcDvGM6A==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.1.3.tgz", + "integrity": "sha512-/lXFLa92v4oOcZ2PbdRpOqBvnqWlYmGaV7iCy8+QhIWlMdzi+7tBX3LVTm9Jzvt/rJseVHQQ6RvfTsSmhbUMFQ==", "dev": true, "requires": { "import-meta-resolve": "^4.0.0" } }, "@cspell/strong-weak-map": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.1.0.tgz", - "integrity": "sha512-yBc3ejGpx3QLbfS+Sec8ycS+lKuou5rnnpfz3aVBCnNHUPozosFuNYPFB6Iah2CBY6v6rkDCkIp5vnp1IwQzdA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.1.3.tgz", + "integrity": "sha512-GhWyximzk8tumo0zhrDV3+nFYiETYefiTBWAEVbXJMibuvitFocVZwddqN85J0UdZ2M7q6tvBleEaI9ME/16gA==", "dev": true }, "@cspotcode/source-map-support": { @@ -13966,9 +13966,9 @@ } }, "@types/jest": { - "version": "29.5.10", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.10.tgz", - "integrity": "sha512-tE4yxKEphEyxj9s4inideLHktW/x6DwesIwWZ9NN1FKf9zbJYsnhBoA9vrHA/IuIOKwPa5PcFBNV4lpMIOEzyQ==", + "version": "29.5.11", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", + "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", "dev": true, "requires": { "expect": "^29.0.0", @@ -13996,9 +13996,9 @@ "dev": true }, "@types/luxon": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.6.tgz", - "integrity": "sha512-LblarKeI26YsMLxHDIQ0295wPSLjkl98eNwDcVhz3zbo1H+kfnkzR01H5Ai5LBzSeddX0ZJSpGwKEZihGb5diw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.7.tgz", + "integrity": "sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==", "dev": true }, "@types/memory-cache": { @@ -14028,9 +14028,9 @@ "dev": true }, "@types/node": { - "version": "20.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", - "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "requires": { "undici-types": "~5.26.4" } @@ -14269,16 +14269,16 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.1.tgz", - "integrity": "sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/type-utils": "6.13.1", - "@typescript-eslint/utils": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -14288,54 +14288,54 @@ } }, "@typescript-eslint/parser": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.1.tgz", - "integrity": "sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz", + "integrity": "sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.1.tgz", - "integrity": "sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", "dev": true, "requires": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1" + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" } }, "@typescript-eslint/type-utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.1.tgz", - "integrity": "sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.13.1", - "@typescript-eslint/utils": "6.13.1", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.1.tgz", - "integrity": "sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.1.tgz", - "integrity": "sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", "dev": true, "requires": { - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/visitor-keys": "6.13.1", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14344,27 +14344,27 @@ } }, "@typescript-eslint/utils": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.1.tgz", - "integrity": "sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.1", - "@typescript-eslint/types": "6.13.1", - "@typescript-eslint/typescript-estree": "6.13.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.1.tgz", - "integrity": "sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", "dev": true, "requires": { - "@typescript-eslint/types": "6.13.1", + "@typescript-eslint/types": "6.13.2", "eslint-visitor-keys": "^3.4.1" } }, @@ -15354,22 +15354,22 @@ } }, "cspell": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.1.0.tgz", - "integrity": "sha512-oxQLyhW3yIAfvDdtoobvriWqfWVqOBo1o+WWRxlDyJdKDBH6my++p6KU3ZjxcJb7VG+CRLGfU7zASWwTPxMXRA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.1.3.tgz", + "integrity": "sha512-SU4Su6002bPoJYaiMeNV4wwLoS8TwaOgIwaTxhys3GDbJIxZV6CrDgwksezHcG7TZrC4yrveDVsdpnrzmQ7T5Q==", "dev": true, "requires": { - "@cspell/cspell-json-reporter": "8.1.0", - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0", - "@cspell/dynamic-import": "8.1.0", + "@cspell/cspell-json-reporter": "8.1.3", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3", + "@cspell/dynamic-import": "8.1.3", "chalk": "^5.3.0", "chalk-template": "^1.1.0", "commander": "^11.1.0", - "cspell-gitignore": "8.1.0", - "cspell-glob": "8.1.0", - "cspell-io": "8.1.0", - "cspell-lib": "8.1.0", + "cspell-gitignore": "8.1.3", + "cspell-glob": "8.1.3", + "cspell-io": "8.1.3", + "cspell-lib": "8.1.3", "fast-glob": "^3.3.2", "fast-json-stable-stringify": "^2.1.0", "file-entry-cache": "^7.0.2", @@ -15412,88 +15412,88 @@ } }, "cspell-config-lib": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.1.0.tgz", - "integrity": "sha512-mIv8etMAp05OapdxJQt0nkfzclMti8AfACPryWnVePrwB89A2KjErHYBa7hX6gn20B4K+KgD7ckPcOi6L8vLYA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.1.3.tgz", + "integrity": "sha512-whzJYxcxos3vnywn0alCFZ+Myc0K/C62pUurfOGhgvIba7ArmlXhNRaL2r5noBxWARtpBOtzz3vrzSBK7Lq6jg==", "dev": true, "requires": { - "@cspell/cspell-types": "8.1.0", + "@cspell/cspell-types": "8.1.3", "comment-json": "^4.2.3", "yaml": "^2.3.4" } }, "cspell-dictionary": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.1.0.tgz", - "integrity": "sha512-nwvlPiM7jsZThZ2bUS2CYzqwAbxWC4OL5GozQfbGEwW/8unNhifBpJzlOZuzLyX4Vu94ETExeIc625wBqPWjVA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.1.3.tgz", + "integrity": "sha512-nkRQDPNnA6tw+hJFBqq26M0nK306q5rtyv/AUIWa8ZHhQkwzACnpMSpuJA7/DV5GVvPKltMK5M4A6vgfpoaFHw==", "dev": true, "requires": { - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0", - "cspell-trie-lib": "8.1.0", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3", + "cspell-trie-lib": "8.1.3", "fast-equals": "^5.0.1", "gensequence": "^6.0.0" } }, "cspell-gitignore": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.1.0.tgz", - "integrity": "sha512-upMIEjbBz1g92Vt80h2hMMRZ9057iAmCWxi05l0WrwGrtc3CGsA8gQQIFIbVZ0x86Sbmv1cBZms1Y/hKWPWuvg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.1.3.tgz", + "integrity": "sha512-NHx5lg44eCKb6yJmUPOCz4prcuYowzoo5GJ5hOcCfbk7ZEBWV1E2/kDRuQMOK2W0y1hNGr45CSxO3UxWJlYg7w==", "dev": true, "requires": { - "cspell-glob": "8.1.0", + "cspell-glob": "8.1.3", "find-up-simple": "^1.0.0" } }, "cspell-glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.1.0.tgz", - "integrity": "sha512-onPRqJqPZaaUQ1CKeuh2fJJ9UjIBicRq6Ffd6bqWCu7IdwfEBPtjWa/nlEjCVp1CMRwhS3Y0zG3jHkKLydsR4Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.1.3.tgz", + "integrity": "sha512-Likr7UVUXBpthQnM5r6yao3X0YBNRbJ9AHWXTC2RJfzwZOFKF+pKPfeo3FU+Px8My96M4RC2bVMbrbZUwN5NJw==", "dev": true, "requires": { "micromatch": "^4.0.5" } }, "cspell-grammar": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.1.0.tgz", - "integrity": "sha512-E28SDJYOOuHk8eBtMSIGyCu8qiKb/H4LX1J/kw8+eV0RLvnllmq2FAYFBk8jtu4uW49TW5n/eLg7J2TvPONYAA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.1.3.tgz", + "integrity": "sha512-dTOwNq6a5wcVzOsi4xY5/tq2r2w/+wLVU+WfyySTsPe66Rjqx/QceFl4OinImks/ZMKF7Zyjd3WGyQ5TcSsJFQ==", "dev": true, "requires": { - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0" + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3" } }, "cspell-io": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.1.0.tgz", - "integrity": "sha512-oPRMS/XUWcdZXMj6Zhs65mgOVyRZajAhHLm18o6cPLOGUD0770oMqi8ZNKj7LuvubkyP/NL0m4AEcWwvmz/Cbw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.1.3.tgz", + "integrity": "sha512-QkcFeYd79oIl7PgSqFSZyvwXnZQhXmdCI733n54IN2+iXDcf7W0mwptxoC/cE19RkEwAwEFLG81UAy6L/BXI6A==", "dev": true, "requires": { - "@cspell/cspell-service-bus": "8.1.0" + "@cspell/cspell-service-bus": "8.1.3" } }, "cspell-lib": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.1.0.tgz", - "integrity": "sha512-tatdY9teElqqPtKHAY1osOhV68h/f3x+4Niw7rV12OXmJ9El1lPka59bVTV401fODWRoF3WWJXUpTg012zhdrQ==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.1.3.tgz", + "integrity": "sha512-Kk8bpHVkDZO4MEiPkDvRf/LgJ0h5mufbKLTWModq6k0Ca8EkZ/qgQlZ0ve0rIivbleSqebuWjpJHKDM+IHmzHA==", "dev": true, "requires": { - "@cspell/cspell-bundled-dicts": "8.1.0", - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-resolver": "8.1.0", - "@cspell/cspell-types": "8.1.0", - "@cspell/dynamic-import": "8.1.0", - "@cspell/strong-weak-map": "8.1.0", + "@cspell/cspell-bundled-dicts": "8.1.3", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-resolver": "8.1.3", + "@cspell/cspell-types": "8.1.3", + "@cspell/dynamic-import": "8.1.3", + "@cspell/strong-weak-map": "8.1.3", "clear-module": "^4.1.2", "comment-json": "^4.2.3", "configstore": "^6.0.0", - "cspell-config-lib": "8.1.0", - "cspell-dictionary": "8.1.0", - "cspell-glob": "8.1.0", - "cspell-grammar": "8.1.0", - "cspell-io": "8.1.0", - "cspell-trie-lib": "8.1.0", + "cspell-config-lib": "8.1.3", + "cspell-dictionary": "8.1.3", + "cspell-glob": "8.1.3", + "cspell-grammar": "8.1.3", + "cspell-io": "8.1.3", + "cspell-trie-lib": "8.1.3", "fast-equals": "^5.0.1", "gensequence": "^6.0.0", "import-fresh": "^3.3.0", @@ -15503,13 +15503,13 @@ } }, "cspell-trie-lib": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.1.0.tgz", - "integrity": "sha512-OF5ZNuGPIGg2CCMdMeAgd1I2iVDjoelpMjVDyqpuNu+RVpAkmNRqMFDBlsnJPWCCeOLn7blWPMBZW2KXctsm3Q==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.1.3.tgz", + "integrity": "sha512-EDSYU9MCtzPSJDrfvDrTKmc0rzl50Ehjg1c5rUCqn33p2LCRe/G8hW0FxXe0mxrZxrMO2b8l0PVSGlrCXCQ8RQ==", "dev": true, "requires": { - "@cspell/cspell-pipe": "8.1.0", - "@cspell/cspell-types": "8.1.0", + "@cspell/cspell-pipe": "8.1.3", + "@cspell/cspell-types": "8.1.3", "gensequence": "^6.0.0" } }, @@ -19827,9 +19827,9 @@ } }, "typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true }, "uc.micro": { diff --git a/package.json b/package.json index 3ab02c513..00386cd22 100644 --- a/package.json +++ b/package.json @@ -132,12 +132,12 @@ "@types/debug": "4.1.12", "@types/express": "4.17.21", "@types/express-session": "1.17.10", - "@types/jest": "29.5.10", + "@types/jest": "29.5.11", "@types/lodash": "4.14.202", - "@types/luxon": "3.3.6", + "@types/luxon": "3.3.7", "@types/memory-cache": "0.2.5", "@types/morgan": "1.9.9", - "@types/node": "20.10.3", + "@types/node": "20.10.4", "@types/node-jose": "1.1.13", "@types/object-path": "0.11.4", "@types/passport": "1.0.16", @@ -149,9 +149,9 @@ "@types/semver": "7.5.6", "@types/simple-oauth2": "5.0.7", "@types/validator": "13.11.7", - "@typescript-eslint/eslint-plugin": "6.13.1", - "@typescript-eslint/parser": "6.13.1", - "cspell": "8.1.0", + "@typescript-eslint/eslint-plugin": "6.13.2", + "@typescript-eslint/parser": "6.13.2", + "cspell": "8.1.3", "eslint": "8.55.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-n": "16.3.1", @@ -165,7 +165,7 @@ "ts-jest": "29.1.1", "ts-node": "10.9.1", "ts-prune": "0.10.3", - "typescript": "5.3.2" + "typescript": "5.3.3" }, "engines": { "node": ">=18" From 16ef3b6546c6b080e9d014a5daa994520fd2efa7 Mon Sep 17 00:00:00 2001 From: Jeff Wilcox <427913+jeffwilcox@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:46:06 -0800 Subject: [PATCH 69/69] Org annotations update Changing how the JSON API redacts the annotation, plus allowing projection of multiple values in the annotations API. --- api/client/organization/annotations.ts | 8 +++- api/client/organizations.ts | 62 +++++++++++++++++++------- entities/organizationAnnotation.ts | 14 ++---- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/api/client/organization/annotations.ts b/api/client/organization/annotations.ts index c534a86a2..ad9d28758 100644 --- a/api/client/organization/annotations.ts +++ b/api/client/organization/annotations.ts @@ -19,7 +19,7 @@ import { import { IOrganizationAnnotationChange, OrganizationAnnotation, - scrubOrganizationAnnotation, + getOrganizationAnnotationRestrictedPropertyNames, } from '../../../entities/organizationAnnotation'; import { CreateError, ErrorHelper, getProviders } from '../../../transitional'; import { IndividualContext } from '../../../business/user'; @@ -58,10 +58,14 @@ router.get( asyncHandler(async (req: IRequestWithOrganizationAnnotations, res: Response, next: NextFunction) => { const { annotations } = req; // Limited redaction + const annotation = { ...annotations }; const isSystemAdministrator = await getIsCorporateAdministrator(req); + for (const propertyToRedact of getOrganizationAnnotationRestrictedPropertyNames(isSystemAdministrator)) { + delete annotation[propertyToRedact]; + } return res.json({ isSystemAdministrator, - annotations: scrubOrganizationAnnotation(annotations, isSystemAdministrator), + annotations: annotation, }) as unknown as void; }) ); diff --git a/api/client/organizations.ts b/api/client/organizations.ts index bf923d2d2..7a289400f 100644 --- a/api/client/organizations.ts +++ b/api/client/organizations.ts @@ -5,8 +5,9 @@ import { NextFunction, Response, Router } from 'express'; import asyncHandler from 'express-async-handler'; +import throat from 'throat'; -import { jsonError } from '../../middleware'; +import { getIsCorporateAdministrator, jsonError } from '../../middleware'; import { CreateError, getProviders } from '../../transitional'; import { ReposAppRequest } from '../../interfaces'; @@ -16,13 +17,13 @@ import type { GitHubOrganizationResponseSanitized } from '../../business'; import { OrganizationAnnotation, OrganizationAnnotationProperty, - scrubOrganizationAnnotation, + getOrganizationAnnotationRestrictedPropertyNames, } from '../../entities/organizationAnnotation'; import { getOrganizationProfileViaMemoryCache } from '../../middleware/github/ensureOrganizationProfile'; const router: Router = Router(); -type HighlightedOrganization = { +export type OrganizationAnnotationPair = { profile: GitHubOrganizationResponseSanitized; annotations: OrganizationAnnotation; }; @@ -48,48 +49,75 @@ router.get( asyncHandler(async (req: ReposAppRequest, res: Response, next: NextFunction) => { const providers = getProviders(req); const { organizationAnnotationsProvider } = providers; - const projection = typeof req.query.projection === 'string' ? req.query.projection : undefined; + const projectionQuery = typeof req.query.projection === 'string' ? req.query.projection : undefined; + const isSystemAdministrator = await getIsCorporateAdministrator(req); // governance filter: a specific value or unset cohort const governance = typeof req.query.governance === 'string' ? req.query.governance?.toLowerCase() : undefined; const filterByGovernance = governance !== undefined; try { - const highlights: HighlightedOrganization[] = []; + const highlights: OrganizationAnnotationPair[] = []; let annotations = await organizationAnnotationsProvider.getAllAnnotations(); if (filterByGovernance) { annotations = annotations.filter((annotation) => { - const value = annotation.getProperty(OrganizationAnnotationProperty.Governance); + const value = annotation?.getProperty(OrganizationAnnotationProperty.Governance); return governance ? value === governance : !value; }); } - for (const annotation of annotations) { + const getAnnotationProfile = async (annotation: OrganizationAnnotation) => { try { const profile = await getOrganizationProfileViaMemoryCache(providers, annotation.organizationId); highlights.push({ profile, - annotations: scrubOrganizationAnnotation(annotation), + annotations: annotation, }); } catch (error) { // we ignore any individual resolution error } + }; + const projections = projectionQuery?.split(','); + if (projections?.length > 0) { + const propertiesToRedact = getOrganizationAnnotationRestrictedPropertyNames(isSystemAdministrator); + if (projections.some((p) => propertiesToRedact.includes(p))) { + throw CreateError.InvalidParameters( + `One or more of the requested projections are not authorized for the current user` + ); + } } - if (projection) { + const parallelRequests = 6; + const throttle = throat(parallelRequests); + await Promise.all(annotations.map((annotation) => throttle(() => getAnnotationProfile(annotation)))); + if (projectionQuery) { + if (projections.length > 1 && !projections.includes('login')) { + throw CreateError.InvalidParameters('When using multiple projections, login must be included'); + } let projected = highlights.map((highlight) => { const profile = highlight.profile; const annotations = highlight.annotations; - if (profile[projection]) { - return profile[projection]; - } else if (annotations.getProperty(projection)) { - return annotations.getProperty(projection); - } else if (annotations.hasFeature(projection)) { - return true; + const result = {}; + for (const p of projections) { + let value = null; + if (profile[p]) { + value = result[p] = profile[p]; + } else if (annotations?.getProperty(p)) { + value = result[p] = annotations.getProperty(p); + } else if (annotations?.hasFeature(p)) { + value = result[p] = true; + } + if (projections.length === 1) { + return value; + } } - return null; + return result; }); - if (projected.length >= 1 && typeof projected[0] === 'string') { + if (projections.length === 1 && projected.length >= 1 && typeof projected[0] === 'string') { projected = projected.sort((a, b) => { return a.localeCompare(b); }); + } else if (projections.length > 1) { + projected = projected.sort((a, b) => { + return a['login'].localeCompare(b['login']); + }); } return res.json(projected) as unknown as void; } diff --git a/entities/organizationAnnotation.ts b/entities/organizationAnnotation.ts index c373ecc33..c2e08fcfa 100644 --- a/entities/organizationAnnotation.ts +++ b/entities/organizationAnnotation.ts @@ -55,17 +55,9 @@ export interface IOrganizationAnnotationChange { text: string; } -export function scrubOrganizationAnnotation( - annotation: OrganizationAnnotation, - isSystemAdministrator?: boolean -): OrganizationAnnotation { - if (isSystemAdministrator === true || !annotation) { - return annotation; - } - const scrubbedAnnotations = { ...annotation }; - delete scrubbedAnnotations.administratorNotes; - delete scrubbedAnnotations.history; - return scrubbedAnnotations as OrganizationAnnotation; +export function getOrganizationAnnotationRestrictedPropertyNames(isSystemAdministrator?: boolean): string[] { + const restrictedProperties = ['administratorNodes', 'history']; + return isSystemAdministrator ? [] : restrictedProperties; } interface IOrganizationAnnotationMetadataProperties {