diff --git a/server/@types/env.d.ts b/server/@types/env.d.ts index f749e6c2..baf0c780 100644 --- a/server/@types/env.d.ts +++ b/server/@types/env.d.ts @@ -5,38 +5,36 @@ declare namespace NodeJS { } interface ProcessEnv { /** node environment */ - SERVER_URL?: string; + SERVER_URL: string; SERVER_PORT: string; CLIENT: string; - CLIENT_ADMIN: string; DB_URL: string; + REDIS_URL: string; + SESSION_KEY: string; + + CRYPTO_KEY: string; + CRYPTO_SALT: string; + CRYPTO_ALGORITHM: string; + GOOGLE_CLIENT_ID: string; GOOGLE_CLIENT_SECRET: string; NAVER_CLIENT_ID: string; NAVER_CLIENT_SECRET: string; KAKAO_CLIENT_ID: string; - SALT_ROUNDS: string; - SESSION_KEY: string; - NODEMAILER_USER: string; NODEMAILER_PASS: string; - REDIS_URL: string; - - CRYPTO_KEY: string; - CRYPTO_SALT: string; - CRYPTO_ALGORITHM: string; - - S3_ACESSKEYID: string; - S3_SECRETACCESSKEY: string; - S3_BUCKET_LOGS: string; - PORTONE_IMP_KEY: string; PORTONE_IMP_SECRET: string; + PORTONE_IMP_IP_LIST: string; + PORTONE_IMP_IP_SEP: string; GOOGLE_CREDENTIALS_CLIENT_EMAIL: string; + GOOGLE_CREDENTIALS_PRIVATE_KEY_NEWLINE_SEP: string; GOOGLE_CREDENTIALS_PRIVATE_KEY: string; + + APPLE_SHARED_SECRET: string; } } diff --git a/server/package.json b/server/package.json index 90e1e483..46e67ffb 100644 --- a/server/package.json +++ b/server/package.json @@ -4,6 +4,8 @@ "description": "", "main": "src/app.ts", "scripts": { + "local": "cross-env NODE_ENV=local npm run build:live", + "dev:new": "cross-env NODE_ENV=develop node -r ./tsconfig-paths-bootstrap.js dist/src/app.js", "dev": "cross-env NODE_ENV=development npm run build:live", "prod": "cross-env NODE_ENV=production node -r ./tsconfig-paths-bootstrap.js dist/src/app.js", "build": "tsc -p . && npm run build:copy-files", @@ -15,10 +17,12 @@ "license": "ISC", "dependencies": { "@types/axios": "^0.14.0", + "@types/cookie-signature": "^1.1.2", "@types/passport-google-oauth20": "^2.0.11", "axios": "^1.4.0", "connect-redis": "^6.1.3", "cookie-parser": "^1.4.6", + "cookie-signature": "^1.2.1", "cors": "^2.8.5", "cross-env": "^7.0.3", "dayjs": "^1.11.11", diff --git a/server/src/api/controllers/auth.ts b/server/src/api/controllers/auth.ts index e652228c..42e3af76 100644 --- a/server/src/api/controllers/auth.ts +++ b/server/src/api/controllers/auth.ts @@ -21,11 +21,22 @@ import { SnsIdNotFoundError } from "src/errors/NotFoundError"; import { AtLeastOneSnsIdIsRequiredError } from "src/errors/ConfilicError"; import { FieldInvalidError } from "src/errors/InvalidError"; import { convertToUser } from "src/types/user"; +import cookieSignature from "cookie-signature"; +import config from "src/config"; + const AuthService = UserService.AuthService; const clientRedirectURL = process.env.CLIENT.trim() + "/redirect/auth"; -const clientAdminURL = process.env.CLIENT_ADMIN.trim(); +// const clientAdminURL = process.env.CLIENT_ADMIN.trim(); + +function logSignedSID(sid: string) { + if (config.stage === "develop") { + const signedSID = "s:" + cookieSignature.sign(sid, config.SESSION_KEY); + + console.info(`๐Ÿ”‘ connect.sid: ${signedSID}`); + } +} export const find = async (req: Request, res: Response) => { const user = req.user!; @@ -38,28 +49,28 @@ export const find = async (req: Request, res: Response) => { }); }; -export const callbackAdmin = async ( - req: Request, - res: Response, - next: NextFunction -) => { - passport.authenticate( - "googleAdmin", - async (authError: Error, user: Express.User) => { - try { - if (authError) throw authError; - return req.login(user, (loginError) => { - if (loginError) throw loginError; - return res.redirect(clientAdminURL + "/login/redirect"); - }); - } catch (err: any) { - return res.redirect( - clientAdminURL + "?error=" + encodeURIComponent(err.message) - ); - } - } - )(req, res, next); -}; +// export const callbackAdmin = async ( +// req: Request, +// res: Response, +// next: NextFunction +// ) => { +// passport.authenticate( +// "googleAdmin", +// async (authError: Error, user: Express.User) => { +// try { +// if (authError) throw authError; +// return req.login(user, (loginError) => { +// if (loginError) throw loginError; +// return res.redirect(clientAdminURL + "/login/redirect"); +// }); +// } catch (err: any) { +// return res.redirect( +// clientAdminURL + "?error=" + encodeURIComponent(err.message) +// ); +// } +// } +// )(req, res, next); +// }; export const callback = async ( req: Request, @@ -93,9 +104,9 @@ export const callback = async ( /* _____ ์†Œ์…œ ๋กœ๊ทธ์ธ _____ */ if (type === "login") { return req.login(user, (loginError) => { - if (loginError) { - throw loginError; - } + if (loginError) throw loginError; + logSignedSID(req.sessionID); + // ๋กœ๊ทธ์ธ ์„ฑ๊ณต req.session.cookie["maxAge"] = 365 * 24 * 60 * 60 * 1000; //1 year return res.redirect( @@ -106,9 +117,9 @@ export const callback = async ( } else if (type === "register") { /* _____ ์†Œ์…œ ํšŒ์› ๊ฐ€์ž… _____ */ return req.login(user, (loginError) => { - if (loginError) { - throw loginError; - } + if (loginError) throw loginError; + logSignedSID(req.sessionID); + // ํšŒ์› ๊ฐ€์ž… ํ›„ ๋กœ๊ทธ์ธ ์„ฑ๊ณต req.session.cookie["maxAge"] = 365 * 24 * 60 * 60 * 1000; //1 year return res.redirect( @@ -171,6 +182,8 @@ export const local = async ( if ((type === "loginVerify" || type === "registerVerify") && user) { return req.login(user, (loginError) => { if (loginError) throw loginError; + logSignedSID(req.sessionID); + /* set maxAge as 1 year if auto login is requested */ if (req.body.persist === true) { req.session.cookie["maxAge"] = 365 * 24 * 60 * 60 * 1000; //1 year @@ -214,6 +227,8 @@ export const guest = async ( return req.login(user, (loginError) => { if (loginError) throw loginError; + logSignedSID(req.sessionID); + /* set maxAge as 1 year if auto login is requested */ if (req.body.persist === true) { req.session.cookie["maxAge"] = 365 * 24 * 60 * 60 * 1000; //1 year diff --git a/server/src/api/middleware/auth.ts b/server/src/api/middleware/auth.ts index 0be42e19..8148f2f1 100644 --- a/server/src/api/middleware/auth.ts +++ b/server/src/api/middleware/auth.ts @@ -4,6 +4,7 @@ import { NOT_LOGGED_IN, NOT_PERMITTED, } from "src/api/message"; +import { API_KEY_COOKIE, API_KEYS } from "src/loaders/express"; export const isLoggedIn = (req: Request, res: Response, next: NextFunction) => { if (req.isAuthenticated()) { @@ -65,3 +66,29 @@ export const isPortOneWebHook = ( res.status(400).send({ message: NOT_LOGGED_IN }); } }; + +export function validateAPIKey( + req: Request, + res: Response, + next: NextFunction +) { + if (req.url === "/api/develop/generate-api-key") { + return next(); + } + + if (!(API_KEY_COOKIE in req.cookies)) { + return res.status(400).send({ + code: "API_KEY_REQUIRED", + message: "API key is required", + }); + } + + if (!API_KEYS.has(req.cookies[API_KEY_COOKIE])) { + return res.status(400).send({ + code: "API_KEY_INVALID", + message: "API key is invalid or expired", + }); + } + + return next(); +} diff --git a/server/src/api/routes/auth.ts b/server/src/api/routes/auth.ts index 8e5c8005..f5fea4e8 100644 --- a/server/src/api/routes/auth.ts +++ b/server/src/api/routes/auth.ts @@ -7,14 +7,14 @@ import { wrapAsync } from "../middleware/error"; router.get("/", isLoggedIn, auth.find); -router.get( - "/google/admin", - isNotLoggedIn, - passport.authenticate("googleAdmin", { - scope: ["profile"], - }) -); -router.get("/google/admin/callback", auth.callbackAdmin); +// router.get( +// "/google/admin", +// isNotLoggedIn, +// passport.authenticate("googleAdmin", { +// scope: ["profile"], +// }) +// ); +// router.get("/google/admin/callback", auth.callbackAdmin); router.get( "/google", diff --git a/server/src/api/routes/develop.controller.ts b/server/src/api/routes/develop.controller.ts new file mode 100644 index 00000000..92c87693 --- /dev/null +++ b/server/src/api/routes/develop.controller.ts @@ -0,0 +1,25 @@ +import express, { Request, Response } from "express"; +import { API_KEYS } from "src/loaders/express"; +import { randomKey } from "src/utils/crypto"; +const router = express.Router(); + +router.get("/generate-api-key", (req: Request, res: Response) => { + const key = randomKey(32); + + if (API_KEYS.size >= 10) { + API_KEYS.clear(); + } + + API_KEYS.add(key); + + console.info(`๐Ÿ”‘ API Key is generated(${API_KEYS.size}/10): ${key}`); + + const maskedKey = key.slice(0, 4) + "*".repeat(28); + + return res.status(200).send({ + code: "API_KEY_GENERATED", + message: `API key is generated(${maskedKey}); Please check log`, + }); +}); + +export default router; diff --git a/server/src/api/routes/index.ts b/server/src/api/routes/index.ts index 8db9e1a7..9f97f8ee 100644 --- a/server/src/api/routes/index.ts +++ b/server/src/api/routes/index.ts @@ -14,6 +14,7 @@ import agreements from "./agreements"; import test from "./test"; import backups from "./backup.controller"; import migrationRouter from "./migration.router"; +import developRouter from "./develop.controller"; export default [ { label: "users", routes: users }, @@ -32,4 +33,5 @@ export default [ { label: "test", routes: test }, { label: "backups", routes: backups }, { label: "migrations", routes: migrationRouter }, + { label: "develop", routes: developRouter }, ]; diff --git a/server/src/config/index.ts b/server/src/config/index.ts index 831e474a..15f818a0 100644 --- a/server/src/config/index.ts +++ b/server/src/config/index.ts @@ -1,17 +1,26 @@ import * as dotenv from "dotenv"; import { resolve } from "path"; import { exit } from "src/utils/process"; -import { configType } from "./type"; +import { Stage, configType } from "./type"; -const isEnvValid = () => process.env.SERVER_PORT; - -const setup = () => { +function setEnv(): Stage { const mode = process.env.NODE_ENV?.trim(); switch (mode) { + case "local": { + dotenv.config({ path: resolve(__dirname, `../../.env.local`) }); + break; + } + + case "develop": { + dotenv.config(); + break; + } + + /** @deprecated */ case "development": { dotenv.config({ path: resolve(__dirname, `../../.env.development`) }); - break; + return mode as Stage; } case "production": { @@ -23,84 +32,67 @@ const setup = () => { exit(`Invalid NODE_ENV: ${process.env.NODE_ENV}`); } - if (!isEnvValid()) { - exit(`env file or env.SERVER_PORT is missing`); - } - - return mode; -}; + dotenv.config({ path: resolve(__dirname, `../../.env.shared`) }); -const mode = setup(); -console.log(`โœ… ENV is set; NODE_ENV=${mode}`); + return mode as Stage; +} -const config: configType = { - NODE_ENV: process.env.NODE_ENV?.trim() ?? "", - allowList: [ - ...(process.env.ALLOW_LIST?.split(";") ?? []), - process.env.CLIENT.trim(), - process.env.CLIENT_ADMIN.trim(), - "52.78.100.19", - "52.78.48.223", - "52.78.5.241", - ], - SERVER_PORT: process.env.SERVER_PORT.trim(), - DB_URL: process.env.DB_URL.trim(), - REDIS_URL: process.env.REDIS_URL.trim(), - OAUTH_CLIENT: { - GOOGLE: { - ID: process.env.GOOGLE_CLIENT_ID.trim(), - SECRET: process.env.GOOGLE_CLIENT_SECRET.trim(), - callbackURL: - (process.env.SERVER_URL?.trim() ?? "") + "/api/auth/google/callback", - }, - GOOGLE_ADMIN: { - ID: process.env.GOOGLE_CLIENT_ID.trim(), - SECRET: process.env.GOOGLE_CLIENT_SECRET.trim(), - callbackURL: - (process.env.SERVER_URL?.trim() ?? "") + - "/api/auth/google/admin/callback", +function getConfig(stage: Stage): configType { + return { + stage, + allowList: [ + process.env.CLIENT.trim(), + ...process.env.PORTONE_IMP_IP_LIST.split( + process.env.PORTONE_IMP_IP_SEP + ).map((ip) => ip.trim()), + ], + SERVER_PORT: process.env.SERVER_PORT.trim(), + DB_URL: process.env.DB_URL.trim(), + REDIS_URL: process.env.REDIS_URL.trim(), + CRYPTO: { + KEY: process.env.CRYPTO_KEY.trim(), + SALT: process.env.CRYPTO_SALT.trim(), + ALGORITHM: process.env.CRYPTO_ALGORITHM.trim(), }, - NAVER: { - ID: process.env.NAVER_CLIENT_ID.trim(), - SECRET: process.env.NAVER_CLIENT_SECRET.trim(), - callbackURL: "/api/auth/naver/callback", + OAUTH_CLIENT: { + GOOGLE: { + ID: process.env.GOOGLE_CLIENT_ID.trim(), + SECRET: process.env.GOOGLE_CLIENT_SECRET.trim(), + callbackURL: + (process.env.SERVER_URL?.trim() ?? "") + "/api/auth/google/callback", + }, + GOOGLE_ADMIN: { + ID: process.env.GOOGLE_CLIENT_ID.trim(), + SECRET: process.env.GOOGLE_CLIENT_SECRET.trim(), + callbackURL: + (process.env.SERVER_URL?.trim() ?? "") + + "/api/auth/google/admin/callback", + }, + NAVER: { + ID: process.env.NAVER_CLIENT_ID.trim(), + SECRET: process.env.NAVER_CLIENT_SECRET.trim(), + callbackURL: "/api/auth/naver/callback", + }, + KAKAO: { + ID: process.env.KAKAO_CLIENT_ID.trim(), + callbackURL: "/api/auth/kakao/callback", + }, }, - KAKAO: { - ID: process.env.KAKAO_CLIENT_ID.trim(), - callbackURL: "/api/auth/kakao/callback", + SESSION_KEY: process.env.SESSION_KEY.trim(), + GOOGLE_CREDENTIALS: { + client_email: process.env.GOOGLE_CREDENTIALS_CLIENT_EMAIL, + private_key: process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY.split( + process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY_NEWLINE_SEP + ).join("\n"), }, - }, - GOOGLE_CREDENTIALS: (() => { - if ( - !process.env.GOOGLE_CREDENTIALS_CLIENT_EMAIL || - !process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY - ) { - throw new Error("CONFIG ERROR: Google Credentials missing"); - } + APPLE_SHARED_SECRET: process.env.APPLE_SHARED_SECRET ?? "", + }; +} - if (mode === "production") { - if (!process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY_NEWLINE_SEP) { - throw new Error( - "CONFIG ERROR: Google Credentials newline seperator missing" - ); - } - - return { - client_email: process.env.GOOGLE_CREDENTIALS_CLIENT_EMAIL, - private_key: process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY.split( - process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY_NEWLINE_SEP - ).join("\n"), - }; - } - - return { - client_email: process.env.GOOGLE_CREDENTIALS_CLIENT_EMAIL, - private_key: process.env.GOOGLE_CREDENTIALS_PRIVATE_KEY, - }; - })(), - APPLE_SHARED_SECRET: process.env.APPLE_SHARED_SECRET ?? "", -}; +const stage = setEnv(); +console.log(`โœ… ENV is set; Stage is ${stage}`); -console.log(`โœ… config is set; `, config); +const config = getConfig(stage); +console.log("โœ… Config is set"); export default config; diff --git a/server/src/config/type.ts b/server/src/config/type.ts index c0cb7fbd..31bd5452 100644 --- a/server/src/config/type.ts +++ b/server/src/config/type.ts @@ -1,7 +1,10 @@ import { JWTInput } from "google-auth-library"; -type configType = { - NODE_ENV: string; +export type Stage = "local" | "develop" | "development" | "production"; + +// TODO: rename as Config +export type configType = { + stage: Stage; allowList: string[]; SERVER_PORT: string; @@ -34,6 +37,15 @@ type configType = { GOOGLE_CREDENTIALS: Pick; APPLE_SHARED_SECRET: string; + + CRYPTO: { + KEY: string; + SALT: string; + ALGORITHM: string; + }; + + SESSION_KEY: string; + // SERVER_URL: string; // CLIENT: string; @@ -46,15 +58,10 @@ type configType = { // KAKAO_CLIENT_ID: string; // SALT_ROUNDS: string; - // SESSION_KEY: string; // NODEMAILER_USER: string; // NODEMAILER_PASS: string; - // CRYPTO_KEY: string; - // CRYPTO_SALT: string; - // CRYPTO_ALGORITHM: string; - // S3_ACESSKEYID: string; // S3_SECRETACCESSKEY: string; // S3_BUCKET_LOGS: string; @@ -62,5 +69,3 @@ type configType = { // PORTONE_IMP_KEY: string; // PORTONE_IMP_SECRET: string; }; - -export type { configType }; diff --git a/server/src/loaders/express.ts b/server/src/loaders/express.ts index 04b80c32..60321d51 100644 --- a/server/src/loaders/express.ts +++ b/server/src/loaders/express.ts @@ -14,6 +14,7 @@ import { client as redisClient } from "./redis"; import { logger } from "src/api/middleware/loggers"; import routers from "src/api/routes"; import { configType } from "src/config/type"; +import { validateAPIKey } from "src/api/middleware/auth"; const setupDefault = (app: Express) => { app.use(express.json()); @@ -21,25 +22,49 @@ const setupDefault = (app: Express) => { app.use(cookieParser()); }; -const setupCors = (app: Express, allowList: string[]) => { - app.use( - cors({ - origin: allowList, - credentials: true, - }) - ); +export const API_KEYS = new Set(); +export const API_KEY_COOKIE = "during-api-key"; + +const setupCors = (app: Express, config: configType) => { + if (config.stage === "develop") { + app.use( + cors((req, callback) => { + const corsOptions = { + origin: req.header("Origin"), // ์š”์ฒญ์˜ Origin์„ ํ—ˆ์šฉ + credentials: true, // ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๋ฅผ ํ—ˆ์šฉ + }; + callback(null, corsOptions); // CORS ์„ค์ •์„ ๋™์ ์œผ๋กœ ์ ์šฉ + }) + ); + + app.use(validateAPIKey); + } else { + app.use( + cors({ + origin: config.allowList, + credentials: true, + }) + ); + } }; -const setupSession = async (app: Express) => { +const setupSession = async (app: Express, config: configType) => { + const cookieOptions: session.CookieOptions = { + httpOnly: true, // ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค๊ฐ’์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š”๋‹ค. + secure: false, // HTTPS ํ†ต์‹  ์™ธ์—์„œ๋Š” ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. + }; + + if (config.stage === "develop") { + cookieOptions.secure = true; + cookieOptions.sameSite = "none"; + } + app.use( session({ resave: false, // req๋งˆ๋‹ค session ์ƒˆ๋กœ ์ €์žฅ saveUninitialized: false, // uninitialized session์„ ์ €์žฅํ•จ. false์ธ ๊ฒƒ์ด ๋ฆฌ์†Œ์Šค ํ™œ์šฉ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•˜์ง€๋งŒ rolling์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด true๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. - secret: process.env.SESSION_KEY.trim(), - cookie: { - httpOnly: true, // ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค๊ฐ’์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š”๋‹ค. - secure: false, // HTTPS ํ†ต์‹  ์™ธ์—์„œ๋Š” ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. - }, + secret: config.SESSION_KEY, + cookie: cookieOptions, rolling: true, store: new RedisStore({ client: redisClient as unknown as connectRedis.Client, @@ -103,8 +128,8 @@ const setupErrorHandler = (app: Express) => { export default async (app: Express, config: configType) => { setupDefault(app); - setupCors(app, config.allowList); - setupSession(app); + setupCors(app, config); + setupSession(app, config); setupLogger(app); setupRoutes(app); setupErrorHandler(app); diff --git a/server/src/utils/crypto.ts b/server/src/utils/crypto.ts index f6247a37..db53803a 100644 --- a/server/src/utils/crypto.ts +++ b/server/src/utils/crypto.ts @@ -1,12 +1,9 @@ // ์–‘๋ฐฉํ–ฅ ์•”ํ˜ธํ™” & ๋ณตํ˜ธํ™” import crypto from "crypto"; +import config from "src/config"; -const key = crypto.scryptSync( - process.env.CRYPTO_KEY, - process.env.CRYPTO_SALT, - 32 -); -const algorithm = process.env.CRYPTO_ALGORITHM; +const key = crypto.scryptSync(config.CRYPTO.KEY, config.CRYPTO.SALT, 32); +const algorithm = config.CRYPTO.ALGORITHM; const iv = crypto.randomBytes(16); // ์•”ํ˜ธํ™” ๋ฉ”์„œ๋“œ @@ -24,3 +21,7 @@ export const decipher = (text: string) => { result += deciper.final("utf8"); return result; }; + +export function randomKey(length: number) { + return crypto.randomBytes(length).toString("hex"); +} diff --git a/server/yarn.lock b/server/yarn.lock index 56cfaac8..9eb23ebe 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -31,7 +31,7 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-crypto/sha256-js@^3.0.0", "@aws-crypto/sha256-js@3.0.0": +"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz" integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== @@ -594,7 +594,7 @@ "@aws-sdk/types" "3.292.0" tslib "^2.3.1" -"@aws-sdk/types@^3.222.0", "@aws-sdk/types@3.292.0": +"@aws-sdk/types@3.292.0", "@aws-sdk/types@^3.222.0": version "3.292.0" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.292.0.tgz" integrity sha512-1teYAY2M73UXZxMAxqZxVS2qwXjQh0OWtt7qyLfha0TtIk/fZ1hRwFgxbDCHUFcdNBSOSbKH/ESor90KROXLCQ== @@ -758,7 +758,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz" integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.22.1", "@babel/core@^7.4.0-0", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.22.1": version "7.22.1" resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz" integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== @@ -1955,7 +1955,7 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.0.0", "@jest/types@^29.5.0": +"@jest/types@^29.5.0": version "29.5.0" resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz" integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== @@ -1986,16 +1986,16 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -2009,7 +2009,7 @@ resolved "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz" integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg== -"@redis/client@^1.0.0", "@redis/client@1.5.6": +"@redis/client@1.5.6": version "1.5.6" resolved "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz" integrity sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA== @@ -2129,6 +2129,13 @@ dependencies: "@types/express" "*" +"@types/cookie-signature@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/cookie-signature/-/cookie-signature-1.1.2.tgz#a975af3d4ea0b86d39d2dc5e46f4bae605ea1204" + integrity sha512-2OhrZV2LVnUAXklUFwuYUTokalh/dUb8rqt70OW6ByMSxYpauPZ+kfNLknX3aJyjY5iu8i3cUyoLZP9Fn37tTg== + dependencies: + "@types/node" "*" + "@types/cookiejar@*": version "2.1.2" resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" @@ -2385,13 +2392,6 @@ accepts@^1.3.7, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -agent-base@^7.0.2: - version "7.1.1" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -2399,6 +2399,13 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.0.2: + version "7.1.1" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + dependencies: + debug "^4.3.4" + ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" @@ -2418,14 +2425,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2517,7 +2517,7 @@ axios@*, axios@^1.4.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -babel-jest@^29.0.0, babel-jest@^29.5.0: +babel-jest@^29.5.0: version "29.5.0" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz" integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== @@ -2683,7 +2683,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.21.3, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2724,14 +2724,6 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - buffer@4.9.2: version "4.9.2" resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" @@ -2741,6 +2733,14 @@ buffer@4.9.2: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bytes@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" @@ -2783,15 +2783,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.2: +chalk@^4.0.0, chalk@^4.0.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2823,7 +2815,7 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -cluster-key-slot@^1.1.0, cluster-key-slot@1.1.2: +cluster-key-slot@1.1.2, cluster-key-slot@^1.1.0: version "1.1.2" resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz" integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== @@ -2852,7 +2844,7 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@1.1.3: +color-name@1.1.3, color-name@^1.0.0: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== @@ -2908,7 +2900,7 @@ connect-redis@^6.1.3: resolved "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz" integrity sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw== -content-disposition@^0.5.3, content-disposition@0.5.4: +content-disposition@0.5.4, content-disposition@^0.5.3: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -2943,6 +2935,11 @@ cookie-signature@1.0.6: resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.1.tgz#790dea2cce64638c7ae04d9fabed193bd7ccf3b4" + integrity sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw== + cookie@0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" @@ -2999,13 +2996,6 @@ dayjs@^1.11.11: resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz" integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== -debug@^4.1.0, debug@^4.1.1, debug@^4.3.4, debug@4, debug@4.x: - 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" - debug@2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -3013,6 +3003,13 @@ debug@2.6.9: dependencies: ms "2.0.0" +debug@4, debug@4.x, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: + 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" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" @@ -3033,16 +3030,16 @@ denque@^2.1.0: resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz" integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@^1.1.0: version "1.1.2" resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -depd@~2.0.0, depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -3071,7 +3068,7 @@ dotenv@^16.0.3: resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -ecdsa-sig-formatter@^1.0.11, ecdsa-sig-formatter@1.0.11: +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -3257,7 +3254,7 @@ extend@^3.0.2: resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -3374,7 +3371,7 @@ forwarded@0.2.0: resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fresh@^0.5.2, fresh@0.5.2: +fresh@0.5.2, fresh@^0.5.2: version "0.5.2" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== @@ -3393,6 +3390,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -3501,19 +3503,7 @@ google-auth-library@^8.9.0: jws "^4.0.0" lru-cache "^6.0.0" -google-auth-library@^9.0.0: - version "9.7.0" - resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.7.0.tgz" - integrity sha512-I/AvzBiUXDzLOy4iIZ2W+Zq33W4lcukQv1nl7C8WUA6SQwyQwUwu3waNmWNAvzds//FG8SZ+DnKnW/2k6mQS8A== - dependencies: - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - gaxios "^6.1.1" - gcp-metadata "^6.1.0" - gtoken "^7.0.0" - jws "^4.0.0" - -google-auth-library@^9.7.0: +google-auth-library@^9.0.0, google-auth-library@^9.7.0: version "9.7.0" resolved "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.7.0.tgz" integrity sha512-I/AvzBiUXDzLOy4iIZ2W+Zq33W4lcukQv1nl7C8WUA6SQwyQwUwu3waNmWNAvzds//FG8SZ+DnKnW/2k6mQS8A== @@ -3659,16 +3649,16 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@1.1.13, ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ieee754@^1.1.4, ieee754@1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - import-local@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" @@ -3690,7 +3680,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4059,7 +4049,7 @@ jest-resolve-dependencies@^29.5.0: jest-regex-util "^29.4.3" jest-snapshot "^29.5.0" -jest-resolve@*, jest-resolve@^29.5.0: +jest-resolve@^29.5.0: 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== @@ -4206,7 +4196,7 @@ jest-worker@^29.5.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.0.0, jest@^29.5.0: +jest@^29.5.0: version "29.5.0" resolved "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz" integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== @@ -4404,7 +4394,7 @@ memory-pager@^1.0.2: resolved "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz" integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== -merge-descriptors@^1.0.1, merge-descriptors@1.0.1: +merge-descriptors@1.0.1, merge-descriptors@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== @@ -4439,7 +4429,7 @@ mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: dependencies: mime-db "1.52.0" -mime@^1.3.4, mime@1.6.0: +mime@1.6.0, mime@^1.3.4: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -4546,16 +4536,16 @@ mquery@4.0.3: dependencies: debug "4.x" -ms@^2.1.1, ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -4646,13 +4636,6 @@ object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" @@ -4660,6 +4643,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" @@ -4764,14 +4754,6 @@ passport-naver@^1.0.6: passport-oauth "^1.0.0" underscore "^1.8.3" -passport-oauth@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz" - integrity sha512-4IZNVsZbN1dkBzmEbBqUxDG8oFOIK81jqdksE3HEb/vI3ib3FMjbiZZ6MTtooyYZzmKu0BfovjvT1pdGgIq+4Q== - dependencies: - passport-oauth1 "1.x.x" - passport-oauth2 "1.x.x" - passport-oauth1@1.x.x: version "1.3.0" resolved "https://registry.npmjs.org/passport-oauth1/-/passport-oauth1-1.3.0.tgz" @@ -4781,15 +4763,6 @@ passport-oauth1@1.x.x: passport-strategy "1.x.x" utils-merge "1.x.x" -passport-oauth2@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.1.2.tgz" - integrity sha512-wpsGtJDHHQUjyc9WcV9FFB0bphFExpmKtzkQrxpH1vnSr6RcWa3ZEGHx/zGKAh2PN7Po9TKYB1fJeOiIBspNPA== - dependencies: - oauth "0.9.x" - passport-strategy "1.x.x" - uid2 "0.0.x" - passport-oauth2@1.x.x: version "1.7.0" resolved "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.7.0.tgz" @@ -4801,6 +4774,23 @@ passport-oauth2@1.x.x: uid2 "0.0.x" utils-merge "1.x.x" +passport-oauth2@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.1.2.tgz" + integrity sha512-wpsGtJDHHQUjyc9WcV9FFB0bphFExpmKtzkQrxpH1vnSr6RcWa3ZEGHx/zGKAh2PN7Po9TKYB1fJeOiIBspNPA== + dependencies: + oauth "0.9.x" + passport-strategy "1.x.x" + uid2 "0.0.x" + +passport-oauth@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/passport-oauth/-/passport-oauth-1.0.0.tgz" + integrity sha512-4IZNVsZbN1dkBzmEbBqUxDG8oFOIK81jqdksE3HEb/vI3ib3FMjbiZZ6MTtooyYZzmKu0BfovjvT1pdGgIq+4Q== + dependencies: + passport-oauth1 "1.x.x" + passport-oauth2 "1.x.x" + passport-strategy@1.x.x: version "1.0.0" resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" @@ -4902,22 +4892,22 @@ proxy-from-env@^1.1.0: resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - punycode@1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== +punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + pure-rand@^6.0.0: version "6.0.2" resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz" integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== -qs@^6.11.0, qs@^6.7.0, qs@6.11.0: +qs@6.11.0, qs@^6.11.0, qs@^6.7.0: version "6.11.0" resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -5074,22 +5064,22 @@ s3-streamlogger-daily@^0.6.0: aws-sdk "^2.1.16" strftime "~0.8.2" -safe-buffer@^5.0.1, safe-buffer@~5.2.0, safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-stable-stringify@^2.3.1: version "2.4.3" resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5101,36 +5091,22 @@ saslprep@^1.0.3: dependencies: sparse-bitfield "^3.0.3" -sax@>=0.6.0, sax@1.2.1: +sax@1.2.1, sax@>=0.6.0: version "1.2.1" resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.5: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8: +semver@7.x, semver@^7.3.5, semver@^7.3.8: version "7.3.8" resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" -semver@7.x: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== send@0.18.0: version "0.18.0" @@ -5296,13 +5272,6 @@ strftime@~0.8.2: resolved "https://registry.npmjs.org/strftime/-/strftime-0.8.4.tgz" integrity sha512-J/qiMvSB/S9ojjPnRttLcNgn/BWExgJeB45+/ZspTjVlku9UjrIOCdYEzcCw28nCr1X6zVSl/TGGW6j8rUs6Jg== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" @@ -5320,6 +5289,13 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -5513,7 +5489,7 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^5.0.2, "typescript@>=4.3 <6": +typescript@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz" integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw== @@ -5563,7 +5539,7 @@ universalify@^0.1.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -5605,11 +5581,16 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -utils-merge@^1.0.1, utils-merge@1.0.1, utils-merge@1.x.x: +utils-merge@1.0.1, utils-merge@1.x.x, utils-merge@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz" + integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" @@ -5620,11 +5601,6 @@ uuid@^9.0.0, uuid@^9.0.1: resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uuid@8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz" - integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== - v8-to-istanbul@^9.0.1: version "9.1.0" resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" @@ -5715,7 +5691,7 @@ winston-transport@^4.4.0, winston-transport@^4.5.0: readable-stream "^3.6.0" triple-beam "^1.3.0" -winston@^3, winston@^3.8.2: +winston@^3.8.2: version "3.8.2" resolved "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz" integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== @@ -5746,14 +5722,6 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - write-file-atomic@3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" @@ -5764,6 +5732,14 @@ write-file-atomic@3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + xml2js@0.5.0: version "0.5.0" resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz" @@ -5782,20 +5758,15 @@ y18n@^5.0.5: resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: +yallist@4.0.0, yallist@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yallist@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1"