diff --git a/.github/workflows/ghcr.yml b/.github/workflows/ghcr.yml index 0e366f8a..8c1b061c 100644 --- a/.github/workflows/ghcr.yml +++ b/.github/workflows/ghcr.yml @@ -1,12 +1,12 @@ -name: publish to ghcr +name: Publish to GHCR on: workflow_dispatch: push: branches: - - master + - '**' jobs: push: - name: "Create build and push to GHCR" + name: Create build and push to GHCR runs-on: ubuntu-latest strategy: fail-fast: false @@ -30,12 +30,23 @@ jobs: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} + - id: getversion + uses: Saionaro/extract-package-version@v1.2.1 - uses: docker/build-push-action@v3.2.0 + if: github.ref != 'refs/heads/master' with: context: . file: Dockerfile platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 push: true tags: | - ghcr.io/${{ steps.string.outputs.lowercase }}/g5api:latest - + ghcr.io/${{ steps.string.outputs.lowercase }}/g5api:next + - uses: docker/build-push-action@v3.2.0 + if: github.ref == 'refs/heads/master' + with: + context: . + file: Dockerfile + platforms: linux/amd64,linux/arm/v7,linux/arm64/v8 + push: true + tags: | + ghcr.io/${{ steps.string.outputs.lowercase }}/g5api:latest,ghcr.io/${{ steps.string.outputs.lowercase }}/g5api:${{ steps.getversion.outputs.version }} diff --git a/.gitignore b/.gitignore index 0ac94b45..0dd829ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +dist/ node_modules/ config/production.json* config/development.json* diff --git a/Dockerfile b/Dockerfile index ff0549b3..ff25f51a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,11 +5,9 @@ RUN apk add gettext python3 build-base EXPOSE 3301 # clone and move into Get5API folder WORKDIR /Get5API -COPY package*.json . -COPY yarn.lock . -RUN yarn - COPY . . +RUN yarn +RUN yarn build # set config with env variables, build, and run application CMD envsubst < /Get5API/config/production.json.template > /Get5API/config/production.json && \ diff --git a/README.md b/README.md index 85ead7a7..799fe150 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,18 @@ G5API is an API that will allow users to create, manage, and control Counter-Str This API is complete enough to provide the most functionality out of [get5](https://github.com/splewis/get5). -For the plugin [G5WS](https://github.com/PhlexPlexico/G5WS), the routes currently put into place located in the `./routes/legacy/` and still point to `/match/` on this app. +
+ Note: While available for backwards compatibility, it is recommended you use the latest version of get5, as you will no longer need an additional plugin for enhanced reporting. The only extension needed is SteamWorks. +
+ + +For the plugin [G5WS](https://github.com/PhlexPlexico/G5WS"), the routes currently put into place located in the `./src/routes/legacy/` and still point to `/match/` on this app. +
-Game server interaction will still take place under the `/matches/:match_id` directive, but the logic can be found under `./matches/matchserver.js`. -The webapi plugin for this can be downloaded from [here](https://github.com/PhlexPlexico/G5WS) to include the use of vetoes being recorded, as well as demoes being uploaded to the API server once the match is complete. +If you are using get5 0.14 or later, the G5WS plugin is **not** needed, and should be removed or disabled from your game server to avoid any conflicting actions. The new routes are located in `./src/routes/v2`, and the main logic can be found in their respective services under `./src/services` + +Game server interaction will still take place under the `/matches/:match_id` directive, but the logic can be found under `./matches/matchserver.js`. There is also Challonge integration within the API. If a user provides a tournament ID to create a season, it will auto-fill a season start date, empty teams, and will auto-update the brackets at the end of each match if the match exists under the Season/Tournament. @@ -108,7 +115,7 @@ For more details on these variables, follow along with production.json.template ### Docs: ```yarn doc``` -This will generate all the API information that I've created in the app, in the hopes of making it more readable and easier to pickup for anyone who wants to try more implementation, or even creating a front-end for this API. Swagger Express is also included, which can be accessed from `/api-docs` on application launch. This will house all the API calls, where JSDocs will show all the internal function calls in this application. +This will generate all the API information that I've created in the app, in the hopes of making it more readable and easier to pickup for anyone who wants to try implementing more actions, or even creating a front-end for this API. Swagger Express is also included, which can be accessed from `/api-docs` on application launch. This will house all the API calls, where JSDocs will show all the internal function calls in this application. All TypeScript functions will be shown in the JSDocs. ### Coverage Tests Steam OAuth will be mocked in order to check if a user is "logged in", and create a temporary database (`get5test`) that will insert new values, and check various features of routes. If you wish to alter the "user" it authenticates as, you can edit `utility/mockProfile.js` to the values you prefer. diff --git a/__test__/users.test.js b/__test__/users.test.js index 77d31428..de3077d0 100644 --- a/__test__/users.test.js +++ b/__test__/users.test.js @@ -1,5 +1,5 @@ import { agent } from 'supertest'; -import app from '../app.js'; +import app from '../app.js' const request = agent(app); let adminCheck = 0; diff --git a/app.js b/app.js index 2d4de915..0d358339 100644 --- a/app.js +++ b/app.js @@ -15,21 +15,25 @@ import swaggerJSDoc from "swagger-jsdoc"; import { serve, setup } from "swagger-ui-express"; // Route Files -import indexRouter from "./routes/index.js"; -import leaderboardRouter from "./routes/leaderboard.js"; -import legacyAPICalls from "./routes/legacy/api.js"; -import mapListRouter from "./routes/maps.js"; -import mapstatsRouter from "./routes/mapstats.js"; -import matchesRouter from "./routes/matches/matches.js"; -import matchServerRouter from "./routes/matches/matchserver.js"; -import playerstatsRouter from "./routes/playerstats.js"; -import seasonsRouter from "./routes/seasons.js"; -import serversRouter from "./routes/servers.js"; -import teamsRouter from "./routes/teams.js"; -import usersRouter from "./routes/users.js"; -import vetoesRouter from "./routes/vetoes.js"; -import vetosidesRouter from "./routes/vetosides.js"; -import passport from "./utility/auth.js"; +import indexRouter from "./src/routes/index.js"; +import leaderboardRouter from "./src/routes/leaderboard.js"; +import legacyAPICalls from "./src/routes/legacy/api.js"; +import mapListRouter from "./src/routes/maps.js"; +import mapstatsRouter from "./src/routes/mapstats.js"; +import matchesRouter from "./src/routes/matches/matches.js"; +import matchServerRouter from "./src/routes/matches/matchserver.js"; +import playerstatsRouter from "./src/routes/playerstats/playerstats.js"; +import playerstatsextraRouter from "./src/routes/playerstats/extrastats.js"; +import seasonsRouter from "./src/routes/seasons.js"; +import serversRouter from "./src/routes/servers.js"; +import teamsRouter from "./src/routes/teams.js"; +import usersRouter from "./src/routes/users.js"; +import vetoesRouter from "./src/routes/vetoes.js"; +import vetosidesRouter from "./src/routes/vetosides.js"; +import passport from "./src/utility/auth.js"; +import {router as v2Router} from "./src/routes/v2/api.js"; +import {router as v2DemoRouter} from "./src/routes/v2/demoapi.js"; +import { router as v2BackupRouter } from "./src/routes/v2/backupapi.js"; // End Route Files @@ -112,25 +116,15 @@ const options = { openapi: "3.0.0", // Specification (optional, defaults to swagger: '2.0') info: { title: "G5API", // Title (required) - version: "1.7.0", // Version (required) - }, + version: "2.0.0" // Version (required) + } }, // Path to the API docs apis: [ - "./routes/leaderboard.js", - "./routes/legacy/api.js", - "./routes/matches/matches.js", - "./routes/matches/matchserver.js", - "./routes/maps.js", - "./routes/mapstats.js", - "./routes/playerstats.js", - "./routes/seasons.js", - "./routes/servers.js", - "./routes/teams.js", - "./routes/users.js", - "./routes/vetoes.js", - "./routes/vetosides.js", - ], + "./dist/src/routes/**/*.js", + "./dist/src/services/**/*.js", + "./dist/src/routes/*.js" + ] }; const swaggerSpec = swaggerJSDoc(options); @@ -148,10 +142,14 @@ app.use("/vetosides", vetosidesRouter); app.use("/matches", matchesRouter, matchServerRouter); app.use("/mapstats", mapstatsRouter); app.use("/playerstats", playerstatsRouter); +app.use("/playerstatsextra", playerstatsextraRouter); app.use("/seasons", seasonsRouter); app.use("/match", legacyAPICalls); app.use("/leaderboard", leaderboardRouter); app.use("/maps", mapListRouter); +app.use("/v2", v2Router); +app.use("/v2/demo", v2DemoRouter); +app.use("/v2/backup", v2BackupRouter); // END ROUTES // Steam API Calls. diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..b413e106 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; \ No newline at end of file diff --git a/jest_config/jest.gameservers.config.cjs b/jest_config/jest.gameservers.config.cjs index 5679c507..2df40fcd 100644 --- a/jest_config/jest.gameservers.config.cjs +++ b/jest_config/jest.gameservers.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.maplist.config.cjs b/jest_config/jest.maplist.config.cjs index d638872f..35afc1e5 100644 --- a/jest_config/jest.maplist.config.cjs +++ b/jest_config/jest.maplist.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.mapstats.config.cjs b/jest_config/jest.mapstats.config.cjs index a5f5a4b9..d1cfad8d 100644 --- a/jest_config/jest.mapstats.config.cjs +++ b/jest_config/jest.mapstats.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.matches.config.cjs b/jest_config/jest.matches.config.cjs index d85cfefb..59aec033 100644 --- a/jest_config/jest.matches.config.cjs +++ b/jest_config/jest.matches.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.playerstats.config.cjs b/jest_config/jest.playerstats.config.cjs index fd8b8ce2..23202f0e 100644 --- a/jest_config/jest.playerstats.config.cjs +++ b/jest_config/jest.playerstats.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.seasons.config.cjs b/jest_config/jest.seasons.config.cjs index fd022399..a0787c88 100644 --- a/jest_config/jest.seasons.config.cjs +++ b/jest_config/jest.seasons.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.teams.config.cjs b/jest_config/jest.teams.config.cjs index 166a4478..753173f8 100644 --- a/jest_config/jest.teams.config.cjs +++ b/jest_config/jest.teams.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.users.config.cjs b/jest_config/jest.users.config.cjs index 03438d98..653239e8 100644 --- a/jest_config/jest.users.config.cjs +++ b/jest_config/jest.users.config.cjs @@ -1,7 +1,11 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ // For a detailed explanation regarding each configuration property, visit: // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, @@ -58,7 +62,9 @@ module.exports = { globalTeardown: "./test-teardown-globals.cjs", // A set of global variables that need to be available in all test environments - // globals: {}, + // globals: { + // extensionsToTreatAsEsm: ['.ts', '.js'] + // }, // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. // maxWorkers: "50%", @@ -71,11 +77,14 @@ module.exports = { // An array of file extensions your modules use moduleFileExtensions: [ "js", - "cjs" + "cjs", + "ts" ], // A map from regular expressions to module names that allow to stub out resources with a single module - // moduleNameMapper: {}, + moduleNameMapper: { + + }, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader // modulePathIgnorePatterns: [], @@ -101,8 +110,6 @@ module.exports = { // Reset the module registry before running each individual test // resetModules: false, - // A path to a custom resolver - // resolver: undefined, // Automatically restore mock state between every test // restoreMocks: false, @@ -162,7 +169,11 @@ module.exports = { // timers: "real", // A map from regular expressions to paths to transformers - // transform: undefined, + // transform: {'\\.[jt]sx?$': ['ts-jest', { useESM: true }] }, + // moduleNameMapper: { + // '(.+)\\.js': '$1' + // }, + // extensionsToTreatAsEsm: ['.ts'], // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation // transformIgnorePatterns: [ diff --git a/jest_config/jest.vetoes.config.cjs b/jest_config/jest.vetoes.config.cjs index baa60265..8c02aa0b 100644 --- a/jest_config/jest.vetoes.config.cjs +++ b/jest_config/jest.vetoes.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jest_config/jest.vetosides.config.cjs b/jest_config/jest.vetosides.config.cjs index a053aed6..62dee187 100644 --- a/jest_config/jest.vetosides.config.cjs +++ b/jest_config/jest.vetosides.config.cjs @@ -2,6 +2,9 @@ // https://jestjs.io/docs/en/configuration.html process.env.NODE_ENV = "test"; module.exports = { + preset: 'ts-jest/presets/js-with-ts-esm', + // A path to a custom resolver + resolver: "jest-ts-webcompat-resolver", // All imported modules in your tests should be mocked automatically // automock: false, diff --git a/jsdoc.conf.json b/jsdoc.conf.json index 32086d19..8134a48d 100644 --- a/jsdoc.conf.json +++ b/jsdoc.conf.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc","closure"] }, "source": { - "include": ["routes"], + "include": ["dist/src"], "includePattern": ".+\\.js(doc|x)?$", "excludePattern": "(^|\\/|\\\\)_" }, diff --git a/migrations/20220907171148-get5db.js b/migrations/20220907171148-get5db.js deleted file mode 100644 index 806968b9..00000000 --- a/migrations/20220907171148-get5db.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -var dbm; -var type; -var seed; -var async = require('async'); - -/** - * We receive the dbmigrate dependency from dbmigrate initially. - * This enables us to not have to rely on NODE_PATH. - */ -exports.setup = function(options, seedLink) { - dbm = options.dbmigrate; - type = dbm.dataType; - seed = seedLink; -}; - -exports.up = function(db, callback) { - return db.addColumn('match', 'map_sides', { type: 'string', length: 75, notNull: false }); -}; - -exports.down = function(db, callback) { - return db.removeColumn('match', 'map_sides'); -}; -exports._meta = { - "version": 21 -}; \ No newline at end of file diff --git a/migrations/development/20220908135836-get5db.js b/migrations/development/20220908135836-get5db.js new file mode 100644 index 00000000..8f5035a6 --- /dev/null +++ b/migrations/development/20220908135836-get5db.js @@ -0,0 +1,64 @@ +"use strict"; + +var dbm; +var type; +var seed; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; +}; + +exports.up = function (db) { + return db.runSql( + "CREATE TABLE player_stat_extras (" + + "id int(11) NOT NULL AUTO_INCREMENT," + + "player_steam_id varchar(17) NOT NULL," + + "player_name varchar(75) NOT NULL," + + "player_side varchar(5) NOT NULL," + + "map_id int(11)," + + "match_id int(11)," + + "team_id int(11)," + + "round_number int(11) NOT NULL," + + "round_time int(11) NOT NULL," + + "attacker_steam_id varchar(17) DEFAULT NULL," + + "attacker_name varchar(75) DEFAULT NULL," + + "attacker_side varchar(5) DEFAULT NULL," + + "weapon varchar(15) NOT NULL," + + "bomb tinyint(1) NOT NULL DEFAULT 0," + + "headshot tinyint(1) NOT NULL DEFAULT 0," + + "thru_smoke tinyint(1) NOT NULL DEFAULT 0," + + "attacker_blind tinyint(1) NOT NULL DEFAULT 0," + + "no_scope tinyint(1) NOT NULL DEFAULT 0," + + "suicide tinyint(1) NOT NULL DEFAULT 0," + + "friendly_fire tinyint(1) NOT NULL DEFAULT 0," + + "assister_steam_id varchar(17) DEFAULT NULL," + + "assister_name varchar(75) DEFAULT NULL," + + "assister_side varchar(5) DEFAULT NULL," + + "assist_friendly_fire tinyint(1) NOT NULL DEFAULT 0," + + "flash_assist tinyint(1) NOT NULL DEFAULT 0," + + "PRIMARY KEY (id)," + + "KEY map_id_extras_fk (map_id)," + + "KEY match_id_extras_fk (match_id)," + + "KEY team_id_extras_fk (team_id)," + + "CONSTRAINT map_id_extras_fk FOREIGN KEY (map_id) REFERENCES map_stats (id) ON DELETE SET NULL," + + "CONSTRAINT match_id_extras_fk FOREIGN KEY (match_id) REFERENCES `match` (id) ON DELETE SET NULL," + + "CONSTRAINT team_id_extras_fk FOREIGN KEY (team_id) REFERENCES team (id) ON DELETE SET NULL," + + "INDEX player_steam_id_idx(player_steam_id)," + + "INDEX attacker_steam_id_idx(attacker_steam_id)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" + ); +}; + +exports.down = function (db) { + return db.dropTable("player_stat_extras"); +}; + +exports._meta = { + version: 22 +}; diff --git a/migrations/development/20230615140704-get5db.js b/migrations/development/20230615140704-get5db.js new file mode 100644 index 00000000..d26b210c --- /dev/null +++ b/migrations/development/20230615140704-get5db.js @@ -0,0 +1,76 @@ +"use strict"; + +var dbm; +var type; +var seed; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; +}; + +exports.up = function (db) { + return db.createTable("match_bomb_plants", { + id: { type: "int", primaryKey: true, autoIncrement: true, length: 11 }, + match_id: { + type: "int", + foreignKey: { + name: "match_id_bomb_plants_fk", + table: "match", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + map_id: { + type: "int", + foreignKey: { + name: "map_id_bomb_plants_fk", + table: "map_stats", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + player_stats_id: { + type: "int", + foreignKey: { + name: "player_stats_id_bomb_plants_fk", + table: "player_stats", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + round_number: { type: "int", length: 11, notNull: true }, + round_time: { type: "int", length: 11, notNull: true }, + site: { type: "string", length: 10, notNull: true }, + defused: { type: "boolean", notNull: false }, + bomb_time_remaining: { type: "int", length: 11, notNull: false } + }); +}; + +exports.down = function (db) { + return db.dropTable("match_bomb_plants"); +}; + +exports._meta = { + version: 23 +}; diff --git a/migrations/production/20220908135836-get5db.js b/migrations/production/20220908135836-get5db.js new file mode 100644 index 00000000..8f5035a6 --- /dev/null +++ b/migrations/production/20220908135836-get5db.js @@ -0,0 +1,64 @@ +"use strict"; + +var dbm; +var type; +var seed; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; +}; + +exports.up = function (db) { + return db.runSql( + "CREATE TABLE player_stat_extras (" + + "id int(11) NOT NULL AUTO_INCREMENT," + + "player_steam_id varchar(17) NOT NULL," + + "player_name varchar(75) NOT NULL," + + "player_side varchar(5) NOT NULL," + + "map_id int(11)," + + "match_id int(11)," + + "team_id int(11)," + + "round_number int(11) NOT NULL," + + "round_time int(11) NOT NULL," + + "attacker_steam_id varchar(17) DEFAULT NULL," + + "attacker_name varchar(75) DEFAULT NULL," + + "attacker_side varchar(5) DEFAULT NULL," + + "weapon varchar(15) NOT NULL," + + "bomb tinyint(1) NOT NULL DEFAULT 0," + + "headshot tinyint(1) NOT NULL DEFAULT 0," + + "thru_smoke tinyint(1) NOT NULL DEFAULT 0," + + "attacker_blind tinyint(1) NOT NULL DEFAULT 0," + + "no_scope tinyint(1) NOT NULL DEFAULT 0," + + "suicide tinyint(1) NOT NULL DEFAULT 0," + + "friendly_fire tinyint(1) NOT NULL DEFAULT 0," + + "assister_steam_id varchar(17) DEFAULT NULL," + + "assister_name varchar(75) DEFAULT NULL," + + "assister_side varchar(5) DEFAULT NULL," + + "assist_friendly_fire tinyint(1) NOT NULL DEFAULT 0," + + "flash_assist tinyint(1) NOT NULL DEFAULT 0," + + "PRIMARY KEY (id)," + + "KEY map_id_extras_fk (map_id)," + + "KEY match_id_extras_fk (match_id)," + + "KEY team_id_extras_fk (team_id)," + + "CONSTRAINT map_id_extras_fk FOREIGN KEY (map_id) REFERENCES map_stats (id) ON DELETE SET NULL," + + "CONSTRAINT match_id_extras_fk FOREIGN KEY (match_id) REFERENCES `match` (id) ON DELETE SET NULL," + + "CONSTRAINT team_id_extras_fk FOREIGN KEY (team_id) REFERENCES team (id) ON DELETE SET NULL," + + "INDEX player_steam_id_idx(player_steam_id)," + + "INDEX attacker_steam_id_idx(attacker_steam_id)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" + ); +}; + +exports.down = function (db) { + return db.dropTable("player_stat_extras"); +}; + +exports._meta = { + version: 22 +}; diff --git a/migrations/production/20230615140704-get5db.js b/migrations/production/20230615140704-get5db.js new file mode 100644 index 00000000..93d1abc4 --- /dev/null +++ b/migrations/production/20230615140704-get5db.js @@ -0,0 +1,75 @@ +"use strict"; + +var dbm; +var type; +var seed; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; +}; + +exports.up = function (db) { + return db.createTable("match_bomb_plants", { + id: { type: "int", primaryKey: true, autoIncrement: true, length: 11 }, + match_id: { + type: "int", + foreignKey: { + name: "match_id_bomb_plants_fk", + table: "match", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + map_id: { + type: "int", + foreignKey: { + name: "map_id_bomb_plants_fk", + table: "map_stats", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + player_stats_id: { + type: "int", + foreignKey: { + name: "player_stats_id_bomb_plants_fk", + table: "player_stats", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + round_number: { type: "int", length: 11, notNull: true }, + round_time: { type: "int", length: 11, notNull: true }, + site: { type: "string", length: 10, notNull: true }, + defused: { type: "boolean", notNull: false } + }); +}; + +exports.down = function (db) { + return db.dropTable("match_bomb_plants"); +}; + +exports._meta = { + version: 23 +}; diff --git a/migrations/test/20220908135836-get5db.js b/migrations/test/20220908135836-get5db.js new file mode 100644 index 00000000..8f5035a6 --- /dev/null +++ b/migrations/test/20220908135836-get5db.js @@ -0,0 +1,64 @@ +"use strict"; + +var dbm; +var type; +var seed; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; +}; + +exports.up = function (db) { + return db.runSql( + "CREATE TABLE player_stat_extras (" + + "id int(11) NOT NULL AUTO_INCREMENT," + + "player_steam_id varchar(17) NOT NULL," + + "player_name varchar(75) NOT NULL," + + "player_side varchar(5) NOT NULL," + + "map_id int(11)," + + "match_id int(11)," + + "team_id int(11)," + + "round_number int(11) NOT NULL," + + "round_time int(11) NOT NULL," + + "attacker_steam_id varchar(17) DEFAULT NULL," + + "attacker_name varchar(75) DEFAULT NULL," + + "attacker_side varchar(5) DEFAULT NULL," + + "weapon varchar(15) NOT NULL," + + "bomb tinyint(1) NOT NULL DEFAULT 0," + + "headshot tinyint(1) NOT NULL DEFAULT 0," + + "thru_smoke tinyint(1) NOT NULL DEFAULT 0," + + "attacker_blind tinyint(1) NOT NULL DEFAULT 0," + + "no_scope tinyint(1) NOT NULL DEFAULT 0," + + "suicide tinyint(1) NOT NULL DEFAULT 0," + + "friendly_fire tinyint(1) NOT NULL DEFAULT 0," + + "assister_steam_id varchar(17) DEFAULT NULL," + + "assister_name varchar(75) DEFAULT NULL," + + "assister_side varchar(5) DEFAULT NULL," + + "assist_friendly_fire tinyint(1) NOT NULL DEFAULT 0," + + "flash_assist tinyint(1) NOT NULL DEFAULT 0," + + "PRIMARY KEY (id)," + + "KEY map_id_extras_fk (map_id)," + + "KEY match_id_extras_fk (match_id)," + + "KEY team_id_extras_fk (team_id)," + + "CONSTRAINT map_id_extras_fk FOREIGN KEY (map_id) REFERENCES map_stats (id) ON DELETE SET NULL," + + "CONSTRAINT match_id_extras_fk FOREIGN KEY (match_id) REFERENCES `match` (id) ON DELETE SET NULL," + + "CONSTRAINT team_id_extras_fk FOREIGN KEY (team_id) REFERENCES team (id) ON DELETE SET NULL," + + "INDEX player_steam_id_idx(player_steam_id)," + + "INDEX attacker_steam_id_idx(attacker_steam_id)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" + ); +}; + +exports.down = function (db) { + return db.dropTable("player_stat_extras"); +}; + +exports._meta = { + version: 22 +}; diff --git a/migrations/test/20230615140704-get5db.js b/migrations/test/20230615140704-get5db.js new file mode 100644 index 00000000..93d1abc4 --- /dev/null +++ b/migrations/test/20230615140704-get5db.js @@ -0,0 +1,75 @@ +"use strict"; + +var dbm; +var type; +var seed; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function (options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; +}; + +exports.up = function (db) { + return db.createTable("match_bomb_plants", { + id: { type: "int", primaryKey: true, autoIncrement: true, length: 11 }, + match_id: { + type: "int", + foreignKey: { + name: "match_id_bomb_plants_fk", + table: "match", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + map_id: { + type: "int", + foreignKey: { + name: "map_id_bomb_plants_fk", + table: "map_stats", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + player_stats_id: { + type: "int", + foreignKey: { + name: "player_stats_id_bomb_plants_fk", + table: "player_stats", + rules: { + onDelete: "CASCADE", + onUpdate: "RESTRICT" + }, + mapping: "id" + }, + length: 11, + notNull: false + }, + round_number: { type: "int", length: 11, notNull: true }, + round_time: { type: "int", length: 11, notNull: true }, + site: { type: "string", length: 10, notNull: true }, + defused: { type: "boolean", notNull: false } + }); +}; + +exports.down = function (db) { + return db.dropTable("match_bomb_plants"); +}; + +exports._meta = { + version: 23 +}; diff --git a/package.json b/package.json index ca7e7cf8..652744b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "g5api", - "version": "1.7.0.0", + "version": "2.0.0.0", "private": true, "type": "module", "licenses": [ @@ -29,11 +29,14 @@ "config": "./config" }, "scripts": { - "start": "nodemon ./bin/www.js", + "build": "tsc", + "clean": "rm -rf ./dist", + "start": "tsc-watch --project . --outDir ./dist --onSuccess \"nodemon ./dist/bin/www.js\"", + "tsstart": "yarn build; nodemon ./dist/bin/www.js", "startprod": "pm2 start ./prodrun.json --name \"G5API\"", "restartprod": "pm2 restart G5API", "stopprod": "pm2 stop G5API; pm2 delete G5API", - "doc": "jsdoc -c jsdoc.conf.json", + "doc": "tsc && jsdoc -c jsdoc.conf.json", "docclean": "rm -rf ./docs", "migrate-create-dev": "MYSQL_FLAGS=\"-CONNECT_WITH_DB\" db-migrate --env development --config config/development.json db:create get5dev", "migrate-create-prod": "MYSQL_FLAGS=\"-CONNECT_WITH_DB\" db-migrate --env production --config config/production.json db:create get5", @@ -48,7 +51,7 @@ "migrate-drop-prod": "MYSQL_FLAGS=\"-CONNECT_WITH_DB\" db-migrate --env production --config config/production.json db:drop get5", "migrate-drop-test": "MYSQL_FLAGS=\"-CONNECT_WITH_DB\" db-migrate --env test --config config/test.json db:drop get5test", "prod": "NODE_ENV=production yarn migrate-create-prod && yarn migrate-prod-upgrade", - "test": "NODE_ENV=test && yarn test:setup-user && yarn migrate-drop-test && yarn migrate-create-test && yarn migrate-test-upgrade && yarn test:user && yarn test:gameservers && yarn test:teams && yarn test:matches && yarn test:seasons && yarn test:vetoes && yarn test:mapstats && yarn test:playerstats && yarn test:vetosides && yarn test:maplists", + "test": "yarn build && NODE_ENV=test && yarn test:setup-user && yarn migrate-drop-test && yarn migrate-create-test && yarn migrate-test-upgrade && yarn test:user && yarn test:gameservers && yarn test:teams && yarn test:matches && yarn test:seasons && yarn test:vetoes && yarn test:mapstats && yarn test:playerstats && yarn test:vetosides && yarn test:maplists", "test:gameservers": "yarn test:removeID && NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.gameservers.config.cjs", "test:mapstats": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.mapstats.config.cjs", "test:maplists": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.maplist.config.cjs", @@ -56,7 +59,7 @@ "test:playerstats": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.playerstats.config.cjs", "test:removeID": "sed -i -e 's.\"steam_ids\": \"[0-9][0-9]*\".\"steam_ids\": \"super_admins,go,here\".g' ./config/test.json", "test:seasons": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.seasons.config.cjs", - "test:setup-user": "export STEAMID=`grep -o -m 1 '[0-9][0-9]*' utility/mockProfile.js` && sed -i -e \"s/\\\"super_admins,go,here\\\"/\\\"$STEAMID\\\"/g\" config/test.json", + "test:setup-user": "export STEAMID=`grep -o -m 1 '[0-9][0-9]*' dist/src/utility/mockProfile.js` && sed -i -e \"s/\\\"super_admins,go,here\\\"/\\\"$STEAMID\\\"/g\" config/test.json", "test:teams": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.teams.config.cjs", "test:user": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.users.config.cjs", "test:vetoes": "NODE_OPTIONS=--experimental-vm-modules jest --testTimeout=10000 --detectOpenHandles --config ./jest_config/jest.vetoes.config.cjs", @@ -75,7 +78,7 @@ "debug": "~4.1.1", "express": "~4.17.1", "express-bearer-token": "^2.4.0", - "express-rate-limit": "^5.0.0", + "express-rate-limit": "^6.7.0", "express-session": "^1.17.0", "helmet": "^6.0.0", "http-errors": "~1.7.3", @@ -95,11 +98,21 @@ "swagger-ui-express": "^4.5.0" }, "devDependencies": { - "jest": "^29.0.1", - "jsdoc": "^3.6.11", + "@types/aes-js": "^3.1.1", + "@types/config": "^3.3.0", + "@types/express": "^4.17.17", + "@types/node": "^20.2.5", + "@types/steamapi": "^2.2.2", + "jest": "^29.1.0", + "jest-ts-webcompat-resolver": "^1.0.0", + "jsdoc": "^4.0.2", "nodemon": "^2.0.15", "passport-mock-strategy": "^2.0.0", "redis-mock": "^0.56.3", - "supertest": "^6.3.2" + "supertest": "^6.3.3", + "ts-jest": "^29.1.0", + "tsc": "^2.0.4", + "tsc-watch": "^6.0.4", + "typescript": "^5.1.3" } } diff --git a/prodrun.json b/prodrun.json index decf4323..4348c03a 100644 --- a/prodrun.json +++ b/prodrun.json @@ -1,14 +1,14 @@ { - "apps": [ - { - "name": "G5API", - "script": "./bin/www.js", - "instances": 1, - "exec_mode": "fork", - "instance_var": "INSTANCE_ID", - "env": { - "NODE_ENV": "production" - } + "apps": [ + { + "name": "G5API", + "script": "./dist/bin/www.js", + "instances": 1, + "exec_mode": "fork", + "instance_var": "INSTANCE_ID", + "env": { + "NODE_ENV": "production" } - ] - } \ No newline at end of file + } + ] +} \ No newline at end of file diff --git a/routes/index.js b/src/routes/index.js similarity index 100% rename from routes/index.js rename to src/routes/index.js diff --git a/routes/leaderboard.js b/src/routes/leaderboard.js similarity index 98% rename from routes/leaderboard.js rename to src/routes/leaderboard.js index a31143cc..d9106014 100644 --- a/routes/leaderboard.js +++ b/src/routes/leaderboard.js @@ -13,7 +13,7 @@ const router = Router(); - import db from "../db.js"; + import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; @@ -52,6 +52,12 @@ * application/json: * schema: * $ref: '#/components/schemas/SimpleResponse' + * Success: + * description: Success + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SimpleResponse' */ /** diff --git a/routes/legacy/api.js b/src/routes/legacy/api.js similarity index 99% rename from routes/legacy/api.js rename to src/routes/legacy/api.js index af0d68ac..9cc1c6fb 100644 --- a/routes/legacy/api.js +++ b/src/routes/legacy/api.js @@ -11,7 +11,7 @@ const router = Router(); /** Database module. * @const */ -import db from "../../db.js"; +import {db} from "../../services/db.js"; /** Rate limit includes. * @const @@ -50,8 +50,8 @@ const basicRateLimit = rateLimit({ try { let apiKey = req.body?.key == null - ? req.params?.api_key - : req.body?.key; + ? req.params?.api_key + : req.body?.key; const api_key = await db.query( "SELECT api_key FROM `match` WHERE id = ?", req.params.match_id @@ -120,7 +120,7 @@ import Utils from "../../utility/utils.js"; */ const keyCheck = (request) => { if (!request.body.key) { - return request.get("key"); + return request.get("key"); } return request.body.key; } @@ -768,7 +768,7 @@ router.post("/:match_id/vetoUpdate", basicRateLimit, async (req, res, next) => { // Throw error if wrong key or finished match. await check_api_key(matchValues[0].api_key, keyCheck(req), matchFinalized); - + if (teamString === "team1") teamID = matchValues[0].team1_id; else if (teamString === "team2") teamID = matchValues[0].team2_id; @@ -1109,7 +1109,7 @@ router.put( } ); }); - GlobalEmitter.emit("demoUpdate"); + GlobalEmitter.emit("demoUpdate"); res.status(200).send({ message: "Success!" }); } catch (err) { res.status(500).json({ message: err.toString() }); @@ -1187,7 +1187,7 @@ router.post( matchFinalized = false; // Throw error if wrong key. Match finish doesn't matter. await check_api_key(matchValues[0].api_key, keyCheck(req), matchFinalized); - + sql = "SELECT id FROM `map_stats` WHERE match_id = ? AND map_number = ?"; const mapStatValues = await db.query(sql, [matchID, mapNum]); @@ -1474,6 +1474,8 @@ router.post( } ); + + /** * @swagger * @@ -1529,7 +1531,7 @@ router.post( * 500: * $ref: '#/components/responses/Error' */ - router.put( +router.put( "/:match_id/map/:map_number/round/:round_number/backup", basicRateLimit, async (req, res, next) => { @@ -1552,7 +1554,7 @@ router.post( // Throw error if wrong key. Match finish doesn't matter. await check_api_key(matchValues[0].api_key, apiKey, matchFinalized); - if(!existsSync(`public/backups/${matchID}/`)) mkdirSync(`public/backups/${matchID}/`, true); + if (!existsSync(`public/backups/${matchID}/`)) mkdirSync(`public/backups/${matchID}/`, true); writeFile( `public/backups/${matchID}/get5_backup_match${matchID}_map${mapNumber}_round${roundNumber}.cfg`, @@ -1647,7 +1649,7 @@ async function update_challonge_match(match_id, season_id, team1_id, team2_id, n scores_csv: `${team1Score}-${team2Score}`, winner_id: winner === "team1" ? team1ChallongeId[0].challonge_team_id - : team2ChallongeId[0].challonge_team_id + : team2ChallongeId[0].challonge_team_id } }; // If we're just updating the score, remove this. @@ -1674,7 +1676,7 @@ async function update_challonge_match(match_id, season_id, team1_id, team2_id, n "&state=open" ); challongeData = await challongeResponse.json(); - if(!challongeData) { + if (!challongeData) { await fetch( "https://api.challonge.com/v1/tournaments/" + seasonInfo[0].challonge_url + diff --git a/routes/maps.js b/src/routes/maps.js similarity index 99% rename from routes/maps.js rename to src/routes/maps.js index 1f50ea58..e9ad842e 100644 --- a/routes/maps.js +++ b/src/routes/maps.js @@ -7,7 +7,7 @@ import { Router } from "express"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/routes/mapstats.js b/src/routes/mapstats.js similarity index 99% rename from routes/mapstats.js rename to src/routes/mapstats.js index 6a235f33..2c0fcd2d 100644 --- a/routes/mapstats.js +++ b/src/routes/mapstats.js @@ -4,11 +4,11 @@ * description: Express API router for mapstats in get5. */ import { Router } from "express"; -import app from "../app.js"; +import app from "../../app.js"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/routes/matches/matches.js b/src/routes/matches/matches.js similarity index 81% rename from routes/matches/matches.js rename to src/routes/matches/matches.js index b8f788dd..ae929335 100644 --- a/routes/matches/matches.js +++ b/src/routes/matches/matches.js @@ -7,7 +7,7 @@ import { Router } from "express"; const router = Router(); -import db from "../../db.js"; +import { db } from "../../services/db.js"; import { generate } from "randomstring"; @@ -166,7 +166,7 @@ import GlobalEmitter from "../../utility/emitter.js"; * map_sides: * type: string * description: Determines the starting sides for each map. If this array is shorter than num_maps, side_type will determine the side-behavior of the remaining maps. Ignored if skip_veto is false. - * + * * MatchPauseObject: * type: object * properties: @@ -271,6 +271,34 @@ import GlobalEmitter from "../../utility/emitter.js"; * season_id: * type: integer * description: The ID of the season. NULL if no season. + * BombInfo: + * type: object + * properties: + * id: + * type: integer + * description: The integer ID from the database. + * match_id: + * type: integer + * description: The match ID that the bomb was defused or planted. + * map_id: + * type: integer + * description: The current Map ID that the bomb was planted/defused. + * player_name: + * type: string + * description: The name of the player that planted/defused the bomb. + * round_number: + * type: integer + * description: The round number where the bomb was planted/defused. + * round_time: + * type: integer + * description: The time in ms during the round that the bomb was planted/defused. + * site: + * type: string + * description: The site the bomb was planted/defused. + * defused: + * type: boolean + * description: Whether the bomb was planted or defused. + * * responses: * MatchFinished: * description: Match already finished. @@ -327,7 +355,7 @@ import GlobalEmitter from "../../utility/emitter.js"; router.get("/", async (req, res, next) => { try { let isAscending = req.query?.asc == null ? false : req.query.asc; - let sql = + let sql = "SELECT mtch.id, mtch.user_id, mtch.server_id, mtch.team1_id, mtch.team2_id, mtch.winner, mtch.team1_score, " + "mtch.team2_score, mtch.team1_series_score, mtch.team2_series_score, mtch.team1_string, mtch.team2_string, " + "mtch.cancelled, mtch.forfeit, mtch.start_time, mtch.end_time, mtch.max_maps, mtch.title, mtch.skip_veto, mtch.private_match, " + @@ -391,7 +419,8 @@ router.get("/mymatches", Utils.ensureAuthenticated, async (req, res, next) => { /*let sql = "SELECT mtch.*, usr.name as owner FROM `match` mtch " + "JOIN user usr ON mtch.user_id = usr.id " + "WHERE user_id = ? ORDER BY id DESC";*/ - let sql = "SELECT mtch.id, mtch.user_id, mtch.server_id, mtch.team1_id, mtch.team2_id, mtch.winner, mtch.team1_score, " + + let sql = + "SELECT mtch.id, mtch.user_id, mtch.server_id, mtch.team1_id, mtch.team2_id, mtch.winner, mtch.team1_score, " + "mtch.team2_score, mtch.team1_series_score, mtch.team2_series_score, mtch.team1_string, mtch.team2_string, " + "mtch.cancelled, mtch.forfeit, mtch.start_time, mtch.end_time, mtch.max_maps, mtch.title, mtch.skip_veto, mtch.private_match, " + "mtch.enforce_teams, mtch.min_player_ready, mtch.season_id, mtch.is_pug, usr.name as owner, mp.team1_score as team1_mapscore, mp.team2_score as team2_mapscore " + @@ -410,14 +439,12 @@ router.get("/mymatches", Utils.ensureAuthenticated, async (req, res, next) => { } else { res.json({ matches }); } - } catch (err) { console.error(err); res.status(500).json({ message: err.toString() }); } }); - /** * @swagger * @@ -513,7 +540,7 @@ router.get("/:match_id", async (req, res, next) => { * 500: * $ref: '#/components/responses/Error' */ - router.get("/:match_id/stream", async (req, res, next) => { +router.get("/:match_id/stream", async (req, res, next) => { try { let matchUserId = "SELECT user_id FROM `match` WHERE id = ?"; let sql; @@ -540,18 +567,18 @@ router.get("/:match_id", async (req, res, next) => { res.set({ "Cache-Control": "no-cache", - "Connection": "keep-alive", + Connection: "keep-alive", "Content-Type": "text/event-stream", "X-Accel-Buffering": "no" }); res.flushHeaders(); - matches = matches.map(v => Object.assign({}, v)); - let matchString = `event: matches\ndata:${JSON.stringify(matches[0])}\n\n` + matches = matches.map((v) => Object.assign({}, v)); + let matchString = `event: matches\ndata:${JSON.stringify(matches[0])}\n\n`; // Need to name the function in order to remove it! const matchStreamStatus = async () => { matches = await db.query(sql, matchID); - matches = matches.map(v => Object.assign({}, v)); - matches = `event: matches\ndata: ${JSON.stringify(matches[0])}\n\n` + matches = matches.map((v) => Object.assign({}, v)); + matches = `event: matches\ndata: ${JSON.stringify(matches[0])}\n\n`; res.write(matchString); }; @@ -566,10 +593,9 @@ router.get("/:match_id", async (req, res, next) => { GlobalEmitter.removeListener("matchUpdate", matchStreamStatus); res.end(); }); - } catch (err) { console.error(err.toString()); - res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`) + res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`); res.end(); } }); @@ -598,7 +624,7 @@ router.get("/:match_id", async (req, res, next) => { * 500: * $ref: '#/components/responses/Error' */ - router.get("/:match_id/paused/stream", async (req, res, next) => { +router.get("/:match_id/paused/stream", async (req, res, next) => { try { let matchId = req.params.match_id; let sql = @@ -609,19 +635,23 @@ router.get("/:match_id", async (req, res, next) => { res.set({ "Cache-Control": "no-cache", - "Connection": "keep-alive", + Connection: "keep-alive", "Content-Type": "text/event-stream", "X-Accel-Buffering": "no" }); res.flushHeaders(); - matchPauseInfo = matchPauseInfo.map(v => Object.assign({}, v)); - let matchPauseString = `event: matches\ndata:${JSON.stringify(matchPauseInfo)}` + matchPauseInfo = matchPauseInfo.map((v) => Object.assign({}, v)); + let matchPauseString = `event: matches\ndata:${JSON.stringify( + matchPauseInfo + )}`; // Need to name the function in order to remove it! const matchPauseStreamStatus = async () => { matchPauseInfo = await db.query(sql, matchId); - matchPauseInfo = matchPauseInfo.map(v => Object.assign({}, v)); - matchPauseInfo = `event: matches\ndata: ${JSON.stringify(matchPauseString)}\n\n` + matchPauseInfo = matchPauseInfo.map((v) => Object.assign({}, v)); + matchPauseInfo = `event: matches\ndata: ${JSON.stringify( + matchPauseString + )}\n\n`; res.write(matchPauseString); }; @@ -636,10 +666,9 @@ router.get("/:match_id", async (req, res, next) => { GlobalEmitter.removeListener("matchUpdate", matchPauseStreamStatus); res.end(); }); - } catch (err) { console.error(err.toString()); - res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`) + res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`); res.end(); } }); @@ -668,7 +697,7 @@ router.get("/:match_id", async (req, res, next) => { * 500: * $ref: '#/components/responses/Error' */ - router.get("/:match_id/paused", async (req, res, next) => { +router.get("/:match_id/paused", async (req, res, next) => { try { let sql = "SELECT id, match_id, pause_type, team_paused, paused " + @@ -686,6 +715,144 @@ router.get("/:match_id", async (req, res, next) => { } }); +/** + * @swagger + * + * /matches/:match_id/bombs/stream: + * get: + * description: Returns an bomb plant/defused event stream of a specified match. + * produces: + * - text/event-stream + * parameters: + * - name: match_id + * required: true + * schema: + * type: integer + * tags: + * - matches + * responses: + * 200: + * description: Bomb Info from the match. + * content: + * application/json: + * schema: + * type: object + * properties: + * match: + * $ref: '#/components/schemas/BombInfo' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ +router.get("/:match_id/bombs/stream", async (req, res, next) => { + try { + let matchUserId = "SELECT user_id FROM `match` WHERE id = ?"; + let sql; + const matchRow = await db.query(matchUserId, req.params.match_id); + if (!matchRow.length) { + res.status(404).json({ message: "No match found." }); + return; + } else { + sql = + "SELECT mb.id, mb.match_id, mb.map_id, ps.name, mb.round_number, mb.round_time, mb.site, mb.defused, mb.bomb_time_remaining" + + "FROM match_bomb_plants mb JOIN player_stats ps ON mb.player_stats_id = ps.id WHERE mb.match_id = ?"; + } + + let matchID = req.params.match_id; + let bombInfo = await db.query(sql, matchID); + + res.set({ + "Cache-Control": "no-cache", + Connection: "keep-alive", + "Content-Type": "text/event-stream", + "X-Accel-Buffering": "no" + }); + res.flushHeaders(); + bombInfo = bombInfo.map((v) => Object.assign({}, v)); + let bombInfoString = `event: bomb_info\ndata:${JSON.stringify( + bombInfo[0] + )}\n\n`; + // Need to name the function in order to remove it! + const matchStreamStatus = async () => { + bombInfo = await db.query(sql, matchID); + bombInfo = bombInfo.map((v) => Object.assign({}, v)); + bombInfo = `event: bomb_info\ndata: ${JSON.stringify(bombInfo[0])}\n\n`; + res.write(bombInfoString); + }; + + GlobalEmitter.on("bombEvent", matchStreamStatus); + res.write(bombInfoString); + + req.on("close", () => { + GlobalEmitter.removeListener("bombEvent", matchStreamStatus); + res.end(); + }); + req.on("disconnect", () => { + GlobalEmitter.removeListener("bombEvent", matchStreamStatus); + res.end(); + }); + } catch (err) { + console.error(err.toString()); + res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`); + res.end(); + } +}); + +/** + * @swagger + * + * /matches/:match_id/bombs: + * get: + * description: Returns an bomb plant/defused data of a specified match. + * produces: + * - text/event-stream + * parameters: + * - name: match_id + * required: true + * schema: + * type: integer + * tags: + * - matches + * responses: + * 200: + * description: Bomb Info from the match. + * content: + * application/json: + * schema: + * type: object + * properties: + * match: + * $ref: '#/components/schemas/BombInfo' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ +router.get("/:match_id/bombs", async (req, res, next) => { + try { + let matchUserId = "SELECT user_id FROM `match` WHERE id = ?"; + let sql; + const matchRow = await db.query(matchUserId, req.params.match_id); + if (!matchRow.length) { + res.status(404).json({ message: "No match found." }); + return; + } else { + sql = + "SELECT mb.id, mb.match_id, mb.map_id, ps.name, mb.round_number, mb.round_time, mb.site, mb.defused, mb.bomb_time_remaining" + + "FROM match_bomb_plants mb JOIN player_stats ps ON mb.player_stats_id = ps.id WHERE mb.match_id = ?"; + } + + let matchID = req.params.match_id; + let bombInfo = await db.query(sql, matchID); + res.json({ bombInfo }); + } catch (err) { + console.error(err.toString()); + res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`); + res.end(); + } +}); + /** * @swagger * @@ -726,7 +893,7 @@ router.get("/limit/:limiter", async (req, res, next) => { "team1_score, team2_score, team1_series_score, team2_series_score, " + "team1_string, team2_string, cancelled, forfeit, start_time, end_time, " + "max_maps, title, skip_veto, private_match, enforce_teams, min_player_ready, " + - "season_id, is_pug, map_sides FROM `match` WHERE cancelled = 0 " + + "season_id, is_pug, map_sides FROM `match` WHERE cancelled = 0 " + "OR cancelled IS NULL ORDER BY end_time DESC LIMIT ?"; } const matches = await db.query(sql, lim); @@ -768,7 +935,7 @@ router.get("/limit/:limiter", async (req, res, next) => { * 500: * $ref: '#/components/responses/Error' */ - router.get("/page/:firstvalue&:lastvalue", async (req, res, next) => { +router.get("/page/:firstvalue&:lastvalue", async (req, res, next) => { try { let firstVal = parseInt(req.params.firstvalue); let secondVal = parseInt(req.params.lastvalue); @@ -847,12 +1014,19 @@ router.get("/:match_id/config", async (req, res, next) => { : 5, team1: {}, team2: {}, - cvars: { - get5_web_api_url: config.get("server.apiURL"), - get5_check_auths: matchInfo[0].enforce_teams.toString(), - }, + cvars: + matchInfo[0].plugin_version != null && + (matchInfo[0].plugin_version == "unknown" || + parseFloat(matchInfo[0].plugin_version) < 0.14) + ? { + get5_web_api_url: config.get("server.apiURL"), + get5_check_auths: matchInfo[0].enforce_teams.toString() + } + : { + get5_check_auths: matchInfo[0].enforce_teams.toString() + }, spectators: { - players: [], + players: [] }, maplist: matchInfo[0].veto_mappool !== null @@ -861,7 +1035,7 @@ router.get("/:match_id/config", async (req, res, next) => { min_spectators_to_ready: matchInfo[0].min_spectators_to_ready !== null ? matchInfo[0].min_spectators_to_ready - : 0, + : 0 }; matchJSON.num_maps = parseInt(matchInfo[0].max_maps); if (matchJSON.skip_veto && matchInfo[0].map_sides) @@ -888,7 +1062,8 @@ router.get("/:match_id/config", async (req, res, next) => { matchSpecs.forEach((row) => { newSpecs[row.auth] = row.spectator_name == null ? "" : row.spectator_name; }); - if (Object.keys(newSpecs).length > 0) matchJSON.spectators.players = newSpecs; + if (Object.keys(newSpecs).length > 0) + matchJSON.spectators.players = newSpecs; res.json(matchJSON); } catch (err) { console.error(err); @@ -932,13 +1107,10 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { let serverSql = "SELECT in_use, user_id, public_server FROM game_server WHERE id = ?"; if (req.body[0].server_id != null) { - const serverInUse = await db.query(serverSql, [ - req.body[0].server_id, - ]); + const serverInUse = await db.query(serverSql, [req.body[0].server_id]); if (serverInUse[0].in_use) { res.status(401).json({ - message: - "Server is already in use, please select a different server.", + message: "Server is already in use, please select a different server." }); return; } else if ( @@ -951,15 +1123,11 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { } } let teamNameSql = "SELECT name FROM team WHERE id = ?"; - let teamOneName = await db.query(teamNameSql, [ - req.body[0].team1_id, - ]); - let teamTwoName = await db.query(teamNameSql, [ - req.body[0].team2_id, - ]); + let teamOneName = await db.query(teamNameSql, [req.body[0].team1_id]); + let teamTwoName = await db.query(teamNameSql, [req.body[0].team2_id]); let apiKey = generate({ length: 24, - capitalization: "uppercase", + capitalization: "uppercase" }); let skipVeto = req.body[0].skip_veto == null ? false : req.body[0].skip_veto; @@ -985,10 +1153,8 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { req.body[0].enforce_teams == null ? 1 : req.body[0].enforce_teams, api_key: apiKey, winner: null, - team1_string: - teamOneName[0].name == null ? null : teamOneName[0].name, - team2_string: - teamTwoName[0].name == null ? null : teamTwoName[0].name, + team1_string: teamOneName[0].name == null ? null : teamOneName[0].name, + team2_string: teamTwoName[0].name == null ? null : teamTwoName[0].name, is_pug: req.body[0].is_pug, min_player_ready: req.body[0].min_players_to_ready, players_per_team: req.body[0].players_per_team, @@ -996,9 +1162,7 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { req.body[0].min_spectators_to_ready !== null ? req.body[0].min_spectators_to_ready : 0, - map_sides: req.body[0].map_sides !== null - ? req.body[0].map_sides - : null + map_sides: req.body[0].map_sides !== null ? req.body[0].map_sides : null }; let sql = "INSERT INTO `match` SET ?"; let cvarSql = @@ -1006,9 +1170,12 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { insertSet = await db.buildUpdateStatement(insertSet); insertMatch = await db.query(sql, [insertSet]); if (req.body[0].spectator_auths) { - sql = "INSERT match_spectator (match_id, auth, spectator_name) VALUES (?,?,?)"; + sql = + "INSERT match_spectator (match_id, auth, spectator_name) VALUES (?,?,?)"; for (let key in req.body[0].spectator_auths) { - let newAuth = await Utils.getSteamPID(req.body[0].spectator_auths[key].split(";")[0]); + let newAuth = await Utils.getSteamPID( + req.body[0].spectator_auths[key].split(";")[0] + ); await db.query(sql, [ insertMatch.insertId, newAuth, @@ -1023,16 +1190,16 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { await db.query(cvarSql, [ insertMatch.insertId, key.replace(/"/g, '\\"'), - typeof cvarInsertSet[key] === 'string' ? cvarInsertSet[key].replace(/"/g, '\\"') : cvarInsertSet[key] + typeof cvarInsertSet[key] === "string" + ? cvarInsertSet[key].replace(/"/g, '\\"') + : cvarInsertSet[key] ]); } } if (!req.body[0].ignore_server) { let ourServerSql = "SELECT rcon_password, ip_string, port FROM game_server WHERE id=?"; - const serveInfo = await db.query(ourServerSql, [ - req.body[0].server_id, - ]); + const serveInfo = await db.query(ourServerSql, [req.body[0].server_id]); const newServer = new GameServer( serveInfo[0].ip_string, serveInfo[0].port, @@ -1042,26 +1209,38 @@ router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { (await newServer.isServerAlive()) && (await newServer.isGet5Available()) ) { + sql = "UPDATE game_server SET in_use = 1 WHERE id = ?"; + await db.query(sql, [req.body[0].server_id]); + + sql = "UPDATE `match` SET plugin_version = ? WHERE id = ?"; + let get5Version = await newServer.getGet5Version(); + await db.query(sql, [get5Version, insertMatch.insertId]); if ( !(await newServer.prepareGet5Match( config.get("server.apiURL") + - "/matches/" + - insertMatch.insertId + - "/config", + "/matches/" + + insertMatch.insertId + + "/config", apiKey )) ) { + // Delete the match as it does not belong in the database. + sql = "DELETE FROM match_specatator WHERE match_id = ?"; + await db.query(sql, [insertMatch.insertId]); + sql = "DELETE FROM match_cvar WHERE match_id = ?"; + await db.query(sql, [insertMatch.insertId]); + sql = "DELETE FROM `match` WHERE id = ?"; + await db.query(sql, [insertMatch.insertId]); + + sql = "UPDATE game_server SET in_use = 0 WHERE id = ?"; + await db.query(sql, [req.body[0].server_id]); throw "Please check server logs, as something was not set properly. You may cancel the match and server status is not updated."; } } } - if (req.body[0].server_id) { - sql = "UPDATE game_server SET in_use = 1 WHERE id = ?"; - await db.query(sql, [req.body[0].server_id]); - } res.json({ message: "Match inserted successfully!", - id: insertMatch.insertId, + id: insertMatch.insertId }); } catch (err) { console.error(err); @@ -1123,16 +1302,13 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { } else { let currentMatchInfo = "SELECT id, user_id, server_id, cancelled, forfeit, end_time, api_key, veto_mappool, max_maps, skip_veto, is_pug FROM `match` WHERE id = ?"; - const matchRow = await db.query( - currentMatchInfo, - req.body[0].match_id - ); + const matchRow = await db.query(currentMatchInfo, req.body[0].match_id); if (req.body[0].server_id != null) { // Check if server is owned, public, or in use by another match. let serverCheckSql = "SELECT in_use, user_id, public_server FROM game_server WHERE id=?"; const returnedServer = await db.query(serverCheckSql, [ - req.body[0].server_id, + req.body[0].server_id ]); if ( returnedServer[0].user_id != req.user.id && @@ -1142,8 +1318,7 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { res.status(403).json({ message: "User does not own this server." }); return; } - if (req.body[0].server_id != matchRow[0].server_id) - diffServer = true; + if (req.body[0].server_id != matchRow[0].server_id) diffServer = true; } let vetoSql = @@ -1161,7 +1336,7 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { maxMaps = Object.keys(vetoList).length; // Remove last two characters. // vetoMapPool = vetoMapPool.substring(0, vetoMapPool.length - 2); - //If we're identical to the matches map pool, it usually means we've begun. + // If we're identical to the matches map pool, it usually means we've begun. if (vetoMapPool == matchRow[0].veto_mappool) { vetoMapPool = null; maxMaps = null; @@ -1196,24 +1371,23 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { req.body[0].min_spectators_to_ready !== null ? req.body[0].min_spectators_to_ready : 0, - map_sides: req.body[0].map_sides !== null - ? req.body[0].map_sides - : null + map_sides: req.body[0].map_sides !== null ? req.body[0].map_sides : null }; // Remove any values that may not be updated. updateStmt = await db.buildUpdateStatement(updateStmt); if (!Object.keys(updateStmt)) { - res - .status(412) - .json({ message: "No update data has been provided." }); + res.status(412).json({ message: "No update data has been provided." }); return; } let sql = "UPDATE `match` SET ? WHERE id = ?"; await db.query(sql, [updateStmt, req.body[0].match_id]); if (req.body[0].spectator_auths) { - sql = "INSERT match_spectator (match_id, auth, spectator_name) VALUES (?,?,?)"; + sql = + "INSERT match_spectator (match_id, auth, spectator_name) VALUES (?,?,?)"; for (let key in req.body[0].spectator_auths) { - let newAuth = await Utils.getSteamPID(req.body[0].spectator_auths[key].split(";")[0]); + let newAuth = await Utils.getSteamPID( + req.body[0].spectator_auths[key].split(";")[0] + ); await db.query(sql, [ insertMatch.insertId, newAuth, @@ -1221,16 +1395,14 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { ]); } } - const ourServer = await db.query(ourServerSql, [ - matchRow[0].server_id, - ]); + const ourServer = await db.query(ourServerSql, [matchRow[0].server_id]); const serverConn = matchRow[0].server_id != null ? new GameServer( - ourServer[0].ip_string, - ourServer[0].port, - ourServer[0].rcon_password - ) + ourServer[0].ip_string, + ourServer[0].port, + ourServer[0].rcon_password + ) : null; if ( req.body[0].forfeit == 1 || @@ -1240,19 +1412,17 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { if (serverConn != null && serverConn.endGet5Match()) { sql = "UPDATE game_server SET in_use=0 WHERE id=?"; await db.query(sql, [matchRow[0].server_id]); + + sql = "UPDATE `match` SET plugin_version = ? WHERE id = ?"; + let get5Version = await newServer.getGet5Version(); + await db.query(sql, [get5Version, matchRow[0].id]); } if (matchRow[0].is_pug != null && matchRow[0].is_pug == 1) { let pugSql = "DELETE FROM team_auth_names WHERE team_id = ? OR team_id = ?"; - await db.query(pugSql, [ - matchRow[0].team1_id, - matchRow[0].team2_id, - ]); + await db.query(pugSql, [matchRow[0].team1_id, matchRow[0].team2_id]); pugSql = "DELETE FROM team WHERE id = ? OR id = ?"; - await db.query(pugSql, [ - matchRow[0].team1_id, - matchRow[0].team2_id, - ]); + await db.query(pugSql, [matchRow[0].team1_id, matchRow[0].team2_id]); } } else { if (!req.body[0].ignore_server) { @@ -1262,7 +1432,7 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { await db.query(sql, [matchRow[0].server_id]); } const newServeInfo = await db.query(ourServerSql, [ - req.body[0].server_id, + req.body[0].server_id ]); const newServer = new GameServer( newServeInfo[0].ip_string, @@ -1272,9 +1442,9 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { if ( await newServer.prepareGet5Match( config.get("server.apiURL") + - "/matches/" + - matchRow[0].id + - "/config", + "/matches/" + + matchRow[0].id + + "/config", matchRow[0].api_key ) ) { @@ -1291,11 +1461,7 @@ router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { sql = "INSERT match_cvar (match_id, cvar_name, cvar_value) VALUES (?,?,?)"; for (let key in newCvars) { - await db.query(sql, [ - req.body[0].match_id, - key, - newCvars[key], - ]); + await db.query(sql, [req.body[0].match_id, key, newCvars[key]]); } } res.json({ message: message }); @@ -1358,15 +1524,11 @@ router.delete("/", Utils.ensureAuthenticated, async (req, res, next) => { let isMatchCancelled = "SELECT cancelled, forfeit, end_time, user_id from `match` WHERE id = ?"; // First find any matches/mapstats/playerstats associated with the team. - let playerStatDeleteSql = - "DELETE FROM player_stats WHERE match_id = ?"; + let playerStatDeleteSql = "DELETE FROM player_stats WHERE match_id = ?"; let mapStatDeleteSql = "DELETE FROM map_stats WHERE match_id = ?"; let spectatorDeleteSql = "DELETE FROM match_spectator WHERE match_id = ?"; - const matchCancelledResult = await db.query( - isMatchCancelled, - matchId - ); + const matchCancelledResult = await db.query(isMatchCancelled, matchId); if ( matchCancelledResult[0].cancelled == 1 || matchCancelledResult[0].forfeit == 1 || @@ -1383,7 +1545,7 @@ router.delete("/", Utils.ensureAuthenticated, async (req, res, next) => { return; } else { res.status(403).json({ - message: "Cannot delete match as it is not cancelled.", + message: "Cannot delete match as it is not cancelled." }); return; } @@ -1425,7 +1587,8 @@ router.delete("/", Utils.ensureAuthenticated, async (req, res, next) => { * @param {Object} matchData - The data that contains the match to get the team string and scores. */ async function build_team_dict(team, teamNumber, matchData) { - let sql = "SELECT auth, name, coach FROM team_auth_names WHERE team_id = ? ORDER BY captain DESC"; + let sql = + "SELECT auth, name, coach FROM team_auth_names WHERE team_id = ? ORDER BY captain DESC"; const playerAuths = await db.query(sql, [team.id]); let normalizedAuths = {}; let normalizedCoachAuths = {}; @@ -1440,17 +1603,17 @@ async function build_team_dict(team, teamNumber, matchData) { } } let teamData = { + id: team.id.toString(), name: team.name, tag: team.tag, - flag: team.flag != null - ? team.flag.toUpperCase() - : '', + flag: team.flag != null ? team.flag.toUpperCase() : "", logo: team.logo, matchtext: team.matchtext, players: normalizedAuths, - coaches: Object.keys(normalizedCoachAuths).length == 0 - ? null - : normalizedCoachAuths, + coaches: + Object.keys(normalizedCoachAuths).length == 0 + ? null + : normalizedCoachAuths, series_score: teamNumber === 1 ? matchData.team1_series_score @@ -1460,7 +1623,7 @@ async function build_team_dict(team, teamNumber, matchData) { ? teamNumber === 1 ? matchData.team1_string : matchData.team2_string - : null, + : null }; for (let key in teamData) { if (teamData[key] === null) delete teamData[key]; diff --git a/routes/matches/matchserver.js b/src/routes/matches/matchserver.js similarity index 99% rename from routes/matches/matchserver.js rename to src/routes/matches/matchserver.js index 640984d8..f175cac0 100644 --- a/routes/matches/matchserver.js +++ b/src/routes/matches/matchserver.js @@ -7,7 +7,7 @@ import { Router } from "express"; const router = Router(); -import db from "../../db.js"; +import {db} from "../../services/db.js"; import Utils from "../../utility/utils.js"; diff --git a/src/routes/playerstats/extrastats.js b/src/routes/playerstats/extrastats.js new file mode 100644 index 00000000..a054b524 --- /dev/null +++ b/src/routes/playerstats/extrastats.js @@ -0,0 +1,805 @@ +/** + * @swagger + * resourcePath: /playerstatsextras + * description: Express API for player additional stats in Get5 matches. + */ + import { Router } from "express"; + + const router = Router(); + + import {db} from "../../services/db.js"; + + import Utils from "../../utility/utils.js"; + + import GlobalEmitter from "../../utility/emitter.js"; + + /* Swagger shared definitions */ +/** + * @swagger + * + * components: + * schemas: + * PlayerStatsExtras: + * type: object + * required: + * - match_id + * - map_id + * - team_id + * - steam_id + * - name + * properties: + * player_steam_id: + * type: string + * description: The Steam64 identifier of the player killed. + * player_name: + * type: string + * description: The name of the player being killed on the server. + * player_side: + * type: string + * description: The side the player killed is on. + * match_id: + * type: integer + * description: Match identifier in the system. + * map_id: + * type: integer + * description: Integer determining the current map of the match. + * team_id: + * type: integer + * description: Integer determining the team a player is on. + * round_number: + * type: integer + * description: Integer determining the round that the player death occurred on. + * round_time: + * type: integer + * description: Integer determining the round time that the player death occurred on. + * attacker_steam_id: + * type: string + * description: The Steam64 identifier of the player who attacked the player who had died. + * attacker_name: + * type: string + * description: The name of the player attacking the killed player on the server. + * attacker_side: + * type: string + * description: The side the attacker is on. + * weapon: + * type: string + * description: The name of the weapon that the player died from. + * bomb: + * type: boolean + * description: Whether the player died from the bomb or not. + * headshot: + * type: boolean + * description: Whether the player died from a headshot. + * thru_smoke: + * type: boolean + * description: Whether the player died thru smoke. + * attacker_blind: + * type: boolean + * description: Whether the player was killed by a blind attacker. + * no_scope: + * type: boolean + * description: Whether the player was killed by a no scope. + * suicide: + * type: boolean + * description: Whether the player had killed themselves via suicide. + * friendly_fire: + * type: boolean + * description: Whether the player had died from friendly fire. + * assister_steam_id: + * type: string + * description: The Steam64 identifier of the player who assisted the attacker. + * assister_name: + * type: string + * description: The name of the player assisting the attacker on the server. + * assister_side: + * type: string + * description: The side that the assister is on. If no assister, this is null. + * assist_friendly_fire: + * type: boolean + * description: Indicates if the assist was friendly fire. + * flash_assist: + * type: boolean + * description: Indicates if the assist was via a flashbang. + */ + +/** + * @swagger + * + * /playerstatsextra/extra: + * get: + * description: Route serving to get all extra player statistics. + * produces: + * - application/json + * tags: + * - playerstats + * responses: + * 200: + * description: Extra Player Stats + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtras' + * 400: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/", async (req, res, next) => { + try { + let sql = "SELECT * FROM player_stat_extras"; + const playerStatExtra = await db.query(sql); + if (!playerStatExtra.length) { + res.status(404).json({ message: "No additional stats found on the site!" }); + return; + } + res.json({ playerStatExtra }); + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextra/:steam_id: + * get: + * description: Player stats from a given Steam ID. + * produces: + * - application/json + * parameters: + * - name: steam_id + * required: true + * schema: + * type: string + * tags: + * - playerstats + * responses: + * 200: + * description: Player stats from a given user. + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtras' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/:steam_id", async (req, res, next) => { + try { + let steamID = req.params.steam_id; + let sql = "SELECT id FROM player_stats WHERE steam_id = ?" + let extraSql = "SELECT * FROM player_stat_extras where id IN (?)"; + const playerIds = await db.query(sql, steamID); + if (!playerIds.length) { + res.status(404).json({ message: "No stats found for player " + steamID }); + return; + } + const extrastats = await db.query(extraSql, [playerIds]); + if (!extrastats.length) { + res.status(404).json({ message: "No extra stats found for player " + steamID }); + return; + } + res.json({ extrastats }); + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextra/:steam_id/pug: + * get: + * description: Extra player stats from a given Steam ID involved in PUGs + * produces: + * - application/json + * parameters: + * - name: steam_id + * required: true + * schema: + * type: string + * tags: + * - playerstats + * responses: + * 200: + * description: Player stats from a given user. + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtras' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/:steam_id/pug", async (req, res, next) => { + try { + let steamID = req.params.steam_id; + return getIdFromMatches(steamID, 1, null, res); + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextra/:steam_id/official: + * get: + * description: Extra player stats from a given Steam ID involved in official matches. + * produces: + * - application/json + * parameters: + * - name: steam_id + * required: true + * schema: + * type: string + * tags: + * - playerstats + * responses: + * 200: + * description: Player stats from a given user. + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtras' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/:steam_id/official", async (req, res, next) => { + try { + let steamID = req.params.steam_id; + return getIdFromMatches(steamID, 0, null, res); + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextra/:steam_id/season/:season_id: + * get: + * description: Extra player stats from a given Steam ID involved in a speciefic season. + * produces: + * - application/json + * parameters: + * - name: steam_id + * required: true + * schema: + * type: string + * - name: season_id + * required: true + * schema: + * type: string + * tags: + * - playerstats + * responses: + * 200: + * description: Player stats from a given user. + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtras' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/:steam_id/season/:season_id", async (req, res, next) => { + try { + let steamID = req.params.steam_id; + let seasonID = req.params.season_id + return getIdFromMatches(steamID, 0, seasonID, res); + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextras/match/:match_id: + * get: + * description: Extra player stats from a given match in the system. + * produces: + * - application/json + * parameters: + * - name: match_id + * required: true + * schema: + * type: integer + * tags: + * - playerstats + * responses: + * 200: + * description: Player stats from a given match. + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtra' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/match/:match_id", async (req, res, next) => { + try { + let matchID = req.params.match_id; + let sql = "SELECT * FROM player_stat_extras where match_id = ?"; + const extrastats = await db.query(sql, matchID); + if (!extrastats.length) { + res.status(404).json({ message: "No extra stats found for match " + matchID }); + return; + } + res.json({ extrastats }); + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextras/match/:match_id/stream: + * get: + * description: Extra player stats from a given match in the system represented by a text-stream for real time updates. + * produces: + * - text/event-stream + * parameters: + * - name: match_id + * required: true + * schema: + * type: integer + * tags: + * - playerstats + * responses: + * 200: + * description: Player stats from a given match. + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/PlayerStatsExtra' + * 404: + * $ref: '#/components/responses/NotFound' + * 500: + * $ref: '#/components/responses/Error' + */ + router.get("/match/:match_id/stream", async (req, res, next) => { + try { + let matchID = req.params.match_id; + let sql = "SELECT * FROM player_stat_extras where match_id = ?"; + let playerstats = await db.query(sql, matchID); + + res.set({ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "Content-Type": "text/event-stream", + "X-Accel-Buffering": "no" + }); + res.flushHeaders(); + playerstats = playerstats.map(v => Object.assign({}, v)); + let playerString = `event: playerstatextras\ndata: ${JSON.stringify(playerstats)}\n\n` + + // Need to name the function in order to remove it! + const playerStreamStats = async () => { + playerstats = await db.query(sql, matchID); + playerstats = playerstats.map(v => Object.assign({}, v)); + playerString = `event: playerstatextras\ndata: ${JSON.stringify(playerstats)}\n\n` + res.write(playerString); + }; + + GlobalEmitter.on("playerStatsExtraUpdate", playerStreamStats); + + res.write(playerString); + req.on("close", () => { + GlobalEmitter.removeListener("playerStatsExtraUpdate", playerStreamStats); + res.end(); + }); + req.on("disconnect", () => { + GlobalEmitter.removeListener("playerStatsExtraUpdate", playerStreamStats); + res.end(); + }); + } catch (err) { + console.error(err.toString()); + res.status(500).write(`event: error\ndata: ${err.toString()}\n\n`) + res.end(); + } +}); + +/** + * @swagger + * + * /playerstatsextras: + * post: + * description: Create extra player stats in a match/map. + * produces: + * - application/json + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/PlayerStatsExtra' + * api_key: + * type: string + * description: API key of the match being updated. + * tags: + * - playerstats + * responses: + * 200: + * description: Player Stats created successfully. + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SimpleResponse' + * 403: + * $ref: '#/components/responses/Unauthorized' + * 404: + * $ref: '#/components/responses/NotFound' + * 412: + * $ref: '#/components/responses/NoPlayerStatData' + * 500: + * $ref: '#/components/responses/Error' + */ + router.post("/", Utils.ensureAuthenticated, async (req, res, next) => { + try { + if ( + req.body[0].match_id == null || + req.body[0].map_id == null || + req.body[0].team_id == null || + req.body[0].steam_id == null || + req.body[0].name == null || + req.body[0].api_key == null + ) { + res.status(412).json({ message: "Required Data Not Provided" }); + return; + } + let currentMatchInfo = + "SELECT mtch.user_id as user_id, mtch.cancelled as cancelled, mtch.forfeit as forfeit, mtch.end_time as mtch_end_time, mtch.api_key as mtch_api_key FROM `match` mtch WHERE mtch.id=?"; + const matchRow = await db.query(currentMatchInfo, req.body[0].match_id); + if (!matchRow.length) { + res.status(404).json({ message: "No match found." }); + return; + } else if ( + matchRow[0].mtch_api_key != req.body[0].api_key && + !Utils.superAdminCheck(req.user) + ) { + res + .status(403) + .json({ message: "User is not authorized to perform action." }); + return; + } else if ( + matchRow[0].cancelled == 1 || + matchRow[0].forfeit == 1 || + matchRow[0].mtch_end_time != null + ) { + res.status(403).json({ + message: + "Match is already finished. Cannot insert into historical matches.", + }); + return; + } else { + let insertSet = { + player_steam_id: req.body[0].steam_id, + player_name: req.body[0].player_name, + player_side: req.body[0].player_side, + map_id: req.body[0].map_id, + match_id: req.body[0].match_id, + team_id: req.body[0].team_id, + round_number: req.body[0].round_number, + round_time: req.body[0].round_time, + attacker_steam_id: req.body[0].attacker_steam_id, + attacker_name: req.body[0].attacker_name, + attacker_side: req.body[0].attacker_side, + weapon: req.body[0].weapon, + bomb: req.body[0].bomb, + deaths: req.body[0].deaths, + headshot: req.body[0].headshot, + thru_smoke: req.body[0].thru_smoke, + attacker_blind: req.body[0].attacker_blind, + no_scope: req.body[0].no_scope, + suicide: req.body[0].suicide, + friendly_fire: req.body[0].friendly_fire, + assister_steam_id: req.body[0].assister_steam_id, + assister_name: req.body[0].assister_name, + assister_side: req.body[0].assister_side, + assist_friendly_fire: req.body[0].assist_friendly_fire, + flash_assist: req.body[0].flash_assist + }; + let sql = "INSERT INTO player_stat_extras SET ?"; + // Remove any values that may not be inserted off the hop. + insertSet = await db.buildUpdateStatement(insertSet); + let insertPlayStats = await db.query(sql, [insertSet]); + GlobalEmitter.emit("playerStatsExtraUpdate"); + res.json({ + message: "Extra Player Stats inserted successfully!", + id: insertPlayStats.insertId, + }); + } + } catch (err) { + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextras: + * put: + * description: Update additional player stats in a match/map. + * produces: + * - application/json + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/PlayerStatsExtra' + * tags: + * - playerstats + * responses: + * 200: + * description: Update successful. + * content: + * application/json: + * type: object + * schema: + * $ref: '#/components/schemas/SimpleResponse' + * 403: + * $ref: '#/components/responses/Unauthorized' + * 404: + * $ref: '#/components/responses/NotFound' + * 412: + * $ref: '#/components/responses/NoPlayerStatData' + * 500: + * $ref: '#/components/responses/Error' + */ + router.put("/", Utils.ensureAuthenticated, async (req, res, next) => { + try { + if ( + req.body[0].match_id == null || + req.body[0].map_id == null || + req.body[0].team_id == null || + req.body[0].steam_id == null || + req.body[0].api_key == null + ) { + res.status(412).json({ message: "Required Data Not Provided" }); + return; + } + let currentMatchInfo = + "SELECT mtch.user_id as user_id, mtch.cancelled as cancelled, mtch.forfeit as forfeit, mtch.end_time as mtch_end_time, mtch.api_key as mtch_api_key FROM `match` mtch, map_stats mstat WHERE mtch.id=? AND mstat.match_id=mtch.id"; + const matchRow = await db.query(currentMatchInfo, req.body[0].match_id); + if (!matchRow.length) { + res.status(404).json({ message: "No match found." }); + return; + } else if ( + matchRow[0].mtch_api_key != req.body[0].api_key && + !Utils.superAdminCheck(req.user) + ) { + res + .status(403) + .json({ message: "User is not authorized to perform action." }); + return; + } else if ( + matchRow[0].cancelled == 1 || + matchRow[0].forfeit == 1 || + matchRow[0].mtch_end_time != null + ) { + res.status(401).json({ + message: "Match is already finished. Cannot update historical matches.", + }); + return; + } else { + let updateStmt = { + round_number: req.body[0].round_number, + round_time: req.body[0].round_time, + attacker_steam_id: req.body[0].attacker_steam_id, + attacker_name: req.body[0].attacker_name, + attacker_side: req.body[0].attacker_side, + weapon: req.body[0].weapon, + bomb: req.body[0].bomb, + deaths: req.body[0].deaths, + headshot: req.body[0].headshot, + thru_smoke: req.body[0].thru_smoke, + attacker_blind: req.body[0].attacker_blind, + no_scope: req.body[0].no_scope, + suicide: req.body[0].suicide, + friendly_fire: req.body[0].friendly_fire, + assister_steam_id: req.body[0].assister_steam_id, + assister_name: req.body[0].assister_name, + assister_side: req.body[0].assister_side, + assist_friendly_fire: req.body[0].assist_friendly_fire, + flash_assist: req.body[0].flash_assist + }; + // Remove any values that may not be updated. + updateStmt = await db.buildUpdateStatement(updateStmt); + if (!Object.keys(updateStmt)) { + res + .status(412) + .json({ message: "No update data has been provided." }); + return; + } + let sql = + "UPDATE player_stat_extras SET ? WHERE map_id = ? AND match_id = ? AND player_stat_id = ?"; + const updatedPlayerStats = await db.query(sql, [ + updateStmt, + req.body[0].map_id, + req.body[0].match_id, + req.body[0].player_stat_id, + ]); + if (updatedPlayerStats.affectedRows > 0) { + res.json({ message: "Extra Player Stats were updated successfully!" }); + } else { + sql = "INSERT INTO player_stats SET ?"; + // Update values to include match/map/steam_id. + updateStmt.player_steam_id = req.body[0].player_steam_id; + updateStmt.map_id = req.body[0].map_id; + updateStmt.match_id = req.body[0].match_id; + updateStmt.team_id = req.body[0].team_id; + await db.query(sql, [updateStmt]); + res.json({ message: "Extra Player Stats Inserted Successfully!" }); + } + GlobalEmitter.emit("playerStatsExtraUpdate"); + return; + } + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + +/** + * @swagger + * + * /playerstatsextras: + * delete: + * description: Delete all additional player stats object from a match. + * produces: + * - application/json + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * match_id: + * type: integer + * tags: + * - playerstats + * responses: + * 200: + * description: Player stat deleted + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SimpleResponse' + * 400: + * $ref: '#/components/responses/BadRequest' + * 403: + * $ref: '#/components/responses/Unauthorized' + * 404: + * $ref: '#/components/responses/NotFound' + * 412: + * $ref: '#/components/responses/NoPlayerStatData' + * 500: + * $ref: '#/components/responses/Error' + */ +router.delete("/", async (req, res, next) => { + try { + if (req.body[0].match_id == null) { + res.status(412).json({ message: "Required Data Not Provided" }); + return; + } + let currentMatchInfo = + "SELECT mtch.user_id as user_id, mtch.cancelled as cancelled, mtch.forfeit as forfeit, mtch.end_time as mtch_end_time, mtch.api_key as mtch_api_key FROM `match` mtch, map_stats mstat WHERE mtch.id=?"; + const matchRow = await db.query(currentMatchInfo, req.body[0].match_id); + if (!matchRow.length) { + res.status(404).json({ message: "No player stats data found." }); + return; + } else if ( + matchRow[0].user_id != req.user.id && + !Utils.superAdminCheck(req.user) + ) { + res + .status(403) + .json({ message: "User is not authorized to perform action." }); + return; + } else if ( + matchRow[0].cancelled == 1 || + matchRow[0].forfeit == 1 || + matchRow[0].mtch_end_time != null + ) { + let deleteSql = "DELETE FROM player_stat_extras; WHERE match_id = ?"; + const delRows = await db.query(deleteSql, [ + req.body[0].match_id, + ]); + if (delRows.affectedRows > 0) { + GlobalEmitter.emit("playerStatsExtraUpdate"); + res.json({ message: "Player stats has been deleted successfully." }); + return; + } else { + throw "Something went wrong deleting the data. Player stats remain intact."; + } + } else { + res.status(401).json({ + message: "Match is currently live. Cannot delete from live matches.", + }); + return; + } + } catch (err) { + console.error(err); + res.status(500).json({ message: err.toString() }); + } +}); + + +/** Get extra player stats standing in a season, pug or official matches. +* @function +* @memberof module:routes/playerstatsextra +* @param {string} [steamId] - Steam64 ID. +* @param {boolean} [pug] - PUGs to filter. +* @param {string} [seasonId=null] - Season ID to filter. +* @param {object} [res] - The response to send back to the client. +*/ +const getIdFromMatches = async (steamId, isPug, seasonId, res) => { + let pugSql = + `SELECT id + FROM player_stats + WHERE steam_id = ? + AND match_id IN ( + SELECT id FROM \`match\` + WHERE cancelled = 0 + AND is_pug = ? + )`; + if (seasonId) { + pugSql = + `SELECT id + FROM player_stats + WHERE steam_id = ? + AND match_id IN ( + SELECT id FROM \`match\` + WHERE cancelled = 0 + AND season_id = ? + )`; + } + let playerIds = await db.query(pugSql, [steamId, isPug, seasonId]); + let extraSql = "SELECT * FROM player_stat_extras where id IN (?)"; + if (!playerIds.length) { + res.status(404).json({ message: "No stats found for player " + steamId }); + return; + } + const extrastats = await db.query(extraSql, [playerIds]); + if (!extrastats.length) { + res.status(404).json({ message: "No extra stats found for player " + steamId }); + return; + } + res.json({ extrastats }); + return; +} + +export default router; \ No newline at end of file diff --git a/routes/playerstats.js b/src/routes/playerstats/playerstats.js similarity index 99% rename from routes/playerstats.js rename to src/routes/playerstats/playerstats.js index c86a8e23..6c20c1a0 100644 --- a/routes/playerstats.js +++ b/src/routes/playerstats/playerstats.js @@ -4,15 +4,14 @@ * description: Express API for player stats in Get5 matches. */ import { Router } from "express"; -import app from "../app.js"; const router = Router(); -import db from "../db.js"; +import {db} from "../../services/db.js"; -import Utils from "../utility/utils.js"; +import Utils from "../../utility/utils.js"; -import GlobalEmitter from "../utility/emitter.js"; +import GlobalEmitter from "../../utility/emitter.js"; /* Swagger shared definitions */ /** @@ -305,7 +304,7 @@ router.get("/:steam_id/pug", async (req, res, next) => { try { let steamID = req.params.steam_id; let playerstats = await getPlayerStats(steamID, null, true); - if (!playerstats) { + if (!playerstats.length) { res.status(404).json({ message: "No stats found for player " + steamID }); return; } @@ -349,7 +348,7 @@ router.get("/:steam_id/official", async (req, res, next) => { try { let steamID = req.params.steam_id; let playerstats = await getPlayerStats(steamID); - if (!playerstats) { + if (!playerstats.length) { res.status(404).json({ message: "No stats found for player " + steamID }); return; } @@ -398,7 +397,7 @@ router.get("/:steam_id/official", async (req, res, next) => { let steamID = req.params.steam_id; let seasonId = req.params.season_id; let playerstats = await getPlayerStats(steamID, seasonId); - if (!playerstats) { + if (!playerstats.length) { res.status(404).json({ message: "No stats found for player " + steamID }); return; } diff --git a/routes/seasons.js b/src/routes/seasons.js similarity index 99% rename from routes/seasons.js rename to src/routes/seasons.js index 4fbb4028..cb7b92c0 100644 --- a/routes/seasons.js +++ b/src/routes/seasons.js @@ -6,13 +6,11 @@ import { Router } from "express"; -import config from "config"; - import fetch from "node-fetch"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/routes/servers.js b/src/routes/servers.js similarity index 99% rename from routes/servers.js rename to src/routes/servers.js index a6807eaf..29f0fdb4 100644 --- a/routes/servers.js +++ b/src/routes/servers.js @@ -8,7 +8,7 @@ import { Router } from "express"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import GameServer from "../utility/serverrcon.js"; diff --git a/routes/teams.js b/src/routes/teams.js similarity index 99% rename from routes/teams.js rename to src/routes/teams.js index 439a662e..05009e1b 100644 --- a/routes/teams.js +++ b/src/routes/teams.js @@ -13,7 +13,7 @@ import { Router } from "express"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/routes/users.js b/src/routes/users.js similarity index 99% rename from routes/users.js rename to src/routes/users.js index 25d9f12a..39724e91 100644 --- a/routes/users.js +++ b/src/routes/users.js @@ -9,7 +9,7 @@ import { hashSync, compare } from "bcrypt"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/src/routes/v2/api.ts b/src/routes/v2/api.ts new file mode 100644 index 00000000..76a39d02 --- /dev/null +++ b/src/routes/v2/api.ts @@ -0,0 +1,192 @@ +/** Express API router for game server updates in get5. + * @module routes/v2 + * @requires express + * @requires db + */ + +/** + * @swagger + * resourcePath: /v2 + * description: Express API for v2 API calls in G5API. + */ + +import { Router } from "express"; +/** Express module + * @const + */ +const router: Router = Router(); + +/** Rate limit includes. + * @const + */ +import rateLimit from "express-rate-limit"; + +import { db } from "../../services/db.js"; +import { RowDataPacket } from "mysql2"; +import { Get5_OnEvent } from "../../types/Get5_OnEvent.js"; +import SeriesFlowService from "../../services/seriesflowservices.js"; +import { Get5_OnSeriesResult } from "../../types/series_flow/Get5_OnSeriesResult.js"; +import { Get5_OnMapResult } from "../../types/series_flow/Get5_OnMapResult.js"; +import { Get5_OnMapVetoed } from "../../types/series_flow/veto/Get5_OnMapVetoed.js"; +import { Get5_OnMapPicked } from "../../types/series_flow/veto/Get5_OnMapPicked.js"; +import { Get5_OnSidePicked } from "../../types/series_flow/veto/Get5_OnSidePicked.js"; +import { Get5_OnBackupRestore } from "../../types/series_flow/Get5_OnBackupRestore.js"; +import { Get5_OnGoingLive } from "../../types/map_flow/Get5_OnGoingLive.js"; +import MapFlowService from "../../services/mapflowservices.js"; +import { Get5_OnMatchPausedUnpaused } from "../../types/map_flow/Get5_OnMatchPausedUnpaused.js"; +import { Get5_OnPlayerDeath } from "../../types/map_flow/Get5_OnPlayerDeath.js"; +import { Get5_OnBombEvent } from "../../types/map_flow/Get5_OnBombEvent.js"; +import { Get5_OnRoundStart } from "../../types/map_flow/Get5_OnRoundStart.js"; + +/** Basic Rate limiter. + * @const + */ +const basicRateLimit = rateLimit({ + windowMs: 30 * 30 * 1000, // 15 mins per 30k requests seems like a fair amount. + max: 30000, + message: "Too many requests from this IP. Please try again in 15 minutes.", + keyGenerator: async (req) => { + try { + const apiKey: string | undefined = req.get("Authorization"); + const dbApiKey: RowDataPacket[] = await db.query( + "SELECT api_key FROM `match` WHERE api_key = ?", + [apiKey] + ); + if (dbApiKey[0].api_key) return dbApiKey[0].api_key; + else return req.ip; + } catch (err) { + return req.ip; + } + } +}); + +/** + * @swagger + * + * /v2: + * post: + * description: Retrieves all logged calls from the game server and operates on them as needed, based on the event. + * Please see [events and forwards](http://splewis.github.io/get5/latest/events.html#tag/All-Events/paths/Get_OnEvent/post) + * From the get5 documentation to see what data is required for each event. Typings can also be found in the repository. + * produces: + * - application/json + * tags: + * - v2 + * responses: + * 200: + * description: Success. + * content: + * text/plain: + * schema: + * type: string + * 401: + * $ref: '#/components/responses/Error' + */ +router.post("/", basicRateLimit, async (req, res) => { + let matchId: string = req.body?.matchId; + const apiKey: string | undefined = req.get("Authorization"); + const eventType: Get5_OnEvent = req.body; + + try { + if (!apiKey) { + res.status(401).send({ message: "API key not provided." }); + return; + } + + if (!matchId) { + // Retrieve Match ID from the database. + const dbMatchKey: RowDataPacket[] = await db.query( + "SELECT id FROM `match` WHERE api_key = ?", + [apiKey] + ); + if (!dbMatchKey[0]?.id) { + res.status(401).send({ message: "Match ID has not been provided." }); + return; + } + matchId = dbMatchKey[0].id; + } + + switch (eventType.event) { + // Series Flows + case "map_picked": + SeriesFlowService.OnMapPicked( + apiKey, + req.body as Get5_OnMapPicked, + res + ); + case "map_vetoed": + SeriesFlowService.OnMapVetoed( + apiKey, + req.body as Get5_OnMapVetoed, + res + ); + case "side_picked": + SeriesFlowService.OnSidePicked( + apiKey, + req.body as Get5_OnSidePicked, + res + ); + case "backup_loaded": + SeriesFlowService.OnBackupRestore( + apiKey, + req.body as Get5_OnBackupRestore, + res + ); + case "map_result": + SeriesFlowService.OnMapResult( + apiKey, + req.body as Get5_OnMapResult, + res + ); + case "series_end": + SeriesFlowService.OnSeriesResult( + apiKey, + req.body as Get5_OnSeriesResult, + res + ); + // Map Flows + case "going_live": + MapFlowService.OnGoingLive(apiKey, req.body as Get5_OnGoingLive, res); + case "round_start": + MapFlowService.OnRoundStart(apiKey, req.body as Get5_OnRoundStart, res); + case "player_death": + MapFlowService.OnPlayerDeath( + apiKey, + req.body as Get5_OnPlayerDeath, + res + ); + case "bomb_planted": + MapFlowService.OnBombEvent( + apiKey, + req.body as Get5_OnBombEvent, + res, + false + ); + case "bomb_defused": + MapFlowService.OnBombEvent( + apiKey, + req.body as Get5_OnBombEvent, + res, + true + ); + case "game_paused": + MapFlowService.OnMatchPausedUnPaused( + apiKey, + req.body as Get5_OnMatchPausedUnpaused, + res + ); + case "game_unpaused": + MapFlowService.OnMatchPausedUnPaused( + apiKey, + req.body as Get5_OnMatchPausedUnpaused, + res + ); + } + // Responses are taken care of in the case statements. + return; + } catch (error: unknown) { + return; + } +}); + +export { router }; diff --git a/src/routes/v2/backupapi.ts b/src/routes/v2/backupapi.ts new file mode 100644 index 00000000..162cdb40 --- /dev/null +++ b/src/routes/v2/backupapi.ts @@ -0,0 +1,133 @@ +/** Express API router for remote backup uploads in get5. + * @module routes/v2/demo + * @requires express + * @requires db + */ + +/** + * @swagger + * resourcePath: /v2/demo + * description: Express API for v2 API calls in G5API. + */ + +/** Config to check demo uploads. + * @const + */ +import config from "config"; + +import { db } from "../../services/db.js"; + +import { Request, Response, Router } from "express"; +import Utils from "../../utility/utils.js"; +import { RowDataPacket } from "mysql2"; + +/** + * @const + * Global Server Sent Emitter class for real time data. + */ +import GlobalEmitter from "../../utility/emitter.js"; +import { existsSync, mkdirSync, writeFile } from "fs"; + +/** Express module + * @const + */ +const router: Router = Router(); + +/** + * @swagger + * + * /v2/backup: + * post: + * description: Retrieves the backups from the game servers and stores them in the application. + * produces: + * - application/json + * tags: + * - v2 + * parameters: + * - in: header + * name: Get5-FileName + * description: Name of the backup file coming from the game server. + * schema: + * type: string + * required: true + * - in: header + * name: Get5-MapNumber + * description: Zero-indexed map number in the series. + * schema: + * type: string + * required: true + * - in: header + * name: Get5-RoundNumber + * description: Zero-indexed map number in the series, if the match is not live it is -1. + * schema: + * type: string + * required: true + * - in: header + * name: Authorization + * description: The API key provided by the server. + * schema: + * type: string + * required: true + * - in: header + * name: Get5-MatchId + * description: The ID of the match. + * schema: + * type: string + * required: true + * requestBody: + * content: + * application/octet-stream: + * schema: + * format: binary + * responses: + * 200: + * $ref: '#/components/responses/Success' + * 401: + * $ref: '#/components/responses/Unauthorized' + * 403: + * $ref: '#/components/responses/Unauthorized' + * 404: + * $ref: '#/components/responses/NotFound' + */ +router.post("/", async (req: Request, res: Response) => { + try { + const apiKey: string | undefined = req.get("Authorization"); + const matchId: string | undefined = req.get("Get5-MatchId"); + const mapNumber: string | undefined = req.get("Get5-MapNumber"); + const roundNumber: string | undefined = req.get("Get5-RoundNumber"); + // Check that the values have made it across. + if (!apiKey || !matchId || !mapNumber || !roundNumber) { + res.status(401).send({ + message: "API key, Match ID, Map Number, or Round Number not provided." + }); + return; + } + // Check if our API key is correct. + const matchApiCheck: number = await Utils.checkApiKey(apiKey, matchId); + if (matchApiCheck == 1 || matchApiCheck == 2) { + res.status(401).send({ + message: "Invalid API key has been given." + }); + return; + } + if (!existsSync(`public/backups/${matchId}/`)) + mkdirSync(`public/backups/${matchId}/`, { recursive: true }); + + writeFile( + `public/backups/${matchId}/get5_backup_match${matchId}_map${mapNumber}_round${roundNumber}.cfg`, + req.body, + function (err) { + if (err) { + console.error(err); + throw err; + } + } + ); + res.status(200).send({ message: "Success" }); + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } +}); +export { router }; diff --git a/src/routes/v2/demoapi.ts b/src/routes/v2/demoapi.ts new file mode 100644 index 00000000..8d048570 --- /dev/null +++ b/src/routes/v2/demoapi.ts @@ -0,0 +1,173 @@ +/** Express API router for demo uploads in get5. + * @module routes/v2/demo + * @requires express + * @requires db + */ + +/** + * @swagger + * resourcePath: /v2/demo + * description: Express API for v2 API calls in G5API. + */ + +/** ZIP files. + * @const + */ +import JSZip from "jszip"; + +/** Required to save files. + * @const + */ +import { existsSync, mkdirSync, writeFile } from "fs"; + +/** Config to check demo uploads. + * @const + */ +import config from "config"; + +import { db } from "../../services/db.js"; + +import { Request, Response, Router } from "express"; +import Utils from "../../utility/utils.js"; +import { RowDataPacket } from "mysql2"; + +/** + * @const + * Global Server Sent Emitter class for real time data. + */ +import GlobalEmitter from "../../utility/emitter.js"; + +/** Express module + * @const + */ +const router: Router = Router(); + +/** + * @swagger + * + * /v2/demo: + * post: + * description: Retrieves the demos from the given match and map, zips and stores them on the server. + * produces: + * - application/json + * tags: + * - v2 + * parameters: + * - in: header + * name: Get5-FileName + * description: Name of the file as defined by get5_demo_name_format + * schema: + * type: string + * required: true + * - in: header + * name: Get5-MapNumber + * description: Zero-indexed map number in the series. + * schema: + * type: string + * required: true + * - in: header + * name: Authorization + * description: The API key provided by the server. + * schema: + * type: string + * required: true + * - in: header + * name: Get5-MatchId + * description: The ID of the match. + * schema: + * type: string + * required: true + * requestBody: + * content: + * application/octet-stream: + * schema: + * format: binary + * responses: + * 200: + * $ref: '#/components/responses/Success' + * 401: + * $ref: '#/components/responses/Unauthorized' + * 403: + * $ref: '#/components/responses/Unauthorized' + * 404: + * $ref: '#/components/responses/NotFound' + */ +router.post("/", async (req: Request, res: Response) => { + if (!config.get("server.uploadDemos")) { + res.status(403).send({ message: "Demo uploads disabled for this server." }); + return; + } + try { + const apiKey: string | undefined = req.get("Authorization"); + const matchId: string | undefined = req.get("Get5-MatchId"); + const mapNumber: string | undefined = req.get("Get5-MapNumber"); + const demoFilename: string | undefined = req.get("Get5-FileName"); + // Check that the values have made it across. + if (!apiKey || !matchId || !mapNumber || !demoFilename) { + res + .status(401) + .send({ message: "API key, Match ID, or Map Number not provided." }); + return; + } + // Check if our API key is correct. + const matchApiCheck: number = await Utils.checkApiKey(apiKey, matchId); + if (matchApiCheck == 1) { + res.status(401).send({ + message: "Invalid API key has been given." + }); + return; + } + // Begin file compression into public/demos and check time variance of 8 minutes. + let zip: JSZip = new JSZip(); + let sqlString: string = + "SELECT id, end_time FROM map_stats WHERE match_id = ? AND map_number = ?"; + const mapInfo: RowDataPacket[] = await db.query(sqlString, [ + matchId, + mapNumber + ]); + if (mapInfo.length == 0) { + res.status(404).send({ message: "Failed to find map stats object." }); + return; + } + let currentDate: Date = new Date(); + let endTimeMs: Date = new Date(mapInfo[0].end_time); + let timeDifference: number = Math.abs( + currentDate.getTime() - endTimeMs.getTime() + ); + let minuteDifference = Math.floor(timeDifference / 1000 / 60); + let updateStmt: object; + if (minuteDifference > 8) { + res.status(401).json({ message: "Demo can no longer be uploaded." }); + return; + } + + zip.file(demoFilename, req.body, { binary: true }); + zip + .generateAsync({ type: "nodebuffer", compression: "DEFLATE" }) + .then((buf) => { + writeFile("public/demos" + demoFilename, buf, "binary", function (err) { + if (err) { + console.error(err); + throw err; + } + }); + }); + // Update map stats object to include the link to the demo. + updateStmt = { + demoFile: demoFilename.replace("dem", "zip") + }; + updateStmt = await db.buildUpdateStatement(updateStmt); + + sqlString = "UPDATE map_stats SET ? WHERE id = ?"; + await db.query(sqlString, [mapInfo[0].id]); + GlobalEmitter.emit("demoUpdate"); + res.status(200).send({message: "Success"}); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } +}); + +export { router }; diff --git a/routes/vetoes.js b/src/routes/vetoes.js similarity index 99% rename from routes/vetoes.js rename to src/routes/vetoes.js index 071a025d..37f7b6db 100644 --- a/routes/vetoes.js +++ b/src/routes/vetoes.js @@ -4,11 +4,10 @@ * description: Express API router for vetoes in get5. */ import { Router } from "express"; -import app from "../app.js"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/routes/vetosides.js b/src/routes/vetosides.js similarity index 99% rename from routes/vetosides.js rename to src/routes/vetosides.js index b5f9be99..f3dcdbb8 100644 --- a/routes/vetosides.js +++ b/src/routes/vetosides.js @@ -4,11 +4,10 @@ * description: Express API router for veto sides in get5. */ import { Router } from "express"; -import app from "../app.js"; const router = Router(); -import db from "../db.js"; +import {db} from "../services/db.js"; import Utils from "../utility/utils.js"; diff --git a/src/services/challonge.ts b/src/services/challonge.ts new file mode 100644 index 00000000..2db1e71a --- /dev/null +++ b/src/services/challonge.ts @@ -0,0 +1,147 @@ +/** Fetch for Challonge API integration. + * @const + */ +import fetch from "node-fetch"; + +import Utils from "../utility/utils.js"; + +/** Database module. + * @const + */ +import {db} from "../services/db.js"; + + +/** + * @const + * Global Server Sent Emitter class for real time data. + */ +import GlobalEmitter from "../utility/emitter.js"; + +/*** A PUT call to Challonge to update a match that is currently being played. + * @function + * @memberof module:legacy/api + * @param {number} match_id - The internal ID of the match being played. + * @param {number} season_id - The internal ID of the current season of the match being played. + * @param {number} team1_id - The internal team ID of the first team. + * @param {number} team2_id - The internal team ID of the second team. + * @param {number} num_maps - The number of maps in the current match. + * @param {string} [winner=null] - The string value representing the winner of the match. + */ +export default +async function update_challonge_match( + match_id: number | string, + season_id: number, + team1_id: number, + team2_id: number, + num_maps: number, + winner: string | null = null +) { + // Check if a match has a season ID. + let sql: string = + "SELECT id, challonge_url, user_id FROM season WHERE id = ?"; + let team1Score: number; + let team2Score: number; + const seasonInfo: any = await db.query(sql, [season_id]); + if (seasonInfo[0].challonge_url) { + sql = "SELECT challonge_team_id FROM team WHERE id = ?"; + const team1ChallongeId: any = await db.query(sql, [team1_id]); + const team2ChallongeId: any = await db.query(sql, [team2_id]); + + // Grab API key. + sql = "SELECT challonge_api_key FROM user WHERE id = ?"; + const challongeAPIKey: any = await db.query(sql, [seasonInfo[0].user_id]); + let decryptedKey: string | null | undefined = Utils.decrypt( + challongeAPIKey[0].challonge_api_key + ); + // Get info of the current open match with the two IDs. + let challongeResponse = await fetch( + "https://api.challonge.com/v1/tournaments/" + + seasonInfo[0].challonge_url + + "/matches.json?api_key=" + + decryptedKey + + "&state=open&participant_id=" + + team1ChallongeId[0].challonge_team_id + + "&participant_id=" + + team2ChallongeId[0].challonge_team_id + ); + let challongeData: any = await challongeResponse.json(); + if (challongeData) { + if (num_maps == 1) { + // Submit the map stats scores instead. + sql = + "SELECT team1_score, team2_score FROM map_stats WHERE match_id = ?"; + } else { + sql = "SELECT team1_score, team2_score FROM `match` WHERE id = ?"; + } + const mapStats: any = await db.query(sql, [match_id]); + // Admins may just make a match that has teams swapped. This is okay as we can change what we + // report to Challonge. + team1Score = + challongeData[0].match.player1_id == + team1ChallongeId[0].challonge_team_id + ? mapStats[0].team1_score + : mapStats[0].team2_score; + team2Score = + challongeData[0].match.player2_id == + team2ChallongeId[0].challonge_team_id + ? mapStats[0].team2_score + : mapStats[0].team1_score; + // Build the PUT body. + let putBody = { + api_key: decryptedKey, + match: { + scores_csv: `${team1Score}-${team2Score}`, + winner_id: + winner === "team1" + ? team1ChallongeId[0].challonge_team_id + : team2ChallongeId[0].challonge_team_id + } + }; + // If we're just updating the score, remove this. + if (winner === null) { + delete putBody.match.winner_id; + } + await fetch( + "https://api.challonge.com/v1/tournaments/" + + seasonInfo[0].challonge_url + + "/matches/" + + challongeData[0].match.id + + ".json", + { + method: "PUT", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(putBody) + } + ); + // Check and see if any matches remain, if not, finalize the tournament. + challongeResponse = await fetch( + "https://api.challonge.com/v1/tournaments/" + + seasonInfo[0].challonge_url + + "/matches.json?api_key=" + + decryptedKey + + "&state=open" + ); + challongeData = await challongeResponse.json(); + if (!challongeData) { + await fetch( + "https://api.challonge.com/v1/tournaments/" + + seasonInfo[0].challonge_url + + "finalize.json?api_key=" + + decryptedKey, + { + method: "POST" + } + ); + // If we are the last map, let's close off the season as well. + sql = "UPDATE season SET end_date = ? WHERE id = ?"; + await db.query(sql, [ + new Date().toISOString().slice(0, 19).replace("T", " "), + seasonInfo[0].id + ]); + GlobalEmitter.emit("seasonUpdate"); + } + } + } +} \ No newline at end of file diff --git a/db.js b/src/services/db.ts similarity index 58% rename from db.js rename to src/services/db.ts index ff7f722b..45401aae 100644 --- a/db.js +++ b/src/services/db.ts @@ -1,7 +1,10 @@ /*Database driver.*/ import { createPool } from 'mysql2/promise'; import config from 'config'; - +import { FieldPacket, PoolOptions, RowDataPacket } from 'mysql2/typings/mysql'; +interface IStringIndex { + [key: string]: any; +} const dbCfg = { host: config.get(process.env.NODE_ENV+".host"), port: config.get(process.env.NODE_ENV+".port"), @@ -9,7 +12,7 @@ const dbCfg = { password: config.get(process.env.NODE_ENV+".password"), database: config.get(process.env.NODE_ENV+".database"), connectionLimit: config.get(process.env.NODE_ENV+".connectionLimit") -} +} as PoolOptions; const connPool = createPool(dbCfg); class Database { @@ -17,37 +20,37 @@ class Database { this.setupAdmins(); } - async query(sql, args) { + async query(sql: string, args?: object) { try { - let result; - result = await connPool.query(sql, args); + let result: [RowDataPacket[], FieldPacket[]]; + result = await connPool.query(sql, args); return result[0]; } catch (error) { - console.log("SQL ERROR SQL ERROR SQL ERROR SQL ERROR SQL ERROR\n" + error); + console.error("SQL ERROR SQL ERROR SQL ERROR SQL ERROR SQL ERROR\n" + error); throw error; } } - - async buildUpdateStatement(objValues){ + + async buildUpdateStatement(objValues: IStringIndex){ for (let key in objValues) { - if (objValues[key] == null) delete objValues[key]; + if (objValues[key] == null || objValues[key] == undefined) delete objValues[key]; } return objValues; } async setupAdmins() { try { - let listOfAdmins = config.get("admins.steam_ids").split(','); - let listofSuperAdmins = config.get("super_admins.steam_ids").split(','); + let listOfAdmins = (config.get("admins.steam_ids") as string).split(','); + let listofSuperAdmins = (config.get("super_admins.steam_ids") as string).split(','); // Get list of admins from database and compare list and add new admins. let updateAdmins = "UPDATE user SET admin = 1 WHERE steam_id IN (?)"; let updateSuperAdmins = "UPDATE user SET super_admin = 1 WHERE steam_id in(?)"; await connPool.query(updateAdmins, [listOfAdmins]); await connPool.query(updateSuperAdmins, [listofSuperAdmins]); } catch (err) { - console.log("Failed to import users. " + err); + console.error("Failed to import users. " + err); } } } - -export default new Database(); +let db = new Database(); +export {db}; diff --git a/src/services/mapflowservices.ts b/src/services/mapflowservices.ts new file mode 100644 index 00000000..915026a6 --- /dev/null +++ b/src/services/mapflowservices.ts @@ -0,0 +1,648 @@ +/** Service class for all map flow related logic during a live game. + * @module routes/v2 + * @requires express + * @requires db + */ +import { db } from "./db.js"; + +/** + * @const + * Global Server Sent Emitter class for real time data. + */ +import GlobalEmitter from "../utility/emitter.js"; + +/** + * @const + * Utility library to check API key validity. + */ +import Utils from "../utility/utils.js"; +import { Get5_OnGoingLive } from "../types/map_flow/Get5_OnGoingLive.js"; +import { Response } from "express"; +import { RowDataPacket } from "mysql2"; +import { Get5_OnMatchPausedUnpaused } from "../types/map_flow/Get5_OnMatchPausedUnpaused.js"; +import { Get5_OnPlayerDeath } from "../types/map_flow/Get5_OnPlayerDeath.js"; +import { Get5_OnBombEvent } from "../types/map_flow/Get5_OnBombEvent.js"; +import { Get5_OnRoundEnd } from "../types/map_flow/Get5_OnRoundEnd.js"; +import SeriesFlowService from "./seriesflowservices.js"; +import { Get5_OnRoundStart } from "../types/map_flow/Get5_OnRoundStart.js"; +import { Get5_Player } from "../types/Get5_Player.js"; + +/** + * @class + * Map flow service class for live games. + */ +class MapFlowService { + /** + * Updates the database and emits mapStatUpdate when the map has gone live. + * @param {string} apiKey The API key set by the API and given to the server. + * @param {Get5_OnGoingLive} event The OnGoingLive event provided from the game server. + * @param {Response} res The express response object to send status responses to the game server. + */ + static async OnGoingLive( + apiKey: string, + event: Get5_OnGoingLive, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + let sqlString: string; + let mapStatInfo: RowDataPacket[]; + let vetoInfo: RowDataPacket[]; + let startTime: string = new Date() + .toISOString() + .slice(0, 19) + .replace("T", " "); + let insUpdStatement: object; + let mapName: string; + let matchInfo: RowDataPacket[]; + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + sqlString = "SELECT map FROM veto WHERE match_id = ? ORDER BY id"; + vetoInfo = await db.query(sqlString, [event.matchid]); + if (vetoInfo.length) { + mapName = vetoInfo[event.map_number].map; + } else { + sqlString = "SELECT veto_mappool FROM `match` WHERE id = ?"; + matchInfo = await db.query(sqlString, [event.matchid]); + mapName = matchInfo[0].veto_mappool.split(" ")[event.map_number]; + } + sqlString = + "SELECT id FROM map_stats WHERE match_id = ? AND map_number = ?"; + mapStatInfo = await db.query(sqlString, [ + event.matchid, + event.map_number + ]); + if (mapStatInfo.length) { + insUpdStatement = { + map_number: event.map_number, + map_name: mapName + }; + sqlString = + "UPDATE map_stats SET ? WHERE match_id = ? AND map_number = ?"; + insUpdStatement = await db.buildUpdateStatement(insUpdStatement); + await db.query(sqlString, insUpdStatement); + } else { + insUpdStatement = { + match_id: event.matchid, + map_number: event.map_number, + map_name: mapName, + start_time: startTime, + team1_score: 0, + team2_score: 0 + }; + sqlString = "INSERT INTO map_stats SET ?"; + await db.query(sqlString, insUpdStatement); + GlobalEmitter.emit("mapStatUpdate"); + res.status(200).send({ message: "Success" }); + return; + } + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + /** + * Updates the database and emits playerStatsUpdate when a player has died. + * @param {string} apiKey The API key set by the API and given to the server. + * @param {Get5_OnPlayerDeath} event The Get5_OnPlayerDeath event provided from the game server. + * @param {Response} res The express response object to send status responses to the game server. + */ + static async OnPlayerDeath( + apiKey: string, + event: Get5_OnPlayerDeath, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + // We do not care about bot deaths for live stats. + if (event.player.is_bot) { + res + .status(200) + .send({ message: "Bot players do not count towards stats." }); + return; + } + let sqlString: string; + let mapInfo: RowDataPacket[]; + let insertObj: object; + let playerTeamId: RowDataPacket[]; + let playerStatVals: RowDataPacket[]; + sqlString = + "SELECT id FROM map_stats WHERE match_id = ? AND map_number = ?"; + mapInfo = await db.query(sqlString, [event.matchid, event.map_number]); + + sqlString = + "SELECT team_id FROM team_auth_names JOIN `match` m " + + "ON (m.team1_id = team_id OR m.team2_id = team_id) WHERE m.id = ? AND auth = ?"; + playerTeamId = await db.query(sqlString, [event.player.steamid]); + insertObj = { + match_id: event.matchid, + map_id: mapInfo[0].id, + team_id: playerTeamId[0].team_id, + player_steam_id: event.player.steamid, + player_name: event.player.name, + player_side: event.player.side, + round_number: event.round_number, + round_time: event.round_time, + attacker_steam_id: event.attacker.steamid, + attacker_name: event.attacker.name, + attacker_side: event.attacker.side, + weapon: event.weapon.name, + bomb: event.bomb, + headshot: event.headshot, + thru_smoke: event.thru_smoke, + attacker_blind: event.attacker_blind, + no_scope: event.no_scope, + suicide: event.suicide, + friendly_fire: event.friendly_fire, + assister_steam_id: event.assist.player.steamid, + assister_name: event.assist.player.name, + assister_side: event.assist.player.side, + assist_friendly_fire: event.assist.friendly_fire, + flash_assist: event.assist.flash_assist + }; + insertObj = await db.buildUpdateStatement(insertObj); + sqlString = "INSERT INTO player_stat_extras SET ?"; + await db.query(sqlString, insertObj); + + // Update player stats for what we can here, start with the victim. + sqlString = + "SELECT id, deaths, suicides FROM player_stats WHERE match_id = ? AND map_id = ? AND steam_id = ?"; + playerStatVals = await db.query(sqlString, [ + event.matchid, + mapInfo[0].id, + event.player.steamid + ]); + + if (playerStatVals.length) { + sqlString = "UPDATE player_stats SET ? WHERE id = ?"; + insertObj = { + deaths: playerStatVals[0].deaths + 1, + suicides: event.suicide ? playerStatVals[0].suicides + 1 : null + }; + insertObj = await db.buildUpdateStatement(insertObj); + await db.query(sqlString, [insertObj, playerStatVals[0].id]); + } else { + sqlString = "INSERT INTO player_stats SET ?"; + insertObj = { + match_id: event.matchid, + map_id: mapInfo[0].id, + team_id: playerTeamId[0].team_id, + steam_id: event.player.steamid, + name: event.player.name, + deaths: 1, + suicides: event.suicide ? 1 : null + }; + insertObj = await db.buildUpdateStatement(insertObj); + await db.query(sqlString, insertObj); + } + + if (event.attacker) { + sqlString = + "SELECT id, kills, headshot_kills, teamkills, knife_kills FROM player_stats WHERE match_id = ? AND map_id = ? AND steam_id = ?"; + playerStatVals = await db.query(sqlString, [ + event.matchid, + mapInfo[0].id, + event.attacker.steamid + ]); + if (playerStatVals.length) { + sqlString = "UPDATE player_stats SET ? WHERE id = ?"; + insertObj = { + kills: playerStatVals[0].kills + 1, + headshot_kills: event.headshot + ? playerStatVals[0].headshot_kills + 1 + : null, + teamkills: event.friendly_fire + ? playerStatVals[0].teamkills + 1 + : null, + knife_kills: + event.weapon.id == 28 || + event.weapon.id == 50 || + event.weapon.id == 28 || + event.weapon.id == 59 || + event.weapon.id == 80 || + event.weapon.id > 500 + ? playerStatVals[0].knife_kills + 1 + : null + }; + insertObj = await db.buildUpdateStatement(insertObj); + await db.query(sqlString, [insertObj, playerStatVals[0].id]); + } else { + sqlString = + "SELECT team_id FROM team_auth_names JOIN `match` m " + + "ON (m.team1_id = team_id OR m.team2_id = team_id) WHERE m.id = ? AND auth = ?"; + playerStatVals = await db.query(sqlString, [event.attacker.steamid]); + sqlString = "INESRT INTO player_stats SET ?"; + insertObj = { + match_id: event.matchid, + map_id: mapInfo[0].id, + team_id: playerStatVals[0].team_id, + steam_id: event.attacker.steamid, + kills: 1, + headshot_kills: event.headshot ? 1 : null, + teamkills: event.friendly_fire ? 1 : null, + knife_kills: + event.weapon.id == 28 || + event.weapon.id == 50 || + event.weapon.id == 28 || + event.weapon.id == 59 || + event.weapon.id == 80 || + event.weapon.id > 500 + ? 1 + : null + }; + insertObj = await db.buildUpdateStatement(insertObj); + await db.query(sqlString, insertObj); + } + } + + if (event.assist) { + sqlString = + "SELECT id, assists, flashbang_assists FROM player_stats WHERE match_id = ? AND map_id = ? AND steam_id = ?"; + playerStatVals = await db.query(sqlString, [ + event.matchid, + mapInfo[0].id, + event.assist.player.steamid + ]); + if (playerStatVals.length) { + sqlString = "UPDATE player_stats SET ? WHERE id = ?"; + insertObj = { + assists: playerStatVals[0].assists + 1, + flashbang_assists: event.assist.flash_assist + ? playerStatVals[0].flashbang_assists + 1 + : null + }; + insertObj = await db.buildUpdateStatement(insertObj); + await db.query(sqlString, [insertObj, playerStatVals[0].id]); + } else { + sqlString = + "SELECT team_id FROM team_auth_names JOIN `match` m " + + "ON (m.team1_id = team_id OR m.team2_id = team_id) WHERE m.id = ? AND auth = ?"; + playerStatVals = await db.query(sqlString, [ + event.assist.player.steamid + ]); + sqlString = "INESRT INTO player_stats SET ?"; + insertObj = { + match_id: event.matchid, + map_id: mapInfo[0].id, + team_id: playerStatVals[0].team_id, + steam_id: event.assist.player.steamid, + assists: 1, + flashbang_assists: event.assist.flash_assist ? 1 : null + }; + insertObj = await db.buildUpdateStatement(insertObj); + await db.query(sqlString, insertObj); + } + } + GlobalEmitter.emit("playerStatsUpdate"); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + /** + * Updates the database and emits bombEvent when a bomb has been planted or defused. + * @param {string} apiKey The API key set by the API and given to the server. + * @param {Get5_OnBombEvent} event The Get5_OnBombEvent event provided from the game server. + * @param {Response} res The express response object to send status responses to the game server. + */ + static async OnBombEvent( + apiKey: string, + event: Get5_OnBombEvent, + res: Response, + defused: boolean + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + let sqlString: string; + let mapInfo: RowDataPacket[]; + let playerStatInfo: RowDataPacket[]; + let insObject: object; + if (event.player.is_bot) { + res + .status(200) + .send({ message: "Bot players do not count towards stats." }); + return; + } + sqlString = + "SELECT id FROM map_stats WHERE match_id = ? AND map_number = ?"; + mapInfo = await db.query(sqlString, [event.matchid, event.map_number]); + sqlString = + "SELECT id FROM player_stats WHERE match_id = ? AND map_id = ? AND steam_id = ?"; + playerStatInfo = await db.query(sqlString, [ + event.matchid, + mapInfo[0].id, + event.player.steamid + ]); + + insObject = { + match_id: event.matchid, + map_id: mapInfo[0].id, + player_stat_id: playerStatInfo[0].id, + round_number: event.round_number, + round_time: event.round_time, + site: event.site, + defused: defused, + bomb_time_remaining: event?.bomb_time_remaining + }; + + insObject = await db.buildUpdateStatement(insObject); + sqlString = "INSERT INTO match_bomb_plants SET ?"; + await db.query(sqlString, insObject); + GlobalEmitter.emit("bombEvent"); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + /** + * Updates the database and emits playerStatsUpdate when a round has ended. + * @param {string} apiKey The API key set by the API and given to the server. + * @param {Get5_OnRoundEnd} event The Get5_OnRoundEnd event provided from the game server. + * @param {Response} res The express response object to send status responses to the game server. + */ + static async OnRoundEnd( + apiKey: string, + event: Get5_OnRoundEnd, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + let sqlString: string = + "SELECT id FROM map_stats WHERE match_id = ? AND map_number = ?"; + let insUpdStatement: object; + let mapStatInfo: RowDataPacket[]; + let playerStats: RowDataPacket[]; + let singlePlayerStat: RowDataPacket[]; + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + mapStatInfo = await db.query(sqlString, [ + event.matchid, + event.map_number + ]); + sqlString = + "SELECT * FROM player_stats WHERE match_id = ? AND map_id = ?"; + playerStats = await db.query(sqlString, [ + event.matchid, + mapStatInfo[0].id + ]); + for (let player of event.team1.players) { + singlePlayerStat = playerStats.filter( + (dbPlayer) => dbPlayer.steam_id == player.steamid + ); + await this.updatePlayerStats( + event, + mapStatInfo[0].id, + player, + singlePlayerStat[0].id + ); + } + for (let player of event.team2.players) { + singlePlayerStat = playerStats.filter( + (dbPlayer) => dbPlayer.steam_id == player.steamid + ); + await this.updatePlayerStats( + event, + mapStatInfo[0].id, + player, + singlePlayerStat[0].id + ); + } + GlobalEmitter.emit("playerStatsUpdate"); + res.status(200).send({ message: "Success" }); + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + /** + * Private helper function to update player stats based on a team. + * @param {Get5_OnRoundEnd} event The Get5_OnRoundEnd event. + * @param {number} mapId The map ID from the database. + * @param {Get5_Player} player The Get5_Player structure. + * @param {number} playerId The player ID from the database. + */ + private static async updatePlayerStats( + event: Get5_OnRoundEnd, + mapId: number, + player: Get5_Player, + playerId: number | null + ) { + let insUpdStatement: object; + let sqlString: string; + insUpdStatement = { + match_id: event.matchid, + map_id: mapId, + team_id: event.team1.id, + steam_id: player.steamid, + name: player.name, + kills: player.stats?.kills, + deaths: player.stats?.deaths, + roundsplayed: player.stats?.rounds_played, + assists: player.stats?.assists, + flashbang_assists: player.stats?.flash_assists, + teamkills: player.stats?.team_kills, + knife_kills: player.stats?.knife_kills, + suicides: player.stats?.suicides, + headshot_kills: player.stats?.headshot_kills, + damage: player.stats?.damage, + util_damage: player.stats?.utility_damage, + enemies_flashed: player.stats?.enemies_flashed, + friendlies_flashed: player.stats?.friendlies_flashed, + bomb_plants: player.stats?.bomb_plants, + bomb_defuses: player.stats?.bomb_defuses, + v1: player.stats?.["1v1"], + v2: player.stats?.["1v2"], + v3: player.stats?.["1v3"], + v4: player.stats?.["1v4"], + v5: player.stats?.["1v5"], + k1: player.stats?.["1k"], + k2: player.stats?.["2k"], + k3: player.stats?.["3k"], + k4: player.stats?.["4k"], + k5: player.stats?.["5k"], + firstdeath_ct: player.stats?.first_deaths_ct, + firstdeath_t: player.stats?.first_deaths_t, + firstkill_ct: player.stats?.first_kills_ct, + firstkill_t: player.stats?.first_kills_t, + kast: player.stats?.kast, + contribution_score: player.stats?.score, + mvp: player.stats?.mvp + }; + + insUpdStatement = await db.buildUpdateStatement(insUpdStatement); + + if (playerId) { + sqlString = "UPDATE player_stats SET ? WHERE id = ?"; + await db.query(sqlString, [insUpdStatement, playerId]); + } else { + sqlString = "INSERT INTO player_stats SET ?"; + await db.query(sqlString, insUpdStatement); + } + } + + /** + * Updates the database and emits playerStatsUpdate when a round has been restored and the match has started again. + * @param {string} apiKey The API key set by the API and given to the server. + * @param {Get5_OnRoundStart} event The Get5_OnRoundStart event provided from the game server. + * @param {Response} res The express response object to send status responses to the game server. + */ + static async OnRoundStart( + apiKey: string, + event: Get5_OnRoundStart, + res: Response + ) { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + let sqlString: string; + let mapStatInfo: RowDataPacket[]; + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + } + // Check if round was backed up and nuke the additional player stats and bomb plants. + if (SeriesFlowService.wasRoundRestored) { + sqlString = + "SELECT id FROM map_stats WHERE match_id = ? AND map_number = ?"; + mapStatInfo = await db.query(sqlString, [ + event.matchid, + event.map_number + ]); + + sqlString = + "DELETE FROM match_bomb_plants WHERE round_number > ? AND match_id = ? AND map_id = ?"; + await db.query(sqlString, [ + event.round_number, + event.matchid, + mapStatInfo[0].id + ]); + + sqlString = + "DELETE FROM player_stat_extras WHERE match_id = ? AND map_id = ? AND round_number > ?"; + await db.query(sqlString, [ + event.matchid, + mapStatInfo[0].id, + event.round_number + ]); + SeriesFlowService.wasRoundRestored = false; + } + GlobalEmitter.emit("playerStatsUpdate"); + res.status(200).send({ message: "Success" }); + return; + } + + /** + * Updates the database and emits matchUpdate when a match has been paused or unpaused. + * @param {string} apiKey The API key set by the API and given to the server. + * @param {Get5_OnMatchPausedUnpaused} event The Get5_OnMatchPausedUnpaused event provided from the game server. + * @param {Response} res The express response object to send status responses to the game server. + */ + static async OnMatchPausedUnPaused( + apiKey: string, + event: Get5_OnMatchPausedUnpaused, + res: Response + ) { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + let sqlString: string; + let matchInfo: RowDataPacket[]; + let pauseInfo: RowDataPacket[]; + let insUpdStatement: object; + let teamPaused: string; + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + sqlString = "SELECT team1_string, team2_string FROM `match` WHERE id = ?"; + matchInfo = await db.query(sqlString, [event.matchid]); + + sqlString = "SELECT * FROM match_pause WHERE match_id = ?"; + pauseInfo = await db.query(sqlString, [event.matchid]); + + if (event.team == "team1") teamPaused = matchInfo[0].team1_string; + else if (event.team == "team2") teamPaused = matchInfo[0].team1_string; + else teamPaused = "Admin"; + + if (pauseInfo.length) { + sqlString = "UPDATE match_pause SET ? WHERE match_id = ?"; + insUpdStatement = { + pause_type: event.pause_type, + team_paused: teamPaused, + paused: event.event == "game_paused" ? true : false + }; + insUpdStatement = await db.buildUpdateStatement(insUpdStatement); + await db.query(sqlString, insUpdStatement); + } else { + sqlString = "INSERT INTO match_pause SET ?"; + insUpdStatement = { + match_id: event.matchid, + pause_type: event.pause_type, + team_paused: teamPaused, + paused: event.event == "game_paused" ? true : false + }; + insUpdStatement = await db.buildUpdateStatement(insUpdStatement); + await db.query(sqlString, insUpdStatement); + } + GlobalEmitter.emit("matchUpdate"); + res.status(200).send({ message: "Success" }); + return; + } +} + +export default MapFlowService; diff --git a/src/services/seriesflowservices.ts b/src/services/seriesflowservices.ts new file mode 100644 index 00000000..1579b906 --- /dev/null +++ b/src/services/seriesflowservices.ts @@ -0,0 +1,441 @@ +import { db } from "./db.js"; +import { Get5_OnSeriesResult } from "../types/series_flow/Get5_OnSeriesResult.js"; +import { Get5_OnMapVetoed } from "../types/series_flow/veto/Get5_OnMapVetoed.js"; +import { Get5_OnMapPicked } from "../types/series_flow/veto/Get5_OnMapPicked.js"; +import { Get5_OnSidePicked } from "../types/series_flow/veto/Get5_OnSidePicked.js"; +import { Get5_OnBackupRestore } from "../types/series_flow/Get5_OnBackupRestore.js"; +import { Get5_OnMapResult } from "../types/series_flow/Get5_OnMapResult.js"; +import GlobalEmitter from "../utility/emitter.js"; +import { RowDataPacket } from "mysql2"; +import { Response } from "express"; +import Utils from "../utility/utils.js"; +import update_challonge_match from "../services/challonge.js"; + +class SeriesFlowService { + static wasRoundRestored: boolean = false; + static async OnSeriesResult( + apiKey: string, + event: Get5_OnSeriesResult, + res: Response + ) { + try { + // Check if match has been finalized. + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + let winnerId: number | null = null; + let cancelled: number | null = null; + let endTime: string = new Date() + .toISOString() + .slice(0, 19) + .replace("T", " "); + let updateObject: {}; + // As of right now there is no way to track forfeits via API calls. + // let forfeit: number = event. + // Match is finalized, this is usually called after a cancel so we just ignore the value with a 200 response. + if (matchApiCheck == 2) { + res.status(200).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } else if (matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + + const matchInfo: RowDataPacket[] = await db.query( + "SELECT team1_id, team2_id, max_maps, start_time, server_id, is_pug, season_id FROM `match` WHERE id = ?", + [event.matchid] + ); + if (event.winner.team === "team1") winnerId = matchInfo[0]?.team1_id; + else if (event.winner.team === "team2") winnerId = matchInfo[0]?.team2_id; + // BO2 situation. + else if ( + event.winner.team === "none" && + matchInfo[0].max_maps != 2 && + event.team1_series_score == 0 && + event.team2_series_score == 0 + ) { + winnerId = null; + cancelled = 1; + } + + updateObject = { + winner: winnerId, + team1_score: event.team1_series_score, + team2_score: event.team2_series_score, + start_time: + matchInfo[0].start_time || + new Date().toISOString().slice(0, 19).replace("T", " "), + end_time: endTime, + cancelled: cancelled + }; + + updateObject = await db.buildUpdateStatement(updateObject); + let updateSql: string = "UPDATE `match` SET ? WHERE id = ?"; + await db.query(updateSql, [updateObject, event.matchid]); + // Set server to not be in use. + updateSql = "UPDATE game_server SET in_use = 0 WHERE id = ?"; + await db.query(updateSql, [matchInfo[0].server_id]); + + // Check if we are pugging. + if (matchInfo[0].is_pug != null && matchInfo[0].is_pug == 1) { + let mapStatSql: string = + "SELECT id FROM map_stats WHERE match_id = ? ORDER BY map_number DESC"; + const finalMapStatInfo: RowDataPacket[] = await db.query(mapStatSql, [ + event.matchid + ]); + let mapStatInfoId: number | null = finalMapStatInfo[0]?.id; + let newMapStatObject: RowDataPacket[]; + if (!finalMapStatInfo.length) { + let newMapStatStmt: object = { + start_time: new Date().toISOString().slice(0, 19).replace("T", " "), + end_time: new Date().toISOString().slice(0, 19).replace("T", " "), + winner: null, + team1_score: 0, + team2_score: 0, + match_id: event.matchid + }; + mapStatSql = "INSERT map_stats SET ?"; + newMapStatObject = await db.query(mapStatSql, [newMapStatStmt]); + mapStatInfoId = newMapStatObject[0].insert_id; + } + await Utils.updatePugStats( + event.matchid, + mapStatInfoId!, + matchInfo[0].team1_id, + matchInfo[0].team2_id, + winnerId! + ); + } + + // Check if a match has a season ID and we're not cancelled. + if (matchInfo[0].season_id && !cancelled) { + await update_challonge_match( + event.matchid, + matchInfo[0].season_id, + matchInfo[0].team1_id, + matchInfo[0].team2_id, + matchInfo[0].max_maps, + event.winner.team + ); + } + GlobalEmitter.emit("matchUpdate"); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + static async OnMapResult( + apiKey: string, + event: Get5_OnMapResult, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + let updateStmt: object = {}; + let sqlString: string; + let matchInfo: RowDataPacket[]; + let mapInfo: RowDataPacket[]; + let mapEndTime: string = new Date() + .toISOString() + .slice(0, 19) + .replace("T", " "); + let winnerId: number | null | string = null; + + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + sqlString = + "SELECT is_pug, max_maps, season_id FROM `match` WHERE id = ?"; + matchInfo = await db.query(sqlString, [event.matchid]); + sqlString = + "SELECT id FROM `map_stats` WHERE match_id = ? AND map_number = ?"; + mapInfo = await db.query(sqlString, [event.matchid, event.map_number]); + if (mapInfo.length < 1) { + res.status(404).send({ message: "Failed to find map stats object." }); + return; + } + if (event.winner.team == "team1") { + winnerId = event.team1.id; + } else if (event.winner.team == "team2") { + winnerId = event.team2.id; + } + updateStmt = { + end_time: mapEndTime, + winner: winnerId + }; + + sqlString = "UPDATE map_stats SET ? WHERE id = ?"; + updateStmt = await db.buildUpdateStatement(updateStmt); + await db.query(sqlString, [updateStmt, mapInfo[0].id]); + + // Update match table. + updateStmt = { + team1_score: event.team1.series_score, + team2_score: event.team2.series_score + }; + + updateStmt = await db.buildUpdateStatement(updateStmt); + sqlString = "UPDATE `match` SET ? WHERE ID = ?"; + await db.query(sqlString, [updateStmt, event.matchid]); + + if (matchInfo[0].is_pug != null && matchInfo[0].is_pug == 1) { + await Utils.updatePugStats( + event.matchid, + mapInfo[0].id, + +event.team1.id, + +event.team2.id, + +winnerId!, + false + ); + } + + GlobalEmitter.emit("mapStatUpdate"); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + static async OnMapVetoed( + apiKey: string, + event: Get5_OnMapVetoed, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + await this.insertPickOrBan( + "veto", + event.matchid, + event.map_name, + event.team + ); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + static async OnMapPicked( + apiKey: string, + event: Get5_OnMapPicked, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + await this.insertPickOrBan( + "pick", + event.matchid, + event.map_name, + event.team + ); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + static async OnSidePicked( + apiKey: string, + event: Get5_OnSidePicked, + res: Response + ) { + try { + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + let sqlString: string = + "SELECT team1_id, team2_id FROM `match` WHERE id = ?"; + let teamPickId: number; + let teamBanId: number; + let nameResRow: RowDataPacket[]; + let teamPickMapString: string = "Default"; + let teamPickSideString: string = "Default"; + let vetoId: number; + let insertObj: Object; + if (event.team !== null) { + const matchInfo: RowDataPacket[] = await db.query(sqlString, [ + event.matchid + ]); + // Need to get the initial veto data to link back to the veto table. + // If team1 is picking sides, that means team2 picked the map. + if (event.team === "team1") { + teamPickId = matchInfo[0].team1_id; + teamBanId = matchInfo[0].team2_id; + } else if (event.team === "team2") { + teamPickId = matchInfo[0].team2_id; + teamBanId = matchInfo[0].team1_id; + } + sqlString = "SELECT name FROM team WHERE id = ?"; + nameResRow = await db.query(sqlString, [teamBanId!]); + teamPickMapString = nameResRow[0].name; + nameResRow = await db.query(sqlString, [teamPickId!]); + teamPickSideString = nameResRow[0].name; + } + + // Retrieve veto id with team name and map veto. + sqlString = + "SELECT id FROM veto WHERE match_id = ? AND team_name = ? AND map = ?"; + const vetoInfo = await db.query(sqlString, [ + event.matchid, + teamPickMapString, + event.map_name + ]); + vetoId = vetoInfo[0].id; + + // Insert into veto_side now. + insertObj = { + match_id: event.matchid, + veto_id: vetoId, + team_name: teamPickSideString, + map: event.map_name, + side: event.side + }; + + insertObj = await db.buildUpdateStatement(insertObj); + sqlString = "INSERT INTO veto_side SET ?"; + await db.query(sqlString, [insertObj]); + GlobalEmitter.emit("vetoSideUpdate"); + res.status(200).send({ message: "Success" }); + return; + } catch (error) { + console.error(error); + res.status(500).send({ message: error }); + return; + } + } + + static async OnBackupRestore( + apiKey: string, + event: Get5_OnBackupRestore, + res: Response + ) { + // Logic for this is to fix a bug in user stats when a round restore happens. In previous iterations of the API + // we would not care if a user would restore the match, which could lead to misrepresentation of stats. + // This route will now fix this issue by seeking out all the data that's > the current round where it can, + // and mark a value that will ensure the remaining player stats are updated as such. + // The main chunk of update logic will then take place in the map flow service, on the OnRoundEnd function + // as we get all the player information from that call. + const matchApiCheck: number = await Utils.checkApiKey( + apiKey, + event.matchid + ); + if (matchApiCheck == 2 || matchApiCheck == 1) { + res.status(401).send({ + message: + "Match already finalized or and invalid API key has been given." + }); + return; + } + let sqlString: string = + "DELETE FROM player_stat_extras " + + "WHERE match_id = ? AND " + + "map_id = (SELECT id FROM map_stats WHERE match_id = ? AND map_number = ?) AND " + + "round_number >= ?"; + await db.query(sqlString, [ + event.matchid, + event.matchid, + event.map_number, + event.round_number + ]); + res.status(200).send({ message: "Success" }); + this.wasRoundRestored = true; + } + + private static async insertPickOrBan( + vetoOrBan: string, + matchid: string, + map_name: string, + team: string + ) { + let insertObj: object; + let sqlString: string; + let teamId: number; + let teamString: string; + let teamInfo: RowDataPacket[]; + let matchInfo: RowDataPacket[]; + + sqlString = "SELECT team1_id, team2_id, id FROM `match` WHERE id = ?"; + // XXX: Maybe change the DB to use team1 and team2 and use a join query to retrieve the actual names? + matchInfo = await db.query(sqlString, [matchid]); + if (team === "team1") teamId = matchInfo[0].team1_id; + else if (team === "team2") teamId = matchInfo[0].team1_id; + else teamId = -1; + + if (teamId == -1) { + teamString = "Decider"; + } else { + sqlString = "SELECT name FROM team WHERE id = ?"; + teamInfo = await db.query(sqlString, [teamId]); + teamString = teamInfo[0].name; + } + + // All values should be present, no need to remove any unneeded variables. + insertObj = { + match_id: matchid, + team_name: teamString, + map: map_name, + pick_or_veto: vetoOrBan + }; + + sqlString = "INSERT INTO veto SET ?"; + await db.query(sqlString, [insertObj]); + GlobalEmitter.emit("vetoUpdate"); + } +} + +export default SeriesFlowService; diff --git a/src/types/Get5_Assist.ts b/src/types/Get5_Assist.ts new file mode 100644 index 00000000..08b55d22 --- /dev/null +++ b/src/types/Get5_Assist.ts @@ -0,0 +1,7 @@ +import { Get5_Player } from "./Get5_Player" + +export interface Get5_Assist { + player: Get5_Player + friendly_fire: boolean + flash_assist: boolean +} \ No newline at end of file diff --git a/src/types/Get5_Attacker.ts b/src/types/Get5_Attacker.ts new file mode 100644 index 00000000..da20eb69 --- /dev/null +++ b/src/types/Get5_Attacker.ts @@ -0,0 +1,7 @@ +export interface Get5_Attacker { + steamid: string + name: string + user_id: number + side: string + is_bot: boolean +} \ No newline at end of file diff --git a/src/types/Get5_OnEvent.ts b/src/types/Get5_OnEvent.ts new file mode 100644 index 00000000..a1e5680f --- /dev/null +++ b/src/types/Get5_OnEvent.ts @@ -0,0 +1,3 @@ +export interface Get5_OnEvent { + event: string +} \ No newline at end of file diff --git a/src/types/Get5_Player.ts b/src/types/Get5_Player.ts new file mode 100644 index 00000000..00ecb68b --- /dev/null +++ b/src/types/Get5_Player.ts @@ -0,0 +1,11 @@ +import { Get5_Stats } from "./Get5_Stats" + + +export interface Get5_Player { + steamid: string + name: string + stats?: Get5_Stats + user_id?: number, + side?: string, + is_bot?: boolean +} \ No newline at end of file diff --git a/src/types/Get5_Stats.ts b/src/types/Get5_Stats.ts new file mode 100644 index 00000000..e4795f0f --- /dev/null +++ b/src/types/Get5_Stats.ts @@ -0,0 +1,35 @@ +export interface Get5_Stats { + kills: number + deaths: number + assists: number + flash_assists: number + team_kills: number + suicides: number + damage: number + utility_damage: number + enemies_flashed: number + friendlies_flashed: number + knife_kills: number + headshot_kills: number + rounds_played: number + bomb_defuses: number + bomb_plants: number + "1k": number + "2k": number + "3k": number + "4k": number + "5k": number + "1v1": number + "1v2": number + "1v3": number + "1v4": number + "1v5": number + first_kills_t: number + first_kills_ct: number + first_deaths_t: number + first_deaths_ct: number + trade_kills: number + kast: number + score: number + mvp: number +} \ No newline at end of file diff --git a/src/types/Get5_Team.ts b/src/types/Get5_Team.ts new file mode 100644 index 00000000..e0092016 --- /dev/null +++ b/src/types/Get5_Team.ts @@ -0,0 +1,13 @@ +import { Get5_Player } from "./Get5_Player" + +export interface Get5_Team { + id: string + name: string + series_score: number + score: number + score_ct: number + score_t: number + players: Get5_Player[] + side: string + starting_side: string +} \ No newline at end of file diff --git a/src/types/Get5_Weapon.ts b/src/types/Get5_Weapon.ts new file mode 100644 index 00000000..b3b48cd3 --- /dev/null +++ b/src/types/Get5_Weapon.ts @@ -0,0 +1,4 @@ +export interface Get5_Weapon { + name: string + id: number +} \ No newline at end of file diff --git a/src/types/Get5_Winner.ts b/src/types/Get5_Winner.ts new file mode 100644 index 00000000..5f5f9880 --- /dev/null +++ b/src/types/Get5_Winner.ts @@ -0,0 +1,5 @@ + +export interface Get5_Winner { + side: string + team: string +} diff --git a/src/types/User.ts b/src/types/User.ts new file mode 100644 index 00000000..a53246a6 --- /dev/null +++ b/src/types/User.ts @@ -0,0 +1,11 @@ +interface User extends Express.User { + steam_id: string + name: string + admin: boolean | number + super_admin: boolean | number + id: number + small_image: string + medium_image: string + large_image: string + api_key: string +} \ No newline at end of file diff --git a/src/types/map_flow/Get5_OnBombEvent.ts b/src/types/map_flow/Get5_OnBombEvent.ts new file mode 100644 index 00000000..eeb217b2 --- /dev/null +++ b/src/types/map_flow/Get5_OnBombEvent.ts @@ -0,0 +1,12 @@ +import { Get5_Player } from "../Get5_Player" + +export interface Get5_OnBombEvent { + event: string; + matchid: string; + map_number: number; + round_number: number; + round_time: number; + player: Get5_Player; + site: string; + bomb_time_remaining?: number; +} \ No newline at end of file diff --git a/src/types/map_flow/Get5_OnGoingLive.ts b/src/types/map_flow/Get5_OnGoingLive.ts new file mode 100644 index 00000000..48a5e747 --- /dev/null +++ b/src/types/map_flow/Get5_OnGoingLive.ts @@ -0,0 +1,5 @@ +export interface Get5_OnGoingLive { + event: string, + matchid: string, + map_number: number +} \ No newline at end of file diff --git a/src/types/map_flow/Get5_OnMatchPausedUnpaused.ts b/src/types/map_flow/Get5_OnMatchPausedUnpaused.ts new file mode 100644 index 00000000..5855d251 --- /dev/null +++ b/src/types/map_flow/Get5_OnMatchPausedUnpaused.ts @@ -0,0 +1,7 @@ +export interface Get5_OnMatchPausedUnpaused { + event: string + matchid: string + map_number: number + team: string + pause_type: string +} diff --git a/src/types/map_flow/Get5_OnPlayerBecameMvp.ts b/src/types/map_flow/Get5_OnPlayerBecameMvp.ts new file mode 100644 index 00000000..85a56719 --- /dev/null +++ b/src/types/map_flow/Get5_OnPlayerBecameMvp.ts @@ -0,0 +1,10 @@ +import { Get5_Player } from "../Get5_Player" + +export interface Get5_OnPlayerBecameMvp { + event: string + matchid: string + map_number: number + round_number: number + player: Get5_Player + reason: number +} \ No newline at end of file diff --git a/src/types/map_flow/Get5_OnPlayerDeath.ts b/src/types/map_flow/Get5_OnPlayerDeath.ts new file mode 100644 index 00000000..1de17faf --- /dev/null +++ b/src/types/map_flow/Get5_OnPlayerDeath.ts @@ -0,0 +1,24 @@ +import { Get5_Assist } from "../Get5_Assist" +import { Get5_Attacker } from "../Get5_Attacker" +import { Get5_Player } from "../Get5_Player" +import { Get5_Weapon } from "../Get5_Weapon" + +export interface Get5_OnPlayerDeath { + event: string + matchid: string + map_number: number + round_number: number + round_time: number + player: Get5_Player + weapon: Get5_Weapon + bomb: boolean + headshot: boolean + thru_smoke: boolean + penetrated: boolean + attacker_blind: boolean + no_scope: boolean + suicide: boolean + friendly_fire: boolean + attacker: Get5_Attacker + assist: Get5_Assist +} diff --git a/src/types/map_flow/Get5_OnRoundEnd.ts b/src/types/map_flow/Get5_OnRoundEnd.ts new file mode 100644 index 00000000..d93be81e --- /dev/null +++ b/src/types/map_flow/Get5_OnRoundEnd.ts @@ -0,0 +1,14 @@ +import { Get5_Team } from "../Get5_Team" +import { Get5_Winner } from "../Get5_Winner" + +export interface Get5_OnRoundEnd { + event: string + matchid: string + map_number: number + round_number: number + round_time: number + reason: number + winner: Get5_Winner + team1: Get5_Team + team2: Get5_Team +} \ No newline at end of file diff --git a/src/types/map_flow/Get5_OnRoundStart.ts b/src/types/map_flow/Get5_OnRoundStart.ts new file mode 100644 index 00000000..bd6509d0 --- /dev/null +++ b/src/types/map_flow/Get5_OnRoundStart.ts @@ -0,0 +1,6 @@ +export interface Get5_OnRoundStart { + event: string + matchid: string, + map_number: number, + round_number: number +} \ No newline at end of file diff --git a/src/types/series_flow/Get5_OnBackupRestore.ts b/src/types/series_flow/Get5_OnBackupRestore.ts new file mode 100644 index 00000000..36f70fea --- /dev/null +++ b/src/types/series_flow/Get5_OnBackupRestore.ts @@ -0,0 +1,7 @@ +export interface Get5_OnBackupRestore { + event: string + matchid: string + map_number: number + round_number: number + filename: string +} diff --git a/src/types/series_flow/Get5_OnMapResult.ts b/src/types/series_flow/Get5_OnMapResult.ts new file mode 100644 index 00000000..86c70a00 --- /dev/null +++ b/src/types/series_flow/Get5_OnMapResult.ts @@ -0,0 +1,13 @@ +import { Get5_Team } from "../Get5_Team" +import { Get5_Winner } from "../Get5_Winner" + +export interface Get5_OnMapResult { + event: string + matchid: string + map_number: number + team1: Get5_Team + team2: Get5_Team + winner: Get5_Winner +} + + diff --git a/src/types/series_flow/Get5_OnSeriesResult.ts b/src/types/series_flow/Get5_OnSeriesResult.ts new file mode 100644 index 00000000..b4be0862 --- /dev/null +++ b/src/types/series_flow/Get5_OnSeriesResult.ts @@ -0,0 +1,10 @@ +import { Get5_Winner } from "../Get5_Winner" + +export interface Get5_OnSeriesResult { + event: string + matchid: string + team1_series_score: number + team2_series_score: number + winner: Get5_Winner + time_until_restore: number +} \ No newline at end of file diff --git a/src/types/series_flow/veto/Get5_OnMapPicked.ts b/src/types/series_flow/veto/Get5_OnMapPicked.ts new file mode 100644 index 00000000..39141d2e --- /dev/null +++ b/src/types/series_flow/veto/Get5_OnMapPicked.ts @@ -0,0 +1,7 @@ +export interface Get5_OnMapPicked { + event: string + matchid: string + team: string + map_name: string + map_number: number +} diff --git a/src/types/series_flow/veto/Get5_OnMapVetoed.ts b/src/types/series_flow/veto/Get5_OnMapVetoed.ts new file mode 100644 index 00000000..17556c51 --- /dev/null +++ b/src/types/series_flow/veto/Get5_OnMapVetoed.ts @@ -0,0 +1,6 @@ +export interface Get5_OnMapVetoed { + event: string + matchid: string + team: string + map_name: string +} diff --git a/src/types/series_flow/veto/Get5_OnSidePicked.ts b/src/types/series_flow/veto/Get5_OnSidePicked.ts new file mode 100644 index 00000000..4e8bbbf0 --- /dev/null +++ b/src/types/series_flow/veto/Get5_OnSidePicked.ts @@ -0,0 +1,8 @@ +export interface Get5_OnSidePicked { + event: string + matchid: string + team: string + map_name: string + side: string + map_number: number +} diff --git a/src/types/swagger/Get5_Assist.yaml b/src/types/swagger/Get5_Assist.yaml new file mode 100644 index 00000000..e51d8e36 --- /dev/null +++ b/src/types/swagger/Get5_Assist.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Assist.yaml with typeconv + version: '1' + x-id: Get5_Assist.yaml + x-comment: >- + Generated from Get5_Assist.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Assist: + properties: + player: + title: Get5_Assist.player + friendly_fire: + title: Get5_Assist.friendly_fire + type: boolean + flash_assist: + title: Get5_Assist.flash_assist + type: boolean + required: + - player + - friendly_fire + - flash_assist + additionalProperties: false + title: Get5_Assist + type: object diff --git a/src/types/swagger/Get5_Attacker.yaml b/src/types/swagger/Get5_Attacker.yaml new file mode 100644 index 00000000..8d570e16 --- /dev/null +++ b/src/types/swagger/Get5_Attacker.yaml @@ -0,0 +1,38 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Attacker.yaml with typeconv + version: '1' + x-id: Get5_Attacker.yaml + x-comment: >- + Generated from Get5_Attacker.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Attacker: + properties: + steamid: + title: Get5_Attacker.steamid + type: string + name: + title: Get5_Attacker.name + type: string + user_id: + title: Get5_Attacker.user_id + type: number + side: + title: Get5_Attacker.side + type: string + is_bot: + title: Get5_Attacker.is_bot + type: boolean + required: + - steamid + - name + - user_id + - side + - is_bot + additionalProperties: false + title: Get5_Attacker + type: object diff --git a/src/types/swagger/Get5_Player.yaml b/src/types/swagger/Get5_Player.yaml new file mode 100644 index 00000000..3a7629b9 --- /dev/null +++ b/src/types/swagger/Get5_Player.yaml @@ -0,0 +1,37 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Player.yaml with typeconv + version: '1' + x-id: Get5_Player.yaml + x-comment: >- + Generated from Get5_Player.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Player: + properties: + steamid: + title: Get5_Player.steamid + type: string + name: + title: Get5_Player.name + type: string + stats: + title: Get5_Player.stats + user_id: + title: Get5_Player.user_id + type: number + side: + title: Get5_Player.side + type: string + is_bot: + title: Get5_Player.is_bot + type: boolean + required: + - steamid + - name + additionalProperties: false + title: Get5_Player + type: object diff --git a/src/types/swagger/Get5_Stats.yaml b/src/types/swagger/Get5_Stats.yaml new file mode 100644 index 00000000..28fd512b --- /dev/null +++ b/src/types/swagger/Get5_Stats.yaml @@ -0,0 +1,150 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Stats.yaml with typeconv + version: '1' + x-id: Get5_Stats.yaml + x-comment: >- + Generated from Get5_Stats.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Stats: + properties: + kills: + title: Get5_Stats.kills + type: number + deaths: + title: Get5_Stats.deaths + type: number + assists: + title: Get5_Stats.assists + type: number + flash_assists: + title: Get5_Stats.flash_assists + type: number + team_kills: + title: Get5_Stats.team_kills + type: number + suicides: + title: Get5_Stats.suicides + type: number + damage: + title: Get5_Stats.damage + type: number + utility_damage: + title: Get5_Stats.utility_damage + type: number + enemies_flashed: + title: Get5_Stats.enemies_flashed + type: number + friendlies_flashed: + title: Get5_Stats.friendlies_flashed + type: number + knife_kills: + title: Get5_Stats.knife_kills + type: number + headshot_kills: + title: Get5_Stats.headshot_kills + type: number + rounds_played: + title: Get5_Stats.rounds_played + type: number + bomb_defuses: + title: Get5_Stats.bomb_defuses + type: number + bomb_plants: + title: Get5_Stats.bomb_plants + type: number + '"1k"': + title: Get5_Stats."1k" + type: number + '"2k"': + title: Get5_Stats."2k" + type: number + '"3k"': + title: Get5_Stats."3k" + type: number + '"4k"': + title: Get5_Stats."4k" + type: number + '"5k"': + title: Get5_Stats."5k" + type: number + '"1v1"': + title: Get5_Stats."1v1" + type: number + '"1v2"': + title: Get5_Stats."1v2" + type: number + '"1v3"': + title: Get5_Stats."1v3" + type: number + '"1v4"': + title: Get5_Stats."1v4" + type: number + '"1v5"': + title: Get5_Stats."1v5" + type: number + first_kills_t: + title: Get5_Stats.first_kills_t + type: number + first_kills_ct: + title: Get5_Stats.first_kills_ct + type: number + first_deaths_t: + title: Get5_Stats.first_deaths_t + type: number + first_deaths_ct: + title: Get5_Stats.first_deaths_ct + type: number + trade_kills: + title: Get5_Stats.trade_kills + type: number + kast: + title: Get5_Stats.kast + type: number + score: + title: Get5_Stats.score + type: number + mvp: + title: Get5_Stats.mvp + type: number + required: + - kills + - deaths + - assists + - flash_assists + - team_kills + - suicides + - damage + - utility_damage + - enemies_flashed + - friendlies_flashed + - knife_kills + - headshot_kills + - rounds_played + - bomb_defuses + - bomb_plants + - '"1k"' + - '"2k"' + - '"3k"' + - '"4k"' + - '"5k"' + - '"1v1"' + - '"1v2"' + - '"1v3"' + - '"1v4"' + - '"1v5"' + - first_kills_t + - first_kills_ct + - first_deaths_t + - first_deaths_ct + - trade_kills + - kast + - score + - mvp + additionalProperties: false + title: Get5_Stats + type: object diff --git a/src/types/swagger/Get5_Team.yaml b/src/types/swagger/Get5_Team.yaml new file mode 100644 index 00000000..a2562245 --- /dev/null +++ b/src/types/swagger/Get5_Team.yaml @@ -0,0 +1,55 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Team.yaml with typeconv + version: '1' + x-id: Get5_Team.yaml + x-comment: >- + Generated from Get5_Team.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Team: + properties: + id: + title: Get5_Team.id + type: string + name: + title: Get5_Team.name + type: string + series_score: + title: Get5_Team.series_score + type: number + score: + title: Get5_Team.score + type: number + score_ct: + title: Get5_Team.score_ct + type: number + score_t: + title: Get5_Team.score_t + type: number + players: + items: {} + title: Get5_Team.players + type: array + side: + title: Get5_Team.side + type: string + starting_side: + title: Get5_Team.starting_side + type: string + required: + - id + - name + - series_score + - score + - score_ct + - score_t + - players + - side + - starting_side + additionalProperties: false + title: Get5_Team + type: object diff --git a/src/types/swagger/Get5_Weapon.yaml b/src/types/swagger/Get5_Weapon.yaml new file mode 100644 index 00000000..e199ec7e --- /dev/null +++ b/src/types/swagger/Get5_Weapon.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Weapon.yaml with typeconv + version: '1' + x-id: Get5_Weapon.yaml + x-comment: >- + Generated from Get5_Weapon.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Weapon: + properties: + name: + title: Get5_Weapon.name + type: string + id: + title: Get5_Weapon.id + type: number + required: + - name + - id + additionalProperties: false + title: Get5_Weapon + type: object diff --git a/src/types/swagger/Get5_Winner.yaml b/src/types/swagger/Get5_Winner.yaml new file mode 100644 index 00000000..cc9f562a --- /dev/null +++ b/src/types/swagger/Get5_Winner.yaml @@ -0,0 +1,26 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_Winner.yaml with typeconv + version: '1' + x-id: Get5_Winner.yaml + x-comment: >- + Generated from Get5_Winner.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_Winner: + properties: + side: + title: Get5_Winner.side + type: string + team: + title: Get5_Winner.team + type: string + required: + - side + - team + additionalProperties: false + title: Get5_Winner + type: object diff --git a/src/types/swagger/map_flow/Get5_OnBombDefused.yaml b/src/types/swagger/map_flow/Get5_OnBombDefused.yaml new file mode 100644 index 00000000..e23484c1 --- /dev/null +++ b/src/types/swagger/map_flow/Get5_OnBombDefused.yaml @@ -0,0 +1,49 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnBombDefused.yaml with typeconv + version: '1' + x-id: map_flow/Get5_OnBombDefused.yaml + x-comment: >- + Generated from map_flow/Get5_OnBombDefused.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnBombDefused: + properties: + event: + title: Get5_OnBombDefused.event + type: string + matchid: + title: Get5_OnBombDefused.matchid + type: string + map_number: + title: Get5_OnBombDefused.map_number + type: number + round_number: + title: Get5_OnBombDefused.round_number + type: number + round_time: + title: Get5_OnBombDefused.round_time + type: number + player: + title: Get5_OnBombDefused.player + site: + title: Get5_OnBombDefused.site + type: string + bomb_time_remaining: + title: Get5_OnBombDefused.bomb_time_remaining + type: number + required: + - event + - matchid + - map_number + - round_number + - round_time + - player + - site + - bomb_time_remaining + additionalProperties: false + title: Get5_OnBombDefused + type: object diff --git a/src/types/swagger/map_flow/Get5_OnBombPlanted.yaml b/src/types/swagger/map_flow/Get5_OnBombPlanted.yaml new file mode 100644 index 00000000..8874f66e --- /dev/null +++ b/src/types/swagger/map_flow/Get5_OnBombPlanted.yaml @@ -0,0 +1,45 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnBombPlanted.yaml with typeconv + version: '1' + x-id: map_flow/Get5_OnBombPlanted.yaml + x-comment: >- + Generated from map_flow/Get5_OnBombPlanted.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnBombPlanted: + properties: + event: + title: Get5_OnBombPlanted.event + type: string + matchid: + title: Get5_OnBombPlanted.matchid + type: string + map_number: + title: Get5_OnBombPlanted.map_number + type: number + round_number: + title: Get5_OnBombPlanted.round_number + type: number + round_time: + title: Get5_OnBombPlanted.round_time + type: number + player: + title: Get5_OnBombPlanted.player + site: + title: Get5_OnBombPlanted.site + type: string + required: + - event + - matchid + - map_number + - round_number + - round_time + - player + - site + additionalProperties: false + title: Get5_OnBombPlanted + type: object diff --git a/src/types/swagger/map_flow/Get5_OnMatchPausedUnpaused.yaml b/src/types/swagger/map_flow/Get5_OnMatchPausedUnpaused.yaml new file mode 100644 index 00000000..50c58fba --- /dev/null +++ b/src/types/swagger/map_flow/Get5_OnMatchPausedUnpaused.yaml @@ -0,0 +1,38 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnMatchPausedUnpaused.yaml with typeconv + version: '1' + x-id: map_flow/Get5_OnMatchPausedUnpaused.yaml + x-comment: >- + Generated from map_flow/Get5_OnMatchPausedUnpaused.ts by + core-types-json-schema (https://github.com/grantila/core-types-json-schema) + on behalf of typeconv (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnMatchPausedUnpaused: + properties: + event: + title: Get5_OnMatchPausedUnpaused.event + type: string + matchid: + title: Get5_OnMatchPausedUnpaused.matchid + type: string + map_number: + title: Get5_OnMatchPausedUnpaused.map_number + type: number + team: + title: Get5_OnMatchPausedUnpaused.team + type: string + pause_type: + title: Get5_OnMatchPausedUnpaused.pause_type + type: string + required: + - event + - matchid + - map_number + - team + - pause_type + additionalProperties: false + title: Get5_OnMatchPausedUnpaused + type: object diff --git a/src/types/swagger/map_flow/Get5_OnPlayerBecameMvp.yaml b/src/types/swagger/map_flow/Get5_OnPlayerBecameMvp.yaml new file mode 100644 index 00000000..bb0258df --- /dev/null +++ b/src/types/swagger/map_flow/Get5_OnPlayerBecameMvp.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnPlayerBecameMvp.yaml with typeconv + version: '1' + x-id: map_flow/Get5_OnPlayerBecameMvp.yaml + x-comment: >- + Generated from map_flow/Get5_OnPlayerBecameMvp.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnPlayerBecameMvp: + properties: + event: + title: Get5_OnPlayerBecameMvp.event + type: string + matchid: + title: Get5_OnPlayerBecameMvp.matchid + type: string + map_number: + title: Get5_OnPlayerBecameMvp.map_number + type: number + round_number: + title: Get5_OnPlayerBecameMvp.round_number + type: number + player: + title: Get5_OnPlayerBecameMvp.player + reason: + title: Get5_OnPlayerBecameMvp.reason + type: number + required: + - event + - matchid + - map_number + - round_number + - player + - reason + additionalProperties: false + title: Get5_OnPlayerBecameMvp + type: object diff --git a/src/types/swagger/map_flow/Get5_OnPlayerDeath.yaml b/src/types/swagger/map_flow/Get5_OnPlayerDeath.yaml new file mode 100644 index 00000000..59bddd8e --- /dev/null +++ b/src/types/swagger/map_flow/Get5_OnPlayerDeath.yaml @@ -0,0 +1,82 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnPlayerDeath.yaml with typeconv + version: '1' + x-id: map_flow/Get5_OnPlayerDeath.yaml + x-comment: >- + Generated from map_flow/Get5_OnPlayerDeath.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Root: + properties: + event: + title: Root.event + type: string + matchid: + title: Root.matchid + type: string + map_number: + title: Root.map_number + type: number + round_number: + title: Root.round_number + type: number + round_time: + title: Root.round_time + type: number + player: + title: Root.player + weapon: + title: Root.weapon + bomb: + title: Root.bomb + type: boolean + headshot: + title: Root.headshot + type: boolean + thru_smoke: + title: Root.thru_smoke + type: boolean + penetrated: + title: Root.penetrated + type: boolean + attacker_blind: + title: Root.attacker_blind + type: boolean + no_scope: + title: Root.no_scope + type: boolean + suicide: + title: Root.suicide + type: boolean + friendly_fire: + title: Root.friendly_fire + type: boolean + attacker: + title: Root.attacker + assist: + title: Root.assist + required: + - event + - matchid + - map_number + - round_number + - round_time + - player + - weapon + - bomb + - headshot + - thru_smoke + - penetrated + - attacker_blind + - no_scope + - suicide + - friendly_fire + - attacker + - assist + additionalProperties: false + title: Root + type: object diff --git a/src/types/swagger/map_flow/Get5_OnRoundEnd.yaml b/src/types/swagger/map_flow/Get5_OnRoundEnd.yaml new file mode 100644 index 00000000..9130d228 --- /dev/null +++ b/src/types/swagger/map_flow/Get5_OnRoundEnd.yaml @@ -0,0 +1,51 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnRoundEnd.yaml with typeconv + version: '1' + x-id: map_flow/Get5_OnRoundEnd.yaml + x-comment: >- + Generated from map_flow/Get5_OnRoundEnd.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnRoundEnd: + properties: + event: + title: Get5_OnRoundEnd.event + type: string + matchid: + title: Get5_OnRoundEnd.matchid + type: string + map_number: + title: Get5_OnRoundEnd.map_number + type: number + round_number: + title: Get5_OnRoundEnd.round_number + type: number + round_time: + title: Get5_OnRoundEnd.round_time + type: number + reason: + title: Get5_OnRoundEnd.reason + type: number + winner: + title: Get5_OnRoundEnd.winner + team1: + title: Get5_OnRoundEnd.team1 + team2: + title: Get5_OnRoundEnd.team2 + required: + - event + - matchid + - map_number + - round_number + - round_time + - reason + - winner + - team1 + - team2 + additionalProperties: false + title: Get5_OnRoundEnd + type: object diff --git a/src/types/swagger/series_flow/Get5_OnBackupRestore.yaml b/src/types/swagger/series_flow/Get5_OnBackupRestore.yaml new file mode 100644 index 00000000..3123f9f2 --- /dev/null +++ b/src/types/swagger/series_flow/Get5_OnBackupRestore.yaml @@ -0,0 +1,38 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnBackupRestore.yaml with typeconv + version: '1' + x-id: series_flow/Get5_OnBackupRestore.yaml + x-comment: >- + Generated from series_flow/Get5_OnBackupRestore.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnBackupRestore: + properties: + event: + title: Get5_OnBackupRestore.event + type: string + matchid: + title: Get5_OnBackupRestore.matchid + type: string + map_number: + title: Get5_OnBackupRestore.map_number + type: number + round_number: + title: Get5_OnBackupRestore.round_number + type: number + filename: + title: Get5_OnBackupRestore.filename + type: string + required: + - event + - matchid + - map_number + - round_number + - filename + additionalProperties: false + title: Get5_OnBackupRestore + type: object diff --git a/src/types/swagger/series_flow/Get5_OnMapResult.yaml b/src/types/swagger/series_flow/Get5_OnMapResult.yaml new file mode 100644 index 00000000..5772bce4 --- /dev/null +++ b/src/types/swagger/series_flow/Get5_OnMapResult.yaml @@ -0,0 +1,39 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnMapResult.yaml with typeconv + version: '1' + x-id: series_flow/Get5_OnMapResult.yaml + x-comment: >- + Generated from series_flow/Get5_OnMapResult.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnMapResult: + properties: + event: + title: Get5_OnMapResult.event + type: string + matchid: + title: Get5_OnMapResult.matchid + type: string + map_number: + title: Get5_OnMapResult.map_number + type: number + team1: + title: Get5_OnMapResult.team1 + team2: + title: Get5_OnMapResult.team2 + winner: + title: Get5_OnMapResult.winner + required: + - event + - matchid + - map_number + - team1 + - team2 + - winner + additionalProperties: false + title: Get5_OnMapResult + type: object diff --git a/src/types/swagger/series_flow/Get5_OnSeriesInit.yaml b/src/types/swagger/series_flow/Get5_OnSeriesInit.yaml new file mode 100644 index 00000000..9e305f06 --- /dev/null +++ b/src/types/swagger/series_flow/Get5_OnSeriesInit.yaml @@ -0,0 +1,36 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnSeriesInit.yaml with typeconv + version: '1' + x-id: series_flow/Get5_OnSeriesInit.yaml + x-comment: >- + Generated from series_flow/Get5_OnSeriesInit.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnSeriesInit: + properties: + event: + title: Get5_OnSeriesInit.event + type: string + matchid: + title: Get5_OnSeriesInit.matchid + type: string + num_maps: + title: Get5_OnSeriesInit.num_maps + type: number + team1: + title: Get5_OnSeriesInit.team1 + team2: + title: Get5_OnSeriesInit.team2 + required: + - event + - matchid + - num_maps + - team1 + - team2 + additionalProperties: false + title: Get5_OnSeriesInit + type: object diff --git a/src/types/swagger/series_flow/Get5_OnSeriesResult.yaml b/src/types/swagger/series_flow/Get5_OnSeriesResult.yaml new file mode 100644 index 00000000..c5aa580f --- /dev/null +++ b/src/types/swagger/series_flow/Get5_OnSeriesResult.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.0 +info: + title: Converted from Get5_OnSeriesResult.yaml with typeconv + version: '1' + x-id: series_flow/Get5_OnSeriesResult.yaml + x-comment: >- + Generated from series_flow/Get5_OnSeriesResult.ts by core-types-json-schema + (https://github.com/grantila/core-types-json-schema) on behalf of typeconv + (https://github.com/grantila/typeconv) +paths: {} +components: + schemas: + Get5_OnSeriesResult: + properties: + event: + title: Get5_OnSeriesResult.event + type: string + matchid: + title: Get5_OnSeriesResult.matchid + type: string + team1_series_score: + title: Get5_OnSeriesResult.team1_series_score + type: number + team2_series_score: + title: Get5_OnSeriesResult.team2_series_score + type: number + winner: + title: Get5_OnSeriesResult.winner + time_until_restore: + title: Get5_OnSeriesResult.time_until_restore + type: number + required: + - event + - matchid + - team1_series_score + - team2_series_score + - winner + - time_until_restore + additionalProperties: false + title: Get5_OnSeriesResult + type: object diff --git a/utility/auth.js b/src/utility/auth.js similarity index 99% rename from utility/auth.js rename to src/utility/auth.js index 222b020a..1244c104 100644 --- a/utility/auth.js +++ b/src/utility/auth.js @@ -10,7 +10,7 @@ import { Strategy as LocalStrategy } from "passport-local"; import { hashSync, compare } from "bcrypt"; import MockStrategy from "passport-mock-strategy"; import user from "./mockProfile.js"; -import db from "../db.js"; +import {db} from "../services/db.js"; import { generate } from "randomstring"; import Utils from "./utils.js"; diff --git a/utility/emitter.js b/src/utility/emitter.js similarity index 100% rename from utility/emitter.js rename to src/utility/emitter.js diff --git a/utility/mockProfile.js b/src/utility/mockProfile.js similarity index 100% rename from utility/mockProfile.js rename to src/utility/mockProfile.js diff --git a/utility/mockstrategy.js b/src/utility/mockstrategy.js similarity index 100% rename from utility/mockstrategy.js rename to src/utility/mockstrategy.js diff --git a/utility/serverrcon.js b/src/utility/serverrcon.js similarity index 72% rename from utility/serverrcon.js rename to src/utility/serverrcon.js index e2242a69..c6911ed4 100644 --- a/utility/serverrcon.js +++ b/src/utility/serverrcon.js @@ -1,6 +1,7 @@ import Utils from "./utils.js"; import Rcon from "rcon"; import fetch from "node-fetch"; +import config from "config"; /** * Creates a new server object to run various tasks. @@ -43,6 +44,36 @@ class ServerRcon { }); } + /** + * Patches a returned call if there was incomplete packets. + * @function + * @returns The completed rcon string. + */ + async fixIncompletePackets(rconResponse) { + return rconResponse.substring(0, rconResponse.lastIndexOf("L")).length == 0 + ? rconResponse + : rconResponse.substring(0, rconResponse.lastIndexOf("L")); + } + + /** + * Retrieve Get5's version from the server. + * @returns The version of hte plugin if found, unknown otherwise. + */ + async getGet5Version() { + if (process.env.NODE_ENV === "test") { + return "unknown"; + } + + let get5Status = await this.execute("get5_status"); + get5Status = await this.fixIncompletePackets(get5Status); + + if (get5Status.includes("Unknown command")) { + return "unknown"; + } + let get5JsonStatus = await JSON.parse(get5Status); + return get5JsonStatus.plugin_version; + } + /** * Checks the availability of the game server via a get5 call. * @function @@ -54,15 +85,19 @@ class ServerRcon { } let get5Status = await this.execute("get5_web_available"); // Weird L coming in from the console call? Incomplete packets. - get5Status = - get5Status.substring(0, get5Status.lastIndexOf("L")).length == 0 - ? get5Status - : get5Status.substring(0, get5Status.lastIndexOf("L")); - let get5JsonStatus = await JSON.parse(get5Status); + get5Status = await this.fixIncompletePackets(get5Status); + if (get5Status.includes("Unknown command")) { - console.log("Either get5 or get5_apistats plugin missing."); - return false; - } else if (get5JsonStatus.gamestate != 0) { + let get5Version = await this.getGet5Version(); + if (get5Version.includes("0.14")) { + return true; + } else { + console.log("Either get5 or G5WS plugin is missing."); + return false; + } + } + let get5JsonStatus = await JSON.parse(get5Status); + if (get5JsonStatus.gamestate != 0) { console.log("Server already has a get5 match setup."); return false; } else { @@ -92,7 +127,7 @@ class ServerRcon { } /** - * + * * Checks if the server is up to date via a steam API call. * @returns True if up to date, false otherwise. */ @@ -105,14 +140,22 @@ class ServerRcon { let serverResponse = await this.execute("version"); let serverVersion = serverResponse.match(/(?<=version ).*(?= \[)/); // Call steam API to check if the version is the latest. - let response = await fetch("https://api.steampowered.com/ISteamApps/UpToDateCheck/v0001/?appid=730&version=" + serverVersion + "&format=json"); + let response = await fetch( + "https://api.steampowered.com/ISteamApps/UpToDateCheck/v0001/?appid=730&version=" + + serverVersion + + "&format=json" + ); let data = await response.json(); if (!data.response.up_to_date) { - console.log("Server is not up to date! Current version: " + serverVersion + " - Latest version: " + data.response.required_version); + console.log( + "Server is not up to date! Current version: " + + serverVersion + + " - Latest version: " + + data.response.required_version + ); return false; - } - else { - return true + } else { + return true; } } catch (err) { console.error("Error on game server: " + err.toString()); @@ -158,11 +201,43 @@ class ServerRcon { if (loadMatchResponse.includes("Failed")) return false; else if (loadMatchResponse.includes("another match already loaded")) return false; - loadMatchResponse = await this.execute( - "get5_web_api_key " + get5APIKeyString - ); - // Swap map to default dust2, ensures our cvars stick for the match. - // await this.execute("map de_dust2"); + let get5Version = await this.getGet5Version(); + if (parseFloat(get5Version) >= 0.14) { + let apiString = config.get("server.apiURL"); + await this.execute( + "get5_remote_log_url ".concat( + apiString.endsWith("/") + ? apiString.concat("v2") + : apiString.concat("/v2") + ) + ); + await this.execute("get5_remote_log_header_key Authorization"); + await this.execute("get5_remote_log_header_value " + get5APIKeyString); + + await this.execute( + "get5_remote_backup_url ".concat( + apiString.endsWith("/") + ? apiString.concat("v2/backup") + : apiString.concat("/v2/backup") + ) + ); + await this.execute("get5_remote_backup_header_key Authorization"); + await this.execute( + "get5_remote_backup_header_value " + get5APIKeyString + ); + + await this.execute( + "get5_demo_upload_url ".concat( + config.get("server.apiURL").endsWith("/") + ? apiString.concat("v2/demo") + : apiString.concat("/v2/demo") + ) + ); + await this.execute("get5_demo_upload_header_key Authorization"); + await this.execute("get5_demo_upload_header_value " + get5APIKeyString); + } else { + await this.execute("get5_web_api_key " + get5APIKeyString); + } return true; } catch (err) { console.error("Error on preparing match to server: " + err.toString()); @@ -197,7 +272,7 @@ class ServerRcon { if (process.env.NODE_ENV === "test") { return false; } - await this.execute("sm_pause") + await this.execute("sm_pause"); return true; } catch (err) { console.error("RCON error on pause: " + err.toString()); @@ -263,21 +338,21 @@ class ServerRcon { * @param {String} steamId - Formatted Steam64 ID. * @returns Returns the response from the server. */ - async addCoach(teamString, steamId) { - try { - if (process.env.NODE_ENV === "test") { - return false; - } - let loadMatchResponse; - loadMatchResponse = await this.execute( - "get5_addcoach " + steamId + " " + teamString - ); - return loadMatchResponse; - } catch (err) { - console.error("RCON error on addUser: " + err.toString()); - throw err; + async addCoach(teamString, steamId) { + try { + if (process.env.NODE_ENV === "test") { + return false; } + let loadMatchResponse; + loadMatchResponse = await this.execute( + "get5_addcoach " + steamId + " " + teamString + ); + return loadMatchResponse; + } catch (err) { + console.error("RCON error on addUser: " + err.toString()); + throw err; } + } /** Removes a user from the match. * @function @@ -340,13 +415,13 @@ class ServerRcon { * @param {String} backupName - The filename of the backup on the API. * @returns Returns the response from the server. */ - async restoreBackupFromURL(backupName) { + async restoreBackupFromURL(backupName) { try { if (process.env.NODE_ENV === "test") { return false; } let loadMatchResponse = await this.execute( - "get5_loadbackup_url \"" + backupName + "\"" + 'get5_loadbackup_url "' + backupName + '"' ); return loadMatchResponse; } catch (err) { diff --git a/utility/utils.js b/src/utility/utils.ts similarity index 66% rename from utility/utils.js rename to src/utility/utils.ts index a188cde3..c46c005a 100644 --- a/utility/utils.js +++ b/src/utility/utils.ts @@ -26,7 +26,9 @@ const SteamAPI = new SteamURLResolver(config.get("server.steamAPIKey")); */ import { ID } from "@node-steam/id"; -import db from "../db.js"; +import {db} from "../services/db.js"; +import { RowDataPacket } from 'mysql2'; +import { NextFunction, Request, Response } from 'express'; class Utils { /** Function to get an HLTV rating for a user. @@ -43,29 +45,29 @@ class Utils { * @function * @static */ static getRating( - kills = 0, - roundsplayed = 0, - deaths = 0, - k1 = 0, - k2 = 0, - k3 = 0, - k4 = 0, - k5 = 0 + kills: number = 0, + roundsplayed: number = 0, + deaths: number = 0, + k1: number = 0, + k2: number = 0, + k3: number = 0, + k4: number = 0, + k5: number = 0 ) { try { - let AverageKPR = 0.679; - let AverageSPR = 0.317; - let AverageRMK = 1.277; - let KillRating = + let AverageKPR: number = 0.679; + let AverageSPR: number = 0.317; + let AverageRMK: number = 1.277; + let KillRating: number = roundsplayed === 0 ? 0 : kills / roundsplayed / AverageKPR; - let SurvivalRating = + let SurvivalRating: number = roundsplayed === 0 ? 0 : (roundsplayed - deaths) / roundsplayed / AverageSPR; - let killcount = k1 + 4 * k2 + 9 * k3 + 16 * k4 + 25 * k5; - let RoundsWithMultipleKillsRating = + let killcount: number = k1 + 4 * k2 + 9 * k3 + 16 * k4 + 25 * k5; + let RoundsWithMultipleKillsRating: number = roundsplayed === 0 ? 0 : killcount / roundsplayed / AverageRMK; - let rating = + let rating: number = (KillRating + 0.7 * SurvivalRating + RoundsWithMultipleKillsRating) / 2.7; @@ -83,7 +85,7 @@ class Utils { * @memberof module:utils * @param {string} source - The source to be decrypted. */ - static decrypt(source) { + static decrypt(source: string) { try { if (source === null) return; let byteSource = utils.hex.toBytes(source.substring(32)); @@ -107,7 +109,7 @@ class Utils { * @memberof module:utils * @param {string} source - The source to be decrypted. */ - static encrypt(source) { + static encrypt(source: string) { try { if (source === null) return; @@ -129,7 +131,11 @@ class Utils { * @function * @memberof module:utils * @inner */ - static async ensureAuthenticated(req, res, next) { + static async ensureAuthenticated( + req: Request, + res: Response, + next: NextFunction + ) { // Check the user based on API. const apiKey = req.get("user-api") || req.body[0]?.user_api; if (apiKey) { @@ -146,7 +152,7 @@ class Utils { id: ourUser[0].id, small_image: ourUser[0].small_image, medium_image: ourUser[0].medium_image, - large_image: ourUser[0].large_image, + large_image: ourUser[0].large_image }; req.user = curUser; return next(); @@ -164,9 +170,9 @@ class Utils { * @memberof module:utils * @inner * @name adminCheck - * @param {user} User - the users session object. + * @param {user} user - the users session object. */ - static adminCheck(user) { + static adminCheck(user: User) { if (user) return user.super_admin === 0 && user.admin === 0 ? false : true; else return false; } @@ -176,9 +182,9 @@ class Utils { * @memberof module:utils * @inner * @name superAdminCheck - * @param {user} User - the users session object. + * @param {user} user - the users session object. */ - static superAdminCheck(user) { + static superAdminCheck(user: User) { if (user) return user.super_admin === 0 ? false : true; else return false; } @@ -191,7 +197,7 @@ class Utils { * @param {String} anySteamID - String value of a Steam ID. * @returns A string representing a 64bit steam ID, or nothing if the profile is not found. */ - static async convertToSteam64(anySteamID) { + static async convertToSteam64(anySteamID: string) { const steam64ID = new ID(anySteamID); if (steam64ID.isValid() && steam64ID.getType() == "INDIVIDUAL") return steam64ID.get64(); @@ -205,7 +211,7 @@ class Utils { * @param {String} authString - String value of a steam username/profile/url/steamID. * @returns A Steam64 value in string form, or nothing. */ - static async getSteamPID(authString) { + static async getSteamPID(authString: string) { // Remove any https tags, as they aren't needed. authString = authString.replace(new RegExp("^(http|https)://", "i"), ""); if (authString.includes("steamcommunity.com/id/")) { @@ -238,7 +244,7 @@ class Utils { * @param {String} auth64 - String value of a steam 64 ID. * @returns A username from a given Steam64 ID. */ - static async getSteamName(auth64) { + static async getSteamName(auth64: string) { try { let summaryInfo = await SteamAPI.getUserSummary(auth64); return summaryInfo.nickname; @@ -255,7 +261,7 @@ class Utils { * @param {String} auth64 - String value of a steam 64 ID. * @returns A profile image link. */ - static async getSteamImage(auth64) { + static async getSteamImage(auth64: string) { try { let summaryInfo = await SteamAPI.getUserSummary(auth64); return summaryInfo.avatar.medium; @@ -269,23 +275,32 @@ class Utils { * @memberof module:utils * @inner * @name getUserMatchAccess - * @param {String} matchid - The ID of a match + * @param {String|Number} matchid - The ID of a match * @param {user} user - the users session object. * @param {boolean} [onlyAdmin = false] - Set to true to only check admin status and not super admin status. * @param {boolean} [serverCheck = false] - Optional parameter to check if a user owns a server, for elevated calls. * @returns An object containing the HTTP error, followed by a message. */ - static async getUserMatchAccess(matchid, user, onlyAdmin = false, serverCheck = false) { + static async getUserMatchAccess( + matchid: string | number, + user: User, + onlyAdmin: boolean = false, + serverCheck: boolean = false + ) { try { - let retMessage = null; - - retMessage = await this.getUserMatchAccessNoFinalize(matchid, user, onlyAdmin, serverCheck); - if (retMessage != null) - return retMessage; + let retMessage: object | null = null; + retMessage = await this.getUserMatchAccessNoFinalize( + matchid, + user, + onlyAdmin, + serverCheck + ); + if (retMessage != null) return retMessage; - let currentMatchInfo = "SELECT cancelled, forfeit, end_time FROM `match` WHERE id = ?"; - const matchRow = await db.query(currentMatchInfo, matchid); + let currentMatchInfo = + "SELECT cancelled, forfeit, end_time FROM `match` WHERE id = ?"; + const matchRow = await db.query(currentMatchInfo, [matchid]); if ( matchRow[0].cancelled == 1 || matchRow[0].forfeit == 1 || @@ -304,42 +319,51 @@ class Utils { * @memberof module:utils * @inner * @name getUserMatchAccessNoFinalize - * @param {String} matchid - The ID of a match + * @param {String|Number} matchid - The ID of a match * @param {user} user - the users session object. * @param {boolean} [onlyAdmin = false] - Set to true to only check admin status and not super admin status. * @param {boolean} [serverCheck = false] - Optional parameter to check if a user owns a server, for elevated calls. * @returns An object containing the HTTP error, followed by a message. */ - static async getUserMatchAccessNoFinalize(matchid, user, onlyAdmin = false, serverCheck = false) { + static async getUserMatchAccessNoFinalize( + matchid: string | number, + user: User, + onlyAdmin: boolean = false, + serverCheck: boolean = false + ) { try { - let adminCheck = onlyAdmin ? this.adminCheck(user) : this.superAdminCheck(user); - let retMessage = null; + let adminCheck: boolean = onlyAdmin + ? this.adminCheck(user) + : this.superAdminCheck(user); + let retMessage: object | null = null; retMessage = await this.checkIfMatchExists(matchid); - if (retMessage != null) - return retMessage; - + if (retMessage != null) return retMessage; - let currentMatchInfo = "SELECT user_id, server_id FROM `match` WHERE id = ?"; - let currentServerInfo = "SELECT user_id FROM game_server WHERE id = ?" - const matchRow = await db.query(currentMatchInfo, matchid); + let currentMatchInfo = + "SELECT user_id, server_id FROM `match` WHERE id = ?"; + let currentServerInfo = "SELECT user_id FROM game_server WHERE id = ?"; + const matchRow = await db.query(currentMatchInfo, [matchid]); // If no server exists no need to check for info. if (!matchRow[0].server_id) return retMessage; - const serverRow = await db.query(currentServerInfo, matchRow[0].server_id); - if ( - matchRow[0].user_id != user.id && - !adminCheck - ) { - retMessage = { status: 403, message: "User is not authorized to perform action." }; + const serverRow = await db.query( + currentServerInfo, + matchRow[0].server_id + ); + if (matchRow[0].user_id != user.id && !adminCheck) { + retMessage = { + status: 403, + message: "User is not authorized to perform action." + }; } if (serverCheck) { - if ( - !this.superAdminCheck(user) && - serverRow[0].user_id != user.id - ) { - retMessage = { status: 403, message: "User is not authorized to perform action." }; + if (!this.superAdminCheck(user) && serverRow[0].user_id != user.id) { + retMessage = { + status: 403, + message: "User is not authorized to perform action." + }; } } return retMessage; @@ -353,17 +377,17 @@ class Utils { * @memberof module:utils * @inner * @name checkIfMatchExists - * @param {String} matchid - The ID of a match + * @param {String|Number} matchid - The ID of a match * @returns An object containing the HTTP error, followed by a message. */ - static async checkIfMatchExists(matchid) { + static async checkIfMatchExists(matchid: string | number) { try { if (matchid == null) { return { status: 400, message: "Match ID Not Provided" }; } let currentMatchInfo = "SELECT id FROM `match` WHERE id = ?"; - const matchRow = await db.query(currentMatchInfo, matchid); + const matchRow = await db.query(currentMatchInfo, [matchid]); if (!matchRow.length) { return { status: 404, message: "No match found." }; } @@ -378,27 +402,47 @@ class Utils { * @memberof module:utils * @inner * @name updatePugStats - * @param {Number} matchid The ID of a match. + * @param {String|Number} match_id The ID of a match. * @param {Number} map_id The ID of a map in a match. * @param {Number} team1_id The internal ID of team 1. * @param {Number} team2_id The internal ID of team 2. * @param {Number} winner The internal ID of the winning team. */ - static async updatePugStats(match_id, map_id, team1_id, team2_id, winner, deleteTeams = true) { - let teamAuthSql = + static async updatePugStats( + match_id: string | number, + map_id: number, + team1_id: number, + team2_id: number, + winner: number, + deleteTeams = true + ) { + let teamAuthSql: string = "SELECT GROUP_CONCAT(ta.auth) as auth_name, GROUP_CONCAT(CONCAT(ta.name)) as name FROM team_auth_names ta WHERE team_id = ?"; - let pugTeamNameSql = "SELECT name FROM team WHERE id = ?"; - let playerStatUpdateSql = "UPDATE player_stats SET team_name = ?, winner = ? WHERE match_id = ? AND map_id = ? AND steam_id IN (?)"; - let pugSql = + let pugTeamNameSql: string = "SELECT name FROM team WHERE id = ?"; + let playerStatUpdateSql: string = + "UPDATE player_stats SET team_name = ?, winner = ? WHERE match_id = ? AND map_id = ? AND steam_id IN (?)"; + let pugSql: string = "DELETE FROM team_auth_names WHERE team_id = ? OR team_id = ?"; - let playerStatCheckExistsSql = "SELECT COUNT(*) as cnt FROM player_stats WHERE match_id = ? AND map_id = ?"; - const teamNameOne = await db.query(pugTeamNameSql, [team1_id]); - const teamOneAuths = await db.query(teamAuthSql, [team1_id]); - const teamNameTwo = await db.query(pugTeamNameSql, [team2_id]); - const teamTwoAuths = await db.query(teamAuthSql, [team2_id]); - const doPlayerStatsExist = await db.query(playerStatCheckExistsSql, [match_id, map_id]); - const teamAuthListOne = teamOneAuths[0].auth_name.split(","); - const teamAuthTwoList = teamTwoAuths[0].auth_name.split(","); + let playerStatCheckExistsSql = + "SELECT COUNT(*) as cnt FROM player_stats WHERE match_id = ? AND map_id = ?"; + const teamNameOne: RowDataPacket[] = await db.query(pugTeamNameSql, [ + team1_id + ]); + const teamOneAuths: RowDataPacket[] = await db.query(teamAuthSql, [ + team1_id + ]); + const teamNameTwo: RowDataPacket[] = await db.query(pugTeamNameSql, [ + team2_id + ]); + const teamTwoAuths: RowDataPacket[] = await db.query(teamAuthSql, [ + team2_id + ]); + const doPlayerStatsExist: RowDataPacket[] = await db.query( + playerStatCheckExistsSql, + [match_id, map_id] + ); + const teamAuthListOne: string[] = teamOneAuths[0].auth_name.split(","); + const teamAuthTwoList: string[] = teamTwoAuths[0].auth_name.split(","); // Check to see if player stats already exist. if (doPlayerStatsExist[0].cnt && doPlayerStatsExist[0].cnt > 0) { await db.query(playerStatUpdateSql, [ @@ -416,10 +460,11 @@ class Utils { teamAuthTwoList ]); } else { - let newPlayerArr = []; - let teamNameOneList = teamOneAuths[0].name.split(","); - let teamNameTwoList = teamTwoAuths[0].name.split(","); - playerStatUpdateSql = "INSERT INTO player_stats (match_id, map_id, team_name, steam_id, name, winner) VALUES ?"; + let newPlayerArr: Array<{}> = []; + let teamNameOneList: string[] = teamOneAuths[0].name.split(","); + let teamNameTwoList: string[] = teamTwoAuths[0].name.split(","); + playerStatUpdateSql = + "INSERT INTO player_stats (match_id, map_id, team_name, steam_id, name, winner) VALUES ?"; for (let [idx, auth] of teamAuthListOne.entries()) { newPlayerArr.push([ match_id, @@ -443,19 +488,36 @@ class Utils { await db.query(playerStatUpdateSql, [newPlayerArr]); } if (deleteTeams) { - await db.query(pugSql, [ - team1_id, - team2_id, - ]); + await db.query(pugSql, [team1_id, team2_id]); pugSql = "DELETE FROM team WHERE id = ? OR id = ?"; - await db.query(pugSql, [ - team1_id, - team2_id, - ]); + await db.query(pugSql, [team1_id, team2_id]); } return; } + + /** + * Performs a check on the server to see if the provided API key is correct, and if the match has not been finalized. + * @param {String} providedKey The API key sent by a user/game server. + * @param {String|Number} matchId The match ID sent by the user/game server. + * @returns 0 if successful, 1 if provided API key does not match, and 2 if the match has been finalized. + */ + static async checkApiKey( + providedKey: string, + matchId: string | number + ) { + const matchInformation: RowDataPacket[] = await db.query( + "SELECT api_key, cancelled, end_time FROM `match` WHERE id = ?", + [matchId] + ); + if (providedKey.localeCompare(matchInformation[0]?.api_key) !== 0) return 1; + else if ( + matchInformation[0]?.cancelled === 1 || + matchInformation[0]?.end_time != null + ) + return 2; + else return 0; + } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..b92756e2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,110 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "es6", /* Specify what module code is generated. */ + "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": false, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": [ + "src/**/**/*.js", // Every js file inside src folder + "src/**/**/*.ts", // Every js file inside src folder + "bin/www.js" + ], + "exclude": [ + "node_modules", + "dist" // Exclude compiled output by Typescript compiler + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 59a89419..f96c02d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.1.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: "@jridgewell/gen-mapping" "^0.1.0" @@ -12,7 +12,7 @@ "@apidevtools/json-schema-ref-parser@^9.0.6": version "9.0.9" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b" + resolved "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz" integrity sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w== dependencies: "@jsdevtools/ono" "^7.1.3" @@ -22,17 +22,17 @@ "@apidevtools/openapi-schemas@^2.0.4": version "2.1.0" - resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" + resolved "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz" integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== "@apidevtools/swagger-methods@^3.0.2": version "3.0.2" - resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" + resolved "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz" integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== "@apidevtools/swagger-parser@10.0.2": version "10.0.2" - resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz#f4145afb7c3a3bafe0376f003b5c3bdeae17a952" + resolved "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz" integrity sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg== dependencies: "@apidevtools/json-schema-ref-parser" "^9.0.6" @@ -44,19 +44,19 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.18.8": version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.13.tgz#6aff7b350a1e8c3e40b029e46cbe78e24a913483" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz" integrity sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw== "@babel/core@^7.11.6", "@babel/core@^7.12.3": version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.13.tgz#9be8c44512751b05094a4d3ab05fc53a47ce00ac" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz" integrity sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A== dependencies: "@ampproject/remapping" "^2.1.0" @@ -77,7 +77,7 @@ "@babel/generator@^7.18.13", "@babel/generator@^7.7.2": version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.13.tgz#59550cbb9ae79b8def15587bdfbaa388c4abf212" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz" integrity sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ== dependencies: "@babel/types" "^7.18.13" @@ -86,7 +86,7 @@ "@babel/helper-compilation-targets@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz" integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: "@babel/compat-data" "^7.18.8" @@ -96,12 +96,12 @@ "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== "@babel/helper-function-name@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz" integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== dependencies: "@babel/template" "^7.18.6" @@ -109,21 +109,21 @@ "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-imports@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== dependencies: "@babel/types" "^7.18.6" "@babel/helper-module-transforms@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz" integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== dependencies: "@babel/helper-environment-visitor" "^7.18.9" @@ -137,41 +137,41 @@ "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz" integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== "@babel/helper-simple-access@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== dependencies: "@babel/types" "^7.18.6" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + 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== dependencies: "@babel/types" "^7.18.6" "@babel/helper-string-parser@^7.18.10": version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== "@babel/helper-validator-option@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== "@babel/helpers@^7.18.9": version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz" integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== dependencies: "@babel/template" "^7.18.6" @@ -180,119 +180,124 @@ "@babel/highlight@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== dependencies: "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13", "@babel/parser@^7.9.4": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.18.13": version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.13.tgz#5b2dd21cae4a2c5145f1fbd8ca103f9313d3b7e4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz" integrity sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg== +"@babel/parser@^7.20.15": + version "7.22.4" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== dependencies: "@babel/helper-plugin-utils" "^7.18.6" "@babel/template@^7.18.10", "@babel/template@^7.18.6", "@babel/template@^7.3.3": version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== dependencies: "@babel/code-frame" "^7.18.6" @@ -301,7 +306,7 @@ "@babel/traverse@^7.18.13", "@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.13.tgz#5ab59ef51a997b3f10c4587d648b9696b6cb1a68" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz" integrity sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA== dependencies: "@babel/code-frame" "^7.18.6" @@ -317,7 +322,7 @@ "@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.13", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.18.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.13.tgz#30aeb9e514f4100f7c1cb6e5ba472b30e48f519a" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz" integrity sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ== dependencies: "@babel/helper-string-parser" "^7.18.10" @@ -326,17 +331,17 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@colors/colors@1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -347,112 +352,112 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.0.1.tgz#e0e429cfc89900e3a46ce27f493bf488395ade39" - integrity sha512-SxLvSKf9gk4Rvt3p2KRQWVQ3sVj7S37rjlCHwp2+xNcRO/X+Uw0idbkfOtciUpjghHIxyggqcrrKhThQ+vClLQ== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.0.1" - jest-util "^29.0.1" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" -"@jest/core@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.0.1.tgz#a49517795f692a510b6fae55a9c09e659826c472" - integrity sha512-EcFrXkYh8I1GYHRH9V4TU7jr4P6ckaPqGo/z4AIJjHDZxicjYgWB6fx1xFb5bhEM87eUjCF4FAY5t+RamLWQmA== +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== dependencies: - "@jest/console" "^29.0.1" - "@jest/reporters" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@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" "@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.0.0" - jest-config "^29.0.1" - jest-haste-map "^29.0.1" - jest-message-util "^29.0.1" - jest-regex-util "^29.0.0" - jest-resolve "^29.0.1" - jest-resolve-dependencies "^29.0.1" - jest-runner "^29.0.1" - jest-runtime "^29.0.1" - jest-snapshot "^29.0.1" - jest-util "^29.0.1" - jest-validate "^29.0.1" - jest-watcher "^29.0.1" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + 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" micromatch "^4.0.4" - pretty-format "^29.0.1" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.0.1.tgz#d236ce9e906744ac58bfc59ae6f7c9882ace7927" - integrity sha512-iLcFfoq2K6DAB+Mc+2VNLzZVmHdwQFeSqvoM/X8SMON6s/+yEi1iuRX3snx/JfwSnvmiMXjSr0lktxNxOcqXYA== +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.0.1" + jest-mock "^29.5.0" -"@jest/expect-utils@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.0.1.tgz#c1a84ee66caaef537f351dd82f7c63d559cf78d5" - integrity sha512-Tw5kUUOKmXGQDmQ9TSgTraFFS7HMC1HG/B7y0AN2G2UzjdAXz9BzK2rmNpCSDl7g7y0Gf/VLBm//blonvhtOTQ== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: - jest-get-type "^29.0.0" + jest-get-type "^29.4.3" -"@jest/expect@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.0.1.tgz#0ffde7f5b4c87f1dd6f8664726bd53f6cd1f7014" - integrity sha512-qKB3q52XDV8VUEiqKKLgLrJx7puQ8sYVqIDlul6n7SIXWS97DOK3KqbR2rDDaMtmenRHqEUl2fI+aFzx0oSemA== +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== dependencies: - expect "^29.0.1" - jest-snapshot "^29.0.1" + expect "^29.5.0" + jest-snapshot "^29.5.0" -"@jest/fake-timers@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.0.1.tgz#51ba7a82431db479d4b828576c139c4c0dc5e409" - integrity sha512-XZ+kAhLChVQ+KJNa5034p7O1Mz3vtWrelxDcMoxhZkgqmWDaEQAW9qJeutaeCfPvwaEwKYVyKDYfWpcyT8RiMw== +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: - "@jest/types" "^29.0.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.0.1" - jest-mock "^29.0.1" - jest-util "^29.0.1" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" -"@jest/globals@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.0.1.tgz#764135ad31408fb632b3126793ab3aaed933095f" - integrity sha512-BtZWrVrKRKNUt7T1H2S8Mz31PN7ItROCmH+V5pn10hJDUfjOCTIUwb0WtLZzm0f1tJ3Uvx+5lVZrF/VTKqNaFg== +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@jest/environment" "^29.0.1" - "@jest/expect" "^29.0.1" - "@jest/types" "^29.0.1" - jest-mock "^29.0.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" -"@jest/reporters@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.0.1.tgz#82a491657031c1cc278bf659905e5094973309ad" - integrity sha512-dM3L8JmYYOsdeXUUVZClQy67Tz/v1sMo9h4AQv2U+716VLHV0zdA6Hh4FQNAHMhYw/95dbZbPX8Q+TRR7Rw+wA== +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@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" "@types/node" "*" chalk "^4.0.0" @@ -465,78 +470,77 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.0.1" - jest-util "^29.0.1" - jest-worker "^29.0.1" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" -"@jest/source-map@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.0.0.tgz#f8d1518298089f8ae624e442bbb6eb870ee7783c" - integrity sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ== +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== dependencies: "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.0.1.tgz#97ac334e4c6f7d016c341cdd500aa423a38e4cdd" - integrity sha512-XCA4whh/igxjBaR/Hg8qwFd/uTsauoD7QAdAYUjV2CSGx0+iunhjoCRRWTwqjQrETRqOJABx6kNfw0+C0vMSgQ== +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.0.1.tgz#7074b5f89ce30941b5b0fb493a19308d441a30b8" - integrity sha512-3GhSBMCRcWXGluP2Dw7CLP6mNke/t+EcftF5YjzhX1BJmqcatMbtZVwjuCfZy0TCME1GevXy3qTyV5PLpwIFKQ== +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^29.0.1" + "@jest/test-result" "^29.5.0" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" + jest-haste-map "^29.5.0" slash "^3.0.0" -"@jest/transform@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.0.1.tgz#fdaa5d9e135c9bd7addbe65bedd1f15ad028cc7e" - integrity sha512-6UxXtqrPScFdDhoip8ys60dQAIYppQinyR87n9nlasR/ZnFfJohKToqzM29KK4gb9gHRv5oDFChdqZKE0SIhsg== +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" + convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" - jest-regex-util "^29.0.0" - jest-util "^29.0.1" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" -"@jest/types@^29.0.1": - version "29.0.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.0.1.tgz#1985650acf137bdb81710ff39a4689ec071dd86a" - integrity sha512-ft01rxzVsbh9qZPJ6EFgAIj3PT9FCRfBF9Xljo2/33VDOUjLZr0ZJ2oKANqh9S/K0/GERCsHDAQlBwj7RxA+9g== +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -545,7 +549,7 @@ "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: "@jridgewell/set-array" "^1.0.0" @@ -553,7 +557,7 @@ "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -562,22 +566,22 @@ "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + 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.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz" integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -585,12 +589,19 @@ "@jsdevtools/ono@^7.1.3": version "7.1.3" - resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + resolved "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== +"@jsdoc/salty@^0.2.1": + version "0.2.5" + resolved "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.5.tgz" + integrity sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw== + dependencies: + lodash "^4.17.21" + "@mapbox/node-pre-gyp@^1.0.0": version "1.0.9" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz" integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw== dependencies: detect-libc "^2.0.0" @@ -605,7 +616,7 @@ "@node-steam/id@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@node-steam/id/-/id-1.2.0.tgz#2ab90e21ddd181ab2a86d86557d7dbc571f632c4" + resolved "https://registry.npmjs.org/@node-steam/id/-/id-1.2.0.tgz" integrity sha512-tI6QecSsVwcNaQeFTe8gLJbHVPywhBXFb5FroVOs2jpTXqBH9s9HK4n/5LtmMcO6o3Kf2o2//vzrNuufTt4kBA== dependencies: "@types/cuint" "0.2.1" @@ -613,7 +624,7 @@ "@opencensus/core@0.0.9": version "0.0.9" - resolved "https://registry.yarnpkg.com/@opencensus/core/-/core-0.0.9.tgz#b16f775435ee309433e4126af194d37313fc93b3" + resolved "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz" integrity sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q== dependencies: continuation-local-storage "^3.2.1" @@ -624,7 +635,7 @@ "@opencensus/core@^0.0.8": version "0.0.8" - resolved "https://registry.yarnpkg.com/@opencensus/core/-/core-0.0.8.tgz#df01f200c2d2fbfe14dae129a1a86fb87286db92" + resolved "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz" integrity sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ== dependencies: continuation-local-storage "^3.2.1" @@ -635,7 +646,7 @@ "@opencensus/propagation-b3@0.0.8": version "0.0.8" - resolved "https://registry.yarnpkg.com/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz#0751e6fd75f09400d9d3c419001e9e15a0df68e9" + resolved "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz" integrity sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A== dependencies: "@opencensus/core" "^0.0.8" @@ -643,7 +654,7 @@ "@passport-next/passport-openid@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@passport-next/passport-openid/-/passport-openid-1.0.0.tgz#d3b5e067a9aa1388ed172ab7cc02c39b8634283d" + resolved "https://registry.npmjs.org/@passport-next/passport-openid/-/passport-openid-1.0.0.tgz" integrity sha512-W9uj4Ui/ZK/iBUNzSNxPWDQ8wCD1tUddGEVSGm0FN0B7ewo3yBQLGMoW3i3UqcwEzxdyGbAj06ohAhNQIXC4VA== dependencies: "@passport-next/passport-strategy" "1.x.x" @@ -651,12 +662,12 @@ "@passport-next/passport-strategy@1.x.x": version "1.1.0" - resolved "https://registry.yarnpkg.com/@passport-next/passport-strategy/-/passport-strategy-1.1.0.tgz#4c0df069e2ec9262791b9ef1e23320c1d73bdb74" + resolved "https://registry.npmjs.org/@passport-next/passport-strategy/-/passport-strategy-1.1.0.tgz" integrity sha512-2KhFjtPueJG6xVj2HnqXt9BlANOfYCVLyu+pXYjPGBDT8yk+vQwc/6tsceIj+mayKcoxMau2JimggXRPHgoc8w== "@pm2/agent@~2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@pm2/agent/-/agent-2.0.1.tgz#0edffc54cd8ee2b12f90136264e7880f3f78c79d" + resolved "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.1.tgz" integrity sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw== dependencies: async "~3.2.0" @@ -675,7 +686,7 @@ "@pm2/io@~5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@pm2/io/-/io-5.0.0.tgz#623cbcaf6fe39375f20ac2e75497477a1b1ec5c5" + resolved "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz" integrity sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw== dependencies: "@opencensus/core" "0.0.9" @@ -691,7 +702,7 @@ "@pm2/js-api@~0.6.7": version "0.6.7" - resolved "https://registry.yarnpkg.com/@pm2/js-api/-/js-api-0.6.7.tgz#ed28c3b7b6d26f03f826318754fdc5468afa589f" + resolved "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz" integrity sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw== dependencies: async "^2.6.3" @@ -702,19 +713,19 @@ "@pm2/pm2-version-check@latest": version "1.0.4" - resolved "https://registry.yarnpkg.com/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz#cf97fbb14b0eca95430ca05eedccbd2683806e43" + resolved "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz" integrity sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA== dependencies: debug "^4.3.1" "@redis/bloom@1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.0.2.tgz#42b82ec399a92db05e29fffcdfd9235a5fc15cdf" + resolved "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz" integrity sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw== "@redis/client@1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.3.0.tgz#c62ccd707f16370a2dc2f9e158a28b7da049fa77" + resolved "https://registry.npmjs.org/@redis/client/-/client-1.3.0.tgz" integrity sha512-XCFV60nloXAefDsPnYMjHGtvbtHR8fV5Om8cQ0JYqTNbWcQo/4AryzJ2luRj4blveWazRK/j40gES8M7Cp6cfQ== dependencies: cluster-key-slot "1.1.0" @@ -723,51 +734,56 @@ "@redis/graph@1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@redis/graph/-/graph-1.0.1.tgz#eabc58ba99cd70d0c907169c02b55497e4ec8a99" + resolved "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz" integrity sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ== "@redis/json@1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.3.tgz#a13fde1d22ebff0ae2805cd8e1e70522b08ea866" + resolved "https://registry.npmjs.org/@redis/json/-/json-1.0.3.tgz" integrity sha512-4X0Qv0BzD9Zlb0edkUoau5c1bInWSICqXAGrpwEltkncUwcxJIGEcVryZhLgb0p/3PkKaLIWkjhHRtLe9yiA7Q== "@redis/search@1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.0.tgz#7abb18d431f27ceafe6bcb4dd83a3fa67e9ab4df" + resolved "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz" integrity sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ== "@redis/time-series@1.0.3": version "1.0.3" - resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.3.tgz#4cfca8e564228c0bddcdf4418cba60c20b224ac4" + resolved "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz" integrity sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA== -"@sinclair/typebox@^0.24.1": - version "0.24.28" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.28.tgz#15aa0b416f82c268b1573ab653e4413c965fe794" - integrity sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" + integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^3.0.0" "@tootallnate/once@1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/aes-js@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/aes-js/-/aes-js-3.1.1.tgz#34b3978122310c135de4b377270d1d65676fae28" + integrity sha512-SDSGgXT3LRCH6qMWk8OHT1vLSVNuHNvCpKCx2/TYtQMbMGGgxJC9fspwSkQjqzRagrWnCrxuLL3jMNXLXHHvSw== + "@types/babel__core@^7.1.14": version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== dependencies: "@babel/parser" "^7.1.0" @@ -778,14 +794,14 @@ "@types/babel__generator@*": version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" @@ -793,43 +809,58 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.18.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.0.tgz#8134fd78cb39567465be65b9fdc16d378095f41f" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz" integrity sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw== dependencies: "@babel/types" "^7.3.0" "@types/body-parser@*": version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" "@types/node" "*" +"@types/config@^3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@types/config/-/config-3.3.0.tgz" + integrity sha512-9kZSbl3/X3TVNowLCu5HFQdQmD+4287Om55avknEYkuo6R2dDrsp/EXEHUFvfYeG7m1eJ0WYGj+cbcUIhARJAQ== + "@types/connect@*": version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" "@types/cuint@0.2.1": version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/cuint/-/cuint-0.2.1.tgz#eb61d1c69b3d2e26701cc534687bb746f2dbf13e" + resolved "https://registry.npmjs.org/@types/cuint/-/cuint-0.2.1.tgz" integrity sha512-yIO66K76vGSV1Y2Ovq5LklkYiHOtbJIukCfO9GRYg7hDccwoapWkDKaygxBvDgB+1uNHsgaTyK41xtbJGLCCGA== "@types/express-serve-static-core@^4.17.18": version "4.17.30" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz" integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" +"@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + "@types/express@*", "@types/express@^4.16.1": version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== dependencies: "@types/body-parser" "*" @@ -837,45 +868,55 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@^4.17.17": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/graceful-fs@^4.1.3": version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/json-schema@^7.0.6": version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/linkify-it@*": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" + resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz" integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== "@types/markdown-it@^12.2.3": version "12.2.3" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" + resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz" integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== dependencies: "@types/linkify-it" "*" @@ -883,44 +924,57 @@ "@types/mdurl@*": version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" + resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz" integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== "@types/mime@*": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/node@*": - version "18.0.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7" - integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*", "@types/node@^20.2.5": + version "20.2.5" + resolved "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/passport@^1.0.0": version "1.0.10" - resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.10.tgz#c518f2bae8b1538b7be71ee7f9220fbd3f569f05" + resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.10.tgz" integrity sha512-IZamnXuN7mY+2/v8bAW6nuTcKiay7gXBBcMBZ8n7YHB4u5DwsWoJaNrHdAQ8PZEODRjCv3oHOg76CYJ40j9RqA== dependencies: "@types/express" "*" "@types/prettier@^2.1.5": version "2.7.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.0.tgz#ea03e9f0376a4446f44797ca19d9c46c36e352dc" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz" integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A== "@types/qs@*": version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/range-parser@*": version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + "@types/serve-static@*": version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== dependencies: "@types/mime" "*" @@ -928,29 +982,34 @@ "@types/stack-utils@^2.0.0": version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/steamapi@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@types/steamapi/-/steamapi-2.2.2.tgz#4f9f7c6adce8a67207e89b5af2f427b92336f564" + integrity sha512-I64sxNOaTtp8/pFqhgz1niI8sIEgnRLv1xF8juq7nNRiyWiCWMm+bnwD4oo06nhzQH0xZt6pG0RQipmBWMFxPg== + "@types/yargs-parser@*": version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": version "17.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.11.tgz#5e10ca33e219807c0eee0f08b5efcba9b6a42c06" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz" integrity sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA== dependencies: "@types/yargs-parser" "*" abbrev@1: version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -958,77 +1017,77 @@ accepts@~1.3.8: acorn-walk@^8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^8.7.0: version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== aes-js@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz" integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" amp-message@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/amp-message/-/amp-message-0.1.2.tgz#a78f1c98995087ad36192a41298e4db49e3dfc45" + resolved "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz" integrity sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg== dependencies: amp "0.3.1" amp@0.3.1, amp@~0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/amp/-/amp-0.3.1.tgz#6adf8d58a74f361e82c1fa8d389c079e139fc47d" + resolved "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz" integrity sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw== ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + 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@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" @@ -1036,12 +1095,12 @@ anymatch@^3.0.3, anymatch@~3.1.2: "aproba@^1.0.3 || ^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== are-we-there-yet@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== dependencies: delegates "^1.0.0" @@ -1049,48 +1108,48 @@ are-we-there-yet@^2.0.0: argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-uniq@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.2.tgz#5fcc373920775723cfd64d65c64bef53bf9eba6d" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz" integrity sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA== asap@^2.0.0: version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1@^0.2.4: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" ast-types@^0.13.2: version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== dependencies: tslib "^2.0.1" async-listener@^0.6.0: version "0.6.10" - resolved "https://registry.yarnpkg.com/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc" + resolved "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz" integrity sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw== dependencies: semver "^5.3.0" @@ -1098,49 +1157,49 @@ async-listener@^0.6.0: async@3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + resolved "https://registry.npmjs.org/async/-/async-3.2.3.tgz" integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== async@^2.6.3, async@~2.6.1: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" async@^3.2.0, async@^3.2.3, async@~3.2.0: version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^0.21.0, axios@^0.21.4: version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: follow-redirects "^1.14.0" -babel-jest@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.0.1.tgz#db50de501fc8727e768f5aa417496cb871ee1ba0" - integrity sha512-wyI9r8tqwsZEMWiIaYjdUJ6ztZIO4DMWpGq7laW34wR71WtRS+D/iBEtXOP5W2aSYCVUQMsypRl/xiJYZznnTg== +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^29.0.1" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.0.0" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1149,10 +1208,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.0.tgz#ae4873399a199ede93697a15919d3d0f614a2eb1" - integrity sha512-B9oaXrlxXHFWeWqhDPg03iqQd2UN/mg/VdZOsLaqAVBkztru3ctTryAI4zisxLEEgmcUnLTKewqx0gGifoXD3A== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1161,7 +1220,7 @@ babel-plugin-jest-hoist@^29.0.0: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -1177,36 +1236,36 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.0.tgz#52d7f1afe3a15d14a3c5ab4349cbd388d98d330b" - integrity sha512-B5Ke47Xcs8rDF3p1korT3LoilpADCwbG93ALqtvqu6Xpf4d8alKkrCBTExbNzdHJcIuEPpfYvEaFFRGee2kUgQ== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^29.0.0" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== basic-auth@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== dependencies: safe-buffer "5.1.2" bcrypt-pbkdf@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bcrypt@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.1.tgz#f1a2c20f208e2ccdceea4433df0c8b2c54ecdf71" + resolved "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz" integrity sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw== dependencies: "@mapbox/node-pre-gyp" "^1.0.0" @@ -1214,27 +1273,27 @@ bcrypt@^5.0.0: binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== blessed@0.1.81: version "0.1.81" - resolved "https://registry.yarnpkg.com/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129" + resolved "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz" integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ== bluebird@^3.1.1, bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bodec@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/bodec/-/bodec-0.1.0.tgz#bc851555430f23c9f7650a75ef64c6a94c3418cc" + resolved "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz" integrity sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ== body-parser@1.19.2: version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz" integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== dependencies: bytes "3.1.2" @@ -1250,7 +1309,7 @@ body-parser@1.19.2: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1258,14 +1317,14 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" browserslist@^4.20.2: version "4.21.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz" integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== dependencies: caniuse-lite "^1.0.30001370" @@ -1273,26 +1332,33 @@ browserslist@^4.20.2: node-releases "^2.0.6" update-browserslist-db "^1.0.5" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" @@ -1300,39 +1366,39 @@ call-bind@^1.0.0: call-me-maybe@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz" integrity sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001370: version "1.0.30001383" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz#aecf317ccd940690725ae3ae4f28293c5fb8050e" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz" integrity sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg== catharsis@^0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + resolved "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz" integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== dependencies: lodash "^4.17.15" chalk@3.0.0, chalk@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" @@ -1340,7 +1406,7 @@ chalk@3.0.0, chalk@~3.0.0: chalk@^2.0.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1349,7 +1415,7 @@ chalk@^2.0.0: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1357,17 +1423,17 @@ chalk@^4.0.0: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== charm@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/charm/-/charm-0.1.2.tgz#06c21eed1a1b06aeb67553cdc53e23274bac2296" + resolved "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz" integrity sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ== chokidar@^3.5.1, chokidar@^3.5.2: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -1382,29 +1448,29 @@ chokidar@^3.5.1, chokidar@^3.5.2: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^3.2.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz" integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== cjs-module-lexer@^1.0.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== cli-tableau@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/cli-tableau/-/cli-tableau-2.0.1.tgz#baa78d83e08a2d7ab79b7dad9406f0254977053f" + resolved "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz" integrity sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ== dependencies: chalk "3.0.0" cliui@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: string-width "^4.2.0" @@ -1413,7 +1479,7 @@ cliui@^6.0.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1422,132 +1488,137 @@ cliui@^7.0.2: cluster-key-slot@1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz" integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-support@^1.1.2: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== colors@1.0.x: version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@2.15.1: version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== commander@6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz" integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== commander@^2.7.1: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== component-emitter@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== config@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/config/-/config-3.3.7.tgz#4310410dc2bf4e0effdca21a12a4035860a24ee4" + resolved "https://registry.npmjs.org/config/-/config-3.3.7.tgz" integrity sha512-mX/n7GKDYZMqvvkY6e6oBY49W8wxdmQt+ho/5lhwFDXqQW9gI+Ahp8EKp8VAbISPnmf2+Bv5uZK7lKXZ6pf1aA== dependencies: json5 "^2.1.1" connect-redis@^6.1.3: version "6.1.3" - resolved "https://registry.yarnpkg.com/connect-redis/-/connect-redis-6.1.3.tgz#0a83c953f9ece45ae37d304a8e8d1c3c6a60b4b9" + resolved "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz" integrity sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw== console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== continuation-local-storage@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb" + resolved "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz" integrity sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA== dependencies: async-listener "^0.6.0" emitter-listener "^1.1.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-parser@^1.4.4, cookie-parser@~1.4.6: version "1.4.6" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" + resolved "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz" integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== dependencies: cookie "0.4.1" @@ -1555,37 +1626,37 @@ cookie-parser@^1.4.4, cookie-parser@~1.4.6: cookie-signature@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== cookie@0.4.2: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== cookie@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== -cookiejar@^2.1.3: +cookiejar@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cors@^2.8.5: version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: object-assign "^4" @@ -1593,19 +1664,19 @@ cors@^2.8.5: cpu-features@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.2.tgz#9f636156f1155fd04bdbaa028bb3c2fbef3cea7a" + resolved "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz" integrity sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA== dependencies: nan "^2.14.1" croner@~4.1.92: version "4.1.97" - resolved "https://registry.yarnpkg.com/croner/-/croner-4.1.97.tgz#6e373dc7bb3026fab2deb0d82685feef20796766" + resolved "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz" integrity sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ== cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -1614,44 +1685,44 @@ cross-spawn@^7.0.3: cuint@0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + resolved "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz" integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== culvert@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/culvert/-/culvert-0.1.2.tgz#9502f5f0154a2d5a22a023e79f71cc936fa6ef6f" + resolved "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz" integrity sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg== cycle@1.0.x: version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + resolved "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" integrity sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA== data-uri-to-buffer@3: version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== data-uri-to-buffer@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz" integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== dayjs@~1.8.24, dayjs@~1.8.25: version "1.8.36" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.36.tgz#be36e248467afabf8f5a86bae0de0cdceecced50" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz" integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw== db-migrate-base@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/db-migrate-base/-/db-migrate-base-2.3.1.tgz#97029e230b344f00cf2e4475e2e6027f7b09994c" + resolved "https://registry.npmjs.org/db-migrate-base/-/db-migrate-base-2.3.1.tgz" integrity sha512-HewYQ3HPmy7NOWmhhMLg9TzN1StEtSqGL3w8IbBRCxEsJ+oM3bDUQ/z5fqpYKfIUK07mMXieCmZYwFpwWkSHDw== dependencies: bluebird "^3.1.1" db-migrate-mysql@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/db-migrate-mysql/-/db-migrate-mysql-2.2.0.tgz#60e5cc4ab1bb0d64bb96a6a4ee12149bd56fa4bf" + resolved "https://registry.npmjs.org/db-migrate-mysql/-/db-migrate-mysql-2.2.0.tgz" integrity sha512-AmZVPGKGQIWB8dWC4Md7JcxJI/IGSDLocLc7L2rbPGG7lV5Z5PgvR08ZtQTPSydX6Sr3nOdcXiXsK7HGQOCV0w== dependencies: bluebird "^3.7.2" @@ -1661,12 +1732,12 @@ db-migrate-mysql@^2.2.0: db-migrate-shared@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/db-migrate-shared/-/db-migrate-shared-1.2.0.tgz#6125be1b3a5e661229fc75d50c85f6c3ffadbede" + resolved "https://registry.npmjs.org/db-migrate-shared/-/db-migrate-shared-1.2.0.tgz" integrity sha512-65k86bVeHaMxb2L0Gw3y5V+CgZSRwhVQMwDMydmw5MvIpHHwD6SmBciqIwHsZfzJ9yzV/yYhdRefRM6FV5/siw== db-migrate@^0.11.13: version "0.11.13" - resolved "https://registry.yarnpkg.com/db-migrate/-/db-migrate-0.11.13.tgz#b9e5b242c62e82ef8ed2b29e118698813e953d67" + resolved "https://registry.npmjs.org/db-migrate/-/db-migrate-0.11.13.tgz" integrity sha512-OE/bbDo/mQvLmZrui/2jNAiAECJROSURCOU5xs6qKr3FvtUE2O6b0xBUI6WyAAKdili3LJQHFlpqugiYCGTSBA== dependencies: balanced-match "^1.0.0" @@ -1687,60 +1758,60 @@ db-migrate@^0.11.13: debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~4.3.1: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" debug@^3.2.6, debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@~4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== dedent@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== degenerator@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.2.tgz#6a61fcc42a702d6e50ff6023fe17bff435f68235" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz" integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ== dependencies: ast-types "^0.13.2" @@ -1750,153 +1821,158 @@ degenerator@^3.0.2: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== denque@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + 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.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== depd@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== destroy@~1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== detect-libc@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -dezalgo@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha512-K7i4zNfT2kgQz3GylDw40ot9GAE47sFZ9EXHFSPP6zONLgH6kWXE0KWJchkbQJLBkRazq4APwZ4OwiFFlT95OQ== +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== dependencies: asap "^2.0.0" wrappy "1" -diff-sequences@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" - integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== doctrine@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dotenv@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz" integrity sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow== +duplexer@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.202: version "1.4.233" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz#aa142e45468bda111b88abc9cc59d573b75d6a60" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz" integrity sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw== emitter-listener@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8" + resolved "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz" integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ== dependencies: shimmer "^1.2.0" -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== enquirer@2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" entities@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es6-promise@^4.2.6: version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^1.8.1: version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" @@ -1908,42 +1984,55 @@ escodegen@^1.8.1: esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== estraverse@^4.2.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter2@5.0.1, eventemitter2@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz" integrity sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg== eventemitter2@^6.3.1: version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== eventemitter2@~0.4.14: version "0.4.14" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" integrity sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ== execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -1958,36 +2047,36 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.0.1.tgz#a2fa64a59cffe4b4007877e730bc82be3d1742bb" - integrity sha512-yQgemsjLU+1S8t2A7pXT3Sn/v5/37LY8J+tocWtKEA0iEYYc6gfKbbJJX2fxHZmd7K9WpdbQqXUpmYkq1aewYg== +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - "@jest/expect-utils" "^29.0.1" - jest-get-type "^29.0.0" - jest-matcher-utils "^29.0.1" - jest-message-util "^29.0.1" - jest-util "^29.0.1" + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" express-bearer-token@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/express-bearer-token/-/express-bearer-token-2.4.0.tgz#f4d9d5a1e318953445e7f0d2bde00bb96d21c95a" + resolved "https://registry.npmjs.org/express-bearer-token/-/express-bearer-token-2.4.0.tgz" integrity sha512-2+kRZT2xo+pmmvSY7Ma5FzxTJpO3kGaPCEXPbAm3GaoZ/z6FE4K6L7cvs1AUZwY2xkk15PcQw7t4dWjsl5rdJw== dependencies: cookie "^0.3.1" cookie-parser "^1.4.4" -express-rate-limit@^5.0.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" - integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== +express-rate-limit@^6.7.0: + version "6.7.0" + resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz" + integrity sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA== express-session@^1.17.0: version "1.17.3" - resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.3.tgz#14b997a15ed43e5949cb1d073725675dd2777f36" + resolved "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz" integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== dependencies: cookie "0.4.2" @@ -2001,7 +2090,7 @@ express-session@^1.17.0: express@~4.17.1: version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" + resolved "https://registry.npmjs.org/express/-/express-4.17.3.tgz" integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== dependencies: accepts "~1.3.8" @@ -2037,44 +2126,44 @@ express@~4.17.1: eyes@0.1.x: version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== fast-json-patch@^3.0.0-1: version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" + resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-safe-stringify@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== fb-watchman@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== dependencies: bser "2.1.1" fclone@1.0.11, fclone@~1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" + resolved "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz" integrity sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw== fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== dependencies: node-domexception "^1.0.0" @@ -2082,19 +2171,19 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: file-uri-to-path@2: version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz" integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" final-fs@^1.6.0: version "1.6.1" - resolved "https://registry.yarnpkg.com/final-fs/-/final-fs-1.6.1.tgz#d6dcd92ef6fe4fe8c07abd568c7135610ede3236" + resolved "https://registry.npmjs.org/final-fs/-/final-fs-1.6.1.tgz" integrity sha512-r5dgz23H8qh1LxKVJK84zet2PhWSWkIOgbLVUd5PlNFAULD/kCDBH9JEMwJt9dpdTnLsSD4rEqS56p2MH7Wbvw== dependencies: node-fs "~0.1.5" @@ -2102,7 +2191,7 @@ final-fs@^1.6.0: finalhandler@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== dependencies: debug "2.6.9" @@ -2115,7 +2204,7 @@ finalhandler@~1.1.2: find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2123,12 +2212,12 @@ find-up@^4.0.0, find-up@^4.1.0: follow-redirects@^1.14.0: version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== form-data@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -2137,34 +2226,39 @@ form-data@^4.0.0: formdata-polyfill@^4.0.10: version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== dependencies: fetch-blob "^3.1.2" -formidable@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" - integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== +formidable@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== dependencies: - dezalgo "1.0.3" - hexoid "1.0.0" - once "1.4.0" - qs "6.9.3" + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -2173,14 +2267,14 @@ fs-extra@^8.1.0: fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: @@ -2190,7 +2284,7 @@ fsevents@^2.3.2, fsevents@~2.3.2: ftp@^0.3.10: version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + resolved "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz" integrity sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ== dependencies: readable-stream "1.1.x" @@ -2198,12 +2292,12 @@ ftp@^0.3.10: function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gauge@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== dependencies: aproba "^1.0.3 || ^2.0.0" @@ -2218,29 +2312,29 @@ gauge@^3.0.0: generate-function@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + resolved "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz" integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== dependencies: is-property "^1.0.2" generic-pool@3.8.2: version "3.8.2" - resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.8.2.tgz#aab4f280adb522fdfbdc5e5b64d718d3683f04e9" + resolved "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz" integrity sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.0.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" @@ -2249,17 +2343,17 @@ get-intrinsic@^1.0.2: get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-uri@3: version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz" integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== dependencies: "@tootallnate/once" "1" @@ -2271,24 +2365,24 @@ get-uri@3: git-node-fs@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/git-node-fs/-/git-node-fs-1.0.0.tgz#49b215e242ebe43aa4c7561bbba499521752080f" + resolved "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz" integrity sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ== git-sha1@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/git-sha1/-/git-sha1-0.1.2.tgz#599ac192b71875825e13a445f3a6e05118c2f745" + resolved "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz" integrity sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg== glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@7.1.6: version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" @@ -2300,7 +2394,7 @@ glob@7.1.6: glob@^7.0.5, glob@^7.1.3, glob@^7.1.4: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2312,59 +2406,59 @@ glob@^7.0.5, glob@^7.1.3, glob@^7.1.4: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.9: version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-unicode@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" helmet@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-6.0.0.tgz#8e183820ddccd7729a206ad73c577b264f495595" + resolved "https://registry.npmjs.org/helmet/-/helmet-6.0.0.tgz" integrity sha512-FO9RpR1wNJepH/GbLPQVtkE2eESglXL641p7SdyoT4LngHFJcZheHMoyUcjCZF4qpuMMO1u5q6RK0l9Ux8JBcg== -hexoid@1.0.0: +hexoid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + resolved "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-errors@1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: depd "~1.1.2" @@ -2375,7 +2469,7 @@ http-errors@1.8.1: http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -2386,7 +2480,7 @@ http-errors@2.0.0: http-errors@~1.7.3: version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== dependencies: depd "~1.1.2" @@ -2397,7 +2491,7 @@ http-errors@~1.7.3: http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: "@tootallnate/once" "1" @@ -2406,7 +2500,7 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: https-proxy-agent@5, https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -2414,36 +2508,36 @@ https-proxy-agent@5, https-proxy-agent@^5.0.0: human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ignore-by-default@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== immediate@~3.0.5: version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -2451,17 +2545,17 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflection@^1.10.0: version "1.13.2" - resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.2.tgz#15e8c797c6c3dadf31aa658f8df8a4ea024798b0" + resolved "https://registry.npmjs.org/inflection/-/inflection-1.13.2.tgz" integrity sha512-cmZlljCRTBFouT8UzMzrGcVEvkv6D/wBdcdKG7J1QH5cXjtU75Dm+P27v9EKu/Y43UYyCJd1WC4zLebRrC8NBw== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -2469,113 +2563,113 @@ inflight@^1.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.5, ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ip@^1.1.5: version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== ip@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.9.0: version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-property@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + resolved "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== isarray@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@0.1.x: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz" integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== dependencies: "@babel/core" "^7.12.3" @@ -2586,7 +2680,7 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-report@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -2595,7 +2689,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -2604,288 +2698,290 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.0.0.tgz#aa238eae42d9372a413dd9a8dadc91ca1806dce0" - integrity sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.0.1.tgz#7ecb4913e134fb4addc03655fb36c9398014fa07" - integrity sha512-I5J4LyK3qPo8EnqPmxsMAVR+2SFx7JOaZsbqW9xQmk4UDmTCD92EQgS162Ey3Jq6CfpKJKFDhzhG3QqiE0fRbw== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^29.0.1" - "@jest/expect" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.0.1" - jest-matcher-utils "^29.0.1" - jest-message-util "^29.0.1" - jest-runtime "^29.0.1" - jest-snapshot "^29.0.1" - jest-util "^29.0.1" + 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" p-limit "^3.1.0" - pretty-format "^29.0.1" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.0.1.tgz#6633c2ab97337ac5207910bd6b0aba2ef0900110" - integrity sha512-XozBHtoJCS6mnjCxNESyGm47Y4xSWzNlBJj4tix9nGrG6m068B83lrTWKtjYAenYSfOqyYVpQCkyqUp35IT+qA== +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.0.1" - jest-util "^29.0.1" - jest-validate "^29.0.1" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.0.1.tgz#bccc2aedc3bafb6cb08bad23e5f0fcc3b1959268" - integrity sha512-3duIx5ucEPIsUOESDTuasMfqHonD0oZRjqHycIMHSC4JwbvHDjAWNKN/NiM0ZxHXjAYrMTLt2QxSQ+IqlbYE5A== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.0.1" - "@jest/types" "^29.0.1" - babel-jest "^29.0.1" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.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.0.1" - jest-environment-node "^29.0.1" - jest-get-type "^29.0.0" - jest-regex-util "^29.0.0" - jest-resolve "^29.0.1" - jest-runner "^29.0.1" - jest-util "^29.0.1" - jest-validate "^29.0.1" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + 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" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.0.1" + pretty-format "^29.5.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.0.1.tgz#d14e900a38ee4798d42feaaf0c61cb5b98e4c028" - integrity sha512-l8PYeq2VhcdxG9tl5cU78ClAlg/N7RtVSp0v3MlXURR0Y99i6eFnegmasOandyTmO6uEdo20+FByAjBFEO9nuw== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" - diff-sequences "^29.0.0" - jest-get-type "^29.0.0" - pretty-format "^29.0.1" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-docblock@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.0.0.tgz#3151bcc45ed7f5a8af4884dcc049aee699b4ceae" - integrity sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw== +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" -jest-each@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.0.1.tgz#c17da68a7073440122dbd47dca3941351ee0cbe5" - integrity sha512-UmCZYU9LPvRfSDoCrKJqrCNmgTYGGb3Ga6IVsnnVjedBTRRR9GJMca7UmDKRrJ1s+U632xrVtiRD27BxaG1aaQ== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" chalk "^4.0.0" - jest-get-type "^29.0.0" - jest-util "^29.0.1" - pretty-format "^29.0.1" - -jest-environment-node@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.0.1.tgz#b09db2a1b8439aace11a6805719d92498a64987e" - integrity sha512-PcIRBrEBFAPBqkbL53ZpEvTptcAnOW6/lDfqBfACMm3vkVT0N7DcfkH/hqNSbDmSxzGr0FtJI6Ej3TPhveWCMA== - dependencies: - "@jest/environment" "^29.0.1" - "@jest/fake-timers" "^29.0.1" - "@jest/types" "^29.0.1" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.0.1" - jest-util "^29.0.1" + jest-mock "^29.5.0" + jest-util "^29.5.0" -jest-get-type@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" - integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== -jest-haste-map@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.0.1.tgz#472212f93ef44309bf97d191f93ddd2e41169615" - integrity sha512-gcKOAydafpGoSBvcj/mGCfhOKO8fRLkAeee1KXGdcJ1Pb9O2nnOl4I8bQSIID2MaZeMHtLLgNboukh/pUGkBtg== +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" "@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.0.0" - jest-util "^29.0.1" - jest-worker "^29.0.1" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.0.1.tgz#1a7cf8475d85e7b2bd53efa5adc5195828a12c33" - integrity sha512-5tISHJphB+sCmKXtVHJGQGltj7ksrLLb9vkuNWwFR86Of1tfzjskvrrrZU1gSzEfWC+qXIn4tuh8noKHYGMIPA== +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: - jest-get-type "^29.0.0" - pretty-format "^29.0.1" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-matcher-utils@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.0.1.tgz#eaa92dd5405c2df9d31d45ec4486361d219de3e9" - integrity sha512-/e6UbCDmprRQFnl7+uBKqn4G22c/OmwriE5KCMVqxhElKCQUDcFnq5XM9iJeKtzy4DUjxT27y9VHmKPD8BQPaw== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^29.0.1" - jest-get-type "^29.0.0" - pretty-format "^29.0.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" -jest-message-util@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.0.1.tgz#85c4b5b90296c228da158e168eaa5b079f2ab879" - integrity sha512-wRMAQt3HrLpxSubdnzOo68QoTfQ+NLXFzU0Heb18ZUzO2S9GgaXNEdQ4rpd0fI9dq2NXkpCk1IUWSqzYKji64A== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.0.1" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.0.1.tgz#12e1b137035365b022ccdb8fd67d476cd4d4bfad" - integrity sha512-i1yTceg2GKJwUNZFjIzrH7Y74fN1SKJWxQX/Vu3LT4TiJerFARH5l+4URNyapZ+DNpchHYrGOP2deVbn3ma8JA== +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" "@types/node" "*" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de" - integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== -jest-resolve-dependencies@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.0.1.tgz#c41b88380c8ea178ce72a750029b5f3d5f65cb94" - integrity sha512-fUGcYlSc1NzNz+tsHDjjG0rclw6blJcFZsLEsezxm/n54bAm9HFvJxgBuCV1CJQoPtIx6AfR+tXkR9lpWJs2LQ== +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: - jest-regex-util "^29.0.0" - jest-snapshot "^29.0.1" + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" -jest-resolve@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.0.1.tgz#4f1338eee2ccc7319ffce850e13eb118a9e93ce5" - integrity sha512-dwb5Z0lLZbptlBtPExqsHfdDamXeiRLv4vdkfPrN84vBwLSWHWcXjlM2JXD/KLSQfljBcXbzI/PDvUJuTQ84Nw== +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.0.1" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.0.1" - jest-validate "^29.0.1" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.0.1.tgz#15bacd13170f3d786168ef8548fdeb96933ea643" - integrity sha512-XeFfPmHtO7HyZyD1uJeO4Oqa8PyTbDHzS1YdGrvsFXk/A5eXinbqA5a42VUEqvsKQgNnKTl5NJD0UtDWg7cQ2A== +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== dependencies: - "@jest/console" "^29.0.1" - "@jest/environment" "^29.0.1" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@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" "@types/node" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.0.0" - jest-environment-node "^29.0.1" - jest-haste-map "^29.0.1" - jest-leak-detector "^29.0.1" - jest-message-util "^29.0.1" - jest-resolve "^29.0.1" - jest-runtime "^29.0.1" - jest-util "^29.0.1" - jest-watcher "^29.0.1" - jest-worker "^29.0.1" + 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" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.0.1.tgz#cafdc10834c45c50105eecb0ded8677ce741e2af" - integrity sha512-yDgz5OE0Rm44PUAfTqwA6cDFnTYnVcYbRpPECsokSASQ0I5RXpnKPVr2g0CYZWKzbsXqqtmM7TIk7CAutZJ7gQ== - dependencies: - "@jest/environment" "^29.0.1" - "@jest/fake-timers" "^29.0.1" - "@jest/globals" "^29.0.1" - "@jest/source-map" "^29.0.0" - "@jest/test-result" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + 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" "@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.0.1" - jest-message-util "^29.0.1" - jest-mock "^29.0.1" - jest-regex-util "^29.0.0" - jest-resolve "^29.0.1" - jest-snapshot "^29.0.1" - jest-util "^29.0.1" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.0.1.tgz#ed455cb7e56fb43e2d451edd902d622349d6afed" - integrity sha512-OuYGp+lsh7RhB3DDX36z/pzrGm2F740e5ERG9PQpJyDknCRtWdhaehBQyMqDnsQdKkvC2zOcetcxskiHjO7e8Q== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -2893,85 +2989,90 @@ jest-snapshot@^29.0.1: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.0.1" - "@jest/transform" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.0.1" + expect "^29.5.0" graceful-fs "^4.2.9" - jest-diff "^29.0.1" - jest-get-type "^29.0.0" - jest-haste-map "^29.0.1" - jest-matcher-utils "^29.0.1" - jest-message-util "^29.0.1" - jest-util "^29.0.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^29.0.1" + pretty-format "^29.5.0" semver "^7.3.5" -jest-util@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.0.1.tgz#f854a4a8877c7817316c4afbc2a851ceb2e71598" - integrity sha512-GIWkgNfkeA9d84rORDHPGGTFBrRD13A38QVSKE0bVrGSnoR1KDn8Kqz+0yI5kezMgbT/7zrWaruWP1Kbghlb2A== +jest-ts-webcompat-resolver@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/jest-ts-webcompat-resolver/-/jest-ts-webcompat-resolver-1.0.0.tgz#a554eb77446e1a8d2aabb810d6302bffaa00095c" + integrity sha512-BFoaU7LeYqZNnTYEr6iMRf87xdCQntNc/Wk8YpzDBcuz+CIZ0JsTtzuMAMnKiEgTRTC1wRWLUo2RlVjVijBcHQ== + +jest-util@^29.0.0, jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.0.1.tgz#8de8ff9d65507c0477964fd39c5b0a1778e3103d" - integrity sha512-mS4q7F738YXZFWBPqE+NjHU/gEOs7IBIFQ8i9zq5EO691cLrUbLhFq4larf8/lNcmauRO71tn/+DTW2y+MrLow== +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^29.0.1" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.0.0" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^29.0.1" + pretty-format "^29.5.0" -jest-watcher@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.0.1.tgz#63adeb8887a0562ed8f990f413b830ef48a8db94" - integrity sha512-0LBWDL3sZ+vyHRYxjqm2irhfwhUXHonjLSbd0oDeGq44U1e1uUh3icWNXYF8HO/UEnOoa6+OJDncLUXP2Hdg9A== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^29.0.1" + emittery "^0.13.1" + jest-util "^29.5.0" string-length "^4.0.1" -jest-worker@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.0.1.tgz#fb42ff7e05e0573f330ec0cf781fc545dcd11a31" - integrity sha512-+B/2/8WW7goit7qVezG9vnI1QP3dlmuzi2W0zxazAQQ8dcDIA63dDn6j4pjOGBARha/ZevcwYQtNIzCySbS7fQ== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.0.1.tgz#4a1c48d79fada0a47c686a111ed9411fd41cd584" - integrity sha512-liHkwzaW6iwQyhRBFj0A4ZYKcsQ7ers1s62CCT95fPeNzoxT/vQRWwjTT4e7jpSCwrvPP2t1VESuy7GrXcr2ug== +jest@^29.1.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== dependencies: - "@jest/core" "^29.0.1" - "@jest/types" "^29.0.1" + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" import-local "^3.0.2" - jest-cli "^29.0.1" + jest-cli "^29.5.0" js-git@^0.7.8: version "0.7.8" - resolved "https://registry.yarnpkg.com/js-git/-/js-git-0.7.8.tgz#52fa655ab61877d6f1079efc6534b554f31e5444" + resolved "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz" integrity sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA== dependencies: bodec "^0.1.0" @@ -2981,12 +3082,12 @@ js-git@^0.7.8: js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -2994,24 +3095,25 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" js2xmlparser@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" + resolved "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz" integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== dependencies: xmlcreate "^2.0.4" -jsdoc@^3.6.11: - version "3.6.11" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.11.tgz#8bbb5747e6f579f141a5238cbad4e95e004458ce" - integrity sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg== +jsdoc@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz" + integrity sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg== dependencies: - "@babel/parser" "^7.9.4" + "@babel/parser" "^7.20.15" + "@jsdoc/salty" "^0.2.1" "@types/markdown-it" "^12.2.3" bluebird "^3.7.2" catharsis "^0.9.0" @@ -3024,39 +3126,38 @@ jsdoc@^3.6.11: mkdirp "^1.0.4" requizzle "^0.2.3" strip-json-comments "^3.1.0" - taffydb "2.6.2" underscore "~1.13.2" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.1.1, json5@^2.2.1: +json5@^2.1.1, json5@^2.2.1, json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jszip@^3.7.0: version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" @@ -3066,29 +3167,29 @@ jszip@^3.7.0: klaw@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + resolved "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz" integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== dependencies: graceful-fs "^4.1.9" kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== lazy@~1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" + resolved "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz" integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" @@ -3096,68 +3197,73 @@ levn@~0.3.0: lie@~3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-it@^3.0.1: version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz" integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== dependencies: uc.micro "^1.0.1" locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash.defaults@^4.1.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== lodash.get@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.mergewith@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-driver@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== long@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== lru-cache@^4.1.3: version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" @@ -3165,40 +3271,50 @@ lru-cache@^4.1.3: lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" make-dir@^3.0.0, make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + markdown-it-anchor@^8.4.1: version "8.6.4" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.4.tgz#affb8aa0910a504c114e9fcad53ac3a5b907b0e6" + resolved "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.4.tgz" integrity sha512-Ul4YVYZNxMJYALpKtu+ZRdrryYt/GlQ5CK+4l1bp/gWXOG2QWElt6AqF3Mih/wfUKdZbNAZVXGR73/n6U/8img== markdown-it@^12.3.2: version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz" integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== dependencies: argparse "^2.0.1" @@ -3209,37 +3325,37 @@ markdown-it@^12.3.2: marked@^4.0.10: version "4.0.19" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.19.tgz#d36198d1ac1255525153c351c68c75bc1d7aee46" + resolved "https://registry.npmjs.org/marked/-/marked-4.0.19.tgz" integrity sha512-rgQF/OxOiLcvgUAj1Q1tAf4Bgxn5h5JZTp04Fx4XUkVhs7B+7YA9JEWJhJpoO8eJt8MkZMwqLCNeNqj1bCREZQ== mdurl@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== methods@^1.1.2, methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -3247,53 +3363,53 @@ micromatch@^4.0.4: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass@^3.0.0: version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz" integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== dependencies: yallist "^4.0.0" minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -3301,34 +3417,34 @@ minizlib@^2.1.1: mkdirp@1.0.4, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@~0.5.0: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" module-details-from-path@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" + resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz" integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== moment@^2.28.0: version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== "mongodb-uri@>= 0.9.7": version "0.9.7" - resolved "https://registry.yarnpkg.com/mongodb-uri/-/mongodb-uri-0.9.7.tgz#0f771ad16f483ae65f4287969428e9fbc4aa6181" + resolved "https://registry.npmjs.org/mongodb-uri/-/mongodb-uri-0.9.7.tgz" integrity sha512-s6BdnqNoEYfViPJgkH85X5Nw5NpzxN8hoflKLweNa7vBxt2V7kaS06d74pAtqDxde8fn4r9h4dNdLiFGoNV0KA== morgan@^1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== dependencies: basic-auth "~2.0.1" @@ -3339,27 +3455,27 @@ morgan@^1.10.0: ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@2.1.3, ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mute-stream@~0.0.4: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== mysql2@^2.1.0, mysql2@^2.2.5: version "2.3.3" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0" + resolved "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz" integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA== dependencies: denque "^2.0.1" @@ -3373,24 +3489,24 @@ mysql2@^2.1.0, mysql2@^2.2.5: named-placeholders@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8" + resolved "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz" integrity sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA== dependencies: lru-cache "^4.1.3" nan@^2.14.1, nan@^2.15.0: version "2.16.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916" + resolved "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz" integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== needle@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + resolved "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz" integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: debug "^3.2.6" @@ -3399,34 +3515,39 @@ needle@2.4.0: negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== netmask@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== node-addon-api@^3.1.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== +node-cleanup@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-cleanup/-/node-cleanup-2.1.2.tgz#7ac19abd297e09a7f72a71545d951b517e4dde2c" + integrity sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw== + node-domexception@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@^2.6.7: version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: whatwg-url "^5.0.0" node-fetch@^3.2.0: version "3.2.10" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.10.tgz#e8347f94b54ae18b57c9c049ef641cef398a85c8" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz" integrity sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA== dependencies: data-uri-to-buffer "^4.0.0" @@ -3435,22 +3556,22 @@ node-fetch@^3.2.0: node-fs@~0.1.5: version "0.1.7" - resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb" + resolved "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz" integrity sha512-XqDBlmUKgDGe76+lZ/0sRBF3XW2vVcK07+ZPvdpUTK8jrvtPahUd0aBqJ9+ZjB01ANjZLuvK3O/eoMVmz62rpA== node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== nodemon@^2.0.15: version "2.0.19" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.19.tgz#cac175f74b9cb8b57e770d47841995eebe4488bd" + resolved "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz" integrity sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A== dependencies: chokidar "^3.5.2" @@ -3466,33 +3587,33 @@ nodemon@^2.0.15: nopt@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" nopt@~1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== dependencies: abbrev "1" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" npmlog@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + resolved "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== dependencies: are-we-there-yet "^2.0.0" @@ -3502,7 +3623,7 @@ npmlog@^5.0.1: nssocket@0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/nssocket/-/nssocket-0.6.0.tgz#59f96f6ff321566f33c70f7dbeeecdfdc07154fa" + resolved "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz" integrity sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w== dependencies: eventemitter2 "~0.4.14" @@ -3510,43 +3631,43 @@ nssocket@0.6.0: object-assign@^4, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.9.0: version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== on-finished@~2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + 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.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.4.0, once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" openid@2.x.x: version "2.0.10" - resolved "https://registry.yarnpkg.com/openid/-/openid-2.0.10.tgz#b611ee673dbefd9c8199f1e30ff3e75628b4a504" + resolved "https://registry.npmjs.org/openid/-/openid-2.0.10.tgz" integrity sha512-EFTQ61/OUVhCeq78Y3rBpdKSuvgb0lwkU8nN4QTdcv0afc5MT7e4IVuZwgkMsgE993dmhbIhkxHFP3iTVJXWmw== dependencies: axios "^0.21.4" @@ -3554,7 +3675,7 @@ openid@2.x.x: optionator@^0.8.1: version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: deep-is "~0.1.3" @@ -3566,33 +3687,33 @@ optionator@^0.8.1: p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pac-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz" integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ== dependencies: "@tootallnate/once" "1" @@ -3607,7 +3728,7 @@ pac-proxy-agent@^5.0.0: pac-resolver@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz" integrity sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q== dependencies: degenerator "^3.0.2" @@ -3616,24 +3737,24 @@ pac-resolver@^5.0.0: pako@^0.2.5: version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== pako@~1.0.2: version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== parse-database-url@~0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/parse-database-url/-/parse-database-url-0.3.0.tgz#369666321e927c9ade63cdfc1aaaf6fb37453d0d" + resolved "https://registry.npmjs.org/parse-database-url/-/parse-database-url-0.3.0.tgz" integrity sha512-YRxDoVBAUk3ksGF9pud+aqWwXmThZzhX9Z1PPxKU03BB3/gu2RcgyMA4rktMYhkIJ9KxwW7lIj00U+TSNz80wg== dependencies: mongodb-uri ">= 0.9.7" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -3643,19 +3764,19 @@ parse-json@^5.2.0: parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== passport-local@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + resolved "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz" integrity sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow== dependencies: passport-strategy "1.x.x" passport-mock-strategy@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/passport-mock-strategy/-/passport-mock-strategy-2.0.0.tgz#ce6cf6b8d6b4f29b94a4a1d7767aa53f0ae7ec4d" + resolved "https://registry.npmjs.org/passport-mock-strategy/-/passport-mock-strategy-2.0.0.tgz" integrity sha512-9YUT0sja/7n+HfQ+Jwx4XETERRh1uciRjpHhEZMcYS1FBnMrfrSlKVS42bMU06ewSFiPhXztazAE6XwiZdZQ/g== dependencies: "@types/express" "^4.16.1" @@ -3665,7 +3786,7 @@ passport-mock-strategy@^2.0.0: passport-steam@^1.0.17: version "1.0.17" - resolved "https://registry.yarnpkg.com/passport-steam/-/passport-steam-1.0.17.tgz#eee353c746f7b5589f5a1fcb904fbc699ba1a3ee" + resolved "https://registry.npmjs.org/passport-steam/-/passport-steam-1.0.17.tgz" integrity sha512-aolIlooF5hZwp1GAaoK3d8einOGLeDDauQEmrb1jtEFrNYP2lC6WS5hVeUdP4rPfZiBHwY60lHcQksCKiSgnlA== dependencies: "@passport-next/passport-openid" "^1.0.0" @@ -3673,12 +3794,12 @@ passport-steam@^1.0.17: passport-strategy@1.x.x: version "1.0.0" - resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== passport@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.1.tgz#941446a21cb92fc688d97a0861c38ce9f738f270" + resolved "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz" integrity sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg== dependencies: passport-strategy "1.x.x" @@ -3686,7 +3807,7 @@ passport@^0.4.0: passport@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d" + resolved "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz" integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== dependencies: passport-strategy "1.x.x" @@ -3695,80 +3816,87 @@ passport@^0.6.0: path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + pause@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + resolved "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidusage@^2.0.21: version "2.0.21" - resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-2.0.21.tgz#7068967b3d952baea73e57668c98b9eaa876894e" + resolved "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz" integrity sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA== dependencies: safe-buffer "^5.2.1" pidusage@~3.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pidusage/-/pidusage-3.0.0.tgz#69108079724c9afdd958644b920bc40bac964044" + resolved "https://registry.npmjs.org/pidusage/-/pidusage-3.0.0.tgz" integrity sha512-8VJLToXhj+RYZGNVw8oxc7dS54iCQXUJ+MDFHezQ/fwF5B8W4OWodAMboc1wb08S/4LiHwAmkT4ohf/d3YPPsw== dependencies: safe-buffer "^5.2.1" pirates@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pm2-axon-rpc@~0.7.0, pm2-axon-rpc@~0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz#2daec5383a63135b3f18babb70266dacdcbc429a" + resolved "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz" integrity sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw== dependencies: debug "^4.3.1" pm2-axon@~4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/pm2-axon/-/pm2-axon-4.0.1.tgz#a7b4bb586e9aeb35b1042b488cde15b60cabafd2" + resolved "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz" integrity sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg== dependencies: amp "~0.3.1" @@ -3778,7 +3906,7 @@ pm2-axon@~4.0.1: pm2-deploy@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/pm2-deploy/-/pm2-deploy-1.0.2.tgz#98d8385553a3a4dca11c7b3116deb519bc5961a7" + resolved "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz" integrity sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg== dependencies: run-series "^1.1.8" @@ -3786,14 +3914,14 @@ pm2-deploy@~1.0.2: pm2-multimeter@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz#1a1e55153d41a05534cea23cfe860abaa0eb4ace" + resolved "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz" integrity sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA== dependencies: charm "~0.1.1" pm2-sysmonit@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz#eddea34a53fd8c8d7c3efb73b97a3c548686e24d" + resolved "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz" integrity sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA== dependencies: async "^3.2.0" @@ -3804,7 +3932,7 @@ pm2-sysmonit@^1.2.8: pm2@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/pm2/-/pm2-5.2.0.tgz#fda71fab4b8fcfa5b7f546ca55a6e59e9ec5a68d" + resolved "https://registry.npmjs.org/pm2/-/pm2-5.2.0.tgz" integrity sha512-PO5hMVhQ85cTszFM++6v07Me9hPJMkFbHjkFigtMMk+La8ty2wCi2dlBTeZYJDhPUSjK8Ccltpq2buNRcyMOTw== dependencies: "@pm2/agent" "~2.0.0" @@ -3841,26 +3969,26 @@ pm2@^5.2.0: prelude-ls@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -pretty-format@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.0.1.tgz#2f8077114cdac92a59b464292972a106410c7ad0" - integrity sha512-iTHy3QZMzuL484mSTYbQIM1AHhEQsH8mXWS2/vd2yFBYnG3EBqGiMONo28PlPgrW7P/8s/1ISv+y7WH306l8cw== +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" react-is "^18.0.0" process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompt@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.3.0.tgz#b1f6d47cb1b6beed4f0660b470f5d3ec157ad7ce" + resolved "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz" integrity sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg== dependencies: "@colors/colors" "1.5.0" @@ -3871,14 +3999,14 @@ prompt@^1.0.0: promptly@^2: version "2.2.0" - resolved "https://registry.yarnpkg.com/promptly/-/promptly-2.2.0.tgz#2a13fa063688a2a5983b161fff0108a07d26fc74" + resolved "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz" integrity sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA== dependencies: read "^1.0.4" prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -3886,7 +4014,7 @@ prompts@^2.0.1: proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -3894,7 +4022,7 @@ proxy-addr@~2.0.7: proxy-agent@~5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz" integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g== dependencies: agent-base "^6.0.0" @@ -3908,49 +4036,56 @@ proxy-agent@~5.0.0: proxy-from-env@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + pseudomap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== pstree.remy@^1.1.8: version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + resolved "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -qs@6.9.3: - version "6.9.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" - integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== qs@6.9.7: version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz" integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== qs@^6.1.0, qs@^6.11.0, qs@^6.5.2: version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" random-bytes@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== randombytes@2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" integrity sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg== randomstring@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/randomstring/-/randomstring-1.2.2.tgz#61b3d42624c7b1fcaaaba161c53452eb3d8fef1c" + resolved "https://registry.npmjs.org/randomstring/-/randomstring-1.2.2.tgz" integrity sha512-9FByiB8guWZLbE+akdQiWE3I1I6w7Vn5El4o4y7o5bWQ6DWPcEOp+aLG7Jezc8BVRKKpgJd2ppRX0jnKu1YCfg== dependencies: array-uniq "1.0.2" @@ -3958,12 +4093,12 @@ randomstring@^1.2.2: range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.4.3: version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz" integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== dependencies: bytes "3.1.2" @@ -3973,7 +4108,7 @@ raw-body@2.4.3: raw-body@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" @@ -3983,7 +4118,7 @@ raw-body@^2.2.0: rc@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -3993,24 +4128,24 @@ rc@^1.2.8: rcon@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/rcon/-/rcon-1.1.0.tgz#82a27bbfadd4c13b3c5d828b55ce15bd606eb7c3" + resolved "https://registry.npmjs.org/rcon/-/rcon-1.1.0.tgz" integrity sha512-eotwcApOBjfadTjqQlrZVR4jzlwGCMNxmHhnFZx+g4kouwwRstRHkk1ON7DzkqrHNIjADSh0cU3gThSsDolUpg== react-is@^18.0.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== read@1.0.x, read@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== dependencies: mute-stream "~0.0.4" readable-stream@1.1.x: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" @@ -4020,7 +4155,7 @@ readable-stream@1.1.x: readable-stream@^3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" @@ -4029,7 +4164,7 @@ readable-stream@^3.6.0: readable-stream@~2.3.6: version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" @@ -4042,19 +4177,19 @@ readable-stream@~2.3.6: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redis-mock@^0.56.3: version "0.56.3" - resolved "https://registry.yarnpkg.com/redis-mock/-/redis-mock-0.56.3.tgz#e96471bcc774ddc514c2fc49cdd03cab2baecd89" + resolved "https://registry.npmjs.org/redis-mock/-/redis-mock-0.56.3.tgz" integrity sha512-ynaJhqk0Qf3Qajnwvy4aOjS4Mdf9IBkELWtjd+NYhpiqu4QCNq6Vf3Q7c++XRPGiKiwRj9HWr0crcwy7EiPjYQ== redis@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/redis/-/redis-4.3.0.tgz#c01de4cf13821406addb7fcb70afe203266c4c39" + resolved "https://registry.npmjs.org/redis/-/redis-4.3.0.tgz" integrity sha512-RXRUor0iU1vizu4viHoUyLpe1ZO/RngZp0V9DyXBHTI+7tC7rEz6Wzn4Sv9v0tTJeqGAzdJ+q5YVbNKKQ5hX9A== dependencies: "@redis/bloom" "1.0.2" @@ -4066,12 +4201,12 @@ redis@^4.3.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-in-the-middle@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz#4b71e3cc7f59977100af9beb76bf2d056a5a6de2" + resolved "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz" integrity sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg== dependencies: debug "^4.1.1" @@ -4080,36 +4215,36 @@ require-in-the-middle@^5.0.0: require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requizzle@^0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" + resolved "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz" integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== dependencies: lodash "^4.17.14" resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.1.6, resolve@^1.20.0, resolve@^1.22.1: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -4118,78 +4253,85 @@ resolve@^1.1.6, resolve@^1.20.0, resolve@^1.22.1: revalidator@0.1.x: version "0.1.8" - resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + resolved "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" integrity sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" run-series@^1.1.8: version "1.1.9" - resolved "https://registry.yarnpkg.com/run-series/-/run-series-1.1.9.tgz#15ba9cb90e6a6c054e67c98e1dc063df0ecc113a" + resolved "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz" integrity sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g== safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + 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.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== semver@6.3.0, semver@^6.0.0, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@7.x: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + semver@^5.3.0, semver@^5.5.0, semver@^5.7.1: version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@^7.2, semver@^7.3.5: version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" semver@^7.3.8: version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" semver@~7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@~7.2.0: version "7.2.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.2.3.tgz#3641217233c6382173c76bf2c7ecd1e1c16b0d8a" + resolved "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz" integrity sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig== send@0.17.2: version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== dependencies: debug "2.6.9" @@ -4208,12 +4350,12 @@ send@0.17.2: seq-queue@^0.0.5: version "0.0.5" - resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" + resolved "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz" integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== serve-static@1.14.2: version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== dependencies: encodeurl "~1.0.2" @@ -4223,44 +4365,44 @@ serve-static@1.14.2: set-blocking@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shimmer@^1.1.0, shimmer@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" + resolved "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz" integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -4269,34 +4411,34 @@ side-channel@^1.0.4: signal-exit@^3.0.0, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-update-notifier@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc" + resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz" integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew== dependencies: semver "~7.0.0" sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@5, socks-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz" integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== dependencies: agent-base "^6.0.2" @@ -4305,7 +4447,7 @@ socks-proxy-agent@5, socks-proxy-agent@^5.0.0: socks@^2.3.3: version "2.7.0" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" + resolved "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz" integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== dependencies: ip "^2.0.0" @@ -4313,7 +4455,7 @@ socks@^2.3.3: source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -4321,7 +4463,7 @@ source-map-support@0.5.13: source-map-support@0.5.19: version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" @@ -4329,27 +4471,34 @@ source-map-support@0.5.19: source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + sprintf-js@1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sqlstring@^2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" + resolved "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz" integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== ssh2@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.4.0.tgz#e32e8343394364c922bad915a5a7fecd67d0f5c5" + resolved "https://registry.npmjs.org/ssh2/-/ssh2-1.4.0.tgz" integrity sha512-XvXwcXKvS452DyQvCa6Ct+chpucwc/UyxgliYz+rWXJ3jDHdtBb9xgmxJdMmnIn5bpgGAEV3KaEsH98ZGPHqwg== dependencies: asn1 "^0.2.4" @@ -4360,48 +4509,60 @@ ssh2@1.4.0: stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== stack-utils@^2.0.3: version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== steam-web@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/steam-web/-/steam-web-0.4.0.tgz#9333b5843ff7ebd77945fe09a0d5d5b28694b331" + resolved "https://registry.npmjs.org/steam-web/-/steam-web-0.4.0.tgz" integrity sha512-FgSYhL7GaP4Va5JKT09yZ+WrTZttFtLwenIPuZd7GUA1z3W7vu7qqPT/qTC76Pd9+sf85txMgIPr/y0+3gNlUA== dependencies: qs "^6.1.0" steamapi@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/steamapi/-/steamapi-2.2.0.tgz#e82682b94de773f42e92a59ae82f312abed50041" + resolved "https://registry.npmjs.org/steamapi/-/steamapi-2.2.0.tgz" integrity sha512-2UWklLzYQruuUC0a5AUgll1dU91/CWgiAhm/7y+rqc43kbBWereGTtmwo8wr6imjC64iV5893KChXghW0zK8Gg== dependencies: steamid "^2.0.0" steamid@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/steamid/-/steamid-2.0.0.tgz#6d4a51feb80638c1fe4793be77aa972996f4ad75" + resolved "https://registry.npmjs.org/steamid/-/steamid-2.0.0.tgz" integrity sha512-+BFJMbo+IxzyfovLR37E7APkaNfmrL3S+88T7wTMRHnQ6LBhzEawPnjfWNKM9eUL/dH45j+7vhSX4WaGXoa4/Q== +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + +string-argv@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -4409,7 +4570,7 @@ string-length@^4.0.1: "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -4418,111 +4579,103 @@ string-length@^4.0.1: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + 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_decoder@~0.10.x: version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -superagent@^8.0.3: - version "8.0.5" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.5.tgz#6812022410c7e220416968fd3efb85c8059f5626" - integrity sha512-lQVE0Praz7nHiSaJLKBM/cZyi7J0E4io8tWnGSBdBrqAzhzrjQ/F5iGP9Zr29CJC8N5zYdhG2kKaNcB6dKxp7g== +superagent@^8.0.5: + version "8.0.9" + resolved "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz" + integrity sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA== dependencies: component-emitter "^1.3.0" - cookiejar "^2.1.3" + cookiejar "^2.1.4" debug "^4.3.4" fast-safe-stringify "^2.1.1" form-data "^4.0.0" - formidable "^2.0.1" + formidable "^2.1.2" methods "^1.1.2" mime "2.6.0" qs "^6.11.0" semver "^7.3.8" -supertest@^6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.2.tgz#7780b4b85bb2ea675c05b5cb80fa52f4dbe5a52b" - integrity sha512-mSmbW/sPpBU6K8w8189ZiHdc62zMe7dCHpC2ktS9tc0/d2DN0FaxNbDJJNFknZD4jCrGJpxkiFoVyemvKgOdwA== +supertest@^6.3.3: + version "6.3.3" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz" + integrity sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== dependencies: methods "^1.1.2" - superagent "^8.0.3" + superagent "^8.0.5" supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== swagger-jsdoc@^6.2.5: version "6.2.5" - resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-6.2.5.tgz#65bffa142276436b2b131255f59a6b55384a0e8e" + resolved "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.5.tgz" integrity sha512-l+cdsKS2y+QDhrH1TJSUiE0y9XKuf5xaGSatjf0hR/wjTlMpO8WfubBK9d/nASdbHPMtj9iJZLBH2ogBEhL7Sw== dependencies: commander "6.2.0" @@ -4534,36 +4687,31 @@ swagger-jsdoc@^6.2.5: swagger-parser@10.0.2: version "10.0.2" - resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-10.0.2.tgz#d7f18faa09c9c145e938977c9bd6c3435998b667" + resolved "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.2.tgz" integrity sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw== dependencies: "@apidevtools/swagger-parser" "10.0.2" swagger-ui-dist@>=4.11.0: version "4.14.0" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz#e34d807464eb84578c43902e393084a1a6fbda52" + resolved "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz" integrity sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw== swagger-ui-express@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz#feb1314627092eb9c7e6b65ee018927011445530" + resolved "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.5.0.tgz" integrity sha512-DHk3zFvsxrkcnurGvQlAcLuTDacAVN1JHKDgcba/gr2NFRE4HGwP1YeHIXMiGznkWR4AeS7X5vEblNn4QljuNA== dependencies: swagger-ui-dist ">=4.11.0" systeminformation@^5.7: version "5.12.6" - resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.12.6.tgz#b75d7aaf9f5da32439fc633d2be9eb741691d200" + resolved "https://registry.npmjs.org/systeminformation/-/systeminformation-5.12.6.tgz" integrity sha512-FkCvT5BOuH1OE3+8lFM25oXIYJ0CM8kq4Wgvz2jyBTrsOIgha/6gdJXgbF4rv+g0j/5wJqQLDKan7kc/p7uIvw== -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== - tar@^6.1.11: version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" @@ -4573,75 +4721,101 @@ tar@^6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" glob "^7.1.4" minimatch "^3.0.4" +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== touch@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz" integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== dependencies: nopt "~1.0.10" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-jest@^29.1.0: + version "29.1.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.0.tgz#4a9db4104a49b76d2b368ea775b6c9535c603891" + integrity sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +tsc-watch@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-6.0.4.tgz#af15229f03cd53086771a97b10653db063bc6c59" + integrity sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg== + dependencies: + cross-spawn "^7.0.3" + node-cleanup "^2.1.2" + ps-tree "^1.2.0" + string-argv "^0.3.1" + +tsc@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/tsc/-/tsc-2.0.4.tgz#5f6499146abea5dca4420b451fa4f2f9345238f5" + integrity sha512-fzoSieZI5KKJVBYGvwbVZs/J5za84f2lSTLPYf6AGiIf43tZ3GNrI1QzTLcjtyDDP4aLxd46RTZq1nQxe7+k5Q== + tslib@1.9.3: version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tslib@^2.0.1: version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== tunnel-ssh@^4.0.0: version "4.1.6" - resolved "https://registry.yarnpkg.com/tunnel-ssh/-/tunnel-ssh-4.1.6.tgz#9409e8e98d019ab6207d65807ad3851144dbc1d9" + resolved "https://registry.npmjs.org/tunnel-ssh/-/tunnel-ssh-4.1.6.tgz" integrity sha512-y7+x+T3F3rkx2Zov5Tk9DGfeEBVAdWU3A/91E0Dk5rrZ/VFIlpV2uhhRuaISJUdyG0N+Lcp1fXZMXz+ovPt5vA== dependencies: debug "2.6.9" @@ -4650,81 +4824,86 @@ tunnel-ssh@^4.0.0: tv4@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/tv4/-/tv4-1.3.0.tgz#d020c846fadd50c855abb25ebaecc68fc10f7963" + resolved "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz" integrity sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw== tweetnacl@^0.14.3: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== tx2@~1.0.4: version "1.0.5" - resolved "https://registry.yarnpkg.com/tx2/-/tx2-1.0.5.tgz#ee0b0e5e2c351f8d23e54bdf46dd60afa3bbc73d" + resolved "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz" integrity sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg== dependencies: json-stringify-safe "^5.0.1" type-check@~0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" +typescript@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz" + integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uid-safe@~2.1.5: version "2.1.5" - resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== dependencies: random-bytes "~1.0.0" undefsafe@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + resolved "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== underscore@~1.13.2: version "1.13.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.4.tgz#7886b46bbdf07f768e0052f1828e1dcab40c0dee" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz" integrity sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ== universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + 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: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz" integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== dependencies: escalade "^3.1.1" @@ -4732,22 +4911,22 @@ update-browserslist-db@^1.0.5: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== utils-merge@1.0.1, utils-merge@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^3.2.1: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== v8-to-istanbul@^9.0.1: version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -4756,17 +4935,17 @@ v8-to-istanbul@^9.0.1: validator@^13.6.0: version "13.7.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== vary@^1, vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== vizion@~2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/vizion/-/vizion-2.2.1.tgz#04201ea45ffd145d5b5210e385a8f35170387fb2" + resolved "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz" integrity sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww== dependencies: async "^2.6.3" @@ -4776,7 +4955,7 @@ vizion@~2.2.1: vm2@^3.9.8: version "3.9.18" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.18.tgz#d919848bee191a0410c5cc1c5aac58adfd03ce9a" + resolved "https://registry.npmjs.org/vm2/-/vm2-3.9.18.tgz" integrity sha512-iM7PchOElv6Uv6Q+0Hq7dcgDtWWT6SizYqVcvol+1WQc+E9HlgTCnPozbQNSP3yDV9oXHQOEQu530w2q/BCVZg== dependencies: acorn "^8.7.0" @@ -4784,24 +4963,24 @@ vm2@^3.9.8: walker@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" web-streams-polyfill@^3.0.3: version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -4809,31 +4988,31 @@ whatwg-url@^5.0.0: when@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/when/-/when-2.0.1.tgz#8d872fe15e68424c91b4b724e848e0807dab6642" + resolved "https://registry.npmjs.org/when/-/when-2.0.1.tgz" integrity sha512-h0l57vFJ4YQe1/U+C+oqBfAoopxXABUm6VqWM0x2gg4pARru4IUWo/PAxyawWgbGtndXrZbA41EzsfxacZVEXQ== which-module@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wide-align@^1.1.2: version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" winston@2.x: version "2.4.6" - resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.6.tgz#da616f332928f70aac482f59b43d62228f29e478" + resolved "https://registry.npmjs.org/winston/-/winston-2.4.6.tgz" integrity sha512-J5Zu4p0tojLde8mIOyDSsmLmcP8I3Z6wtwpTDHx1+hGcdhxcJaAmG4CFtagkb+NiN1M9Ek4b42pzMWqfc9jm8w== dependencies: async "^3.2.3" @@ -4845,12 +5024,12 @@ winston@2.x: word-wrap@~1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -4859,7 +5038,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -4868,10 +5047,10 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -4881,57 +5060,57 @@ write-file-atomic@^4.0.1: ws@^7.0.0: version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@~7.4.0: version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xmlcreate@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" + resolved "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz" integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== xregexp@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + resolved "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz" integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== y18n@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@4.0.0, yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yallist@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@2.0.0-1: version "2.0.0-1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.0-1.tgz#8c3029b3ee2028306d5bcf396980623115ff8d18" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz" integrity sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ== yamljs@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" + resolved "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz" integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== dependencies: argparse "^1.0.7" @@ -4939,20 +5118,20 @@ yamljs@0.3.0: yargs-parser@^18.1.2: version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^21.0.0: +yargs-parser@^21.0.0, yargs-parser@^21.0.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^15.3.1: version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: cliui "^6.0.0" @@ -4969,7 +5148,7 @@ yargs@^15.3.1: yargs@^17.3.1: version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== dependencies: cliui "^7.0.2" @@ -4982,12 +5161,12 @@ yargs@^17.3.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== z-schema@^4.2.3: version "4.2.4" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-4.2.4.tgz#73102a49512179b12a8ec50b1daa676b984da6e4" + resolved "https://registry.npmjs.org/z-schema/-/z-schema-4.2.4.tgz" integrity sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w== dependencies: lodash.get "^4.4.2"