From 88d3f69ae7337f6bb3ee39263704dd61ee82d9f6 Mon Sep 17 00:00:00 2001 From: "Guillaume Julien (BJSS)" <104442665+gjulien-bjss@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:29:46 +0100 Subject: [PATCH] chore(cb2-8502): bump lambda to node 18 (#76) * chore(cb2-8502): update to node 18 * chore(cb2-8502): change nop commit * chore(cb2-8502): align sonar properties file with other repos * chore(cb2-8502): add submodule * chore(cb2-8502): add models back in ignore * bump cvs-nop to develop * chore(cb2-8502): add github actions * chore(cb2-8502): bump packages * chore(cb2-8502): remove libs check * chore: bump version in serverless --- .github/workflows/ci.yml | 12 + .github/workflows/pr-checks.yml | 36 + .nvmrc | 2 +- commitlint.config.js | 2 +- cvs-nop | 2 +- gulpfile.js | 50 +- jest.config.js | 25 +- package-lock.json | 30042 +++++++++------- package.json | 12 +- serverless.yml | 8 +- sonar-project.properties | 17 +- src/functions/process-stream-event.ts | 202 +- src/models/adr-details.ts | 312 +- src/models/applicant-details-properties.ts | 51 +- src/models/auth-into-service.ts | 42 +- src/models/aws-sm-config.ts | 14 +- src/models/axles.ts | 190 +- src/models/batch-item-failure-response.ts | 7 +- src/models/body-type.ts | 61 +- src/models/brakes.ts | 142 +- src/models/dda.ts | 62 +- src/models/defects.ts | 183 +- src/models/dimensions.ts | 68 +- src/models/letters-of-auth.ts | 30 +- src/models/manufacturer-details.ts | 58 +- src/models/microfilm.ts | 138 +- src/models/mod-type.ts | 27 +- src/models/plates.ts | 64 +- src/models/purchaser-details.ts | 58 +- src/models/shared-enums.ts | 58 +- src/models/tech-record-document.ts | 44 +- src/models/tech-record.ts | 520 +- src/models/test-results.ts | 215 +- src/models/test-types.ts | 191 +- src/models/vehicle-class.ts | 65 +- src/services/connection-pool-options.ts | 28 +- src/services/connection-pool.ts | 96 +- src/services/dynamodb-images.ts | 492 +- src/services/entity-conversion.ts | 79 +- src/services/logger.ts | 6 +- src/services/secrets-manager.ts | 38 +- src/services/sql-execution.ts | 121 +- src/services/sql-generation.ts | 110 +- src/services/sql-operations.ts | 26 +- src/services/table-details.ts | 667 +- .../tech-record-document-conversion.ts | 993 +- src/services/test-result-record-conversion.ts | 944 +- src/utils/cleanser.ts | 8 +- src/utils/padwithzeros.ts | 2 +- ...nto-service-document-conversion.intTest.ts | 971 +- tests/integration/cvsbnop-container.ts | 90 +- tests/integration/database-teardown.ts | 19 +- tests/integration/integration.allIntTest.ts | 8 +- ...tech-record-document-conversion.intTest.ts | 855 +- ...-results-conversion-with-delete.intTest.ts | 2523 +- ...-results-conversion-with-upsert.intTest.ts | 2523 +- .../process-stream-event.unitTest.ts | 420 +- tests/unit/handler.unitTest.ts | 64 +- .../unit/models/auth-into-service.unitTest.ts | 329 +- .../models/tech-record-document.unitTest.ts | 141 +- tests/unit/models/test-result.unitTest.ts | 45 +- .../unit/services/connection-pool.unitTest.ts | 164 +- .../unit/services/dynamodb-images.unitTest.ts | 232 +- .../services/entity-conversion.unitTest.ts | 99 +- .../unit/services/secrets-manager.unitTest.ts | 103 +- tests/unit/services/sql-execution.unitTest.ts | 213 +- .../unit/services/sql-generation.unitTest.ts | 118 +- .../unit/services/sql-operations.unitTest.ts | 26 +- tests/unit/updateStore.unitTest.ts | 6 +- tests/utils/cleanser.unitTest.ts | 96 +- tests/utils/padwithtwos.unitTest.ts | 18 +- tsconfig.json | 29 +- 72 files changed, 25117 insertions(+), 20595 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/pr-checks.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7b33e14 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,12 @@ +name: CI + +on: + push: + +jobs: + security: + uses: dvsa/.github/.github/workflows/nodejs-security.yaml@v2 + with: + args: '--all-projects' + secrets: + SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 0000000..4576e9f --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,36 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: PR-checks + +on: + push: + branches: ["develop"] + pull_request: + branches: ["develop"] + +jobs: + build-test: + runs-on: ubuntu-latest + timeout-minutes: 15 + + strategy: + matrix: + node-version: [18.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v3 + - name: Setup Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: "npm" + - name: Install dependencies + run: npm ci + + - name: Unit tests + run: npm run test + + - name: Build + run: npm run build diff --git a/.nvmrc b/.nvmrc index d864d70..810a381 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.* \ No newline at end of file +18.* \ No newline at end of file diff --git a/commitlint.config.js b/commitlint.config.js index 3347cb9..5073c20 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1 @@ -module.exports = {extends: ['@commitlint/config-conventional']}; +module.exports = { extends: ["@commitlint/config-conventional"] }; diff --git a/cvs-nop b/cvs-nop index 2d71be3..facfbb9 160000 --- a/cvs-nop +++ b/cvs-nop @@ -1 +1 @@ -Subproject commit 2d71be37eb46196af1f15d347b464f842b83faf3 +Subproject commit facfbb97886d2444aa9a6e431b3e54ad78b48224 diff --git a/gulpfile.js b/gulpfile.js index 452ad4e..cb51143 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,33 +1,35 @@ -const gulp = require('gulp'); -const exec = require('child_process').exec; -const process = require('process'); +const gulp = require("gulp"); +const exec = require("child_process").exec; +const process = require("process"); -gulp.task('start-serverless', function (done) { - const instance = exec('node_modules/serverless/bin/serverless offline start &'); +gulp.task("start-serverless", function (done) { + const instance = exec( + "node_modules/serverless/bin/serverless offline start &" + ); - instance.stdout.on('data', function (output) { - process.stdout.write(output); + instance.stdout.on("data", function (output) { + process.stdout.write(output); - if (output.search('replay the last request') !== -1) { - done(); - process.exit(0); - } + if (output.search("replay the last request") !== -1) { + done(); + process.exit(0); + } - if (output.search('Error') !== -1) { - done(); - process.exit(-1); - } - }); + if (output.search("Error") !== -1) { + done(); + process.exit(-1); + } + }); - instance.on('close', function (code) { - console.info(`Process exited with code ${code}`); - done() - }) + instance.on("close", function (code) { + console.info(`Process exited with code ${code}`); + done(); + }); }); -gulp.task('kill-serverless', function (done) { - exec('pkill -2 node'); - exec('pkill -2 java'); +gulp.task("kill-serverless", function (done) { + exec("pkill -2 node"); + exec("pkill -2 java"); - done() + done(); }); diff --git a/jest.config.js b/jest.config.js index fb4f35d..f7ab6e5 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,18 +1,13 @@ -process.env.TZ = 'GMT'; +process.env.TZ = "GMT"; module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - roots: [ - '/src', - '/tests' - ], - setupFiles: [ - 'jest-plugin-context/setup' - ], - moduleFileExtensions: ['js', 'ts'], - testResultsProcessor: 'jest-sonar-reporter', + preset: "ts-jest", + testEnvironment: "node", + roots: ["/src", "/tests"], + setupFiles: ["jest-plugin-context/setup"], + moduleFileExtensions: ["js", "ts"], + testResultsProcessor: "jest-sonar-reporter", transform: { - '^.+\\.tsx?$': 'ts-jest' + "^.+\\.tsx?$": "ts-jest", }, - testMatch: ['**/*.*Test.ts'] -} + testMatch: ["**/*.*Test.ts"], +}; diff --git a/package-lock.json b/package-lock.json index 73b7968..7501f63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,34 +1,79 @@ { "name": "cvs-tsk-update-store", "version": "0.0.1", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "2-thenable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", - "integrity": "sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.47" + "packages": { + "": { + "name": "cvs-tsk-update-store", + "version": "0.0.1", + "license": "ISC", + "dependencies": { + "@types/lambda-tester": "3.6.0", + "aws-lambda": "1.0.6", + "aws-sdk": "2.1354.0", + "aws-xray-sdk": "2.5.0", + "date-fns": "2.21.2", + "liquibase": "1.0.1", + "moment": "2.29.4", + "mysql2": "2.2.5", + "prettier": "2.2.1", + "reflect-metadata": "0.1.13", + "testcontainers": "7.6.2", + "ts-node-register": "1.0.0", + "uuid": "8.3.2" + }, + "devDependencies": { + "@aws-sdk/client-dynamodb": "3.266.0", + "@aws-sdk/util-dynamodb": "3.266.0", + "@commitlint/cli": "12.1.4", + "@commitlint/config-conventional": "12.1.4", + "@types/aws-lambda": "8.10.34", + "@types/jest": "26.0.0", + "@types/jest-plugin-context": "2.9.2", + "@types/node": "12.20.7", + "@types/request-promise": "4.1.44", + "@types/sinon": "7.5.0", + "@types/uuid": "8.3.0", + "audit-filter": "0.5.0", + "aws-lambda-mock-context": "3.2.1", + "commitlint": "17.0.0", + "cross-env": "7.0.3", + "husky": "3.0.9", + "jest": "26.0.0", + "jest-plugin-context": "2.9.0", + "jest-sonar-reporter": "2.0.0", + "lambda-tester": "3.5.0", + "serverless": "3.33.0", + "serverless-offline": "6.9.0", + "serverless-plugin-tracing": "2.0.0", + "serverless-plugin-typescript": "1.1.9", + "sinon": "7.5.0", + "ts-jest": "26.5.1", + "tslint": "5.20.0", + "tslint-no-unused-expression-chai": "0.1.4", + "typescript": "3.9.9" + }, + "engines": { + "node": "18.*", + "npm": "9.*" } }, - "@aws-crypto/ie11-detection": { + "node_modules/@aws-crypto/ie11-detection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.11.1" } }, - "@aws-crypto/sha256-browser": { + "node_modules/@aws-crypto/sha256-browser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", "dev": true, - "requires": { + "dependencies": { "@aws-crypto/ie11-detection": "^3.0.0", "@aws-crypto/sha256-js": "^3.0.0", "@aws-crypto/supports-web-crypto": "^3.0.0", @@ -39,61 +84,62 @@ "tslib": "^1.11.1" } }, - "@aws-crypto/sha256-js": { + "node_modules/@aws-crypto/sha256-js": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", "dev": true, - "requires": { + "dependencies": { "@aws-crypto/util": "^3.0.0", "@aws-sdk/types": "^3.222.0", "tslib": "^1.11.1" } }, - "@aws-crypto/supports-web-crypto": { + "node_modules/@aws-crypto/supports-web-crypto": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.11.1" } }, - "@aws-crypto/util": { + "node_modules/@aws-crypto/util": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-utf8-browser": "^3.0.0", "tslib": "^1.11.1" } }, - "@aws-sdk/abort-controller": { + "node_modules/@aws-sdk/abort-controller": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.266.0.tgz", "integrity": "sha512-H/ySWWSwJN5coP9c5Ge2pOJYs1YPG5AVemGeKRx3kw5Z7Btd9jSFyYV0qGPd78HG3FopjZqSb4l2puPPp8UdpA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/client-dynamodb": { + "node_modules/@aws-sdk/abort-controller/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-dynamodb": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.266.0.tgz", "integrity": "sha512-UGEiqvVgb9PVRLnIl7OFb4WZWjBXUQBlUPMx8sds1QmVoTAlNJxRupQk3SxWTLi4IkWNEfEFR+lbkaQWS5GLjg==", "dev": true, - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/client-sts": "3.266.0", @@ -133,21 +179,22 @@ "tslib": "^2.3.1", "uuid": "^8.3.2" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-dynamodb/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-sso": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.266.0.tgz", "integrity": "sha512-eK20HlA61ehvCBf62bk29DX0cXPQh2/KMlvuHnjhxDrn4BLMxLCMer8Awz3MIoBbVQKG1h46X2z6/pJra8Fs4w==", "dev": true, - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/config-resolver": "3.266.0", @@ -181,21 +228,16 @@ "@aws-sdk/util-utf8": "3.254.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-sso-oidc": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.266.0.tgz", "integrity": "sha512-kpXr0Vj7IjDZ1ef3GHAe+/eDFp/XpEKfNHCl0r2MB5zTTFYxDm8BlFl7qB1rBJlqzqpPRhy+1J+UAsg84melsw==", "dev": true, - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/config-resolver": "3.266.0", @@ -229,21 +271,28 @@ "@aws-sdk/util-utf8": "3.254.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-sso/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/client-sts": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.266.0.tgz", "integrity": "sha512-ml3cjtIhHP21OwNKAC25ys5nAox0m4E2gPH97Q5s/1aE/hzxqQKkTO6YWp3eW7gwruubNV1GG/w0uHvAUYMjBw==", "dev": true, - "requires": { + "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/config-resolver": "3.266.0", @@ -281,82 +330,86 @@ "fast-xml-parser": "4.0.11", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/config-resolver": { + "node_modules/@aws-sdk/client-sts/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/config-resolver": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.266.0.tgz", "integrity": "sha512-s1DKPIJVcB506mRDGLzRAT3ZFUD/JvglbRoN9/oGUkCHusiOAlOIuTTilSfkjq13Ntq+O/sUIpWhir0R45dBcA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/signature-v4": "3.266.0", "@aws-sdk/types": "3.266.0", "@aws-sdk/util-config-provider": "3.208.0", "@aws-sdk/util-middleware": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-env": { + "node_modules/@aws-sdk/config-resolver/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-env": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.266.0.tgz", "integrity": "sha512-hh6/mkchzl6KUZBNFBkTB2YKEKPr2nLYS65d5DQnj+O2zXrWzVejS3mGT5iI7FZTcmKEdkxEGM+w8eZNGrdLBQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-imds": { + "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-imds": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.266.0.tgz", "integrity": "sha512-UEfzcMtSJsNt9DedP+LDAG3cSLq7XFl/6wJAkDAAeNuDmy5iTCk03sZF21LJ1A31GKviEHpxLquBslOdk1DYGQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/node-config-provider": "3.266.0", "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/types": "3.266.0", "@aws-sdk/url-parser": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.266.0.tgz", "integrity": "sha512-zyQo/eCtiPjoDvcsDI4xBojY6qy+o59B4LiVan1byvDQBbdI2VqshaDC4E+VJyCXcIZlYY1cT5NWt2g3wKKOLg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/credential-provider-env": "3.266.0", "@aws-sdk/credential-provider-imds": "3.266.0", "@aws-sdk/credential-provider-process": "3.266.0", @@ -367,21 +420,22 @@ "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-node": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.266.0.tgz", "integrity": "sha512-x4KtMZFpNuh6jfrKWtOnwkRrVJj4dR7fAWD95xiUtykE4eD7YthTBOQPVtRcroxHNKo80gmcZnJf6ZdvHG0XCw==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/credential-provider-env": "3.266.0", "@aws-sdk/credential-provider-imds": "3.266.0", "@aws-sdk/credential-provider-ini": "3.266.0", @@ -393,41 +447,43 @@ "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-process": { + "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-process": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.266.0.tgz", "integrity": "sha512-x9MvMCAVUGr/7c2h6HbpDbEQSkdc2CH7snqdzl3fL6f3Q2HqhIG9rYWi9kAm4WIOIe2AuEIyzpOcGhwu+lyAqQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/shared-ini-file-loader": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.266.0.tgz", "integrity": "sha512-48QjXHmL8etffasJa0ioQxLvFGJrD53cPC8PbiUCcsbhmEg7TEGIRDdir7h+RzEup+9s1kJhdwCsi1k2jkyXMg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/client-sso": "3.266.0", "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/shared-ini-file-loader": "3.266.0", @@ -435,153 +491,155 @@ "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.266.0.tgz", "integrity": "sha512-EMcH+vt/WyWysHa2vwq2G3n73gRhyJ7fw3sh+3MhBtK5850bpLeSBz3iXvow3VKm8rbkn5IwZ2YdwG2OZgr66w==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/endpoint-cache": { + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/endpoint-cache": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.208.0.tgz", "integrity": "sha512-MkrCvaZhTb1qZCjcDH73t5n43h0Kr0GS+30lpXZ9PAnHJZPqv+vhWFPK0ZsFe1XktbS0WOoDR4ED+lWm0Dw7Rg==", "dev": true, - "requires": { + "dependencies": { "mnemonist": "0.38.3", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/fetch-http-handler": { + "node_modules/@aws-sdk/endpoint-cache/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/fetch-http-handler": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.266.0.tgz", "integrity": "sha512-qqW5G/AdanNdAtNtDripRvijzgVOhvZ6NLRjVuOwWp3C5WRAAzMdl2lew2Q2swUy4InHwDsNeYjdhn1+hIIjrg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/querystring-builder": "3.266.0", "@aws-sdk/types": "3.266.0", "@aws-sdk/util-base64": "3.208.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } } }, - "@aws-sdk/hash-node": { + "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/hash-node": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.266.0.tgz", "integrity": "sha512-E0uXwLU0/lY1itKhS2wsDBaqysAryV/Suk6cXpyJWe13iktRJhMoVaD3SYEJD9jytXohXYgXCRly8tDYnxPwZQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "@aws-sdk/util-buffer-from": "3.208.0", "@aws-sdk/util-utf8": "3.254.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/invalid-dependency": { + "node_modules/@aws-sdk/hash-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/invalid-dependency": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.266.0.tgz", "integrity": "sha512-q3LkPLTd3LXhFnym6jjtlZzhJK9U4WekCyhFYrD+bBlyQGW/wuimpKE0ovGIyxuIZ/oklreYai5u1uH5FzgFlA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } } }, - "@aws-sdk/is-array-buffer": { + "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/is-array-buffer": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-content-length": { + "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-content-length": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.266.0.tgz", "integrity": "sha512-sVsSJ00BBu5ttOOggNp9kRKPopz01g3+z4aZng8nH/ZLpNO0cNVJPqU0SOlwiWuYCQQBXJahMe/SpWLXuPPstA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-endpoint": { + "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-endpoint": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.266.0.tgz", "integrity": "sha512-xAuLKmCjD8DYNIb9LVfnWG/16nqzoHEW+kxfecxeTaKGXb3eD+LoCbbE2l7pqBFC4uE+8ufrgexBBibHRnhotg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/middleware-serde": "3.266.0", "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/signature-v4": "3.266.0", @@ -591,98 +649,103 @@ "@aws-sdk/util-middleware": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-endpoint-discovery": { + "node_modules/@aws-sdk/middleware-endpoint-discovery": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.266.0.tgz", "integrity": "sha512-3YYU7aeHRL5pUgDAK8uV4NdnrbxXJtf3AzqCtCxxKGhaZEFu98413CWfTacuMX/I3ZarKxJpLSr1vIB2n63FXQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/config-resolver": "3.266.0", "@aws-sdk/endpoint-cache": "3.208.0", "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/middleware-endpoint-discovery/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-host-header": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.266.0.tgz", "integrity": "sha512-Rz5xkVkr7DW23QiZoXHUhqXIHhtqM364jjmIfmHCXeYsobXqLw9spU8n2DLzcltFqFKLOljzahu3RKjYe5IUSw==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-logger": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.266.0.tgz", "integrity": "sha512-JiAvd0kKOmehdn2KBWxd7EobOVg5LCVZUtSKcwNdZiWhcxLw/z4Rn95J+Sk/e0GoHKETIkD5gRLWNNumjGgnvA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.266.0.tgz", "integrity": "sha512-kaAQQmeTL0JNPtT6g83FksIwnJfgtRP05a8FAeiLQOdhkxs862HWK7vpFHlEgSrGi49LP27Du+msqTErXcwOMQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-retry": { + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-retry": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.266.0.tgz", "integrity": "sha512-SxfRXOfuuvllgtTSAPX/43+PTb0Xf8BlAoVQDstW+GDC+IfaL4wcmOKS4ClwUdzGEGBb4E+wL8wdEaVej3T3lA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/service-error-classification": "3.266.0", "@aws-sdk/types": "3.266.0", @@ -691,21 +754,22 @@ "tslib": "^2.3.1", "uuid": "^8.3.2" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-sdk-sts": { + "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.266.0.tgz", "integrity": "sha512-8yETgfyfFHc1m4v8LEUpxF2kEzc6qokjC6vwPGx2FghmZ9JdhpVWNJZRzpNqecKCl+MpkGfRv07NLvyc9veqww==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/middleware-signing": "3.266.0", "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/protocol-http": "3.266.0", @@ -713,39 +777,41 @@ "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-serde": { + "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-serde": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.266.0.tgz", "integrity": "sha512-UX7kFB5SmizNBcFIw6qNp/87dldx0VsDIZtTDpbeS05O3vsh7BEfByibOFPS5PlGqWjZt0T+FLcx/9Y4XSrSxA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-signing": { + "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-signing": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.266.0.tgz", "integrity": "sha512-PlpngmBB5P9oxEdYZRtCbHiP1ftDk/RIWLY2ewk02xK6lkzY8tlZ8wPGOmshj9C7b3SzPOASJLEbtDS86yXn/Q==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/signature-v4": "3.266.0", @@ -753,195 +819,208 @@ "@aws-sdk/util-middleware": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-stack": { + "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-stack": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.266.0.tgz", "integrity": "sha512-v1BHaHu+o1MUYoozeHRJQBEbnQvFeOnxL8e1/uio19DdWqtOA2wv6eznTfsxXOORER1xZX38EjlcZGWbM41maA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/middleware-user-agent": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.266.0.tgz", "integrity": "sha512-ofnRkm+iMMl6NatDa0nqGIFRVEtS5lIKntS4htPVsJvI/lqWzlgn75L2YgzYgkpU2o4GWBMvjCjhnnZ3V32BQQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/node-config-provider": { + "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/node-config-provider": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.266.0.tgz", "integrity": "sha512-myK9Dr/QNfijEZQFOFkQJ8NAyZVA8yBiZTA15+EMphap1ciVXRGSpE/8KzF/qEX5wY2WoDZuPUUfmPebC3+jUA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/shared-ini-file-loader": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/node-http-handler": { + "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/node-http-handler": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.266.0.tgz", "integrity": "sha512-JLezkHEDWN7dN/mZEzA0La+iKRZqxOyqjYJNpFNTz4ZiR0XlV5zhihHBkgatE0/hL1xVCV+ljSiyMGP//4DkjQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/abort-controller": "3.266.0", "@aws-sdk/protocol-http": "3.266.0", "@aws-sdk/querystring-builder": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/property-provider": { + "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/property-provider": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.266.0.tgz", "integrity": "sha512-/M0HpUNkAUJF9wEKsWyJ/w2ZXwSwRByZ1IGkDluPoCweDmhbSp2n9WC8S/IyPktGlesEjQbfuLCvgjgiEfGPkg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/protocol-http": { + "node_modules/@aws-sdk/property-provider/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/protocol-http": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.266.0.tgz", "integrity": "sha512-bg59CcRVgqKlrwDBdxy3NFmi30P61nUqZlAHaEtdxoj/oVHNaUKMDGl/YEM8O1UB2r0KO4KJdEu5tvAcChYk+A==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/querystring-builder": { + "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/querystring-builder": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.266.0.tgz", "integrity": "sha512-dor4slaD1ohUiGZxouK4Nu5LmRwspJg6JhOwKfaUMUR3oJnVnBBv5k/84UHjsmC6mJDWu4fEsfUd8rVg2HpYxA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "@aws-sdk/util-uri-escape": "3.201.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/querystring-parser": { + "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/querystring-parser": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.266.0.tgz", "integrity": "sha512-XECB7T7xNoFOfyqgitQPwjLDGn4Y9M5pnPVwdKs3UiZGvX0KSBxtWMNRo5Sv4QyIOm0DQYQimER1DiKxbrpvZA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/service-error-classification": { + "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/service-error-classification": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.266.0.tgz", "integrity": "sha512-Yq9NVRkVaVzNsQsWZ6gwkfmyuPM6CBxBeWkjvcE0B4TiD8DDjFZIjGoUrUpGgraCA4W7WHeTwOFghzSK+BcYVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=14.0.0" + } }, - "@aws-sdk/shared-ini-file-loader": { + "node_modules/@aws-sdk/shared-ini-file-loader": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.266.0.tgz", "integrity": "sha512-8S/7I6FjQczulFha2ebpBfUcbg3G/NDp+fByTz9DWqY9EI4VsvCJsScYexSc9t89F0ny9zyyspfESzfzdy2PRw==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/signature-v4": { + "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/signature-v4": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.266.0.tgz", "integrity": "sha512-TvDhA3yVTKLBgHNtKNY31m7O5HRSSQrk0OjVVt6mkEjAuXjSC4TDno+l/kOfpFco+gV1WiFt0cqrLAM6h9CL8A==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "@aws-sdk/types": "3.266.0", "@aws-sdk/util-hex-encoding": "3.201.0", @@ -950,204 +1029,209 @@ "@aws-sdk/util-utf8": "3.254.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/smithy-client": { + "node_modules/@aws-sdk/signature-v4/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/smithy-client": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.266.0.tgz", "integrity": "sha512-FCv4cIt/uDFe2E24mgnL4PlnQcnkIj1v7H/jS6amRoZAkrDai6DcvnUQJ6TsyRTjKY56K1Xq/ev7vcXe+bcVJA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/middleware-stack": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/token-providers": { + "node_modules/@aws-sdk/smithy-client/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/token-providers": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.266.0.tgz", "integrity": "sha512-NnWqT03u8STssKnKkGtHUSFDUBgv/VF+h4rwvyY5NKO9FMReN0v90XE/Bb2Oa3pzx6C5AG89kGmAvy+0VRn+Rg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/client-sso-oidc": "3.266.0", "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/shared-ini-file-loader": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/types": { + "node_modules/@aws-sdk/token-providers/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/types": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.266.0.tgz", "integrity": "sha512-DGOnzUKM9gE1xRyzNKe9S0hOMHT1C1CEuTJ8MgPQjXj5UgndAIItU+9kkfeZTLSbp3rDHeNZ8EP9/oS9kC+q8Q==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/url-parser": { + "node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/url-parser": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.266.0.tgz", "integrity": "sha512-KeXkGDNBlNGdrXKu9mKE018GvgtJg5aH3mliXvPnO3jXlhpbgu7G+PJoykAJiw41fcIwWC/lX6JDMkmIgvElwQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/querystring-parser": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } } }, - "@aws-sdk/util-base64": { + "node_modules/@aws-sdk/url-parser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-base64": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/util-buffer-from": "3.208.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-body-length-browser": { + "node_modules/@aws-sdk/util-base64/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-body-length-browser": { "version": "3.188.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", "dev": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "tslib": "^2.3.1" } }, - "@aws-sdk/util-body-length-node": { + "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-body-length-node": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-buffer-from": { + "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-buffer-from": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-config-provider": { + "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-config-provider": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-defaults-mode-browser": { + "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.266.0.tgz", "integrity": "sha512-DzjU4TZyrvQBZfwdBBXTH5+SjeHWSrCplOOt6zXKtu8rt5GntVS4Oyx0DTz1JGCAqesicQpZ9jTQ6YKp7EOntw==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/property-provider": "3.266.0", "@aws-sdk/types": "3.266.0", "bowser": "^2.11.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">= 10.0.0" } }, - "@aws-sdk/util-defaults-mode-node": { + "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.266.0.tgz", "integrity": "sha512-hyxPm84YuHPxze7jHnYaLBGVcmdE6V9irlXUe3V/JgYYCnGdwMob+TNwkdWVp4DGW/8b41FxlBDvRZPBKCvTpQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/config-resolver": "3.266.0", "@aws-sdk/credential-provider-imds": "3.266.0", "@aws-sdk/node-config-provider": "3.266.0", @@ -1155,248 +1239,264 @@ "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">= 10.0.0" } }, - "@aws-sdk/util-dynamodb": { + "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-dynamodb": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.266.0.tgz", "integrity": "sha512-ozlsMwXnfNTFXHFsD/+A9h1ZQNqJ4XTYTVqzpBYiHq4jfECge1UeGp06c3v1tVvszkAvV8TUrUE37eZNzTPl/g==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/util-dynamodb/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-endpoints": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.266.0.tgz", "integrity": "sha512-G75mBFyEoO9+fnx2BawcmdnRyBkE2mIyDl560cgxH3HiicmgED71QNQ+qWxxmFx+G4bnZOft+2l9BfIf+i9wcA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-hex-encoding": { + "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-hex-encoding": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-locate-window": { + "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-locate-window": { "version": "3.208.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-middleware": { + "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-middleware": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.266.0.tgz", "integrity": "sha512-q5dWY20Euh9vCXCuTNbcKXLNhW6dXBHxYAHR+csP2OFNLLB4wiJaeMYr9iwcB0YXcfnpQbXznSF0PLbPPZgCmw==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-retry": { + "node_modules/@aws-sdk/util-middleware/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-retry": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.266.0.tgz", "integrity": "sha512-+HcMcJ8y9O3Jsq0I3Zqh9/cqMey3RM4j+M6hzAsFBOwjbBvWV4EfXb5g+NODJzyLxrBIHAesZyyQAiCipvbAlA==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/service-error-classification": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">= 14.0.0" } }, - "@aws-sdk/util-uri-escape": { + "node_modules/@aws-sdk/util-retry/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-uri-escape": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.266.0.tgz", "integrity": "sha512-pMJ4C5lzDEVJ0kZoZdV1ww4hn9s15cExaPcRgUqjCwzNxYo9E1Jc6wCC533sYNZF1aSkY9NDLyJmv/lP7FvF4A==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/types": "3.266.0", "bowser": "^2.11.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } } }, - "@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-user-agent-node": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.266.0.tgz", "integrity": "sha512-CNpJsxvEplAP3XLwUmr7iJ428pCH2aFQIFLjXFjcAaB2IbgG1/801hdzdmeBH+1LSYVJ5qd3R+HeaZhxMDo62A==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/node-config-provider": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true } } }, - "@aws-sdk/util-utf8": { + "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-utf8": { "version": "3.254.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/util-buffer-from": "3.208.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@aws-sdk/util-utf8-browser": { + "node_modules/@aws-sdk/util-utf8-browser": { "version": "3.259.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", "dev": true, - "requires": { - "tslib": "^2.3.1" - }, "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "tslib": "^2.3.1" } }, - "@aws-sdk/util-waiter": { + "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-utf8/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@aws-sdk/util-waiter": { "version": "3.266.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.266.0.tgz", "integrity": "sha512-le+ekM2U/MyQ81e9aZHfhj2XFsHxzmHdlvqFIkrSQ71Wt1/Fkv8DcVUEQy9IbO88sOzVGOsB8T7USU3zAVBGnQ==", "dev": true, - "requires": { + "dependencies": { "@aws-sdk/abort-controller": "3.266.0", "@aws-sdk/types": "3.266.0", "tslib": "^2.3.1" }, - "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "engines": { + "node": ">=14.0.0" } }, - "@babel/code-frame": { + "node_modules/@aws-sdk/util-waiter/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "requires": { + "dev": true, + "dependencies": { "@babel/highlight": "^7.12.13" } }, - "@babel/compat-data": { + "node_modules/@babel/compat-data": { "version": "7.13.15", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==", "dev": true }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.13.15", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.9", "@babel/helper-compilation-targets": "^7.13.13", @@ -1413,99 +1513,102 @@ "semver": "^6.3.0", "source-map": "^0.5.0" }, - "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "@babel/generator": { + "node_modules/@babel/generator": { "version": "7.13.9", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.13.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, - "@babel/helper-compilation-targets": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.13.13", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", "dev": true, - "requires": { + "dependencies": { "@babel/compat-data": "^7.13.12", "@babel/helper-validator-option": "^7.12.17", "browserslist": "^4.14.5", "semver": "^6.3.0" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "@babel/helper-function-name": { + "node_modules/@babel/helper-function-name": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-get-function-arity": "^7.12.13", "@babel/template": "^7.12.13", "@babel/types": "^7.12.13" } }, - "@babel/helper-get-function-arity": { + "node_modules/@babel/helper-get-function-arity": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.12.13" } }, - "@babel/helper-member-expression-to-functions": { + "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.13.12", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.13.12" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.13.12", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.13.12" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.13.14", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-module-imports": "^7.13.12", "@babel/helper-replace-supers": "^7.13.12", "@babel/helper-simple-access": "^7.13.12", @@ -1516,214 +1619,258 @@ "@babel/types": "^7.13.14" } }, - "@babel/helper-optimise-call-expression": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.12.13" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", "dev": true }, - "@babel/helper-replace-supers": { + "node_modules/@babel/helper-replace-supers": { "version": "7.13.12", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-member-expression-to-functions": "^7.13.12", "@babel/helper-optimise-call-expression": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.12" } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.13.12", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.13.12" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, - "requires": { + "dependencies": { "@babel/types": "^7.12.13" } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true }, - "@babel/helper-validator-option": { + "node_modules/@babel/helper-validator-option": { "version": "7.12.17", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "dev": true, - "requires": { + "dependencies": { "@babel/template": "^7.12.13", "@babel/traverse": "^7.13.0", "@babel/types": "^7.13.0" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.13.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "requires": { + "dev": true, + "dependencies": { "@babel/helper-validator-identifier": "^7.12.11", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.13.15", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", - "dev": true + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/plugin-syntax-async-generators": { + "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-class-properties": { + "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-import-meta": { + "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "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==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-json-strings": { + "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "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==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "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==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-numeric-separator": { + "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "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==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "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==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-catch-binding": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "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==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-optional-chaining": { + "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-top-level-await": { + "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/parser": "^7.12.13", "@babel/types": "^7.12.13" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.13.15", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.9", "@babel/helper-function-name": "^7.12.13", @@ -1734,44 +1881,50 @@ "globals": "^11.1.0" } }, - "@babel/types": { + "node_modules/@babel/types": { "version": "7.13.14", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "dev": true, - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, - "@balena/dockerignore": { + "node_modules/@balena/dockerignore": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, - "@bcoe/v8-coverage": { + "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@cnakazawa/watch": { + "node_modules/@cnakazawa/watch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, - "requires": { + "dependencies": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" } }, - "@commitlint/cli": { + "node_modules/@commitlint/cli": { "version": "12.1.4", "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.1.4.tgz", "integrity": "sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg==", "dev": true, - "requires": { + "dependencies": { "@commitlint/format": "^12.1.4", "@commitlint/lint": "^12.1.4", "@commitlint/load": "^12.1.4", @@ -1782,13529 +1935,15998 @@ "resolve-global": "1.0.0", "yargs": "^16.2.0" }, - "dependencies": { - "@commitlint/ensure": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.1.4.tgz", - "integrity": "sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw==", - "dev": true, - "requires": { - "@commitlint/types": "^12.1.4", - "lodash": "^4.17.19" - } - }, - "@commitlint/execute-rule": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.1.4.tgz", - "integrity": "sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg==", - "dev": true - }, - "@commitlint/format": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-12.1.4.tgz", - "integrity": "sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g==", - "dev": true, - "requires": { - "@commitlint/types": "^12.1.4", - "chalk": "^4.0.0" - } - }, - "@commitlint/is-ignored": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.1.4.tgz", - "integrity": "sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw==", - "dev": true, - "requires": { - "@commitlint/types": "^12.1.4", - "semver": "7.3.5" - } - }, - "@commitlint/lint": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-12.1.4.tgz", - "integrity": "sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA==", - "dev": true, - "requires": { - "@commitlint/is-ignored": "^12.1.4", - "@commitlint/parse": "^12.1.4", - "@commitlint/rules": "^12.1.4", - "@commitlint/types": "^12.1.4" - } - }, - "@commitlint/load": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-12.1.4.tgz", - "integrity": "sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA==", - "dev": true, - "requires": { - "@commitlint/execute-rule": "^12.1.4", - "@commitlint/resolve-extends": "^12.1.4", - "@commitlint/types": "^12.1.4", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0" - } - }, - "@commitlint/message": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-12.1.4.tgz", - "integrity": "sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA==", - "dev": true - }, - "@commitlint/parse": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-12.1.4.tgz", - "integrity": "sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw==", - "dev": true, - "requires": { - "@commitlint/types": "^12.1.4", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.0.0" - } - }, - "@commitlint/read": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-12.1.4.tgz", - "integrity": "sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg==", - "dev": true, - "requires": { - "@commitlint/top-level": "^12.1.4", - "@commitlint/types": "^12.1.4", - "fs-extra": "^9.0.0", - "git-raw-commits": "^2.0.0" - } - }, - "@commitlint/resolve-extends": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz", - "integrity": "sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg==", - "dev": true, - "requires": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - } - }, - "@commitlint/rules": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-12.1.4.tgz", - "integrity": "sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg==", - "dev": true, - "requires": { - "@commitlint/ensure": "^12.1.4", - "@commitlint/message": "^12.1.4", - "@commitlint/to-lines": "^12.1.4", - "@commitlint/types": "^12.1.4" - } - }, - "@commitlint/to-lines": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.1.4.tgz", - "integrity": "sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw==", - "dev": true - }, - "@commitlint/top-level": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.1.4.tgz", - "integrity": "sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "@commitlint/types": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.1.4.tgz", - "integrity": "sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/config-conventional": { + "node_modules/@commitlint/cli/node_modules/@commitlint/ensure": { "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-12.1.4.tgz", - "integrity": "sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ==", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.1.4.tgz", + "integrity": "sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw==", "dev": true, - "requires": { - "conventional-changelog-conventionalcommits": "^4.3.1" - } - }, - "@commitlint/ensure": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.1.1.tgz", - "integrity": "sha512-XEUQvUjzBVQM7Uv8vYz+c7PDukFvx0AvQEyX/V+PaTkCK/xPvexu7FLbFwvypjSt9BPMf+T/rhB1hVmldkd6lw==", - "requires": { - "@commitlint/types": "^12.1.1", + "dependencies": { + "@commitlint/types": "^12.1.4", "lodash": "^4.17.19" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/execute-rule": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.1.1.tgz", - "integrity": "sha512-6mplMGvLCKF5LieL7BRhydpg32tm6LICnWQADrWU4S5g9PKi2utNvhiaiuNPoHUXr29RdbNaGNcyyPv8DSjJsQ==" + "node_modules/@commitlint/cli/node_modules/@commitlint/execute-rule": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.1.4.tgz", + "integrity": "sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg==", + "dev": true, + "engines": { + "node": ">=v10" + } }, - "@commitlint/format": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-12.1.1.tgz", - "integrity": "sha512-bTAoOryTFLqls17JTaRwk2WDVOP0NwuG4F/JPK8RaF6DMZNVQTfajkgTxFENNZRnESfau1BvivvEXfUAW2ZsvA==", - "requires": { - "@commitlint/types": "^12.1.1", - "chalk": "^4.0.0" - }, + "node_modules/@commitlint/cli/node_modules/@commitlint/format": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-12.1.4.tgz", + "integrity": "sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } + "@commitlint/types": "^12.1.4", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/is-ignored": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.1.1.tgz", - "integrity": "sha512-Sn4fsnWX+wLAJOD/UZeoVruB98te1TyPYRiDEq0MhRJAQIrP+7jE/O3/ass68AAMq00HvH3OK9kt4UBXggcGjA==", - "requires": { - "@commitlint/types": "^12.1.1", + "node_modules/@commitlint/cli/node_modules/@commitlint/is-ignored": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.1.4.tgz", + "integrity": "sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^12.1.4", "semver": "7.3.5" }, + "engines": { + "node": ">=v10" + } + }, + "node_modules/@commitlint/cli/node_modules/@commitlint/lint": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-12.1.4.tgz", + "integrity": "sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA==", + "dev": true, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } + "@commitlint/is-ignored": "^12.1.4", + "@commitlint/parse": "^12.1.4", + "@commitlint/rules": "^12.1.4", + "@commitlint/types": "^12.1.4" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/lint": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-12.1.1.tgz", - "integrity": "sha512-FFFPpku/E0svL1jaUVqosuZJDDWiNWYBlUw5ZEljh3MwWRcoaWtMIX5bseX+IvHpFZsCTAiBs1kCgNulCi0UvA==", - "requires": { - "@commitlint/is-ignored": "^12.1.1", - "@commitlint/parse": "^12.1.1", - "@commitlint/rules": "^12.1.1", - "@commitlint/types": "^12.1.1" - } - }, - "@commitlint/load": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-12.1.1.tgz", - "integrity": "sha512-qOQtgNdJRULUQWP9jkpTwhj7aEtnqUtqeUpbQ9rjS+GIUST65HZbteNUX4S0mAEGPWqy2aK5xGd73cUfFSvuuw==", - "requires": { - "@commitlint/execute-rule": "^12.1.1", - "@commitlint/resolve-extends": "^12.1.1", - "@commitlint/types": "^12.1.1", + "node_modules/@commitlint/cli/node_modules/@commitlint/load": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-12.1.4.tgz", + "integrity": "sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA==", + "dev": true, + "dependencies": { + "@commitlint/execute-rule": "^12.1.4", + "@commitlint/resolve-extends": "^12.1.4", + "@commitlint/types": "^12.1.4", "chalk": "^4.0.0", "cosmiconfig": "^7.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">=v10" } }, - "@commitlint/message": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-12.1.1.tgz", - "integrity": "sha512-RakDSLAiOligXjhbLahV8HowF4K75pZIcs0+Ii9Q8Gz5H3DWf1Ngit7alFTWfcbf/+DTjSzVPov5HiwQZPIBUg==" + "node_modules/@commitlint/cli/node_modules/@commitlint/message": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-12.1.4.tgz", + "integrity": "sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA==", + "dev": true, + "engines": { + "node": ">=v10" + } }, - "@commitlint/parse": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-12.1.1.tgz", - "integrity": "sha512-nuljIvAbBDr93DgL0wCArftEIhjSghawAwhvrKNV9FFcqAJqfVqitwMxJrNDCQ5pgUMCSKULLOEv+dA0bLlTEQ==", - "requires": { - "@commitlint/types": "^12.1.1", + "node_modules/@commitlint/cli/node_modules/@commitlint/parse": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-12.1.4.tgz", + "integrity": "sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^12.1.4", "conventional-changelog-angular": "^5.0.11", "conventional-commits-parser": "^3.0.0" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/read": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-12.1.1.tgz", - "integrity": "sha512-1k0CQEoZIdixvmqZRKEcWdj2XiKS7SlizEOJ1SE99Qui5d5FlBey8eaooTGgmpR6zObpIHJehtEPzM3VzUT3qA==", - "requires": { - "@commitlint/top-level": "^12.1.1", - "@commitlint/types": "^12.1.1", + "node_modules/@commitlint/cli/node_modules/@commitlint/read": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-12.1.4.tgz", + "integrity": "sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^12.1.4", + "@commitlint/types": "^12.1.4", "fs-extra": "^9.0.0", "git-raw-commits": "^2.0.0" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/resolve-extends": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.1.1.tgz", - "integrity": "sha512-/DXRt0S0U3o9lq5cc8OL1Lkx0IjW0HcDWjUkUXshAajBIKBYSJB8x/loNCi1krNEJ8SwLXUEFt5OLxNO6wE9yQ==", - "requires": { + "node_modules/@commitlint/cli/node_modules/@commitlint/resolve-extends": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz", + "integrity": "sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg==", + "dev": true, + "dependencies": { "import-fresh": "^3.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" }, - "dependencies": { - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } + "engines": { + "node": ">=v10" } }, - "@commitlint/rules": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-12.1.1.tgz", - "integrity": "sha512-oCcLF/ykcJfhM2DeeaDyrgdaiuKsqIPNocugdPj2WEyhSYqmx1/u18CV96LAtW+WyyiOLCCeiZwiQutx3T5nXg==", - "requires": { - "@commitlint/ensure": "^12.1.1", - "@commitlint/message": "^12.1.1", - "@commitlint/to-lines": "^12.1.1", - "@commitlint/types": "^12.1.1" + "node_modules/@commitlint/cli/node_modules/@commitlint/rules": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-12.1.4.tgz", + "integrity": "sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^12.1.4", + "@commitlint/message": "^12.1.4", + "@commitlint/to-lines": "^12.1.4", + "@commitlint/types": "^12.1.4" + }, + "engines": { + "node": ">=v10" } }, - "@commitlint/to-lines": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.1.1.tgz", - "integrity": "sha512-W23AH2XF5rI27MOAPSSr0TUDoRe7ZbFoRtYhFnPu2MBmcuDA9Tmfd9N5sM2tBXtdE26uq3SazwKqGt1OoGAilQ==" + "node_modules/@commitlint/cli/node_modules/@commitlint/to-lines": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.1.4.tgz", + "integrity": "sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw==", + "dev": true, + "engines": { + "node": ">=v10" + } }, - "@commitlint/top-level": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.1.1.tgz", - "integrity": "sha512-g7uRbr81QEIg+pbii0OkE17Zh/2C/f6dSmiMDVRn1S0+hNHR1bENCh18hVUKcV/qKTUsKkFlhhWXM9mQBfxQJw==", - "requires": { + "node_modules/@commitlint/cli/node_modules/@commitlint/top-level": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.1.4.tgz", + "integrity": "sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg==", + "dev": true, + "dependencies": { "find-up": "^5.0.0" }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - } + "engines": { + "node": ">=v10" } }, - "@commitlint/types": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.1.1.tgz", - "integrity": "sha512-+qGH+s2Lo6qwacV2X3/ZypZwaAI84ift+1HBjXdXtI/q0F5NtmXucV3lcQOTviMTNiJhq4qWON2fjci2NItASw==", - "requires": { + "node_modules/@commitlint/cli/node_modules/@commitlint/types": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.1.4.tgz", + "integrity": "sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw==", + "dev": true, + "dependencies": { "chalk": "^4.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">=v10" } }, - "@hapi/accept": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-3.2.4.tgz", - "integrity": "sha512-soThGB+QMgfxlh0Vzhzlf3ZOEOPk5biEwcOXhkF0Eedqx8VnhGiggL9UYHrIsOb1rUg3Be3K8kp0iDL2wbVSOQ==", + "node_modules/@commitlint/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/ammo": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-3.1.2.tgz", - "integrity": "sha512-ej9OtFmiZv1qr45g1bxEZNGyaR4jRpyMxU6VhbxjaYThymvOwsyIsUKMZnP5Qw2tfYFuwqCJuIBHGpeIbdX9gQ==", + "node_modules/@commitlint/cli/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@hapi/b64": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-4.2.1.tgz", - "integrity": "sha512-zqHpQuH5CBMw6hADzKfU/IGNrxq1Q+/wTYV+OiZRQN9F3tMyk+9BUMeBvFRMamduuqL8iSp62QAnJ+7ATiYLWA==", + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "@hapi/boom": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-7.4.11.tgz", - "integrity": "sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A==", + "node_modules/@commitlint/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@hapi/bounce": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-1.3.2.tgz", - "integrity": "sha512-3bnb1AlcEByFZnpDIidxQyw1Gds81z/1rSqlx4bIEE+wUN0ATj0D49B5cE1wGocy90Rp/de4tv7GjsKd5RQeew==", + "node_modules/@commitlint/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/cli/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "^8.3.1" + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" } }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", - "dev": true - }, - "@hapi/call": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-5.1.3.tgz", - "integrity": "sha512-5DfWpMk7qZiYhvBhM5oUiT4GQ/O8a2rFR121/PdwA/eZ2C1EsuD547ZggMKAR5bZ+FtxOf0fdM20zzcXzq2mZA==", + "node_modules/@commitlint/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x" + "engines": { + "node": ">=8" } }, - "@hapi/catbox": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-10.2.3.tgz", - "integrity": "sha512-kN9hXO4NYyOHW09CXiuj5qW1syc/0XeVOBsNNk0Tz89wWNQE5h21WF+VsfAw3uFR8swn/Wj3YEVBnWqo82m/JQ==", + "node_modules/@commitlint/cli/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x", - "@hapi/podium": "3.x.x" + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@hapi/catbox-memory": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-4.1.1.tgz", - "integrity": "sha512-T6Hdy8DExzG0jY7C8yYWZB4XHfc0v+p1EGkwxl2HoaPYAmW7I3E59M/IvmSVpis8RPcIoBp41ZpO2aZPBpM2Ww==", + "node_modules/@commitlint/cli/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x" + "engines": { + "node": ">=4" } }, - "@hapi/content": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-4.1.1.tgz", - "integrity": "sha512-3TWvmwpVPxFSF3KBjKZ8yDqIKKZZIm7VurDSweYpXYENZrJH3C1hd1+qEQW9wQaUaI76pPBLGrXl6I3B7i3ipA==", + "node_modules/@commitlint/cli/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x" + "engines": { + "node": ">=8" } }, - "@hapi/cryptiles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-4.2.1.tgz", - "integrity": "sha512-XoqgKsHK0l/VpqPs+tr6j6vE+VQ3+2bkF2stvttmc7xAOf1oSAwHcJ0tlp/6MxMysktt1IEY0Csy3khKaP9/uQ==", + "node_modules/@commitlint/cli/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "@hapi/file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-1.0.0.tgz", - "integrity": "sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ==", - "dev": true + "node_modules/@commitlint/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", - "dev": true + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } }, - "@hapi/h2o2": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@hapi/h2o2/-/h2o2-8.3.2.tgz", - "integrity": "sha512-2WkZq+QAkvYHWGqnUuG0stcVeGyv9T7bopBYnCJSUEuvBZlUf2BTX2JCVSKxsnTLOxCYwoC/aI4Rr0ZSRd2oVg==", + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x", - "@hapi/wreck": "15.x.x" + "engines": { + "node": ">=10" } }, - "@hapi/hapi": { - "version": "18.4.1", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-18.4.1.tgz", - "integrity": "sha512-9HjVGa0Z4Qv9jk9AVoUdJMQLA+KuZ+liKWyEEkVBx3e3H1F0JM6aGbPkY9jRfwsITBWGBU2iXazn65SFKSi/tg==", + "node_modules/@commitlint/config-conventional": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-12.1.4.tgz", + "integrity": "sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ==", "dev": true, - "requires": { - "@hapi/accept": "^3.2.4", - "@hapi/ammo": "^3.1.2", - "@hapi/boom": "7.x.x", - "@hapi/bounce": "1.x.x", - "@hapi/call": "^5.1.3", - "@hapi/catbox": "10.x.x", - "@hapi/catbox-memory": "4.x.x", - "@hapi/heavy": "6.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "15.x.x", - "@hapi/mimos": "4.x.x", - "@hapi/podium": "3.x.x", - "@hapi/shot": "4.x.x", - "@hapi/somever": "2.x.x", - "@hapi/statehood": "6.x.x", - "@hapi/subtext": "^6.1.3", - "@hapi/teamwork": "3.x.x", - "@hapi/topo": "3.x.x" - }, "dependencies": { - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - } + "conventional-changelog-conventionalcommits": "^4.3.1" + }, + "engines": { + "node": ">=v10" } }, - "@hapi/heavy": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-6.2.2.tgz", - "integrity": "sha512-PY1dCCO6dsze7RlafIRhTaGeyTgVe49A/lSkxbhKGjQ7x46o/OFf7hLiRqTCDh3atcEKf6362EaB3+kTUbCsVA==", + "node_modules/@commitlint/config-validator": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", + "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x" + "dependencies": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" } }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", - "dev": true + "node_modules/@commitlint/ensure": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.6.7.tgz", + "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } }, - "@hapi/iron": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-5.1.4.tgz", - "integrity": "sha512-+ElC+OCiwWLjlJBmm8ZEWjlfzTMQTdgPnU/TsoU5QsktspIWmWi9IU4kU83nH+X/SSya8TP8h8P11Wr5L7dkQQ==", + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", "dev": true, - "requires": { - "@hapi/b64": "4.x.x", - "@hapi/boom": "7.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/cryptiles": "4.x.x", - "@hapi/hoek": "8.x.x" + "engines": { + "node": ">=v14" } }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "node_modules/@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", "dev": true, - "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "dependencies": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" } }, - "@hapi/mimos": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-4.1.1.tgz", - "integrity": "sha512-CXoi/zfcTWfKYX756eEea8rXJRIb9sR4d7VwyAH9d3BkDyNgAesZxvqIdm55npQc6S9mU3FExinMAQVlIkz0eA==", + "node_modules/@commitlint/format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "mime-db": "1.x.x" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@hapi/nigel": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-3.1.1.tgz", - "integrity": "sha512-R9YWx4S8yu0gcCBrMUDCiEFm1SQT895dMlYoeNBp8I6YhF1BFF1iYPueKA2Kkp9BvyHdjmvrxCOns7GMmpl+Fw==", + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "@hapi/vise": "3.x.x" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@hapi/pez": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-4.1.2.tgz", - "integrity": "sha512-8zSdJ8cZrJLFldTgwjU9Fb1JebID+aBCrCsycgqKYe0OZtM2r3Yv3aAwW5z97VsZWCROC1Vx6Mdn4rujh5Ktcg==", + "node_modules/@commitlint/format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "@hapi/b64": "4.x.x", - "@hapi/boom": "7.x.x", - "@hapi/content": "^4.1.1", - "@hapi/hoek": "8.x.x", - "@hapi/nigel": "3.x.x" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "node_modules/@commitlint/format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "@hapi/podium": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-3.4.3.tgz", - "integrity": "sha512-QJlnYLEYZWlKQ9fSOtuUcpANyoVGwT68GA9P0iQQCAetBK0fI+nbRBt58+aMixoifczWZUthuGkNjqKxgPh/CQ==", + "node_modules/@commitlint/format/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x" + "engines": { + "node": ">=8" } }, - "@hapi/shot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-4.1.2.tgz", - "integrity": "sha512-6LeHLjvsq/bQ0R+fhEyr7mqExRGguNTrxFZf5DyKe3CK6pNabiGgYO4JVFaRrLZ3JyuhkS0fo8iiRE2Ql2oA/A==", + "node_modules/@commitlint/format/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x", - "@hapi/joi": "16.x.x" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@hapi/somever": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-2.1.1.tgz", - "integrity": "sha512-cic5Sto4KGd9B0oQSdKTokju+rYhCbdpzbMb0EBnrH5Oc1z048hY8PaZ1lx2vBD7I/XIfTQVQetBH57fU51XRA==", + "node_modules/@commitlint/is-ignored": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.7.tgz", + "integrity": "sha512-vqyNRqtbq72P2JadaoWiuoLtXIs9SaAWDqdtef6G2zsoXqKFc7vqj1f+thzVgosXG3X/5K9jNp+iYijmvOfc/g==", "dev": true, - "requires": { - "@hapi/bounce": "1.x.x", - "@hapi/hoek": "8.x.x" + "dependencies": { + "@commitlint/types": "^17.4.4", + "semver": "7.5.2" + }, + "engines": { + "node": ">=v14" } }, - "@hapi/statehood": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-6.1.2.tgz", - "integrity": "sha512-pYXw1x6npz/UfmtcpUhuMvdK5kuOGTKcJNfLqdNptzietK2UZH5RzNJSlv5bDHeSmordFM3kGItcuQWX2lj2nQ==", + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/bounce": "1.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/cryptiles": "4.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/iron": "5.x.x", - "@hapi/joi": "16.x.x" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "@hapi/subtext": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-6.1.3.tgz", - "integrity": "sha512-qWN6NbiHNzohVcJMeAlpku/vzbyH4zIpnnMPMPioQMwIxbPFKeNViDCNI6fVBbMPBiw/xB4FjqiJkRG5P9eWWg==", + "node_modules/@commitlint/lint": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.7.tgz", + "integrity": "sha512-TW+AozfuOFMrHn+jdwtz0IWu8REKFp0eryOvoBp2r8IXNc4KihKB1spAiUB6SFyHD6hVVeolz12aHnJ3Mb+xVQ==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/content": "^4.1.1", - "@hapi/file": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/pez": "^4.1.2", - "@hapi/wreck": "15.x.x" + "dependencies": { + "@commitlint/is-ignored": "^17.6.7", + "@commitlint/parse": "^17.6.7", + "@commitlint/rules": "^17.6.7", + "@commitlint/types": "^17.4.4" + }, + "engines": { + "node": ">=v14" } }, - "@hapi/teamwork": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-3.3.1.tgz", - "integrity": "sha512-61tiqWCYvMKP7fCTXy0M4VE6uNIwA0qvgFoiDubgfj7uqJ0fdHJFQNnVPGrxhLWlwz0uBPWrQlBH7r8y9vFITQ==", - "dev": true - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "node_modules/@commitlint/load": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.6.7.tgz", + "integrity": "sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==", "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.6.7", + "@commitlint/types": "^17.4.4", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + }, + "engines": { + "node": ">=v14" } }, - "@hapi/vise": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-3.1.1.tgz", - "integrity": "sha512-OXarbiCSadvtg+bSdVPqu31Z1JoBL+FwNYz3cYoBKQ5xq1/Cr4A3IkGpAZbAuxU5y4NL5pZFZG3d2a3ZGm/dOQ==", + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@hapi/hoek": "8.x.x" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@hapi/wreck": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-15.1.0.tgz", - "integrity": "sha512-tQczYRTTeYBmvhsek/D49En/5khcShaBEmzrAaDjMrFXKJRuF8xA8+tlq1ETLBFwGd6Do6g2OC74rt11kzawzg==", + "node_modules/@commitlint/load/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@hapi/boom": "7.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@commitlint/load/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" } }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "engines": { + "node": ">=v14.21.3" }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/@commitlint/load/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/load/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "node_modules/@commitlint/load/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" + "engines": { + "node": ">=4" } }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "node_modules/@commitlint/load/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "node_modules/@commitlint/load/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "engines": { + "node": ">=8" } }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "node_modules/@commitlint/load/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "node_modules/@commitlint/load/node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "engines": { + "node": ">=14.17" } }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "node_modules/@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "engines": { + "node": ">=v14" } }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "node_modules/@commitlint/parse": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.6.7.tgz", + "integrity": "sha512-ibO03BgEns+JJpohpBZYD49mCdSNMg6fTv7vA5yqzEFWkBQk5NWhEBw2yG+Z1UClStIRkMkAYyI2HzoQG9tCQQ==", "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" + "dependencies": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" } }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "node_modules/@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" } }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "node_modules/@commitlint/read/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "node_modules/@commitlint/read/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "requires": { - "debug": "^4.1.1" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true + "node_modules/@commitlint/read/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "node_modules/@commitlint/resolve-extends": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", + "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" } }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@commitlint/resolve-extends/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "node_modules/@commitlint/resolve-extends/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "engines": { + "node": ">=8" } }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true + "node_modules/@commitlint/rules": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.7.tgz", + "integrity": "sha512-x/SDwDTN3w3Gr5xkhrIORu96rlKCc8ZLYEMXRqi9+MB33st2mKcGvKa5uJuigHlbl3xm75bAAubATrodVrjguQ==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.6.7", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true + "node_modules/@commitlint/rules/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true + "node_modules/@commitlint/rules/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true + "node_modules/@commitlint/rules/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "node_modules/@commitlint/rules/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "engines": { + "node": ">=10.17.0" } }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true + "node_modules/@commitlint/rules/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true + "node_modules/@commitlint/rules/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true + "node_modules/@commitlint/rules/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true + "node_modules/@commitlint/rules/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true + "node_modules/@commitlint/rules/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "@serverless/cli": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@serverless/cli/-/cli-1.6.0.tgz", - "integrity": "sha512-1Muw/KhS4sZ6+ZrXBdmVY9zAwZh03lF7v1DKtaZ0cmxjqQBwPLoO40rOGXlxR97pyufe2NS6rD/p+ri8NGqeXg==", - "dev": true, - "requires": { - "@serverless/core": "^1.1.2", - "@serverless/template": "^1.1.3", - "@serverless/utils": "^1.2.0", - "ansi-escapes": "^4.3.1", - "chalk": "^2.4.2", - "chokidar": "^3.4.1", - "dotenv": "^8.2.0", - "figures": "^3.2.0", - "minimist": "^1.2.5", - "prettyoutput": "^1.2.0", - "strip-ansi": "^6.0.1" + "node_modules/@commitlint/rules/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, "dependencies": { - "@serverless/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-aI/cpGVUhWbJUR8QDMtPue28EU4ViG/L4/XKuZDfAN2uNQv3NRjwEFIBi/cxyfQnMTYVtMLe9wDjuwzOT4ENzA==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "lodash": "^4.17.15", - "rc": "^1.2.8", - "type": "^2.0.0", - "uuid": "^3.4.0", - "write-file-atomic": "^2.4.3" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" } }, - "@serverless/component-metrics": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@serverless/component-metrics/-/component-metrics-1.0.8.tgz", - "integrity": "sha512-lOUyRopNTKJYVEU9T6stp2irwlTDsYMmUKBOUjnMcwGveuUfIJqrCOtFLtIPPj3XJlbZy5F68l4KP9rZ8Ipang==", + "node_modules/@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, - "requires": { - "node-fetch": "^2.6.0", - "shortid": "^2.2.14" + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" } }, - "@serverless/core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@serverless/core/-/core-1.1.2.tgz", - "integrity": "sha512-PY7gH+7aQ+MltcUD7SRDuQODJ9Sav9HhFJsgOiyf8IVo7XVD6FxZIsSnpMI6paSkptOB7n+0Jz03gNlEkKetQQ==", + "node_modules/@commitlint/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "fs-extra": "^7.0.1", - "js-yaml": "^3.13.1", - "package-json": "^6.3.0", - "ramda": "^0.26.1", - "semver": "^6.1.1" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@serverless/dashboard-plugin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@serverless/dashboard-plugin/-/dashboard-plugin-5.3.0.tgz", - "integrity": "sha512-JOtFIVLHyeTAtdoK2gFEAAMNsGemszQr6rwhTOg0bV6pgeLmfufL4nz9rAtSj5m2oZnVnH46+P1aVZlwUXNThQ==", + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "@serverless/event-mocks": "^1.1.1", - "@serverless/platform-client": "^4.2.3", - "@serverless/utils": "^5.2.0", - "chalk": "^4.1.1", - "child-process-ext": "^2.1.1", - "chokidar": "^3.5.1", - "cli-color": "^2.0.0", - "flat": "^5.0.2", - "fs-extra": "^9.1.0", - "js-yaml": "^4.1.0", - "jszip": "^3.6.0", - "lodash": "^4.17.21", - "memoizee": "^0.4.15", - "ncjsm": "^4.2.0", - "node-dir": "^0.1.17", - "node-fetch": "^2.6.1", - "open": "^7.4.2", - "semver": "^7.3.5", - "simple-git": "^2.39.0", - "uuid": "^8.3.2", - "yamljs": "^0.3.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@serverless/event-mocks": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@serverless/event-mocks/-/event-mocks-1.1.1.tgz", - "integrity": "sha512-YAV5V/y+XIOfd+HEVeXfPWZb8C6QLruFk9tBivoX2roQLWVq145s4uxf8D0QioCueuRzkukHUS4JIj+KVoS34A==", + "node_modules/@commitlint/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@commitlint/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "@types/lodash": "^4.14.123", - "lodash": "^4.17.11" + "engines": { + "node": ">=8" } }, - "@serverless/platform-client": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-4.2.3.tgz", - "integrity": "sha512-dyELLbrf/9+O+sjuIL7ymlH8zwCOsG+tf2TjeEjXooVSvNqUoZ4ZadENjxInUV841l0ddwkihwzH/54Yw+/qkg==", + "node_modules/@commitlint/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "adm-zip": "^0.4.13", - "archiver": "^5.3.0", - "axios": "^0.21.1", - "fast-glob": "^3.2.5", - "https-proxy-agent": "^5.0.0", - "ignore": "^5.1.8", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^3.13.1", - "jwt-decode": "^2.2.0", - "minimatch": "^3.0.4", - "querystring": "^0.2.1", - "run-parallel-limit": "^1.1.0", - "throat": "^5.0.0", - "traverse": "^0.6.6", - "ws": "^7.4.6" - }, "dependencies": { - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true - }, - "querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "@serverless/template": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@serverless/template/-/template-1.1.4.tgz", - "integrity": "sha512-LYC+RmSD4ozStdCxSHInpVWP8h+0sSa0lmPGjAb1Fw4Ppk+LCJqJTrohbhHmF2ixgaIBu6ceNtVTB4qM+2NvIA==", - "dev": true, - "requires": { - "@serverless/component-metrics": "^1.0.8", - "@serverless/core": "^1.1.2", - "graphlib": "^2.1.8", - "ramda": "^0.26.1", - "traverse": "^0.6.6" + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "@serverless/utils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-5.2.0.tgz", - "integrity": "sha512-QXBZO0W2da0AtROpg8H1c4YWMSl56+nef0Kukd+40Q4jEaY3a0dtpVzvGps3aLFDXer3kWZ3LtlhS5HGXLficw==", + "node_modules/@hapi/accept": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-3.2.4.tgz", + "integrity": "sha512-soThGB+QMgfxlh0Vzhzlf3ZOEOPk5biEwcOXhkF0Eedqx8VnhGiggL9UYHrIsOb1rUg3Be3K8kp0iDL2wbVSOQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "archive-type": "^4.0.0", - "chalk": "^4.1.1", - "ci-info": "^3.2.0", - "content-disposition": "^0.5.3", - "decompress": "^4.2.1", - "ext-name": "^5.0.0", - "file-type": "^16.4.0", - "filenamify": "^4.3.0", - "get-stream": "^6.0.1", - "got": "^11.8.2", - "inquirer": "^7.3.3", - "js-yaml": "^4.1.0", - "jwt-decode": "^3.1.2", - "lodash": "^4.17.21", - "make-dir": "^3.1.0", - "ncjsm": "^4.2.0", - "p-event": "^4.2.0", - "type": "^2.5.0", - "uuid": "^8.3.2", - "write-file-atomic": "^3.0.3" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - } + "@hapi/boom": "7.x.x", + "@hapi/hoek": "8.x.x" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'", "dev": true }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@hapi/ammo": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@hapi/ammo/-/ammo-3.1.2.tgz", + "integrity": "sha512-ej9OtFmiZv1qr45g1bxEZNGyaR4jRpyMxU6VhbxjaYThymvOwsyIsUKMZnP5Qw2tfYFuwqCJuIBHGpeIbdX9gQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "type-detect": "4.0.8" + "dependencies": { + "@hapi/hoek": "8.x.x" } }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "node_modules/@hapi/b64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-4.2.1.tgz", + "integrity": "sha512-zqHpQuH5CBMw6hADzKfU/IGNrxq1Q+/wTYV+OiZRQN9F3tMyk+9BUMeBvFRMamduuqL8iSp62QAnJ+7ATiYLWA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" + "dependencies": { + "@hapi/hoek": "8.x.x" } }, - "@sinonjs/formatio": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", - "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "node_modules/@hapi/boom": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-7.4.11.tgz", + "integrity": "sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" + "dependencies": { + "@hapi/hoek": "8.x.x" } }, - "@sinonjs/samsam": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", - "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "node_modules/@hapi/bounce": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-1.3.2.tgz", + "integrity": "sha512-3bnb1AlcEByFZnpDIidxQyw1Gds81z/1rSqlx4bIEE+wUN0ATj0D49B5cE1wGocy90Rp/de4tv7GjsKd5RQeew==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@sinonjs/commons": "^1.3.0", - "array-from": "^2.1.1", - "lodash": "^4.17.15" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/hoek": "^8.3.1" } }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "node_modules/@hapi/call": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@hapi/call/-/call-5.1.3.tgz", + "integrity": "sha512-5DfWpMk7qZiYhvBhM5oUiT4GQ/O8a2rFR121/PdwA/eZ2C1EsuD547ZggMKAR5bZ+FtxOf0fdM20zzcXzq2mZA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/archiver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.1.0.tgz", - "integrity": "sha512-baFOhanb/hxmcOd1Uey2TfFg43kTSmM6py1Eo7Rjbv/ivcl7PXLhY0QgXGf50Hx/eskGCFqPfhs/7IZLb15C5g==", - "requires": { - "@types/glob": "*" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/hoek": "8.x.x" } }, - "@types/aws-lambda": { - "version": "8.10.34", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.34.tgz", - "integrity": "sha512-ewsBa0SjQYywUpDwck+4n89T0pXcRtIfIXi0aK/3qIQJNBoGvX7AKqFya9FWKdoG7ZcK3Iarl4QjlJiAW7jgPg==" - }, - "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "node_modules/@hapi/catbox": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@hapi/catbox/-/catbox-10.2.3.tgz", + "integrity": "sha512-kN9hXO4NYyOHW09CXiuj5qW1syc/0XeVOBsNNk0Tz89wWNQE5h21WF+VsfAw3uFR8swn/Wj3YEVBnWqo82m/JQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/joi": "16.x.x", + "@hapi/podium": "3.x.x" } }, - "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "node_modules/@hapi/catbox-memory": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-4.1.1.tgz", + "integrity": "sha512-T6Hdy8DExzG0jY7C8yYWZB4XHfc0v+p1EGkwxl2HoaPYAmW7I3E59M/IvmSVpis8RPcIoBp41ZpO2aZPBpM2Ww==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@babel/types": "^7.0.0" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/hoek": "8.x.x" } }, - "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "node_modules/@hapi/content": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@hapi/content/-/content-4.1.1.tgz", + "integrity": "sha512-3TWvmwpVPxFSF3KBjKZ8yDqIKKZZIm7VurDSweYpXYENZrJH3C1hd1+qEQW9wQaUaI76pPBLGrXl6I3B7i3ipA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "dependencies": { + "@hapi/boom": "7.x.x" } }, - "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "node_modules/@hapi/cryptiles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-4.2.1.tgz", + "integrity": "sha512-XoqgKsHK0l/VpqPs+tr6j6vE+VQ3+2bkF2stvttmc7xAOf1oSAwHcJ0tlp/6MxMysktt1IEY0Csy3khKaP9/uQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@babel/types": "^7.3.0" + "dependencies": { + "@hapi/boom": "7.x.x" } }, - "@types/bluebird": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.33.tgz", - "integrity": "sha512-ndEo1xvnYeHxm7I/5sF6tBvnsA4Tdi3zj1keRKRs12SP+2ye2A27NDJ1B6PqkfMbGAcT+mqQVqbZRIrhfOp5PQ==", + "node_modules/@hapi/file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@hapi/file/-/file-1.0.0.tgz", + "integrity": "sha512-Bsfp/+1Gyf70eGtnIgmScvrH8sSypO3TcK3Zf0QdHnzn/ACnAkI6KLtGACmNRPEzzIy+W7aJX5E+1fc9GwIABQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } + "node_modules/@hapi/formula": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", + "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", + "deprecated": "Moved to 'npm install @sideway/formula'", + "dev": true }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "node_modules/@hapi/h2o2": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@hapi/h2o2/-/h2o2-8.3.2.tgz", + "integrity": "sha512-2WkZq+QAkvYHWGqnUuG0stcVeGyv9T7bopBYnCJSUEuvBZlUf2BTX2JCVSKxsnTLOxCYwoC/aI4Rr0ZSRd2oVg==", "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/joi": "16.x.x", + "@hapi/wreck": "15.x.x" } }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", - "dev": true - }, - "@types/connect": { - "version": "3.4.34", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", - "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", - "requires": { - "@types/node": "*" + "node_modules/@hapi/hapi": { + "version": "18.4.1", + "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-18.4.1.tgz", + "integrity": "sha512-9HjVGa0Z4Qv9jk9AVoUdJMQLA+KuZ+liKWyEEkVBx3e3H1F0JM6aGbPkY9jRfwsITBWGBU2iXazn65SFKSi/tg==", + "deprecated": "This version contains severe security issues and defects and should not be used! Please upgrade to the latest version of @hapi/hapi or consider a commercial license (https://github.com/hapijs/hapi/issues/4114)", + "dev": true, + "dependencies": { + "@hapi/accept": "^3.2.4", + "@hapi/ammo": "^3.1.2", + "@hapi/boom": "7.x.x", + "@hapi/bounce": "1.x.x", + "@hapi/call": "^5.1.3", + "@hapi/catbox": "10.x.x", + "@hapi/catbox-memory": "4.x.x", + "@hapi/heavy": "6.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/joi": "15.x.x", + "@hapi/mimos": "4.x.x", + "@hapi/podium": "3.x.x", + "@hapi/shot": "4.x.x", + "@hapi/somever": "2.x.x", + "@hapi/statehood": "6.x.x", + "@hapi/subtext": "^6.1.3", + "@hapi/teamwork": "3.x.x", + "@hapi/topo": "3.x.x" } }, - "@types/continuation-local-storage": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.3.tgz", - "integrity": "sha512-4LYeWblV+6puK9tFGM7Zr4OLZkVXmaL7hUK6/wHwbfwM+q7v+HZyBWTXkNOiC9GqOxv7ehhi5TMCbebZWeVYtw==", - "requires": { - "@types/node": "*" + "node_modules/@hapi/hapi/node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" } }, - "@types/dockerode": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.2.3.tgz", - "integrity": "sha512-nZRhpSxm3PYianRBcRExcHxDvEzYHUPfGCnRL5Fe4/fSEZbtxrRNJ7okzCans3lXxj2t298EynFHGTnTC2f1Iw==", - "requires": { - "@types/node": "*" - }, + "node_modules/@hapi/heavy": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@hapi/heavy/-/heavy-6.2.2.tgz", + "integrity": "sha512-PY1dCCO6dsze7RlafIRhTaGeyTgVe49A/lSkxbhKGjQ7x46o/OFf7hLiRqTCDh3atcEKf6362EaB3+kTUbCsVA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, "dependencies": { - "@types/node": { - "version": "14.14.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", - "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" - } + "@hapi/boom": "7.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/joi": "16.x.x" } }, - "@types/express": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", - "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/iron": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-5.1.4.tgz", + "integrity": "sha512-+ElC+OCiwWLjlJBmm8ZEWjlfzTMQTdgPnU/TsoU5QsktspIWmWi9IU4kU83nH+X/SSya8TP8h8P11Wr5L7dkQQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/b64": "4.x.x", + "@hapi/boom": "7.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/cryptiles": "4.x.x", + "@hapi/hoek": "8.x.x" } }, - "@types/express-serve-static-core": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.20.tgz", - "integrity": "sha512-8qqFN4W53IEWa9bdmuVrUcVkFemQWnt5DKPQ/oa8xKDYgtjCr2OO6NX5TIK49NLFr3mPYU2cLh92DQquC3oWWQ==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "node_modules/@hapi/joi": { + "version": "16.1.8", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", + "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "^2.1.2", + "@hapi/formula": "^1.2.0", + "@hapi/hoek": "^8.2.4", + "@hapi/pinpoint": "^1.0.2", + "@hapi/topo": "^3.1.3" } }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - }, + "node_modules/@hapi/mimos": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@hapi/mimos/-/mimos-4.1.1.tgz", + "integrity": "sha512-CXoi/zfcTWfKYX756eEea8rXJRIb9sR4d7VwyAH9d3BkDyNgAesZxvqIdm55npQc6S9mU3FExinMAQVlIkz0eA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, "dependencies": { - "@types/node": { - "version": "14.14.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", - "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" - } + "@hapi/hoek": "8.x.x", + "mime-db": "1.x.x" } }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/@hapi/nigel": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-3.1.1.tgz", + "integrity": "sha512-R9YWx4S8yu0gcCBrMUDCiEFm1SQT895dMlYoeNBp8I6YhF1BFF1iYPueKA2Kkp9BvyHdjmvrxCOns7GMmpl+Fw==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@types/node": "*" + "dependencies": { + "@hapi/hoek": "8.x.x", + "@hapi/vise": "3.x.x" } }, - "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", - "dev": true + "node_modules/@hapi/pez": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-4.1.2.tgz", + "integrity": "sha512-8zSdJ8cZrJLFldTgwjU9Fb1JebID+aBCrCsycgqKYe0OZtM2r3Yv3aAwW5z97VsZWCROC1Vx6Mdn4rujh5Ktcg==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/b64": "4.x.x", + "@hapi/boom": "7.x.x", + "@hapi/content": "^4.1.1", + "@hapi/hoek": "8.x.x", + "@hapi/nigel": "3.x.x" + } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "node_modules/@hapi/pinpoint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", + "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", + "deprecated": "Moved to 'npm install @sideway/pinpoint'", "dev": true }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "node_modules/@hapi/podium": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@hapi/podium/-/podium-3.4.3.tgz", + "integrity": "sha512-QJlnYLEYZWlKQ9fSOtuUcpANyoVGwT68GA9P0iQQCAetBK0fI+nbRBt58+aMixoifczWZUthuGkNjqKxgPh/CQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" + "dependencies": { + "@hapi/hoek": "8.x.x", + "@hapi/joi": "16.x.x" } }, - "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "node_modules/@hapi/shot": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@hapi/shot/-/shot-4.1.2.tgz", + "integrity": "sha512-6LeHLjvsq/bQ0R+fhEyr7mqExRGguNTrxFZf5DyKe3CK6pNabiGgYO4JVFaRrLZ3JyuhkS0fo8iiRE2Ql2oA/A==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" + "dependencies": { + "@hapi/hoek": "8.x.x", + "@hapi/joi": "16.x.x" } }, - "@types/jest": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.0.tgz", - "integrity": "sha512-/yeMsH9HQ1RLORlXAwoLXe8S98xxvhNtUz3yrgrwbaxYjT+6SFPZZRksmRKRA6L5vsUtSHeN71viDOTTyYAD+g==", + "node_modules/@hapi/somever": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@hapi/somever/-/somever-2.1.1.tgz", + "integrity": "sha512-cic5Sto4KGd9B0oQSdKTokju+rYhCbdpzbMb0EBnrH5Oc1z048hY8PaZ1lx2vBD7I/XIfTQVQetBH57fU51XRA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "jest-diff": "^25.2.1", - "pretty-format": "^25.2.1" - }, "dependencies": { - "@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-diff": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", - "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.5.0" - } - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "requires": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@hapi/bounce": "1.x.x", + "@hapi/hoek": "8.x.x" } }, - "@types/jest-plugin-context": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/jest-plugin-context/-/jest-plugin-context-2.9.2.tgz", - "integrity": "sha512-r8bN9AFdaoaKl1x1IVGC2nsek8KJpQB4FUZjPBSfs6vyHhmdylgJ9qBCydCyRaqmWPB9/5tm4ypl8qvYdWnr1w==", + "node_modules/@hapi/statehood": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-6.1.2.tgz", + "integrity": "sha512-pYXw1x6npz/UfmtcpUhuMvdK5kuOGTKcJNfLqdNptzietK2UZH5RzNJSlv5bDHeSmordFM3kGItcuQWX2lj2nQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@types/jest": "*" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/bounce": "1.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/cryptiles": "4.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/iron": "5.x.x", + "@hapi/joi": "16.x.x" } }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "node_modules/@hapi/subtext": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-6.1.3.tgz", + "integrity": "sha512-qWN6NbiHNzohVcJMeAlpku/vzbyH4zIpnnMPMPioQMwIxbPFKeNViDCNI6fVBbMPBiw/xB4FjqiJkRG5P9eWWg==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/lambda-tester": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@types/lambda-tester/-/lambda-tester-3.6.0.tgz", - "integrity": "sha512-gWzruHlQKeOoIyvV9CY71zV0btifW2I1sxGXHuDS+Py9jQJG3j6beYrNUzEU5DsU/JDhzV3Cw2q7UHaMYfhbqA==", - "requires": { - "@types/aws-lambda": "*" + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/content": "^4.1.1", + "@hapi/file": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/pez": "^4.1.2", + "@hapi/wreck": "15.x.x" } }, - "@types/lodash": { - "version": "4.14.170", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", - "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", + "node_modules/@hapi/teamwork": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@hapi/teamwork/-/teamwork-3.3.1.tgz", + "integrity": "sha512-61tiqWCYvMKP7fCTXy0M4VE6uNIwA0qvgFoiDubgfj7uqJ0fdHJFQNnVPGrxhLWlwz0uBPWrQlBH7r8y9vFITQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", "dev": true }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==" + "node_modules/@hapi/vise": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-3.1.1.tgz", + "integrity": "sha512-OXarbiCSadvtg+bSdVPqu31Z1JoBL+FwNYz3cYoBKQ5xq1/Cr4A3IkGpAZbAuxU5y4NL5pZFZG3d2a3ZGm/dOQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "8.x.x" + } }, - "@types/mysql": { - "version": "2.15.18", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.18.tgz", - "integrity": "sha512-JW74Nh3P/RDAnaP8uXe1qmRpoFBO84SiWvWoSju/F5+2S1kVBi1FbbDoqK/sTZrCCxySaOJnRATvWD+bLcJjAg==", - "requires": { - "@types/node": "*" + "node_modules/@hapi/wreck": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-15.1.0.tgz", + "integrity": "sha512-tQczYRTTeYBmvhsek/D49En/5khcShaBEmzrAaDjMrFXKJRuF8xA8+tlq1ETLBFwGd6Do6g2OC74rt11kzawzg==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/boom": "7.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x" } }, - "@types/node": { - "version": "12.20.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", - "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/pg": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.0.tgz", - "integrity": "sha512-3JXFrsl8COoqVB1+2Pqelx6soaiFVXzkT3fkuSNe7GB40ysfT0FHphZFPiqIXpMyTHSFRdLTyZzrFBrJRPAArA==", - "requires": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "@types/readable-stream": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.10.tgz", - "integrity": "sha512-xwSXvAv9x4B9Vj88AMZnFyEVLilz1EBxKvRUhGqIF4nJpRQBSTm7jS236X4Y9Y2qPsVvaMxwrGJlNhLHEahlFQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "@types/node": "*", - "safe-buffer": "*" + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "@types/request": { - "version": "2.48.5", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", - "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "@types/request-promise": { - "version": "4.1.44", - "resolved": "https://registry.npmjs.org/@types/request-promise/-/request-promise-4.1.44.tgz", - "integrity": "sha512-RId7eFsUKxfal1LirDDIcOp9u3MM3NXFDBcC3sqIMcmu7f4U6DsCEMD8RbLZtnPrQlN5Jc79di/WPsIEDO4keg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "requires": { - "@types/bluebird": "*", - "@types/request": "*" + "engines": { + "node": ">=6" } }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "requires": { - "@types/node": "*" + "engines": { + "node": ">=8" } }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "@types/serve-static": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", - "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "@types/sinon": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.0.tgz", - "integrity": "sha512-NyzhuSBy97B/zE58cDw4NyGvByQbAHNP9069KVSgnXt/sc0T6MFRh0InKAeBVHJWdSXG1S3+PxgVIgKo9mTHbw==", - "dev": true + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "@types/ssh2-streams": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.8.tgz", - "integrity": "sha512-I7gixRPUvVIyJuCEvnmhr3KvA2dC0639kKswqD4H5b4/FOcnPtNU+qWLiXdKIqqX9twUvi5j0U1mwKE5CUsrfA==", - "requires": { - "@types/node": "*" + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "@types/node": { - "version": "14.14.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", - "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "@types/tough-cookie": { + "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", - "dev": true - }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", - "dev": true - }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "@types/yargs-parser": "*" + "engines": { + "node": ">=8" } }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "adm-zip": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.5.tgz", - "integrity": "sha512-IWwXKnCbirdbyXSfUDvCCrmYrOHANRZcc8NcRrvTlIApdl7PwE9oGcsYvNeJPAVY1M+70b4PxXGKIf8AEuiQ6w==", - "dev": true + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true + "node_modules/@jest/core/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "debug": "4" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "node_modules/@jest/core/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { - "string-width": "^3.0.0" - }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" + "node_modules/@jest/core/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/@jest/core/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" } }, - "app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", - "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "node_modules/@jest/core/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { - "file-type": "^4.2.0" - }, "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", - "dev": true - } + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, "dependencies": { - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - } + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - } + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" - }, - "async-listener": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", - "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", - "requires": { - "semver": "^5.3.0", - "shimmer": "^1.1.0" + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "atomic-batcher": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", - "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" - }, - "audit-filter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/audit-filter/-/audit-filter-0.5.0.tgz", - "integrity": "sha512-YXcxWFWrXfKIzyBbi+8tFz5ApE0ASQWyB4Qu2Lj55+ni7kvIWeaqQlg5EphxKwqLFuebsfW+TGEwg2ywq0laPA==", + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "docopt": "^0.6.2" + "engines": { + "node": ">=8" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "aws-lambda": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/aws-lambda/-/aws-lambda-1.0.6.tgz", - "integrity": "sha512-Z9lmZBiDYejzjMWuQSDXuZWAqAun6vGt7WApB1r0f8tLNf0IlTGsH30qENfP1kXeTbbMgPpt1bPEeMZjYDTXxQ==", - "requires": { - "aws-sdk": "*", - "commander": "^3.0.2", - "js-yaml": "^3.13.1", - "watchpack": "^2.0.0-beta.10" - }, - "dependencies": { - "commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - } + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "aws-lambda-mock-context": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/aws-lambda-mock-context/-/aws-lambda-mock-context-3.2.1.tgz", - "integrity": "sha512-mBqUustp9Q6yfa7w0L8UT8XJVTlIaeZTtxhvRQEEM3uhZwzQ1/l1NNN9i4F+O6CbYEOu9jDODLMCymV/J7pSYA==", + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "moment": "^2.10.5", - "pinkie-defer": "^1.0.0", - "uuid": "^3.0.1" - }, "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "aws-sdk": { - "version": "2.1281.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1281.0.tgz", - "integrity": "sha512-nrDezd78ebYSI58iGTxNR5j6l/beYAGO0pAPMITg/Ili6SUCIGL3359fv2gxhVOI2NIwOsKs5/Mjr83+6G+zCQ==", - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.16.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "util": "^0.12.4", - "uuid": "8.0.0", - "xml2js": "0.4.19" - }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dev": true, "dependencies": { - "jmespath": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", - "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" - }, - "uuid": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", - "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" - } - } - }, - "aws-xray-sdk": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk/-/aws-xray-sdk-2.5.0.tgz", - "integrity": "sha512-KBTF9QUq0zu24t+gFh3VATYDNx295VzZUUjpZ1OmIEbcs3Zqmox5L6VAqjCgGfJeLaCUAWPLkduxau3LuDpqcw==", - "requires": { - "aws-xray-sdk-core": "^2.5.0", - "aws-xray-sdk-express": "^2.5.0", - "aws-xray-sdk-mysql": "^2.5.0", - "aws-xray-sdk-postgres": "^2.5.0", - "pkginfo": "^0.4.0" - } - }, - "aws-xray-sdk-core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-2.5.0.tgz", - "integrity": "sha512-qe60bv0kn5KY6gAIF88TPCOIdu/A3dTmcKISj+kE4OH02eF6kMm1ctL7OgoBAasnsDNSn0VMLhIaA1izgoWuxA==", - "requires": { - "@types/continuation-local-storage": "*", - "atomic-batcher": "^1.0.2", - "aws-sdk": "^2.304.0", - "continuation-local-storage": "^3.2.0", - "date-fns": "^1.29.0", - "pkginfo": "^0.4.0", - "semver": "^5.3.0", - "winston": "^2.4.4" + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" }, - "dependencies": { - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" - } + "engines": { + "node": ">= 10.14.2" } }, - "aws-xray-sdk-express": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-express/-/aws-xray-sdk-express-2.5.0.tgz", - "integrity": "sha512-VfUXlxFlI+gr6ImMF+3000fqPRTBS9MbAywdtC8dt/U57WQbLFDjPW+V6oJowTwrkgKwpOKSXncQDfBs8QHvIw==", - "requires": { - "@types/express": "*" + "node_modules/@jest/source-map/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" } }, - "aws-xray-sdk-mysql": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-mysql/-/aws-xray-sdk-mysql-2.5.0.tgz", - "integrity": "sha512-OI3cDkVcKTiWytwoOE1Oj0D2UbchOVHkiQNXWktDk9QYzqbOz+GNEwD5QneqyxFu0z0bQieClBM+0okUprFBXQ==", - "requires": { - "@types/mysql": "*" + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "aws-xray-sdk-postgres": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-postgres/-/aws-xray-sdk-postgres-2.5.0.tgz", - "integrity": "sha512-8LcXTjr272gKMSg9a+QSGQPjAabQb87SA0c4ZlVcPqzoG7nAd3pULR6/HDtujeukbRAb6rEoxzKvPX0s18NyFw==", - "requires": { - "@types/pg": "*" + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" } }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", "dev": true, - "requires": { - "follow-redirects": "^1.14.0" + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" } }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", "dev": true, - "requires": { - "@jest/transform": "^26.6.2", + "dependencies": { + "@babel/core": "^7.1.0", "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "slash": "^3.0.0" + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">= 10.14.2" } }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "node_modules/@jest/transform/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "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==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "node_modules/@jest/transform/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "node_modules/@jest/transform/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" + "node_modules/@jest/transform/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" } }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "engines": { + "node": ">=0.10.0" } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "node_modules/@jest/transform/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "bl": { + "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "dev": true + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "debug": "^4.1.1" } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "dev": true }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" } }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "requires": { - "node-int64": "^0.4.0" + "engines": { + "node": ">= 8" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "node_modules/@serverless/dashboard-plugin": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@serverless/dashboard-plugin/-/dashboard-plugin-6.2.3.tgz", + "integrity": "sha512-iTZhpZbiVl6G2AyfgoqxemqqpG4pUceWys3GsyZtjimnfnGd2UFBOMVUMTavLhYia7lQc4kQVuXQ+afLlkg+pQ==", "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "dependencies": { + "@serverless/event-mocks": "^1.1.1", + "@serverless/platform-client": "^4.3.2", + "@serverless/utils": "^6.8.2", + "child-process-ext": "^2.1.1", + "chokidar": "^3.5.3", + "flat": "^5.0.2", + "fs-extra": "^9.1.0", + "js-yaml": "^4.1.0", + "jszip": "^3.10.1", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "ncjsm": "^4.3.2", + "node-dir": "^0.1.17", + "node-fetch": "^2.6.8", + "open": "^7.4.2", + "semver": "^7.3.8", + "simple-git": "^3.16.0", + "type": "^2.7.2", + "uuid": "^8.3.2", + "yamljs": "^0.3.0" + }, + "engines": { + "node": ">=12.0" } }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "node_modules/@serverless/dashboard-plugin/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffermaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.1.tgz", - "integrity": "sha512-IdnyU2jDHU65U63JuVQNTHiWjPRH0CS3aYd/WPaEwyX84rFdukhOduAVb1jwUScmb5X0JWPw8NZOrhoLMiyAHQ==", + "node_modules/@serverless/dashboard-plugin/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "long": "1.1.2" - }, "dependencies": { - "long": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz", - "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=", - "dev": true - } + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true - }, - "buildcheck": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", - "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", - "optional": true - }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "node_modules/@serverless/dashboard-plugin/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "node_modules/@serverless/dashboard-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "node_modules/@serverless/event-mocks": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@serverless/event-mocks/-/event-mocks-1.1.1.tgz", + "integrity": "sha512-YAV5V/y+XIOfd+HEVeXfPWZb8C6QLruFk9tBivoX2roQLWVq145s4uxf8D0QioCueuRzkukHUS4JIj+KVoS34A==", + "dev": true, + "dependencies": { + "@types/lodash": "^4.14.123", + "lodash": "^4.17.11" } }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true + "node_modules/@serverless/platform-client": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@serverless/platform-client/-/platform-client-4.3.2.tgz", + "integrity": "sha512-DAa5Z0JAZc6UfrTZLYwqoZxgAponZpFwaqd7WzzMA+loMCkYWyJNwxrAmV6cr2UUJpkko4toPZuJ3vM9Ie+NDA==", + "dev": true, + "dependencies": { + "adm-zip": "^0.5.5", + "archiver": "^5.3.0", + "axios": "^0.21.1", + "fast-glob": "^3.2.7", + "https-proxy-agent": "^5.0.0", + "ignore": "^5.1.8", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^3.14.1", + "jwt-decode": "^2.2.0", + "minimatch": "^3.0.4", + "querystring": "^0.2.1", + "run-parallel-limit": "^1.1.0", + "throat": "^5.0.0", + "traverse": "^0.6.6", + "ws": "^7.5.3" + }, + "engines": { + "node": ">=10.0" + } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "node_modules/@serverless/platform-client/node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, - "requires": { - "callsites": "^2.0.0" + "engines": { + "node": ">=0.4.x" } }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "node_modules/@serverless/utils": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-6.13.1.tgz", + "integrity": "sha512-yokWzlsIaAd3TWzNgIDz6l8HZmtYZs9caaLuheZ0IiZ/bDWSCLBWn84HKkdWZOmFnYxejyPNJEOwE59mtSR3Ow==", "dev": true, - "requires": { - "caller-callsite": "^2.0.0" + "dependencies": { + "archive-type": "^4.0.0", + "chalk": "^4.1.2", + "ci-info": "^3.8.0", + "cli-progress-footer": "^2.3.2", + "content-disposition": "^0.5.4", + "d": "^1.0.1", + "decompress": "^4.2.1", + "event-emitter": "^0.3.5", + "ext": "^1.7.0", + "ext-name": "^5.0.0", + "file-type": "^16.5.4", + "filenamify": "^4.3.0", + "get-stream": "^6.0.1", + "got": "^11.8.6", + "inquirer": "^8.2.5", + "js-yaml": "^4.1.0", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "log": "^6.3.1", + "log-node": "^8.0.3", + "make-dir": "^4.0.0", + "memoizee": "^0.4.15", + "ms": "^2.1.3", + "ncjsm": "^4.3.2", + "node-fetch": "^2.6.11", + "open": "^8.4.2", + "p-event": "^4.2.0", + "supports-color": "^8.1.1", + "timers-ext": "^0.1.7", + "type": "^2.7.2", + "uni-global": "^1.0.0", + "uuid": "^8.3.2", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": ">=12.0" } }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, + "node_modules/@serverless/utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "caniuse-lite": { - "version": "1.0.30001235", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", - "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", + "node_modules/@serverless/utils/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "node_modules/@serverless/utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { - "rsvp": "^4.8.4" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "node_modules/@serverless/utils/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - }, "dependencies": { - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@serverless/utils/node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" } + ], + "engines": { + "node": ">=8" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "node_modules/@serverless/utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/@serverless/utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "node_modules/@serverless/utils/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "child-process-ext": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.1.tgz", - "integrity": "sha512-0UQ55f51JBkOFa+fvR76ywRzxiPwQS3Xe8oe5bZRphpv+dIMeerW5Zn5e4cUy4COJwVtJyU0R79RMnw+aCqmGA==", + "node_modules/@serverless/utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "cross-spawn": "^6.0.5", - "es5-ext": "^0.10.53", - "log": "^6.0.0", - "split2": "^3.1.1", - "stream-promise": "^3.2.0" + "engines": { + "node": ">=8" } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@serverless/utils/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "dependencies": { - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "node_modules/@serverless/utils/node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/@serverless/utils/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "node_modules/@serverless/utils/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "node_modules/@serverless/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { - "ansi-regex": "^2.1.1", - "d": "^1.0.1", - "es5-ext": "^0.10.51", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.7" - }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@serverless/utils/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "requires": { - "restore-cursor": "^3.1.0" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "node_modules/@serverless/utils/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "requires": { - "mimic-response": "^1.0.0" + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true, - "optional": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "engines": { + "node": ">=6" + } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "dependencies": { + "type-detect": "4.0.8" } }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" } }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - }, - "colorspace": { + "node_modules/@szmarczak/http-timer": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" } }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "engines": { + "node": ">= 6" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, - "commitlint": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-12.1.1.tgz", - "integrity": "sha512-mAA0n62vKBe+70dCcji3YSVJNI9zOa3yqZ5z1KtTUwiyNkVlwscZnUSjYLofwfKNGxy3HXE5CD41kOMpRdhzcw==", - "requires": { - "@commitlint/cli": "^12.1.1", - "@commitlint/types": "^12.1.1" - }, - "dependencies": { - "@commitlint/cli": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.1.1.tgz", - "integrity": "sha512-SB67/s6VJ50seoPx/Sr2gj1fMzKrx+udgarecGdr8h43ah+M2e22gjQJ7xHv5KwyPQ+6ug1YOMCL34ubT4zupQ==", - "requires": { - "@commitlint/format": "^12.1.1", - "@commitlint/lint": "^12.1.1", - "@commitlint/load": "^12.1.1", - "@commitlint/read": "^12.1.1", - "@commitlint/types": "^12.1.1", - "get-stdin": "8.0.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^16.2.0" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" - } - } - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, - "compress-commons": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", - "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" + "node_modules/@types/archiver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-5.1.0.tgz", + "integrity": "sha512-baFOhanb/hxmcOd1Uey2TfFg43kTSmM6py1Eo7Rjbv/ivcl7PXLhY0QgXGf50Hx/eskGCFqPfhs/7IZLb15C5g==", + "dependencies": { + "@types/glob": "*" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "node_modules/@types/aws-lambda": { + "version": "8.10.34", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.34.tgz", + "integrity": "sha512-ewsBa0SjQYywUpDwck+4n89T0pXcRtIfIXi0aK/3qIQJNBoGvX7AKqFya9FWKdoG7ZcK3Iarl4QjlJiAW7jgPg==" }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "node_modules/@types/babel__core": { + "version": "7.1.14", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", + "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "^0.6.0", - "emitter-listener": "^1.1.1" + "@babel/types": "^7.0.0" } }, - "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "conventional-changelog-conventionalcommits": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.0.tgz", - "integrity": "sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==", + "node_modules/@types/babel__traverse": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", + "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" + "dependencies": { + "@babel/types": "^7.3.0" } }, - "conventional-commits-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz", - "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==", - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" - }, + "node_modules/@types/bluebird": { + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.33.tgz", + "integrity": "sha512-ndEo1xvnYeHxm7I/5sF6tBvnsA4Tdi3zj1keRKRs12SP+2ye2A27NDJ1B6PqkfMbGAcT+mqQVqbZRIrhfOp5PQ==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", "dependencies": { - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - } - } + "@types/connect": "*", + "@types/node": "*" } }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "node_modules/@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "node_modules/@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dependencies": { + "@types/node": "*" + } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "node_modules/@types/continuation-local-storage": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.3.tgz", + "integrity": "sha512-4LYeWblV+6puK9tFGM7Zr4OLZkVXmaL7hUK6/wHwbfwM+q7v+HZyBWTXkNOiC9GqOxv7ehhi5TMCbebZWeVYtw==", + "dependencies": { + "@types/node": "*" + } }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, + "node_modules/@types/dockerode": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.2.3.tgz", + "integrity": "sha512-nZRhpSxm3PYianRBcRExcHxDvEzYHUPfGCnRL5Fe4/fSEZbtxrRNJ7okzCans3lXxj2t298EynFHGTnTC2f1Iw==", "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } + "@types/node": "*" } }, - "cpu-features": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", - "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", - "optional": true, - "requires": { - "buildcheck": "0.0.3", - "nan": "^2.15.0" - }, + "node_modules/@types/dockerode/node_modules/@types/node": { + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" + }, + "node_modules/@types/express": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz", + "integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==", "dependencies": { - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - } + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" + "node_modules/@types/express-serve-static-core": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.20.tgz", + "integrity": "sha512-8qqFN4W53IEWa9bdmuVrUcVkFemQWnt5DKPQ/oa8xKDYgtjCr2OO6NX5TIK49NLFr3mPYU2cLh92DQquC3oWWQ==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" } }, - "crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" } }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "node_modules/@types/glob/node_modules/@types/node": { + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" }, - "cron-parser": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", - "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, - "requires": { - "is-nan": "^1.3.0", - "moment-timezone": "^0.5.31" + "dependencies": { + "@types/node": "*" } }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "@types/istanbul-lib-coverage": "*" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "dependencies": { + "@types/istanbul-lib-report": "*" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "node_modules/@types/jest": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.0.tgz", + "integrity": "sha512-/yeMsH9HQ1RLORlXAwoLXe8S98xxvhNtUz3yrgrwbaxYjT+6SFPZZRksmRKRA6L5vsUtSHeN71viDOTTyYAD+g==", "dev": true, - "requires": { - "cssom": "~0.3.6" - }, "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" } }, - "cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", - "dev": true - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/@types/jest-plugin-context": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/jest-plugin-context/-/jest-plugin-context-2.9.2.tgz", + "integrity": "sha512-r8bN9AFdaoaKl1x1IVGC2nsek8KJpQB4FUZjPBSfs6vyHhmdylgJ9qBCydCyRaqmWPB9/5tm4ypl8qvYdWnr1w==", "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "dependencies": { + "@types/jest": "*" } }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==" - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" } }, - "date-fns": { - "version": "2.21.2", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.2.tgz", - "integrity": "sha512-FMkG7pIPx64mGIpS2LOb3Wp3O606H/hatoiz7G0oiYWai1izdM4tF1dd7QABv2NogkIDI4wxsfLLFQSuVvDHgA==" - }, - "dayjs": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.5.tgz", - "integrity": "sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==", - "dev": true - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" + "node_modules/@types/jest/node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "node_modules/@types/jest/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "node_modules/@types/jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true, - "requires": { - "mimic-response": "^1.0.0" + "engines": { + "node": ">= 8.3" } }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "node_modules/@types/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "dependencies": { - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - } + "engines": { + "node": ">=8" } }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true - } + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" } }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "dependencies": { - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", - "dev": true - } + "engines": { + "node": ">= 8.3" } }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - } + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "node_modules/@types/jest/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "deferred": { - "version": "0.7.11", - "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.11.tgz", - "integrity": "sha512-8eluCl/Blx4YOGwMapBvXRKxHXhA8ejDXYzEaK8+/gtcm8hRMhSLmXSqDmNUKNc/C8HNSmuyyp/hflhqDAvK2A==", + "node_modules/@types/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.50", - "event-emitter": "^0.3.5", - "next-tick": "^1.0.0", - "timers-ext": "^0.1.7" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, - "requires": { - "object-keys": "^1.0.12" + "dependencies": { + "@types/node": "*" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, + "node_modules/@types/lambda-tester": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@types/lambda-tester/-/lambda-tester-3.6.0.tgz", + "integrity": "sha512-gWzruHlQKeOoIyvV9CY71zV0btifW2I1sxGXHuDS+Py9jQJG3j6beYrNUzEU5DsU/JDhzV3Cw2q7UHaMYfhbqA==", "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "@types/aws-lambda": "*" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "node_modules/@types/lodash": { + "version": "4.14.196", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", + "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "dev": true, - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" + "node_modules/@types/mysql": { + "version": "2.15.18", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.18.tgz", + "integrity": "sha512-JW74Nh3P/RDAnaP8uXe1qmRpoFBO84SiWvWoSju/F5+2S1kVBi1FbbDoqK/sTZrCCxySaOJnRATvWD+bLcJjAg==", + "dependencies": { + "@types/node": "*" } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + "node_modules/@types/node": { + "version": "12.20.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.7.tgz", + "integrity": "sha512-gWL8VUkg8VRaCAUgG9WmhefMqHmMblxe2rVpMF86nZY/+ZysU+BkAp+3cz03AixWDSSz0ks5WX59yAhv/cDwFA==" }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "dijkstrajs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==", + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@types/pg": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.0.tgz", + "integrity": "sha512-3JXFrsl8COoqVB1+2Pqelx6soaiFVXzkT3fkuSNe7GB40ysfT0FHphZFPiqIXpMyTHSFRdLTyZzrFBrJRPAArA==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/prettier": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", + "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "node_modules/@types/request": { + "version": "2.48.5", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz", + "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==", "dev": true, - "requires": { - "path-type": "^4.0.0" - }, "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" } }, - "docker-compose": { - "version": "0.23.6", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.23.6.tgz", - "integrity": "sha512-y3Q8MkwG862rNqkvEQG59/7Fi2/fzs3NYDCvqUAAD+z0WGs2qcJ9hRcn34hWgWv9ouPkFqe3Vwca0h+4bIIRWw==" + "node_modules/@types/request-promise": { + "version": "4.1.44", + "resolved": "https://registry.npmjs.org/@types/request-promise/-/request-promise-4.1.44.tgz", + "integrity": "sha512-RId7eFsUKxfal1LirDDIcOp9u3MM3NXFDBcC3sqIMcmu7f4U6DsCEMD8RbLZtnPrQlN5Jc79di/WPsIEDO4keg==", + "dev": true, + "dependencies": { + "@types/bluebird": "*", + "@types/request": "*" + } }, - "dockerode": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.4.tgz", - "integrity": "sha512-3EUwuXnCU+RUlQEheDjmBE0B7q66PV9Rw5NiH1sXwINq0M9c5ERP9fxgkw36ZHOtzf4AGEEYySnkx/sACC9EgQ==", - "requires": { - "@balena/dockerignore": "^1.0.2", - "docker-modem": "^3.0.0", - "tar-fs": "~2.0.1" + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, "dependencies": { - "docker-modem": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.6.tgz", - "integrity": "sha512-h0Ow21gclbYsZ3mkHDfsYNDqtRhXS8fXr51bU0qr1dxgTMJj0XufbzX+jhNOvA8KuEEzn6JbvLVhXyv+fny9Uw==", - "requires": { - "debug": "^4.1.1", - "readable-stream": "^3.5.0", - "split-ca": "^1.0.1", - "ssh2": "^1.11.0" - } - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, - "ssh2": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", - "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", - "requires": { - "asn1": "^0.2.4", - "bcrypt-pbkdf": "^1.0.2", - "cpu-features": "~0.0.4", - "nan": "^2.16.0" - } - }, - "tar-fs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", - "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - } + "@types/node": "*" } }, - "docopt": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", - "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, + "node_modules/@types/serve-static": { + "version": "1.13.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", + "integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==", "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } + "@types/mime": "^1", + "@types/node": "*" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" + "node_modules/@types/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-NyzhuSBy97B/zE58cDw4NyGvByQbAHNP9069KVSgnXt/sc0T6MFRh0InKAeBVHJWdSXG1S3+PxgVIgKo9mTHbw==", + "dev": true + }, + "node_modules/@types/ssh2-streams": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.8.tgz", + "integrity": "sha512-I7gixRPUvVIyJuCEvnmhr3KvA2dC0639kKswqD4H5b4/FOcnPtNU+qWLiXdKIqqX9twUvi5j0U1mwKE5CUsrfA==", + "dependencies": { + "@types/node": "*" } }, - "dot-qs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dot-qs/-/dot-qs-0.2.0.tgz", - "integrity": "sha1-02UX/iS3zaYfznpQJqACSvr1pDk=", + "node_modules/@types/ssh2-streams/node_modules/@types/node": { + "version": "14.14.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", + "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, - "dotenv-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dotenv-json/-/dotenv-json-1.0.0.tgz", - "integrity": "sha512-jAssr+6r4nKhKRudQ0HOzMskOFFi9+ubXWwmrSGJFgTvpjyPXCXsCsYbjif6mXp7uxA7xY3/LGaiTQukZzSbOQ==", + "node_modules/@types/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", "dev": true }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "node_modules/@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", "dev": true }, - "duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "node_modules/@types/yargs": { + "version": "15.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", + "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", "dev": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" + "dependencies": { + "@types/yargs-parser": "*" } }, - "duration": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", - "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.46" - } + "node_modules/@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "node_modules/2-thenable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", + "integrity": "sha512-HqiDzaLDFCXkcCO/SwoyhRwqYtINFHF7t9BDRq4x90TOKNAJpiqUt9X5lQ08bwxYzc067HUywDjGySpebHcUpw==", "dev": true, - "requires": { - "safe-buffer": "^5.0.1" + "dependencies": { + "d": "1", + "es5-ext": "^0.10.47" } }, - "electron-to-chromium": { - "version": "1.3.749", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", - "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==", + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, - "emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "requires": { - "shimmer": "^1.2.0" + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, - "requires": { - "env-variable": "0.0.x" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, - "engine.io-client": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" + "bin": { + "acorn": "bin/acorn" }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "engines": { + "node": ">=0.4.0" } }, - "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "engines": { + "node": ">=0.4.0" } }, - "env-variable": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", - "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", - "dev": true + "node_modules/adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "dependencies": { + "string-width": "^3.0.0" } }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "engines": { + "node": ">=6" } }, - "es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } + "engines": { + "node": ">=4" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "esniff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", - "integrity": "sha512-vmHXOeOt7FJLsqofvFk4WB3ejvcHizCd8toXXwADmYfd02p2QwHRgkUbhYDX54y08nqk818CUTWipgZGlyN07g==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.12" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "essentials": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.1.1.tgz", - "integrity": "sha512-SmaxoAdVu86XkZQM/u6TYSu96ZlFGwhvSk1l9zAkznFuQkMb9mRDS2iq/XWDow7R8OwBwdYH8nLyDKznMD+GWw==", - "dev": true + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true + "node_modules/app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "optional": true + "node_modules/archiver-utils/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, + "node_modules/archiver/node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "sprintf-js": "~1.0.2" } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, - "requires": { - "mime-db": "^1.28.0" + "engines": { + "node": ">=0.10.0" } }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true, - "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "engines": { + "node": ">=8" } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "engines": { + "node": ">=0.10.0" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "engines": { + "node": ">=0.10.0" } }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "safer-buffer": "~2.1.0" } }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true + "node_modules/async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" }, - "fast-xml-parser": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", - "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", - "dev": true, - "requires": { - "strnum": "^1.0.5" + "node_modules/async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "dependencies": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "engines": { + "node": "<=0.11.8 || >0.11.10" } }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "requires": { - "reusify": "^1.0.4" + "engines": { + "node": ">= 4.0.0" } }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true, - "requires": { - "bser": "2.1.1" + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/atomic-batcher": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", + "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" + }, + "node_modules/audit-filter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/audit-filter/-/audit-filter-0.5.0.tgz", + "integrity": "sha512-YXcxWFWrXfKIzyBbi+8tFz5ApE0ASQWyB4Qu2Lj55+ni7kvIWeaqQlg5EphxKwqLFuebsfW+TGEwg2ywq0laPA==", "dev": true, - "requires": { - "pend": "~1.2.0" + "dependencies": { + "docopt": "^0.6.2" + }, + "bin": { + "audit-filter": "cli.js" } }, - "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==", - "dev": true + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" + "node_modules/aws-lambda": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/aws-lambda/-/aws-lambda-1.0.6.tgz", + "integrity": "sha512-Z9lmZBiDYejzjMWuQSDXuZWAqAun6vGt7WApB1r0f8tLNf0IlTGsH30qENfP1kXeTbbMgPpt1bPEeMZjYDTXxQ==", + "dependencies": { + "aws-sdk": "*", + "commander": "^3.0.2", + "js-yaml": "^3.13.1", + "watchpack": "^2.0.0-beta.10" + }, + "bin": { + "lambda": "bin/lambda" } }, - "file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "node_modules/aws-lambda-mock-context": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/aws-lambda-mock-context/-/aws-lambda-mock-context-3.2.1.tgz", + "integrity": "sha512-mBqUustp9Q6yfa7w0L8UT8XJVTlIaeZTtxhvRQEEM3uhZwzQ1/l1NNN9i4F+O6CbYEOu9jDODLMCymV/J7pSYA==", "dev": true, - "requires": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, "dependencies": { - "@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "dev": true - }, - "strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dev": true, - "requires": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - } - }, - "token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dev": true, - "requires": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - } - } + "moment": "^2.10.5", + "pinkie-defer": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "node_modules/aws-lambda-mock-context/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "optional": true + "bin": { + "uuid": "bin/uuid" + } }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "dev": true + "node_modules/aws-lambda/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, - "filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" + "node_modules/aws-sdk": { + "version": "2.1354.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1354.0.tgz", + "integrity": "sha512-3aDxvyuOqMB9DqJguCq6p8momdsz0JR1axwkWOOCzHA7a35+Bw+WLmqt3pWwRjR1tGIwkkZ2CvGJObYHsOuw3w==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "filesize": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.3.0.tgz", - "integrity": "sha512-ytx0ruGpDHKWVoiui6+BY/QMNngtDQ/pJaFwfBpQif0J63+E8DLdFyqS3NkKQn7vIruUEpoGD9JUJSg7Kp+I0g==", - "dev": true + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, + "node_modules/aws-xray-sdk": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk/-/aws-xray-sdk-2.5.0.tgz", + "integrity": "sha512-KBTF9QUq0zu24t+gFh3VATYDNx295VzZUUjpZ1OmIEbcs3Zqmox5L6VAqjCgGfJeLaCUAWPLkduxau3LuDpqcw==", "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "aws-xray-sdk-core": "^2.5.0", + "aws-xray-sdk-express": "^2.5.0", + "aws-xray-sdk-mysql": "^2.5.0", + "aws-xray-sdk-postgres": "^2.5.0", + "pkginfo": "^0.4.0" + }, + "engines": { + "node": ">= 4.x" } }, - "find-requires": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-requires/-/find-requires-1.0.0.tgz", - "integrity": "sha512-UME7hNwBfzeISSFQcBEDemEEskpOjI/shPrpJM5PI4DSdn6hX0dmz+2dL70blZER2z8tSnTRL+2rfzlYgtbBoQ==", - "dev": true, - "requires": { - "es5-ext": "^0.10.49", - "esniff": "^1.1.0" + "node_modules/aws-xray-sdk-core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-2.5.0.tgz", + "integrity": "sha512-qe60bv0kn5KY6gAIF88TPCOIdu/A3dTmcKISj+kE4OH02eF6kMm1ctL7OgoBAasnsDNSn0VMLhIaA1izgoWuxA==", + "dependencies": { + "@types/continuation-local-storage": "*", + "atomic-batcher": "^1.0.2", + "aws-sdk": "^2.304.0", + "continuation-local-storage": "^3.2.0", + "date-fns": "^1.29.0", + "pkginfo": "^0.4.0", + "semver": "^5.3.0", + "winston": "^2.4.4" + }, + "engines": { + "node": ">= 4.x" } }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true + "node_modules/aws-xray-sdk-core/node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" + "node_modules/aws-xray-sdk-express": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-express/-/aws-xray-sdk-express-2.5.0.tgz", + "integrity": "sha512-VfUXlxFlI+gr6ImMF+3000fqPRTBS9MbAywdtC8dt/U57WQbLFDjPW+V6oJowTwrkgKwpOKSXncQDfBs8QHvIw==", + "dependencies": { + "@types/express": "*" + }, + "engines": { + "node": ">= 4.x" + }, + "peerDependencies": { + "aws-xray-sdk-core": "^2.5.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "node_modules/aws-xray-sdk-mysql": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-mysql/-/aws-xray-sdk-mysql-2.5.0.tgz", + "integrity": "sha512-OI3cDkVcKTiWytwoOE1Oj0D2UbchOVHkiQNXWktDk9QYzqbOz+GNEwD5QneqyxFu0z0bQieClBM+0okUprFBXQ==", + "dependencies": { + "@types/mysql": "*" + }, + "engines": { + "node": ">= 4.x" + }, + "peerDependencies": { + "aws-xray-sdk-core": "^2.5.0" + } }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "node_modules/aws-xray-sdk-postgres": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-postgres/-/aws-xray-sdk-postgres-2.5.0.tgz", + "integrity": "sha512-8LcXTjr272gKMSg9a+QSGQPjAabQb87SA0c4ZlVcPqzoG7nAd3pULR6/HDtujeukbRAb6rEoxzKvPX0s18NyFw==", + "dependencies": { + "@types/pg": "*" + }, + "engines": { + "node": ">= 4.x" + }, + "peerDependencies": { + "aws-xray-sdk-core": "^2.5.0" } }, - "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dev": true, - "requires": { - "map-cache": "^0.2.2" + "dependencies": { + "follow-redirects": "^1.14.0" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dev": true, "dependencies": { - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "minipass": "^3.0.0" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fs2": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.9.tgz", - "integrity": "sha512-WsOqncODWRlkjwll+73bAxVW3JPChDgaPX3DT4iTTm73UmG4VgALa7LaFblP232/DN60itkOrPZ8kaP1feksGQ==", + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "d": "^1.0.1", - "deferred": "^0.7.11", - "es5-ext": "^0.10.53", - "event-emitter": "^0.3.5", - "ignore": "^5.1.8", - "memoizee": "^0.4.14", - "type": "^2.1.0" - }, "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "optional": true + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "engines": { + "node": ">=8" } }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "requires": { - "is-property": "^1.0.2" + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==" + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } }, - "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "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==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", "dev": true, - "requires": { - "pump": "^3.0.0" + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "git-raw-commits": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", - "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "dependencies": { - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "requires": { - "readable-stream": "3" - } - } + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, - "requires": { - "ini": "2.0.0" - }, "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", - "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" } }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dependencies": { - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "dev": true + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, - "requires": { - "lodash": "^4.17.15" + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "optional": true + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } + "engines": { + "node": ">=8" } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-unicode": { + "node_modules/braces/node_modules/extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, - "optional": true + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "has-value": { + "node_modules/browser-process-hrtime": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "dependencies": { + "fast-json-stable-stringify": "2.x" }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "node-int64": "^0.4.0" } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", "dev": true }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", "dev": true }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buildcheck": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.3.tgz", + "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", + "optional": true, + "engines": { + "node": ">=10.0.0" } }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "https-proxy-agent": { + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true + }, + "node_modules/byline": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "engines": { + "node": ">=0.10.0" } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "husky": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.9.tgz", - "integrity": "sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg==", + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, - "requires": { - "chalk": "^2.4.2", - "ci-info": "^2.0.0", - "cosmiconfig": "^5.2.1", - "execa": "^1.0.0", - "get-stdin": "^7.0.0", - "opencollective-postinstall": "^2.0.2", - "pkg-dir": "^4.2.0", - "please-upgrade-node": "^3.2.0", - "read-pkg": "^5.2.0", - "run-node": "^1.0.0", - "slash": "^3.0.0" - }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - } - } + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" } }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "import-fresh": { + "node_modules/cacheable-request/node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "engines": { + "node": ">=8" } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } + "engines": { + "node": ">=6" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "inquirer-autocomplete-prompt": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.3.0.tgz", - "integrity": "sha512-zvAc+A6SZdcN+earG5SsBu1RnQdtBS4o8wZ/OqJiCfL34cfOx+twVRq7wumYix6Rkdjn1N2nVCcO3wHqKqgdGg==", + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true, - "requires": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "figures": "^3.2.0", - "run-async": "^2.4.0", - "rxjs": "^6.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">=4" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, - "requires": { - "kind-of": "^3.0.2" + "engines": { + "node": ">=10" }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "requires": { - "binary-extensions": "^2.0.0" + "engines": { + "node": ">=6" } }, - "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, - "requires": { - "call-bind": "^1.0.0" + "engines": { + "node": ">=8" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + "node_modules/caniuse-lite": { + "version": "1.0.30001235", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz", + "integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, - "is-ci": { + "node_modules/capture-exit": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, - "requires": { - "ci-info": "^2.0.0" + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "is-date-object": { + "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "is-extglob": { + "node_modules/child-process-ext": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "resolved": "https://registry.npmjs.org/child-process-ext/-/child-process-ext-2.1.1.tgz", + "integrity": "sha512-0UQ55f51JBkOFa+fvR76ywRzxiPwQS3Xe8oe5bZRphpv+dIMeerW5Zn5e4cUy4COJwVtJyU0R79RMnw+aCqmGA==", "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" + "dependencies": { + "cross-spawn": "^6.0.5", + "es5-ext": "^0.10.53", + "log": "^6.0.0", + "split2": "^3.1.1", + "stream-promise": "^3.2.0" } }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "requires": { - "has-tostringtag": "^1.0.0" + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "node_modules/chokidar/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "is-obj": { + "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", + "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "requires": { - "isobject": "^3.0.1" + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "node_modules/cli-color": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "node_modules/cli-progress-footer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz", + "integrity": "sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw==", + "dev": true, + "dependencies": { + "cli-color": "^2.0.2", + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "mute-stream": "0.0.8", + "process-utils": "^4.0.0", + "timers-ext": "^0.1.7", + "type": "^2.6.0" + }, + "engines": { + "node": ">=10.0" + } }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, - "requires": { - "has-symbols": "^1.0.1" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "requires": { - "text-extensions": "^1.0.0" + "node_modules/cli-sprintf-format": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-sprintf-format/-/cli-sprintf-format-1.1.1.tgz", + "integrity": "sha512-BbEjY9BEdA6wagVwTqPvmAwGB24U93rQPBFZUT8lNCDxXzre5LFHQUTJc70czjgUomVg8u8R5kW8oY9DYRFNeg==", + "dev": true, + "dependencies": { + "cli-color": "^2.0.1", + "es5-ext": "^0.10.53", + "sprintf-kit": "^2.0.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0" } }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "node_modules/cli-sprintf-format/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } }, - "is-windows": { + "node_modules/clone-response": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true, - "requires": { - "is-docker": "^2.0.0" + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "isarray": { + "node_modules/collection-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "engines": { + "node": ">=0.1.90" + } }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "node_modules/commitlint": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-17.0.0.tgz", + "integrity": "sha512-9D1oY5UValrpkdpVbaiZ9EIXYJDnFvO5LXK5FztbIbnf3QxnC34A1MmMAzm9Z6Lmf7V4+khV0VE43302pHmwug==", "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "@commitlint/cli": "^17.0.0", + "@commitlint/types": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/commitlint/node_modules/@commitlint/cli": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.7.tgz", + "integrity": "sha512-nzZmfO5KIOupYppn1MsnYX/80I+KDlxiwkks3CJT0XT+t34UgqGi3eSyEuzgcIjPlORk5/GMaAEiys78iLfGMg==", "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.6.7", + "@commitlint/load": "^17.6.7", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" } }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "node_modules/commitlint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "node_modules/commitlint/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "java-invoke-local": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/java-invoke-local/-/java-invoke-local-0.0.6.tgz", - "integrity": "sha512-gZmQKe1QrfkkMjCn8Qv9cpyJFyogTYqkP5WCobX5RNaHsJzIV/6NvAnlnouOcwKr29QrxLGDGcqYuJ+ae98s1A==", - "dev": true - }, - "jest": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.0.0.tgz", - "integrity": "sha512-OtoG+cpcP+UXx+pQ7rzoQ11Pfb5+OUkrsNn5YPc0GU2HeBktgTANonUZEgT6cCgUHX7jUiuDIusDNTL4iNcWGQ==", + "node_modules/commitlint/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "requires": { - "@jest/core": "^26.0.0", - "import-local": "^3.0.2", - "jest-cli": "^26.0.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "node_modules/commitlint/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "engines": { + "node": ">=10.17.0" } }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "node_modules/commitlint/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" + "engines": { + "node": ">=8" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "node_modules/commitlint/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "node_modules/commitlint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "requires": { - "detect-newline": "^3.0.0" + "engines": { + "node": ">=8" } }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "node_modules/commitlint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commitlint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "node_modules/commitlint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "engines": { + "node": ">=8" } }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "node_modules/commitlint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" + "node_modules/compress-commons": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", + "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "dependencies": { + "safe-buffer": "5.2.1" }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" } }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "node_modules/conventional-changelog-angular": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", + "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.0.tgz", + "integrity": "sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==", "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "readable-stream": "3" } }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" + "dependencies": { + "safe-buffer": "~5.1.1" } }, - "jest-plugin-context": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/jest-plugin-context/-/jest-plugin-context-2.9.0.tgz", - "integrity": "sha1-YCqsvmEhOjuyKQZ9sO7p4APrGTE=", + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" } }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" } }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, + "node_modules/cpu-features": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.4.tgz", + "integrity": "sha512-fKiZ/zp1mUwQbnzb9IghXtHtDoTMtNeb8oYGx6kX2SYfhnG0HNdBEBIzB9b5KlXu5DQPhfy3mInbBxFcgwAr3A==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "buildcheck": "0.0.3", + "nan": "^2.15.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" + "node_modules/cpu-features/node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/crc-32": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", + "dependencies": { + "exit-on-epipe": "~1.0.1", + "printj": "~1.1.0" }, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" } }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cron-parser": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", + "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" + "dependencies": { + "is-nan": "^1.3.0", + "moment-timezone": "^0.5.31" + }, + "engines": { + "node": ">=0.8" } }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-env/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "jest-sonar-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", - "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "node_modules/cross-env/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "requires": { - "xml": "^1.0.1" + "engines": { + "node": ">=8" } }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "node_modules/cross-env/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "node_modules/cross-env/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "engines": { + "node": ">=8" } }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "node_modules/cross-env/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", + "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead.", + "dev": true + }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d/node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.21.2", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.2.tgz", + "integrity": "sha512-FMkG7pIPx64mGIpS2LOb3Wp3O606H/hatoiz7G0oiYWai1izdM4tF1dd7QABv2NogkIDI4wxsfLLFQSuVvDHgA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + "optional": true } } }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/decompress-tar/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/decompress-tar/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dev": true, + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/deferred": { + "version": "0.7.11", + "resolved": "https://registry.npmjs.org/deferred/-/deferred-0.7.11.tgz", + "integrity": "sha512-8eluCl/Blx4YOGwMapBvXRKxHXhA8ejDXYzEaK8+/gtcm8hRMhSLmXSqDmNUKNc/C8HNSmuyyp/hflhqDAvK2A==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.50", + "event-emitter": "^0.3.5", + "next-tick": "^1.0.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/docker-compose": { + "version": "0.23.6", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.23.6.tgz", + "integrity": "sha512-y3Q8MkwG862rNqkvEQG59/7Fi2/fzs3NYDCvqUAAD+z0WGs2qcJ9hRcn34hWgWv9ouPkFqe3Vwca0h+4bIIRWw==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/dockerode": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.4.tgz", + "integrity": "sha512-3EUwuXnCU+RUlQEheDjmBE0B7q66PV9Rw5NiH1sXwINq0M9c5ERP9fxgkw36ZHOtzf4AGEEYySnkx/sACC9EgQ==", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^3.0.0", + "tar-fs": "~2.0.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode/node_modules/docker-modem": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.6.tgz", + "integrity": "sha512-h0Ow21gclbYsZ3mkHDfsYNDqtRhXS8fXr51bU0qr1dxgTMJj0XufbzX+jhNOvA8KuEEzn6JbvLVhXyv+fny9Uw==", + "dependencies": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.11.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode/node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/dockerode/node_modules/ssh2": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.4", + "nan": "^2.16.0" + } + }, + "node_modules/dockerode/node_modules/tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/docopt": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", + "integrity": "sha1-so6eIiDaXsSffqW7JKR3h0Be6xE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dotenv-json/-/dotenv-json-1.0.0.tgz", + "integrity": "sha512-jAssr+6r4nKhKRudQ0HOzMskOFFi9+ubXWwmrSGJFgTvpjyPXCXsCsYbjif6mXp7uxA7xY3/LGaiTQukZzSbOQ==", + "dev": true + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.749.tgz", + "integrity": "sha512-F+v2zxZgw/fMwPz/VUGIggG4ZndDsYy0vlpthi3tjmDZlcfbhN5mYW0evXUsBr2sUtuDANFtle410A9u/sd/4A==", + "dev": true + }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "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" + } + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esniff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", + "integrity": "sha512-vmHXOeOt7FJLsqofvFk4WB3ejvcHizCd8toXXwADmYfd02p2QwHRgkUbhYDX54y08nqk818CUTWipgZGlyN07g==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.12" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/essentials": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", + "integrity": "sha512-kP/j7Iw7KeNE8b/o7+tr9uX2s1wegElGOoGZ2Xm35qBr4BbbEcH3/bxR2nfH9l9JANCq9AUrvKw+gRuHtZp0HQ==", + "dev": true, + "dependencies": { + "uni-global": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", + "dev": true + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exit-on-epipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "dev": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dev": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filesize": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.8.tgz", + "integrity": "sha512-/ylBrxZ1GAjgh2CEemKKLwTtmXfWqTtN1jRl6iqLwnMEucUX5cmaCCUPGstQOHVCcK9uYL6o1cPNakLQU2sasQ==", + "dev": true, + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-requires": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-requires/-/find-requires-1.0.0.tgz", + "integrity": "sha512-UME7hNwBfzeISSFQcBEDemEEskpOjI/shPrpJM5PI4DSdn6hX0dmz+2dL70blZER2z8tSnTRL+2rfzlYgtbBoQ==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.49", + "esniff": "^1.1.0" + }, + "bin": { + "find-requires": "bin/find-requires.js" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fs2": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/fs2/-/fs2-0.3.9.tgz", + "integrity": "sha512-WsOqncODWRlkjwll+73bAxVW3JPChDgaPX3DT4iTTm73UmG4VgALa7LaFblP232/DN60itkOrPZ8kaP1feksGQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "deferred": "^0.7.11", + "es5-ext": "^0.10.53", + "event-emitter": "^0.3.5", + "ignore": "^5.1.8", + "memoizee": "^0.4.14", + "type": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd/node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/got/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/got/node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/got/node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/got/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/got/node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/husky": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.0.9.tgz", + "integrity": "sha512-Yolhupm7le2/MqC1VYLk/cNmYxsSsqKkTyBhzQHhPK1jFnC89mmmNVuGtLNabjDI6Aj8UNIr0KpRNuBkiC4+sg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chalk": "^2.4.2", + "ci-info": "^2.0.0", + "cosmiconfig": "^5.2.1", + "execa": "^1.0.0", + "get-stdin": "^7.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "read-pkg": "^5.2.0", + "run-node": "^1.0.0", + "slash": "^3.0.0" + }, + "bin": { + "husky-run": "run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/husky/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/husky/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/husky/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "dev": true, + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/java-invoke-local": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/java-invoke-local/-/java-invoke-local-0.0.6.tgz", + "integrity": "sha512-gZmQKe1QrfkkMjCn8Qv9cpyJFyogTYqkP5WCobX5RNaHsJzIV/6NvAnlnouOcwKr29QrxLGDGcqYuJ+ae98s1A==", + "dev": true, + "bin": { + "java-invoke-local": "lib/cli.js" + } + }, + "node_modules/jest": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.0.0.tgz", + "integrity": "sha512-OtoG+cpcP+UXx+pQ7rzoQ11Pfb5+OUkrsNn5YPc0GU2HeBktgTANonUZEgT6cCgUHX7jUiuDIusDNTL4iNcWGQ==", + "dev": true, + "dependencies": { + "@jest/core": "^26.0.0", + "import-local": "^3.0.2", + "jest-cli": "^26.0.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-config/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-haste-map/node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/jest-haste-map/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-haste-map/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-plugin-context": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/jest-plugin-context/-/jest-plugin-context-2.9.0.tgz", + "integrity": "sha1-YCqsvmEhOjuyKQZ9sO7p4APrGTE=", + "dev": true, + "peerDependencies": { + "jest": "*" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-sonar-reporter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jest-sonar-reporter/-/jest-sonar-reporter-2.0.0.tgz", + "integrity": "sha512-ZervDCgEX5gdUbdtWsjdipLN3bKJwpxbvhkYNXTAYvAckCihobSLr9OT/IuyNIRT1EZMDDwR6DroWtrq+IL64w==", + "dev": true, + "dependencies": { + "xml": "^1.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/jest/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-colorizer": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json-colorizer/-/json-colorizer-2.2.2.tgz", + "integrity": "sha512-56oZtwV1piXrQnRNTtJeqRv+B9Y/dXAYLqBBaYl/COcUdoZxgLBLAO88+CnkbT6MxNs0c5E9mPBIb2sFcNz3vw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "lodash.get": "^4.4.2" + } + }, + "node_modules/json-cycle": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", + "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "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==", + "dev": true + }, + "node_modules/json-refs": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", + "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", + "dev": true, + "dependencies": { + "commander": "~4.1.1", + "graphlib": "^2.1.8", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "native-promise-only": "^0.8.1", + "path-loader": "^1.0.10", + "slash": "^3.0.0", + "uri-js": "^4.2.2" + }, + "bin": { + "json-refs": "bin/json-refs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json-refs/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonpath-plus": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", + "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/jsonschema": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz", + "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dev": true, + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dev": true, + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dev": true, + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ==", + "dev": true + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lambda-leak": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lambda-leak/-/lambda-leak-2.0.0.tgz", + "integrity": "sha1-dxmF02KEh/boha+uK1RRDc+yzX4=", + "dev": true, + "engines": { + "node": ">=6.10.0" + } + }, + "node_modules/lambda-tester": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lambda-tester/-/lambda-tester-3.5.0.tgz", + "integrity": "sha512-QTz0JsIxjOKEyxryDtQD1+fT9KRYifdId53fq+hDwplAe71DB7UuZwNWqjJy1GQZfW57UrQVOWEDuFm4S808GQ==", + "dev": true, + "dependencies": { + "app-root-path": "^2.1.0", + "dotenv": "^5.0.0", + "dotenv-json": "^1.0.0", + "lambda-leak": "^2.0.0", + "semver": "^5.5.0", + "uuid": "^3.3.2", + "vandium-utils": "^1.1.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/lambda-tester/node_modules/dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "dev": true, + "engines": { + "node": ">=4.6.0" + } + }, + "node_modules/lambda-tester/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.7", + "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", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/liquibase": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/liquibase/-/liquibase-1.0.1.tgz", + "integrity": "sha512-P3cs1gbPNWgDC7asvAV3/xFsq3OhppwNBNXEI0+QGQ9DsTG0TZSwJfUJAKJT9V9UqeGU165rwQKNlWZe6RYu2w==", + "deprecated": "This package is being deprecated in favor of a new release under the same name. Please visit https://github.com/liquibase/node-liquibase for more information.", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", + "dev": true + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=", + "dev": true + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz", + "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "duration": "^0.2.2", + "es5-ext": "^0.10.53", + "event-emitter": "^0.3.5", + "sprintf-kit": "^2.0.1", + "type": "^2.5.0", + "uni-global": "^1.0.0" + } + }, + "node_modules/log-node": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/log-node/-/log-node-8.0.3.tgz", + "integrity": "sha512-1UBwzgYiCIDFs8A0rM2QdBFo8Wd8UQ0HrSTu/MNI+/2zN3NoHRj2fhplurAyuxTYUXu3Oohugq1jAn5s05u1MQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "cli-color": "^2.0.1", + "cli-sprintf-format": "^1.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "sprintf-kit": "^2.0.1", + "supports-color": "^8.1.1", + "type": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "log": "^6.0.0" + } + }, + "node_modules/log-node/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-node/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/luxon": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", + "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mem": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.1.tgz", + "integrity": "sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/mem/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mnemonist": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", + "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", + "dev": true, + "dependencies": { + "obliterator": "^1.6.1" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz", + "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==", + "dev": true, + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/mysql2": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", + "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", + "dependencies": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.2", + "long": "^4.0.0", + "lru-cache": "^6.0.0", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "dependencies": { + "lru-cache": "^4.1.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/ncjsm": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-4.3.2.tgz", + "integrity": "sha512-6d1VWA7FY31CpI4Ki97Fpm36jfURkVbpktizp8aoVViTZRQgr/0ddmlKerALSSlzfwQRBeSq1qwwVcBJK4Sk7Q==", "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "builtin-modules": "^3.3.0", + "deferred": "^0.7.11", + "es5-ext": "^0.10.62", + "es6-set": "^0.1.6", + "ext": "^1.7.0", + "find-requires": "^1.0.0", + "fs2": "^0.3.9", + "type": "^2.7.2" } }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" + "dependencies": { + "minimatch": "^3.0.2" }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, "dependencies": { - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true } } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "json-cycle": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.3.0.tgz", - "integrity": "sha512-FD/SedD78LCdSvJaOUQAXseT8oQBb5z6IVYaQaCrVUlu9zOAr1BDdKyVYQaSD/GDsAMrXpKcOyBD4LIl8nfjHw==", - "dev": true + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "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==" + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "json-refs": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", - "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, - "requires": { - "commander": "~4.1.1", - "graphlib": "^2.1.8", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15", - "native-promise-only": "^0.8.1", - "path-loader": "^1.0.10", - "slash": "^3.0.0", - "uri-js": "^4.2.2" - }, + "optional": true, "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - } + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "node_modules/node-notifier/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { - "graceful-fs": "^4.1.6" + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsonpath-plus": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", - "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==", - "dev": true + "node_modules/node-notifier/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } }, - "jsonschema": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz", - "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==", + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", "dev": true }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "node_modules/node-schedule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.3.tgz", + "integrity": "sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw==", "dev": true, - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" + "dependencies": { + "cron-parser": "^2.18.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" } }, - "jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - }, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "engines": { + "node": ">=8" } }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "node_modules/npm-registry-utilities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-utilities/-/npm-registry-utilities-1.0.0.tgz", + "integrity": "sha512-9xYfSJy2IFQw1i6462EJzjChL9e65EfSo2Cw6kl0EFeDp05VvU+anrQk3Fc0d1MbVCq7rWIxeer89O9SUQ/uOg==", "dev": true, - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "dependencies": { + "ext": "^1.6.0", + "fs2": "^0.3.9", + "memoizee": "^0.4.15", + "node-fetch": "^2.6.7", + "semver": "^7.3.5", + "type": "^2.6.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=12.0" } }, - "jwt-decode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", - "integrity": "sha512-86GgN2vzfUu7m9Wcj63iUkuDzFNYFVmjeDm2GzWpUk+opB0pEpMsw6ePCMrhYkumz2C1ihqtZzOMAg7FiXcNoQ==", - "dev": true - }, - "kafka-node": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-5.0.0.tgz", - "integrity": "sha512-dD2ga5gLcQhsq1yNoQdy1MU4x4z7YnXM5bcG9SdQuiNr5KKuAmXixH1Mggwdah5o7EfholFbcNDPSVA6BIfaug==", + "node_modules/npm-registry-utilities/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { - "async": "^2.6.2", - "binary": "~0.3.0", - "bl": "^2.2.0", - "buffer-crc32": "~0.2.5", - "buffermaker": "~1.2.0", - "debug": "^2.1.3", - "denque": "^1.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "nested-error-stacks": "^2.0.0", - "optional": "^0.1.3", - "retry": "^0.10.1", - "snappy": "^6.0.1", - "uuid": "^3.0.0" - }, - "dependencies": { - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, - "requires": { - "json-buffer": "3.0.0" + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "requires": { - "colornames": "^1.1.1" + "engines": { + "node": ">=0.10.0" } }, - "lambda-leak": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lambda-leak/-/lambda-leak-2.0.0.tgz", - "integrity": "sha1-dxmF02KEh/boha+uK1RRDc+yzX4=", - "dev": true - }, - "lambda-tester": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lambda-tester/-/lambda-tester-3.5.0.tgz", - "integrity": "sha512-QTz0JsIxjOKEyxryDtQD1+fT9KRYifdId53fq+hDwplAe71DB7UuZwNWqjJy1GQZfW57UrQVOWEDuFm4S808GQ==", + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, - "requires": { - "app-root-path": "^2.1.0", - "dotenv": "^5.0.0", - "dotenv-json": "^1.0.0", - "lambda-leak": "^2.0.0", - "semver": "^5.5.0", - "uuid": "^3.3.2", - "vandium-utils": "^1.1.1" - }, "dependencies": { - "dotenv": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", - "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" } }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "requires": { - "package-json": "^6.3.0" + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "engines": { + "node": ">= 6" } }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true, - "requires": { - "immediate": "~3.0.5" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "liquibase": { + "node_modules/object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/liquibase/-/liquibase-1.0.1.tgz", - "integrity": "sha512-P3cs1gbPNWgDC7asvAV3/xFsq3OhppwNBNXEI0+QGQ9DsTG0TZSwJfUJAKJT9V9UqeGU165rwQKNlWZe6RYu2w==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", - "dev": true - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", - "dev": true - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=", - "dev": true + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=", - "dev": true + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "node_modules/obliterator": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", + "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", "dev": true }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } }, - "log": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log/-/log-6.0.0.tgz", - "integrity": "sha512-sxChESNYJ/EcQv8C7xpmxhtTOngoXuMEqGDAkhXBEmt3MAzM3SM/TmIBOqnMEVdrOv1+VgZoYbo6U2GemQiU4g==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { - "d": "^1.0.0", - "duration": "^0.2.2", - "es5-ext": "^0.10.49", - "event-emitter": "^0.3.5", - "sprintf-kit": "^2.0.0", - "type": "^1.0.1" + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - }, "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - } + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "lolex": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", - "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", - "dev": true + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "long-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { - "es5-ext": "~0.10.2" + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "luxon": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz", - "integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==", + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "semver": "^6.0.0" - }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true, - "requires": { - "tmpl": "1.0.x" + "engines": { + "node": ">=6" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true, - "requires": { - "p-defer": "^1.0.0" + "engines": { + "node": ">=4" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "map-obj": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", - "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==" + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "map-visit": { + "node_modules/p-finally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true, - "requires": { - "object-visit": "^1.0.0" + "engines": { + "node": ">=4" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-6.1.1.tgz", - "integrity": "sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.0.0" - }, "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - }, "dependencies": { - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - } + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, + "node_modules/p-memoize": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.1.tgz", + "integrity": "sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog==", + "dev": true, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==" - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==" - } + "mem": "^6.0.1", + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/p-memoize?sponsor=1" } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/p-memoize/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "engines": { + "node": ">=8" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "mime-db": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", - "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "dev": true + "node_modules/p-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.5.0.tgz", + "integrity": "sha512-5Hwh4aVQSu6BEP+w2zKlVXtFAaYQe1qWuVADSgoeVlLjwe/Q/AMSoRR4MDeaAfu8llT+YNbEijWu/YF3m6avkg==", + "dev": true, + "dependencies": { + "@types/retry": "^0.12.0", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=8" + } }, - "mime-types": { - "version": "2.1.30", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", - "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "node_modules/p-retry/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true, - "requires": { - "mime-db": "1.47.0" + "engines": { + "node": ">= 4" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "engines": { + "node": ">=6" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true, - "requires": { - "minimist": "^1.2.5" + "engines": { + "node": ">=0.10.0" } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, - "mnemonist": { - "version": "0.38.3", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", - "integrity": "sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "requires": { - "obliterator": "^1.6.1" + "engines": { + "node": ">=8" } }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } }, - "moment-timezone": { - "version": "0.5.40", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz", - "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==", + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true, - "requires": { - "moment": ">= 2.9.0" + "engines": { + "node": ">=4" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "node_modules/path-loader": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz", + "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==", + "dev": true, + "dependencies": { + "native-promise-only": "^0.8.1", + "superagent": "^3.8.3" + } }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "mysql2": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", - "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", - "requires": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - } - }, - "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "requires": { - "lru-cache": "^4.1.3" - }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } + "isarray": "0.0.1" } }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true - }, - "nanoid": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", - "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==", + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "engines": { + "node": ">=8" } }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true, - "optional": true - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "node_modules/path2": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path2/-/path2-0.1.0.tgz", + "integrity": "sha512-TX+cz8Jk+ta7IvRy2FAej8rdlbrP0+uBIkP/5DTODez/AuL/vSb30KuAdDxGVREXzn8QfAiu5mJYJ1XjbOhEPA==", "dev": true }, - "ncjsm": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ncjsm/-/ncjsm-4.2.0.tgz", - "integrity": "sha512-L2Qij4PTy7Bs4TB24zs7FLIAYJTaR5JPvSig5hIcO059LnMCNgy6MfHHNyg8s/aekPKrTqKX90gBGt3NNGvhdw==", + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", "dev": true, - "requires": { - "builtin-modules": "^3.2.0", - "deferred": "^0.7.11", - "es5-ext": "^0.10.53", - "es6-set": "^0.1.5", - "find-requires": "^1.0.0", - "fs2": "^0.3.9", - "type": "^2.5.0" + "engines": { + "node": ">=8" }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "node_modules/pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, - "nise": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", - "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "requires": { - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^5.0.1", - "path-to-regexp": "^1.7.0" + "engines": { + "node": ">=8.6" }, - "dependencies": { - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - } + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node-abi": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz", - "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "optional": true, - "requires": { - "semver": "^5.4.1" + "engines": { + "node": ">=0.10.0" } }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, - "requires": { - "minimatch": "^3.0.2" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie-defer/-/pinkie-defer-1.0.0.tgz", + "integrity": "sha1-ePzCIRbA2okKySqAitNwiI3tlCE=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, - "requires": { - "whatwg-url": "^5.0.0" + "dependencies": { + "pinkie": "^2.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" } }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true + "node_modules/pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", + "engines": { + "node": ">= 0.4.0" + } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" } }, - "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", - "dev": true + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } }, - "node-schedule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.3.tgz", - "integrity": "sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw==", + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "requires": { - "cron-parser": "^2.18.0", - "long-timeout": "0.1.1", - "sorted-array-functions": "^1.3.0" + "dependencies": { + "ms": "^2.1.1" } }, - "noop-logger": { + "node_modules/posix-character-classes": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true, - "optional": true + "engines": { + "node": ">=0.10.0" + } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", + "engines": { + "node": ">=0.10.0" + } }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "engines": { + "node": ">= 0.8.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true, - "optional": true + "engines": { + "node": ">=4" + } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "node_modules/pretty-format/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true + "node_modules/printj": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", + "bin": { + "printj": "bin/printj.njs" + }, + "engines": { + "node": ">=0.8" + } }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "node_modules/process-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-utils/-/process-utils-4.0.0.tgz", + "integrity": "sha512-fMyMQbKCxX51YxR7YGCzPjLsU3yDzXFkP4oi1/Mt5Ixnk7GO/7uUTj8mrCHUwuvozWzI+V7QSJR9cZYnwNOZPg==", "dev": true, - "requires": { - "isobject": "^3.0.0" + "dependencies": { + "ext": "^1.4.0", + "fs2": "^0.3.9", + "memoizee": "^0.4.14", + "type": "^2.1.0" + }, + "engines": { + "node": ">=10.0" } }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "node_modules/promise-queue": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", + "integrity": "sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==", "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "engines": { + "node": ">= 0.8.0" } }, - "object.fromentries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", - "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "node_modules/prompts": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", + "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "obliterator": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", - "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", - "dev": true + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dev": true, - "requires": { - "mimic-fn": "^2.1.0" + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" } }, - "opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", - "dev": true - }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, "dependencies": { - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - } + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } }, - "p-each-series": { + "node_modules/querystringify": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "p-memoize": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.1.tgz", - "integrity": "sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog==", + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, - "requires": { - "mem": "^6.0.1", - "mimic-fn": "^3.0.0" + "engines": { + "node": ">=10" }, - "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dependencies": { - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "p-retry": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.5.0.tgz", - "integrity": "sha512-5Hwh4aVQSu6BEP+w2zKlVXtFAaYQe1qWuVADSgoeVlLjwe/Q/AMSoRR4MDeaAfu8llT+YNbEijWu/YF3m6avkg==", + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dev": true, - "requires": { - "@types/retry": "^0.12.0", - "retry": "^0.12.0" + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", "dependencies": { - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - } + "minimatch": "^3.0.4" } }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { - "p-finally": "^1.0.0" + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, "dependencies": { - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-loader": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.10.tgz", - "integrity": "sha512-CMP0v6S6z8PHeJ6NFVyVJm6WyJjIwFvyz2b0n2/4bKdS/0uZa/9sKUlYZzubrn3zuDRU0zIuEDX9DZYQ2ZI8TA==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "requires": { - "native-promise-only": "^0.8.1", - "superagent": "^3.8.3" + "engines": { + "node": ">=0.10.0" } }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "requires": { - "isarray": "0.0.1" - }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "path2": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path2/-/path2-0.1.0.tgz", - "integrity": "sha512-TX+cz8Jk+ta7IvRy2FAej8rdlbrP0+uBIkP/5DTODez/AuL/vSb30KuAdDxGVREXzn8QfAiu5mJYJ1XjbOhEPA==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "dev": true }, - "pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" - }, - "pg-protocol": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", - "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } }, - "pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "picomatch": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", - "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", - "dev": true + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true + "node_modules/resolve-global/node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } }, - "pinkie-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-defer/-/pinkie-defer-1.0.0.tgz", - "integrity": "sha1-ePzCIRbA2okKySqAitNwiI3tlCE=", + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "dev": true, - "requires": { - "pinkie": "^2.0.0" + "dependencies": { + "lowercase-keys": "^1.0.0" } }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" } }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "requires": { - "semver-compare": "^1.0.0" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, "dependencies": { - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } }, - "postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "postgres-bytea": { + "node_modules/run-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" - }, - "postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" - }, - "postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "requires": { - "xtend": "^4.0.0" + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true, + "bin": { + "run-node": "run-node" + }, + "engines": { + "node": ">=4" } }, - "prebuild-install": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz", - "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^2.0.1", - "rc": "^1.2.7", - "simple-get": "^2.7.0", - "tar-fs": "^1.13.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - } - } + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - }, - "dependencies": { - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "optional": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "node_modules/rxjs/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", "dev": true }, - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==" - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + { + "type": "consulting", + "url": "https://feross.org/support" } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" } }, - "prettyoutput": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prettyoutput/-/prettyoutput-1.2.0.tgz", - "integrity": "sha512-G2gJwLzLcYS+2m6bTAe+CcDpwak9YpcvpScI0tE4WYb2O3lEZD/YywkMNpGqsSx5wttGvh2UXaKROTKKCyM2dw==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dev": true, - "requires": { - "colors": "1.3.x", - "commander": "2.19.x", - "lodash": "4.17.x" + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, "dependencies": { - "colors": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", - "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", - "dev": true - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" } }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } }, - "promise-queue": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/promise-queue/-/promise-queue-2.2.5.tgz", - "integrity": "sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==", + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, + "node_modules/serverless": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.33.0.tgz", + "integrity": "sha512-qmG0RMelsWmnS5Smxoy0CbjpecgnJlM89wzSIgJqfkGlmOo2nJdd8y0/E6KlaTsaozlPKkjUBDzis2nF8VNO2g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@serverless/dashboard-plugin": "^6.2.3", + "@serverless/platform-client": "^4.3.2", + "@serverless/utils": "^6.11.1", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "archiver": "^5.3.1", + "aws-sdk": "^2.1404.0", + "bluebird": "^3.7.2", + "cachedir": "^2.3.0", + "chalk": "^4.1.2", + "child-process-ext": "^2.1.1", + "ci-info": "^3.8.0", + "cli-progress-footer": "^2.3.2", + "d": "^1.0.1", + "dayjs": "^1.11.8", + "decompress": "^4.2.1", + "dotenv": "^16.3.1", + "dotenv-expand": "^10.0.0", + "essentials": "^1.2.0", + "ext": "^1.7.0", + "fastest-levenshtein": "^1.0.16", + "filesize": "^10.0.7", + "fs-extra": "^10.1.0", + "get-stdin": "^8.0.0", + "globby": "^11.1.0", + "got": "^11.8.6", + "graceful-fs": "^4.2.11", + "https-proxy-agent": "^5.0.1", + "is-docker": "^2.2.1", + "js-yaml": "^4.1.0", + "json-colorizer": "^2.2.2", + "json-cycle": "^1.5.0", + "json-refs": "^3.0.15", + "lodash": "^4.17.21", + "memoizee": "^0.4.15", + "micromatch": "^4.0.5", + "node-fetch": "^2.6.11", + "npm-registry-utilities": "^1.0.0", + "object-hash": "^3.0.0", + "open": "^8.4.2", + "path2": "^0.1.0", + "process-utils": "^4.0.0", + "promise-queue": "^2.2.5", + "require-from-string": "^2.0.2", + "semver": "^7.5.3", + "signal-exit": "^3.0.7", + "stream-buffers": "^3.0.2", + "strip-ansi": "^6.0.1", + "supports-color": "^8.1.1", + "tar": "^6.1.15", + "timers-ext": "^0.1.7", + "type": "^2.7.2", + "untildify": "^4.0.0", + "uuid": "^9.0.0", + "ws": "^7.5.9", + "yaml-ast-parser": "0.0.43" + }, + "bin": { + "serverless": "bin/serverless.js", + "sls": "bin/serverless.js" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/serverless-offline": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/serverless-offline/-/serverless-offline-6.9.0.tgz", + "integrity": "sha512-toKcyXUv0rFM7nGk/0QcCxP1Zlv/37IAf3vQiUlOh5XHPl6pFWfHUVF4HelMkosAeWJqJt1SngNmK38uiAsLtg==", + "dev": true, + "dependencies": { + "@hapi/boom": "^7.4.11", + "@hapi/h2o2": "^8.3.2", + "@hapi/hapi": "^18.4.1", + "aws-sdk": "^2.834.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "cuid": "^2.1.8", + "execa": "^5.0.0", + "extend": "^3.0.2", + "fs-extra": "^9.1.0", + "java-invoke-local": "0.0.6", + "js-string-escape": "^1.0.1", + "jsonpath-plus": "^5.0.2", + "jsonschema": "^1.4.0", + "jsonwebtoken": "^8.5.1", + "jszip": "^3.5.0", + "luxon": "^1.25.0", + "node-fetch": "^2.6.1", + "node-schedule": "^1.3.3", + "object.fromentries": "^2.0.3", + "p-memoize": "^4.0.1", + "p-queue": "^6.6.2", + "p-retry": "^4.3.0", + "please-upgrade-node": "^3.2.0", + "portfinder": "^1.0.28", + "semver": "^7.3.4", + "update-notifier": "^5.0.1", + "velocityjs": "^2.0.3", + "ws": "^7.4.2" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "serverless": ">=1.60.0" + } + }, + "node_modules/serverless-offline/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/serverless-offline/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "18.11.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", - "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==", - "dev": true - } + "node_modules/serverless-offline/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "node_modules/serverless-offline/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "node_modules/serverless-offline/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "node_modules/serverless-offline/node_modules/execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", "dev": true, - "requires": { - "escape-goat": "^2.0.0" + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", - "dev": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/serverless-offline/node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node_modules/serverless-offline/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "readable-web-to-node-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.1.tgz", - "integrity": "sha512-4zDC6CvjUyusN7V0QLsXVB7pJCD9+vtrM9bYDRv6uBQ+SKfx36rp5AFNPRgh9auKRul/a1iFZJYXcCbwRL+SaA==", + "node_modules/serverless-offline/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "requires": { - "@types/readable-stream": "^2.3.9", - "readable-stream": "^3.6.0" + "engines": { + "node": ">=10.17.0" } }, - "readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "requires": { - "minimatch": "^3.0.4" + "node_modules/serverless-offline/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/serverless-offline/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { - "picomatch": "^2.2.1" + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "node_modules/serverless-offline/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/serverless-offline/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "node_modules/serverless-offline/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { - "rc": "^1.2.8" + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "node_modules/serverless-offline/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "requires": { - "rc": "^1.2.8" + "engines": { + "node": ">=8" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replaceall": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/replaceall/-/replaceall-0.1.6.tgz", - "integrity": "sha1-gdgax663LX9cSUKt8ml6MiBojY4=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "node_modules/serverless-offline/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-alpn": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.1.2.tgz", - "integrity": "sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA==", - "dev": true - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/serverless-offline/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "node_modules/serverless-plugin-tracing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/serverless-plugin-tracing/-/serverless-plugin-tracing-2.0.0.tgz", + "integrity": "sha512-cndG6QC5ZFHSwmylOqxOzy/M9TAKtUl+wnpqdmqZ5sFfWjcUi4BLV7MkQnsIdKPKJcCv19tpNONYmGPmw6tXIg==", + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "requires": { - "global-dirs": "^0.1.1" - }, + "node_modules/serverless-plugin-typescript": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/serverless-plugin-typescript/-/serverless-plugin-typescript-1.1.9.tgz", + "integrity": "sha512-OmZrD1uArNx+1MPrXck39zsa76k/H7QYOOAg/Uz9xpLGJPUsvW0pXRSE9NN7LRid6IuM/WpY3VWkD5DPusY4cA==", + "dev": true, "dependencies": { - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } - } + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "typescript": ">=2.2.2" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "node_modules/serverless-plugin-typescript/node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true, + "engines": { + "node": ">= 6" + } }, - "responselike": { + "node_modules/serverless-plugin-typescript/node_modules/array-union": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/serverless-plugin-typescript/node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "node_modules/serverless-plugin-typescript/node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true + "node_modules/serverless-plugin-typescript/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "node_modules/serverless-plugin-typescript/node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/serverless-plugin-typescript/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "requires": { - "glob": "^7.1.3" + "engines": { + "node": ">= 4" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true + "node_modules/serverless-plugin-typescript/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "run-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", - "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", - "dev": true + "node_modules/serverless-plugin-typescript/node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/serverless-plugin-typescript/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "requires": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=6" } }, - "run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/serverless-plugin-typescript/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "requires": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=6" } }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/serverless/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { - "tslib": "^1.9.0" + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/serverless/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "node_modules/serverless/node_modules/aws-sdk": { + "version": "2.1426.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1426.0.tgz", + "integrity": "sha512-qq4ydcRzQW2IqjMdCz5FklORREEtkSCJ2tm9CUJ2PaUOaljxpdxq9UI64vXiyRD+GIp5vdkmVNoTRi2rCXh3rA==", "dev": true, - "requires": { - "ret": "~0.1.10" + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.5.0" + }, + "engines": { + "node": ">= 10.0.0" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/serverless/node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "node_modules/serverless/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" } }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + "node_modules/serverless/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "node_modules/serverless/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "requires": { - "xmlchars": "^2.2.0" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "node_modules/serverless/node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, - "requires": { - "commander": "^2.8.1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "node_modules/serverless/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "node_modules/serverless/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "node_modules/serverless/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "requires": { - "semver": "^6.3.0" - }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + "node_modules/serverless/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "serverless": { - "version": "2.45.2", - "resolved": "https://registry.npmjs.org/serverless/-/serverless-2.45.2.tgz", - "integrity": "sha512-DFGs4T1QW50fMNbw7LjIdsks4iAizsQQ6hd9H11ucTih+a5/HXzEMgVy6oHljdHGISwn2L2YfxdeAFg9WBjx3A==", - "dev": true, - "requires": { - "@serverless/cli": "^1.5.2", - "@serverless/components": "^3.12.0", - "@serverless/dashboard-plugin": "^5.3.0", - "@serverless/utils": "^5.2.0", - "ajv": "^6.12.6", - "ajv-keywords": "^3.5.2", - "archiver": "^5.3.0", - "aws-sdk": "^2.924.0", - "bluebird": "^3.7.2", - "boxen": "^5.0.1", - "cachedir": "^2.3.0", - "chalk": "^4.1.1", - "child-process-ext": "^2.1.1", - "ci-info": "^3.2.0", - "d": "^1.0.1", - "dayjs": "^1.10.5", - "decompress": "^4.2.1", - "dotenv": "^10.0.0", - "essentials": "^1.1.1", - "fastest-levenshtein": "^1.0.12", - "filesize": "^6.3.0", - "fs-extra": "^9.1.0", - "get-stdin": "^8.0.0", - "globby": "^11.0.3", - "got": "^11.8.2", - "graceful-fs": "^4.2.6", - "https-proxy-agent": "^5.0.0", - "is-docker": "^2.2.1", - "is-wsl": "^2.2.0", - "js-yaml": "^4.1.0", - "json-cycle": "^1.3.0", - "json-refs": "^3.0.15", - "lodash": "^4.17.21", - "memoizee": "^0.4.15", - "micromatch": "^4.0.4", - "ncjsm": "^4.2.0", - "node-fetch": "^2.6.1", - "object-hash": "^2.2.0", - "path2": "^0.1.0", - "promise-queue": "^2.2.5", - "replaceall": "^0.1.6", - "semver": "^7.3.5", - "tabtab": "^3.0.2", - "tar": "^6.1.0", - "timers-ext": "^0.1.7", - "type": "^2.5.0", - "untildify": "^4.0.0", - "uuid": "^8.3.2", - "yaml-ast-parser": "0.0.43" + "node_modules/serverless/node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" }, - "dependencies": { - "@serverless/components": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/@serverless/components/-/components-3.18.2.tgz", - "integrity": "sha512-jQSgd3unajU94R6vjzD0l+PS5lVcky0vrE1DOfb28VPgmaS48+I/niavWR7+SOt0mYjIkUlwBI73a2ZuqeYK6Q==", - "dev": true, - "requires": { - "@serverless/platform-client": "^4.2.2", - "@serverless/platform-client-china": "^2.2.0", - "@serverless/utils": "^4.0.0", - "adm-zip": "^0.5.4", - "ansi-escapes": "^4.3.1", - "chalk": "^4.1.0", - "child-process-ext": "^2.1.1", - "chokidar": "^3.5.1", - "ci-info": "^3.2.0", - "dayjs": "^1.10.4", - "dotenv": "^8.2.0", - "fastest-levenshtein": "^1.0.12", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "got": "^11.8.2", - "graphlib": "^2.1.8", - "https-proxy-agent": "^5.0.0", - "inquirer-autocomplete-prompt": "^1.3.0", - "js-yaml": "^3.14.1", - "memoizee": "^0.4.14", - "minimist": "^1.2.5", - "open": "^7.3.1", - "prettyoutput": "^1.2.0", - "ramda": "^0.27.1", - "semver": "^7.3.4", - "strip-ansi": "^6.0.0", - "tencent-serverless-http": "^1.3.1", - "traverse": "^0.6.6", - "uuid": "^8.3.2" - }, - "dependencies": { - "@serverless/platform-client-china": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@serverless/platform-client-china/-/platform-client-china-2.4.2.tgz", - "integrity": "sha512-HFF3vN2Cli2z2A1E1Tp76lFe8lFcHiPuobe5CLxK7VxtwVY3xj7h4hmgsxavmJESw9cJ83u6r5tpY2TYaLbnVA==", - "dev": true, - "requires": { - "@serverless/utils-china": "^1.1.4", - "archiver": "^5.0.2", - "dotenv": "^8.2.0", - "fast-glob": "^3.2.4", - "fs-extra": "^9.0.1", - "got": "^11.8.3", - "https-proxy-agent": "^5.0.0", - "js-yaml": "^3.14.0", - "jszip": "^3.9.1", - "minimatch": "^3.0.4", - "querystring": "^0.2.0", - "run-parallel-limit": "^1.0.6", - "traverse": "^0.6.6", - "urlencode": "^1.1.0", - "ws": "^7.3.1" - } - }, - "@serverless/utils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@serverless/utils/-/utils-4.1.0.tgz", - "integrity": "sha512-cl5uPaGg72z0sCUpF0zsOhwYYUV72Gxc1FwFfxltO8hSvMeFDvwD7JrNE4kHcIcKRjwPGbSH0fdVPUpErZ8Mog==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "ci-info": "^3.1.1", - "inquirer": "^7.3.3", - "js-yaml": "^4.1.0", - "jwt-decode": "^3.1.2", - "lodash": "^4.17.21", - "ncjsm": "^4.1.0", - "type": "^2.5.0", - "uuid": "^8.3.2", - "write-file-atomic": "^3.0.3" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "@serverless/utils-china": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@serverless/utils-china/-/utils-china-1.1.7.tgz", - "integrity": "sha512-HDN0pjnjuwV8QTjqLvqk4wzAV3NitvistM5nF8Wa6knKJZZ68bxWm2h+BoYlBvW4xVJOaq1GyyF9Z7Qj1Q7qwQ==", - "dev": true, - "requires": { - "@tencent-sdk/capi": "^2.0.0", - "dijkstrajs": "^1.0.1", - "dot-qs": "0.2.0", - "duplexify": "^4.1.1", - "end-of-stream": "^1.4.4", - "got": "^11.8.2", - "https-proxy-agent": "^5.0.0", - "kafka-node": "^5.0.0", - "protobufjs": "^6.9.0", - "qrcode-terminal": "^0.12.0", - "socket.io-client": "^2.3.0", - "winston": "3.2.1" - } - }, - "@tencent-sdk/capi": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@tencent-sdk/capi/-/capi-2.0.3.tgz", - "integrity": "sha512-iLmtC1Trp74u+l9OP0Kv60Nfa8wfqAQQ5t6Vt3gIdJsYleG994mqRJTEFVQE/+hFAgIFfx9owQR0B+Yv/MkefQ==", - "dev": true, - "requires": { - "@tencent-sdk/common": "1.0.0", - "got": "^11.8.2" - } - }, - "@tencent-sdk/common": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tencent-sdk/common/-/common-1.0.0.tgz", - "integrity": "sha512-fgBcyiAPJy0LDXWha8zFOh3T5cc/UwD3z2SZ+ulE7ZyFQxWf/moECynvOQ2wJqIZWF+5mAo0mfOK13067PZXng==", - "dev": true, - "requires": { - "camelcase": "^6.2.0", - "type-fest": "^1.2.1" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "aws-sdk": { - "version": "2.925.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.925.0.tgz", - "integrity": "sha512-dHXngzuSTZvIFWizWbU+ceZTAKmgodzEIi/AWbB+z0THKfxD3Iz/CJ7kZ7a9QyZv7X082L68vv3siMhXBMoTLA==", - "dev": true, - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jwt-decode": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - }, - "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", - "dev": true, - "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - } - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "serverless-offline": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/serverless-offline/-/serverless-offline-6.9.0.tgz", - "integrity": "sha512-toKcyXUv0rFM7nGk/0QcCxP1Zlv/37IAf3vQiUlOh5XHPl6pFWfHUVF4HelMkosAeWJqJt1SngNmK38uiAsLtg==", + "node_modules/serverless/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "requires": { - "@hapi/boom": "^7.4.11", - "@hapi/h2o2": "^8.3.2", - "@hapi/hapi": "^18.4.1", - "aws-sdk": "^2.834.0", - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "cuid": "^2.1.8", - "execa": "^5.0.0", - "extend": "^3.0.2", - "fs-extra": "^9.1.0", - "java-invoke-local": "0.0.6", - "js-string-escape": "^1.0.1", - "jsonpath-plus": "^5.0.2", - "jsonschema": "^1.4.0", - "jsonwebtoken": "^8.5.1", - "jszip": "^3.5.0", - "luxon": "^1.25.0", - "node-fetch": "^2.6.1", - "node-schedule": "^1.3.3", - "object.fromentries": "^2.0.3", - "p-memoize": "^4.0.1", - "p-queue": "^6.6.2", - "p-retry": "^4.3.0", - "please-upgrade-node": "^3.2.0", - "portfinder": "^1.0.28", - "semver": "^7.3.4", - "update-notifier": "^5.0.1", - "velocityjs": "^2.0.3", - "ws": "^7.4.2" + "engines": { + "node": ">=8" + } + }, + "node_modules/serverless/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/serverless/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/serverless/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aws-sdk": { - "version": "2.888.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.888.0.tgz", - "integrity": "sha512-9Rg14eneXnrs5Wh5FL42qGEXf7QaqaV/gMHU9SfvAA0SEM390QnwVjCSKF5YAReWjSuJriKJTDiodMI39J+Nrg==", - "dev": true, - "requires": { - "buffer": "4.9.2", - "events": "1.1.1", - "ieee754": "1.1.13", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "serverless-plugin-tracing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/serverless-plugin-tracing/-/serverless-plugin-tracing-2.0.0.tgz", - "integrity": "sha512-cndG6QC5ZFHSwmylOqxOzy/M9TAKtUl+wnpqdmqZ5sFfWjcUi4BLV7MkQnsIdKPKJcCv19tpNONYmGPmw6tXIg==", - "dev": true + "node_modules/serverless/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } }, - "serverless-plugin-typescript": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/serverless-plugin-typescript/-/serverless-plugin-typescript-1.1.9.tgz", - "integrity": "sha512-OmZrD1uArNx+1MPrXck39zsa76k/H7QYOOAg/Uz9xpLGJPUsvW0pXRSE9NN7LRid6IuM/WpY3VWkD5DPusY4cA==", + "node_modules/serverless/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "requires": { - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "lodash": "^4.17.11" + "dependencies": { + "lru-cache": "^6.0.0" }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serverless/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "set-blocking": { + "node_modules/serverless/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/serverless/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/serverless/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { + "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "setimmediate": { + "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, - "shebang-command": { + "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "shellwords": { + "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true, "optional": true }, - "shimmer": { + "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, - "shortid": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", - "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, - "requires": { - "nanoid": "^2.1.0" + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "optional": true - }, - "simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dev": true, - "optional": true, - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-git": { - "version": "2.39.1", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.39.1.tgz", - "integrity": "sha512-+kEAkyQHsWejYxQNCzTrjvCxJOcijpB49RSs7HV+TK9B9prUq7YBNpFstQvjfGBn4Hecywp4tm+breGGGHlHwA==", + "node_modules/simple-git": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.1.tgz", + "integrity": "sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==", "dev": true, - "requires": { + "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.1" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" + "debug": "^4.3.4" }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" } }, - "sinon": { + "node_modules/sinon": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", "dev": true, - "requires": { + "dependencies": { "@sinonjs/commons": "^1.4.0", "@sinonjs/formatio": "^3.2.1", "@sinonjs/samsam": "^3.3.3", @@ -15312,33 +17934,37 @@ "lolex": "^4.2.0", "nise": "^1.5.2", "supports-color": "^5.5.0" - }, - "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - } } }, - "sisteransi": { + "node_modules/sinon/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } }, - "snapdragon": { + "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "requires": { + "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", @@ -15348,231 +17974,183 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-node": { + "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-util": { + "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.2.0" }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "engines": { + "node": ">=0.10.0" } }, - "snappy": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/snappy/-/snappy-6.3.5.tgz", - "integrity": "sha512-lonrUtdp1b1uDn1dbwgQbBsb5BbaiLeKq+AGwOk2No+en+VvJThwmtztwulEQsLinRF681pBqib0NUZaizKLIA==", + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.3.1", - "nan": "^2.14.1", - "prebuild-install": "5.3.0" + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "ms": "2.0.0" } }, - "socket.io-parser": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.3.tgz", - "integrity": "sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==", + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" + "dependencies": { + "is-descriptor": "^0.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sort-keys": { + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", "dev": true, - "requires": { + "dependencies": { "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sort-keys-length": { + "node_modules/sort-keys-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", "dev": true, - "requires": { + "dependencies": { "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sorted-array-functions": { + "node_modules/sorted-array-functions": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", "dev": true }, - "source-map": { + "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { + "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "requires": { + "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", @@ -15580,345 +18158,403 @@ "urix": "^0.1.0" } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "requires": { + "dev": true, + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, - "source-map-url": { + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { + "dev": true, + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { + "dev": true, + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true }, - "split-ca": { + "node_modules/split-ca": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY=" }, - "split-string": { + "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "split2": { + "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "requires": { + "dev": true, + "dependencies": { "readable-stream": "^3.0.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sprintf-kit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.0.tgz", - "integrity": "sha512-/0d2YTn8ZFVpIPAU230S9ZLF8WDkSSRWvh/UOLM7zzvkCchum1TtouRgyV8OfgOaYilSGU4lSSqzwBXJVlAwUw==", + "node_modules/sprintf-kit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz", + "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==", "dev": true, - "requires": { - "es5-ext": "^0.10.46" + "dependencies": { + "es5-ext": "^0.10.53" } }, - "sqlstring": { + "node_modules/sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", + "engines": { + "node": ">= 0.6" + } }, - "ssh-remote-port-forward": { + "node_modules/ssh-remote-port-forward": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", - "requires": { + "dependencies": { "@types/ssh2": "^0.5.48", "ssh2": "^1.4.0" - }, + } + }, + "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { + "version": "0.5.52", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", + "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", "dependencies": { - "@types/ssh2": { - "version": "0.5.52", - "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", - "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", - "requires": { - "@types/node": "*", - "@types/ssh2-streams": "*" - } - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, - "ssh2": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", - "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", - "requires": { - "asn1": "^0.2.4", - "bcrypt-pbkdf": "^1.0.2", - "cpu-features": "~0.0.4", - "nan": "^2.16.0" - } - } + "@types/node": "*", + "@types/ssh2-streams": "*" + } + }, + "node_modules/ssh-remote-port-forward/node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/ssh-remote-port-forward/node_modules/ssh2": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.4", + "nan": "^2.16.0" } }, - "stack-trace": { + "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "engines": { + "node": "*" + } }, - "stack-utils": { + "node_modules/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^2.0.0" }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" } }, - "static-extend": { + "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, - "requires": { + "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "dev": true, + "engines": { + "node": ">= 0.10.0" } }, - "stream-promise": { + "node_modules/stream-promise": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-promise/-/stream-promise-3.2.0.tgz", "integrity": "sha512-P+7muTGs2C8yRcgJw/PPt61q7O517tDHiwYEzMWo1GSBCcZedUMT/clz7vUNsSxFphIlJ6QUL4GexQKlfJoVtA==", "dev": true, - "requires": { + "dependencies": { "2-thenable": "^1.0.0", "es5-ext": "^0.10.49", "is-stream": "^1.1.0" } }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "stream-to-array": { + "node_modules/stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", - "requires": { + "dependencies": { "any-promise": "^1.1.0" } }, - "string-length": { + "node_modules/string_decoder": { + "version": "1.1.1", + "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" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "requires": { + "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "engines": { + "node": ">=10" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "string.prototype.trimend": { + "node_modules/string.prototype.trimend": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "string.prototype.trimstart": { + "node_modules/string.prototype.trimstart": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - } + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-dirs": { + "node_modules/strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, - "requires": { + "dependencies": { "is-natural-number": "^4.0.1" } }, - "strip-eof": { + "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "strip-indent": { + "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { + "dev": true, + "dependencies": { "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "strip-outer": { + "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "strnum": { + "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "dev": true }, - "superagent": { + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/superagent": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, - "requires": { + "dependencies": { "component-emitter": "^1.2.0", "cookiejar": "^2.1.0", "debug": "^3.1.0", @@ -15930,329 +18566,191 @@ "qs": "^6.5.1", "readable-stream": "^2.3.5" }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "ms": "^2.1.1" } }, - "supports-color": { + "node_modules/superagent/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/superagent/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { + "dev": true, + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "supports-hyperlinks": { + "node_modules/supports-hyperlinks": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "symbol-tree": { + "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "tabtab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, - "requires": { - "debug": "^4.0.1", - "es6-promisify": "^6.0.0", - "inquirer": "^6.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "untildify": "^3.0.3" - }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - }, - "untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "dev": true - } - } - }, - "tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dev": true, - "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, - "dependencies": { - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "tar-fs": { + "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { + "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, - "tar-stream": { + "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { + "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" } }, - "tencent-serverless-http": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/tencent-serverless-http/-/tencent-serverless-http-1.3.2.tgz", - "integrity": "sha512-HgIu9HuBdY0lx3jLKuicOSOrjmieklPh55x8ZmtuTnrZ5v1buAPUfLKBhTeBSz6e90ggyW+dPr5PWdz179kUkw==", + "node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "requires": { - "type-is": "^1.6.16" + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "terminal-link": { + "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, - "requires": { + "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "test-exclude": { + "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "requires": { + "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "testcontainers": { + "node_modules/testcontainers": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-7.6.2.tgz", "integrity": "sha512-mRjshuowSLPiNSp+ogPMe1UcWlD8T/KCasmDRSmJIQWG8j2ifPnBkbU8Atw8Ot1ARN9K0d6F59zs0+LO1LlIrw==", - "requires": { + "dependencies": { "@types/archiver": "^5.1.0", "@types/dockerode": "^3.2.1", "archiver": "^5.2.0", @@ -16268,173 +18766,258 @@ "tar-fs": "^2.1.1" } }, - "text-extensions": { + "node_modules/text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==" - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "throat": { + "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, - "timers-ext": { + "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", "dev": true, - "requires": { + "dependencies": { "es5-ext": "~0.10.46", "next-tick": "1" } }, - "tmp": { + "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "requires": { + "dependencies": { "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "tmpl": { + "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-buffer": { + "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-object-path": { + "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-readable-stream": { + "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "to-regex": { + "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, - "requires": { + "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/token-types/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" } }, - "tr46": { + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, - "requires": { + "dependencies": { "punycode": "^2.1.1" }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "traverse": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", - "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", - "dev": true + "node_modules/tr46/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "trim-newlines": { + "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" - }, - "trim-off-newlines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", - "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==" + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "trim-repeated": { + "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, - "requires": { + "dependencies": { "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", - "dev": true - }, - "ts-jest": { + "node_modules/ts-jest": { "version": "26.5.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.1.tgz", "integrity": "sha512-G7Rmo3OJMvlqE79amJX8VJKDiRcd7/r61wh9fnvvG8cAjhA9edklGw/dCxRSQmfZ/z8NDums5srSVgwZos1qfg==", "dev": true, - "requires": { + "dependencies": { "@types/jest": "26.x", "bs-logger": "0.x", "buffer-from": "1.x", @@ -16447,72 +19030,123 @@ "semver": "7.x", "yargs-parser": "20.x" }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "jest": ">=26 <27", + "typescript": ">=3.8 <5.0" + } + }, + "node_modules/ts-jest/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "requires": { + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "20.2.7", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "ts-node-register": { + "node_modules/ts-node-register": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ts-node-register/-/ts-node-register-1.0.0.tgz", "integrity": "sha512-0i5qFowh0t1phylWB0Y0l6+K2bv1He0ncYhM+jLSzOWGYM37qjDQJQV5yER63+97q7VFETC5mkPXZH+4JgZlng==", - "requires": { + "dependencies": { "ts-node": ">=0.9.0" } }, - "tslib": { + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "tslint": { + "node_modules/tslint": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz", "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==", "dev": true, - "requires": { + "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", @@ -16527,224 +19161,286 @@ "tslib": "^1.8.0", "tsutils": "^2.29.0" }, - "dependencies": { - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - } + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" } }, - "tslint-no-unused-expression-chai": { + "node_modules/tslint-no-unused-expression-chai": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/tslint-no-unused-expression-chai/-/tslint-no-unused-expression-chai-0.1.4.tgz", "integrity": "sha512-frEWKNTcq7VsaWKgUxMDOB2N/cmQadVkUtUGIut+2K4nv/uFXPfgJyPjuNC/cHyfUVqIkHMAvHOCL+d/McU3nQ==", "dev": true, - "requires": { + "dependencies": { "tsutils": "^3.0.0" }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "tslint": ">=5.1.0" + } + }, + "node_modules/tslint-no-unused-expression-chai/node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, "dependencies": { - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tslint/node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "tsutils": { + "node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { + "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true }, - "type-check": { + "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "engines": { + "node": ">=8" } }, - "typedarray-to-buffer": { + "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "requires": { + "dependencies": { "is-typedarray": "^1.0.0" } }, - "typescript": { + "node_modules/typescript": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } }, - "unbox-primitive": { + "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", "has-symbols": "^1.0.2", "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "node_modules/uni-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", + "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - }, "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } + "type": "^2.5.0" } }, - "union-value": { + "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "unique-string": { + "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "requires": { + "dependencies": { "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "universalify": { + "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4.0.0" + } }, - "unset-value": { + "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "requires": { + "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "untildify": { + "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "update-notifier": { + "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "dev": true, - "requires": { + "dependencies": { "boxen": "^5.0.0", "chalk": "^4.1.0", "configstore": "^5.0.1", @@ -16760,149 +19456,168 @@ "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/update-notifier/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "uri-js": { + "node_modules/update-notifier/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { - "punycode": "^2.1.0" - }, "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } + "punycode": "^2.1.0" } }, - "urix": { + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "url": { + "node_modules/url": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { + "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, - "url-parse": { + "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "requires": { + "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, - "url-parse-lax": { + "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "dev": true, - "requires": { + "dependencies": { "prepend-http": "^2.0.0" - } - }, - "urlencode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/urlencode/-/urlencode-1.1.0.tgz", - "integrity": "sha1-HyuibwE8hfATP3o61v8nMK33y7c=", - "dev": true, - "requires": { - "iconv-lite": "~0.4.11" }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "engines": { + "node": ">=4" } }, - "use": { + "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "util": { + "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", @@ -16910,478 +19625,529 @@ "which-typed-array": "^1.1.2" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "uuid": { + "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, - "v8-to-istanbul": { + "node_modules/v8-to-istanbul": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz", "integrity": "sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==", "dev": true, - "requires": { + "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", "source-map": "^0.7.3" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" } }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { + "dev": true, + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "vandium-utils": { + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vandium-utils": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vandium-utils/-/vandium-utils-1.2.0.tgz", "integrity": "sha1-RHNd5LdkGgXeWevpRfF05YLbT1k=", "dev": true }, - "velocityjs": { + "node_modules/velocityjs": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/velocityjs/-/velocityjs-2.0.3.tgz", "integrity": "sha512-sUkygY7HwvbKZvS3naiI7t2o4RTqui6efSwTXLb03igdvPKm3SwCpnqA2kU4/jLD2f0eHB9xPoiza9XAkpuU+g==", - "dev": true + "dev": true, + "bin": { + "velocity": "bin/velocity" + }, + "engines": { + "node": ">=0.8.0" + } }, - "w3c-hr-time": { + "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, - "requires": { + "dependencies": { "browser-process-hrtime": "^1.0.0" } }, - "w3c-xmlserializer": { + "node_modules/w3c-xmlserializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, - "requires": { + "dependencies": { "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" } }, - "walker": { + "node_modules/walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, - "requires": { + "dependencies": { "makeerror": "1.0.x" } }, - "watchpack": { + "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "requires": { + "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/watchpack/node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "dependencies": { - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - } + "defaults": "^1.0.3" } }, - "webidl-conversions": { + "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.4" + } }, - "whatwg-encoding": { + "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", "dev": true, - "requires": { + "dependencies": { "iconv-lite": "0.4.24" - }, + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "whatwg-mimetype": { + "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, - "whatwg-url": { + "node_modules/whatwg-url": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.5.0.tgz", "integrity": "sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==", "dev": true, - "requires": { + "dependencies": { "lodash": "^4.7.0", "tr46": "^2.0.2", "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" } }, - "which": { + "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "which-boxed-primitive": { + "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "requires": { + "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", - "dev": true, - "optional": true - }, - "which-typed-array": { + "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { + "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "widest-line": { + "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, - "requires": { + "dependencies": { "string-width": "^4.0.0" }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "engines": { + "node": ">=8" } }, - "winston": { + "node_modules/winston": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", "integrity": "sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A==", - "requires": { + "dependencies": { "async": "~1.0.0", "colors": "1.0.x", "cycle": "1.0.x", "eyes": "0.1.x", "isstream": "0.1.x", "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.10.0" } }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "dev": true, - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "wrappy": { + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { + "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "requires": { + "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, - "xdg-basedir": { + "node_modules/xdg-basedir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "xml": { + "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, - "xml-name-validator": { + "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } }, - "xmlchars": { + "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", - "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", - "dev": true - }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "yaml": { + "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } }, - "yaml-ast-parser": { + "node_modules/yaml-ast-parser": { "version": "0.0.43", "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", "dev": true }, - "yamljs": { + "node_modules/yamljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", "dev": true, - "requires": { + "dependencies": { "argparse": "^1.0.7", "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" } }, - "yauzl": { + "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, - "requires": { + "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "zip-stream": { + "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "requires": { + "dependencies": { "archiver-utils": "^2.1.0", "compress-commons": "^4.1.0", "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" } } } diff --git a/package.json b/package.json index 792c8b8..ecdc623 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Update Store Microservice", "main": "handler.js", "engines": { - "node": "14.*", - "npm": "5.6.0" + "node": "18.*", + "npm": "9.*" }, "repository": { "type": "git", @@ -25,7 +25,7 @@ "prettier": "prettier --write ./**/*.{js,ts}", "prepush": "npm test && npm run build && npm run test-local-i", "sonar-scanner": "sonar-scanner", - "audit": "npm audit --production", + "audit": "npm audit --omit=dev", "package": "mkdir -p ${ZIP_NAME} && cp package.json package-lock.json ${ZIP_NAME}/ && cp -r .build/src/* ${ZIP_NAME}/ && cd ${ZIP_NAME} && npm ci --production && rm package.json package-lock.json && zip -qr ../${ZIP_NAME}.zip .", "security-checks": "git secrets --register-aws && git secrets --scan", "tools-setup": "liquibase --changeLogFile ../cvs-nop/changelog-master.xml --username root --password 12345 --url jdbc:mysql://127.0.0.1:3306/CVSBNOP?createDatabaseIfNotExist=true --classpath /liquibase/lib/mysql.jar update" @@ -54,9 +54,8 @@ "dependencies": { "@types/lambda-tester": "3.6.0", "aws-lambda": "1.0.6", - "aws-sdk": "2.1281.0", + "aws-sdk": "2.1354.0", "aws-xray-sdk": "2.5.0", - "commitlint": "12.1.1", "date-fns": "2.21.2", "liquibase": "1.0.1", "moment": "2.29.4", @@ -82,12 +81,13 @@ "audit-filter": "0.5.0", "aws-lambda-mock-context": "3.2.1", "cross-env": "7.0.3", + "commitlint": "17.0.0", "husky": "3.0.9", "jest": "26.0.0", "jest-plugin-context": "2.9.0", "jest-sonar-reporter": "2.0.0", "lambda-tester": "3.5.0", - "serverless": "2.45.2", + "serverless": "3.33.0", "serverless-offline": "6.9.0", "serverless-plugin-tracing": "2.0.0", "serverless-plugin-typescript": "1.1.9", diff --git a/serverless.yml b/serverless.yml index 49c0969..d38120e 100644 --- a/serverless.yml +++ b/serverless.yml @@ -2,7 +2,7 @@ service: cvs-tsk-update-store provider: name: aws - runtime: nodejs10.x + runtime: nodejs18.x tracing: lambda: "true" lambdaHashingVersion: 20201221 @@ -25,9 +25,9 @@ functions: main: handler: src/handler.handler events: - - sqs: - arn: arn:aws:sqs:region:XXXXXX:update-store-q - batchSize: 10 + - sqs: + arn: arn:aws:sqs:region:XXXXXX:update-store-q + batchSize: 10 custom: serverless-offline: diff --git a/sonar-project.properties b/sonar-project.properties index 6ee8987..586da52 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,18 +1,19 @@ -sonar.host.url=http://localhost:9000 # must be unique in a given SonarQube instance sonar.projectKey=org.sonarqube:cvs-tsk-update-store # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1. sonar.projectName=cvs-tsk-update-store -sonar.projectVersion=1.0 -# Path is relative to the sonar-project.properties file. Replace “\” by “/” on Windows. -# This property is optional if sonar.modules is set. -sonar.sources=src +sonar.host.url=http://localhost:9000 -sonar.exclusions=.build, src/models/** +sonar.projectVersion=1.0 +sonar.sourceEncoding=UTF-8 +sonar.sources=src +sonar.exclusions=tests/*, .nyc_output/*, .scannerwork/*, coverage/*, *.d.ts, .build, cvs-nop, src/models/** +sonar.ts.tslint.configPath=tslint.json +sonar.ts.tslint.outputPath=.reports/lint_issues.json sonar.ts.tslintconfigpath=tslint.json -sonar.typescript.lcov.reportPaths=coverage/lcov.info -sonar.sourceEncoding=UTF-8 +sonar.tslint.reportPaths=.reports/lint_issues.json +sonar.typescript.lcov.reportPaths=coverage/lcov.info \ No newline at end of file diff --git a/src/functions/process-stream-event.ts b/src/functions/process-stream-event.ts index f8fde0b..cf7ade1 100644 --- a/src/functions/process-stream-event.ts +++ b/src/functions/process-stream-event.ts @@ -1,9 +1,16 @@ -import {Context, DynamoDBRecord, DynamoDBStreamEvent, Handler, SQSEvent, StreamRecord} from "aws-lambda"; -import {convert} from "../services/entity-conversion"; -import {DynamoDbImage} from "../services/dynamodb-images"; -import {deriveSqlOperation, SqlOperation} from "../services/sql-operations"; -import {destroyConnectionPool} from "../services/connection-pool"; -import {debugLog} from "../services/logger"; +import { + Context, + DynamoDBRecord, + DynamoDBStreamEvent, + Handler, + SQSEvent, + StreamRecord, +} from "aws-lambda"; +import { convert } from "../services/entity-conversion"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { deriveSqlOperation, SqlOperation } from "../services/sql-operations"; +import { destroyConnectionPool } from "../services/connection-pool"; +import { debugLog } from "../services/logger"; import { BatchItemFailuresResponse } from "../models/batch-item-failure-response"; /** @@ -11,119 +18,144 @@ import { BatchItemFailuresResponse } from "../models/batch-item-failure-response * @param event - DynamoDB stream event, containing DynamoDB document image * @param context - λ context */ -export const processStreamEvent: Handler = async (event: SQSEvent, context: Context): Promise => { - const res: BatchItemFailuresResponse = { - batchItemFailures: [], - }; +export const processStreamEvent: Handler = async ( + event: SQSEvent, + context: Context +): Promise => { + const res: BatchItemFailuresResponse = { + batchItemFailures: [], + }; - try { - debugLog("Received SQS event: ", event); + try { + debugLog("Received SQS event: ", event); - validateEvent(event); + validateEvent(event); - const region = process.env.AWS_REGION; + const region = process.env.AWS_REGION; - if (!region) { - console.error("AWS_REGION envvar not available"); - return; - } + if (!region) { + console.error("AWS_REGION envvar not available"); + return; + } - debugLog(`Received valid SQS event (${event.Records.length} records)`); + debugLog(`Received valid SQS event (${event.Records.length} records)`); - for await (const record of event.Records) { - const id = record.messageId; - const dynamoRecord: DynamoDBRecord = JSON.parse(record.body) as DynamoDBRecord; + for await (const record of event.Records) { + const id = record.messageId; + const dynamoRecord: DynamoDBRecord = JSON.parse( + record.body + ) as DynamoDBRecord; - debugLog("Original DynamoDB stream event body (parsed): ", dynamoRecord); + debugLog("Original DynamoDB stream event body (parsed): ", dynamoRecord); - validateRecord(dynamoRecord); + validateRecord(dynamoRecord); - // parse source ARN - const tableName: string = getTableNameFromArn(dynamoRecord.eventSourceARN!); + // parse source ARN + const tableName: string = getTableNameFromArn( + dynamoRecord.eventSourceARN! + ); - // is this an INSERT, UPDATE, or DELETE? - const operationType: SqlOperation = deriveSqlOperation(dynamoRecord.eventName!); + // is this an INSERT, UPDATE, or DELETE? + const operationType: SqlOperation = deriveSqlOperation( + dynamoRecord.eventName! + ); - // parse native DynamoDB format to usable TS map - const image: DynamoDbImage = selectImage(operationType, dynamoRecord.dynamodb!); + // parse native DynamoDB format to usable TS map + const image: DynamoDbImage = selectImage( + operationType, + dynamoRecord.dynamodb! + ); - debugLog("Dynamo image dump:", image); + debugLog("Dynamo image dump:", image); - try { - debugLog(`DynamoDB ---> Aurora | START (event ID: ${dynamoRecord.eventID})`); + try { + debugLog( + `DynamoDB ---> Aurora | START (event ID: ${dynamoRecord.eventID})` + ); - await convert(tableName, operationType, image); + await convert(tableName, operationType, image); - debugLog(`DynamoDB ---> Aurora | END (event ID: ${dynamoRecord.eventID})`); - } catch (err) { - console.error("Couldn't convert DynamoDB entity to Aurora, will return record to SQS for retry", [ `messageId: ${id}`, err ]); - res.batchItemFailures.push({ itemIdentifier: id }); - dumpArguments(event, context); - } - } - } catch (err) { - console.error("An error unrelated to Dynamo-to-Aurora conversion has occurred, event will not be retried", err); + debugLog( + `DynamoDB ---> Aurora | END (event ID: ${dynamoRecord.eventID})` + ); + } catch (err) { + console.error( + "Couldn't convert DynamoDB entity to Aurora, will return record to SQS for retry", + [`messageId: ${id}`, err] + ); + res.batchItemFailures.push({ itemIdentifier: id }); dumpArguments(event, context); - await destroyConnectionPool(); + } } - return res; + } catch (err) { + console.error( + "An error unrelated to Dynamo-to-Aurora conversion has occurred, event will not be retried", + err + ); + dumpArguments(event, context); + await destroyConnectionPool(); + } + return res; }; export const getTableNameFromArn = (eventSourceArn: string): string => { - return eventSourceArn.split(":")[5].split("/")[1]; + return eventSourceArn.split(":")[5].split("/")[1]; }; -const selectImage = (operationType: SqlOperation, streamRecord: StreamRecord): DynamoDbImage => { - switch (operationType) { - case "INSERT": - case "UPDATE": - if (!streamRecord.NewImage) { - throw new Error("'dynamodb' object missing required field 'NewImage'"); - } - debugLog(`operation type '${operationType}', selecting image 'NewImage'`); - return DynamoDbImage.parse(streamRecord.NewImage!); - case "DELETE": - if (!streamRecord.OldImage) { - throw new Error("'dynamodb' object missing required field 'OldImage'"); - } - debugLog(`operation type '${operationType}', selecting image 'OldImage'`); - return DynamoDbImage.parse(streamRecord.OldImage!); - } +const selectImage = ( + operationType: SqlOperation, + streamRecord: StreamRecord +): DynamoDbImage => { + switch (operationType) { + case "INSERT": + case "UPDATE": + if (!streamRecord.NewImage) { + throw new Error("'dynamodb' object missing required field 'NewImage'"); + } + debugLog(`operation type '${operationType}', selecting image 'NewImage'`); + return DynamoDbImage.parse(streamRecord.NewImage!); + case "DELETE": + if (!streamRecord.OldImage) { + throw new Error("'dynamodb' object missing required field 'OldImage'"); + } + debugLog(`operation type '${operationType}', selecting image 'OldImage'`); + return DynamoDbImage.parse(streamRecord.OldImage!); + } }; const validateEvent = (event: DynamoDBStreamEvent): void => { - if (!event) { - throw new Error("event is null or undefined"); - } + if (!event) { + throw new Error("event is null or undefined"); + } - if (!event.Records) { - throw new Error("event missing required field 'Records'"); - } + if (!event.Records) { + throw new Error("event missing required field 'Records'"); + } - if (!Array.isArray(event.Records)) { - throw new Error("event.Records is not an array"); - } + if (!Array.isArray(event.Records)) { + throw new Error("event.Records is not an array"); + } }; const validateRecord = (record: DynamoDBRecord): void => { - if (!record) { - throw new Error("record is null or undefined"); - } + if (!record) { + throw new Error("record is null or undefined"); + } - if (!record.eventName) { - throw new Error("record is missing required field \'eventName\'"); - } + if (!record.eventName) { + throw new Error("record is missing required field 'eventName'"); + } - if (!record.dynamodb) { - throw new Error("record is missing required field \'dynamodb\'"); - } + if (!record.dynamodb) { + throw new Error("record is missing required field 'dynamodb'"); + } - if (!record.eventSourceARN) { - throw new Error("record is missing required field \'eventSourceARN\'"); - } + if (!record.eventSourceARN) { + throw new Error("record is missing required field 'eventSourceARN'"); + } }; const dumpArguments = (event: DynamoDBStreamEvent, context: Context): void => { - console.error("Event dump : ", JSON.stringify(event)); - console.error("Context dump: ", JSON.stringify(context)); + console.error("Event dump : ", JSON.stringify(event)); + console.error("Context dump: ", JSON.stringify(context)); }; diff --git a/src/models/adr-details.ts b/src/models/adr-details.ts index 9ef4d92..7767fee 100644 --- a/src/models/adr-details.ts +++ b/src/models/adr-details.ts @@ -1,73 +1,73 @@ -import {DynamoDbImage, parseStringArray} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage, parseStringArray } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface AdrDetails { - vehicleDetails?: VehicleDetails; - listStatementApplicable?: boolean; - batteryListNumber?: string; - declarationsSeen?: boolean; - brakeDeclarationsSeen?: boolean; - brakeDeclarationIssuer?: string; - brakeEndurance?: boolean; - weight?: string; - compatibilityGroupJ?: boolean; - documents?: string[]; - permittedDangerousGoods?: string[]; - additionalExaminerNotes?: string; - applicantDetails?: ApplicantDetails; - memosApply?: string[]; - additionalNotes?: AdditionalNotes; - adrTypeApprovalNo?: string; - adrCertificateNotes?: string; - tank?: Tank; + vehicleDetails?: VehicleDetails; + listStatementApplicable?: boolean; + batteryListNumber?: string; + declarationsSeen?: boolean; + brakeDeclarationsSeen?: boolean; + brakeDeclarationIssuer?: string; + brakeEndurance?: boolean; + weight?: string; + compatibilityGroupJ?: boolean; + documents?: string[]; + permittedDangerousGoods?: string[]; + additionalExaminerNotes?: string; + applicantDetails?: ApplicantDetails; + memosApply?: string[]; + additionalNotes?: AdditionalNotes; + adrTypeApprovalNo?: string; + adrCertificateNotes?: string; + tank?: Tank; } export interface VehicleDetails { - type?: string; - approvalDate?: string; + type?: string; + approvalDate?: string; } export interface ApplicantDetails { - name?: string; - street?: string; - town?: string; - city?: string; - postcode?: string; + name?: string; + street?: string; + town?: string; + city?: string; + postcode?: string; } export interface AdditionalNotes { - number?: string[]; - guidanceNotes?: string[]; + number?: string[]; + guidanceNotes?: string[]; } export interface Tank { - tankDetails?: TankDetails; - tankStatement?: TankStatement; + tankDetails?: TankDetails; + tankStatement?: TankStatement; } export interface TankDetails { - tankManufacturer?: string; - yearOfManufacture?: number; - tankCode?: string; - specialProvisions?: string; - tankManufacturerSerialNo?: string; - tankTypeAppNo?: string; - tc2Details?: Tc2Details; - tc3Details?: Tc3Details; + tankManufacturer?: string; + yearOfManufacture?: number; + tankCode?: string; + specialProvisions?: string; + tankManufacturerSerialNo?: string; + tankTypeAppNo?: string; + tc2Details?: Tc2Details; + tc3Details?: Tc3Details; } export interface TankStatement { - substancesPermitted?: string; - statement?: string; - productListRefNo?: string; - productListUnNo?: string[]; - productList?: string; + substancesPermitted?: string; + statement?: string; + productListRefNo?: string; + productListUnNo?: string[]; + productList?: string; } export interface Tc2Details { - tc2Type?: Tc2Type; - tc2IntermediateApprovalNo?: string; - tc2IntermediateExpiryDate?: string; + tc2Type?: Tc2Type; + tc2IntermediateApprovalNo?: string; + tc2IntermediateExpiryDate?: string; } export type Tc2Type = "initial"; @@ -75,105 +75,129 @@ export type Tc2Type = "initial"; export type Tc3Details = Tc3DetailsItem[]; export interface Tc3DetailsItem { - tc3Type?: Tc3Type; - tc3PeriodicNumber?: string; - tc3PeriodicExpiryDate?: string; + tc3Type?: Tc3Type; + tc3PeriodicNumber?: string; + tc3PeriodicExpiryDate?: string; } export type Tc3Type = "intermediate" | "periodic" | "exceptional"; -export const parseAdrDetails = (adrDetails?: DynamoDbImage): Maybe => { - if (!adrDetails) { - return undefined; - } - - const additionalNotesImage: DynamoDbImage = adrDetails.getMap("additionalNotes")!; - const additionalNotes: AdditionalNotes = { - number: parseStringArray(additionalNotesImage.getList("number")), - guidanceNotes: parseStringArray(additionalNotesImage.getList("guidanceNotes")) - }; - - const applicantDetailsImage: DynamoDbImage = adrDetails.getMap("applicantDetails")!; - const applicantDetails: ApplicantDetails = { - name: applicantDetailsImage.getString("name"), - street: applicantDetailsImage.getString("street"), - town: applicantDetailsImage.getString("town"), - city: applicantDetailsImage.getString("city"), - postcode: applicantDetailsImage.getString("postcode"), - }; - - const vehicleDetailsImage: DynamoDbImage = adrDetails.getMap("vehicleDetails")!; - const vehicleDetails: VehicleDetails = { - type: vehicleDetailsImage.getString("type"), - approvalDate: vehicleDetailsImage.getString("approvalDate") - }; - - const tankImage: DynamoDbImage = adrDetails.getMap("tank")!; - - const tankDetailsImage = tankImage.getMap("tankDetails")!; - - const tc2DetailsImage: DynamoDbImage = tankDetailsImage.getMap("tc2Details")!; - const tc2Details: Tc2Details = { - tc2Type: tc2DetailsImage.getString("tc2Type") as Tc2Type, - tc2IntermediateApprovalNo: tc2DetailsImage.getString("tc2IntermediateApprovalNo"), - tc2IntermediateExpiryDate: tc2DetailsImage.getString("tc2IntermediateExpiryDate") - }; - - const tc3DetailsImage: DynamoDbImage = tankDetailsImage.getList("tc3Details")!; - const tc3Details: Tc3Details = []; - - for (const key of tc3DetailsImage.getKeys()) { - const tc3DetailsItemImage = tc3DetailsImage.getMap(key)!; - tc3Details.push({ - tc3Type: tc3DetailsItemImage.getString("tc3Type") as Tc3Type, - tc3PeriodicNumber: tc3DetailsItemImage.getString("tc3PeriodicNumber"), - tc3PeriodicExpiryDate: tc3DetailsItemImage.getString("tc3PeriodicExpiryDate") - }); - } - - const tankDetails: TankDetails = { - tankManufacturer: tankDetailsImage.getString("tankManufacturer"), - yearOfManufacture: 0, - tankCode: tankDetailsImage.getString("tankCode"), - specialProvisions: tankDetailsImage.getString("specialProvisions"), - tankManufacturerSerialNo: tankDetailsImage.getString("tankManufacturerSerialNo"), - tankTypeAppNo: tankDetailsImage.getString("tankTypeAppNo"), - tc2Details, - tc3Details - }; - - const tankStatementImage: DynamoDbImage = tankImage.getMap("tankStatement")!; - const tankStatement: TankStatement = { - substancesPermitted: tankStatementImage.getString("substancesPermitted"), - statement: tankStatementImage.getString("statement"), - productListRefNo: tankStatementImage.getString("productListRefNo"), - productListUnNo: parseStringArray(tankStatementImage.getList("productListUnNo")), - productList: tankStatementImage.getString("productList") - }; - - const tank: Tank = { - tankDetails, - tankStatement - }; - - return { - vehicleDetails, - listStatementApplicable: adrDetails.getBoolean("listStatementApplicable"), - batteryListNumber: adrDetails.getString("batteryListNumber"), - declarationsSeen: adrDetails.getBoolean("declarationsSeen"), - brakeDeclarationsSeen: adrDetails.getBoolean("brakeDeclarationsSeen"), - brakeDeclarationIssuer: adrDetails.getString("brakeDeclarationIssuer"), - brakeEndurance: adrDetails.getBoolean("brakeEndurance"), - weight: adrDetails.getString("weight"), - compatibilityGroupJ: adrDetails.getBoolean("compatibilityGroupJ"), - documents: parseStringArray(adrDetails.getList("documents")), - permittedDangerousGoods: parseStringArray(adrDetails.getList("permittedDangerousGoods")), - additionalExaminerNotes: adrDetails.getString("additionalExaminerNotes"), - applicantDetails, - memosApply: parseStringArray(adrDetails.getList("memosApply")), - additionalNotes, - adrTypeApprovalNo: adrDetails.getString("adrTypeApprovalNo"), - adrCertificateNotes: adrDetails.getString("adrCertificateNotes"), - tank - }; +export const parseAdrDetails = ( + adrDetails?: DynamoDbImage +): Maybe => { + if (!adrDetails) { + return undefined; + } + + const additionalNotesImage: DynamoDbImage = adrDetails.getMap( + "additionalNotes" + )!; + const additionalNotes: AdditionalNotes = { + number: parseStringArray(additionalNotesImage.getList("number")), + guidanceNotes: parseStringArray( + additionalNotesImage.getList("guidanceNotes") + ), + }; + + const applicantDetailsImage: DynamoDbImage = adrDetails.getMap( + "applicantDetails" + )!; + const applicantDetails: ApplicantDetails = { + name: applicantDetailsImage.getString("name"), + street: applicantDetailsImage.getString("street"), + town: applicantDetailsImage.getString("town"), + city: applicantDetailsImage.getString("city"), + postcode: applicantDetailsImage.getString("postcode"), + }; + + const vehicleDetailsImage: DynamoDbImage = adrDetails.getMap( + "vehicleDetails" + )!; + const vehicleDetails: VehicleDetails = { + type: vehicleDetailsImage.getString("type"), + approvalDate: vehicleDetailsImage.getString("approvalDate"), + }; + + const tankImage: DynamoDbImage = adrDetails.getMap("tank")!; + + const tankDetailsImage = tankImage.getMap("tankDetails")!; + + const tc2DetailsImage: DynamoDbImage = tankDetailsImage.getMap("tc2Details")!; + const tc2Details: Tc2Details = { + tc2Type: tc2DetailsImage.getString("tc2Type") as Tc2Type, + tc2IntermediateApprovalNo: tc2DetailsImage.getString( + "tc2IntermediateApprovalNo" + ), + tc2IntermediateExpiryDate: tc2DetailsImage.getString( + "tc2IntermediateExpiryDate" + ), + }; + + const tc3DetailsImage: DynamoDbImage = tankDetailsImage.getList( + "tc3Details" + )!; + const tc3Details: Tc3Details = []; + + for (const key of tc3DetailsImage.getKeys()) { + const tc3DetailsItemImage = tc3DetailsImage.getMap(key)!; + tc3Details.push({ + tc3Type: tc3DetailsItemImage.getString("tc3Type") as Tc3Type, + tc3PeriodicNumber: tc3DetailsItemImage.getString("tc3PeriodicNumber"), + tc3PeriodicExpiryDate: tc3DetailsItemImage.getString( + "tc3PeriodicExpiryDate" + ), + }); + } + + const tankDetails: TankDetails = { + tankManufacturer: tankDetailsImage.getString("tankManufacturer"), + yearOfManufacture: 0, + tankCode: tankDetailsImage.getString("tankCode"), + specialProvisions: tankDetailsImage.getString("specialProvisions"), + tankManufacturerSerialNo: tankDetailsImage.getString( + "tankManufacturerSerialNo" + ), + tankTypeAppNo: tankDetailsImage.getString("tankTypeAppNo"), + tc2Details, + tc3Details, + }; + + const tankStatementImage: DynamoDbImage = tankImage.getMap("tankStatement")!; + const tankStatement: TankStatement = { + substancesPermitted: tankStatementImage.getString("substancesPermitted"), + statement: tankStatementImage.getString("statement"), + productListRefNo: tankStatementImage.getString("productListRefNo"), + productListUnNo: parseStringArray( + tankStatementImage.getList("productListUnNo") + ), + productList: tankStatementImage.getString("productList"), + }; + + const tank: Tank = { + tankDetails, + tankStatement, + }; + + return { + vehicleDetails, + listStatementApplicable: adrDetails.getBoolean("listStatementApplicable"), + batteryListNumber: adrDetails.getString("batteryListNumber"), + declarationsSeen: adrDetails.getBoolean("declarationsSeen"), + brakeDeclarationsSeen: adrDetails.getBoolean("brakeDeclarationsSeen"), + brakeDeclarationIssuer: adrDetails.getString("brakeDeclarationIssuer"), + brakeEndurance: adrDetails.getBoolean("brakeEndurance"), + weight: adrDetails.getString("weight"), + compatibilityGroupJ: adrDetails.getBoolean("compatibilityGroupJ"), + documents: parseStringArray(adrDetails.getList("documents")), + permittedDangerousGoods: parseStringArray( + adrDetails.getList("permittedDangerousGoods") + ), + additionalExaminerNotes: adrDetails.getString("additionalExaminerNotes"), + applicantDetails, + memosApply: parseStringArray(adrDetails.getList("memosApply")), + additionalNotes, + adrTypeApprovalNo: adrDetails.getString("adrTypeApprovalNo"), + adrCertificateNotes: adrDetails.getString("adrCertificateNotes"), + tank, + }; }; diff --git a/src/models/applicant-details-properties.ts b/src/models/applicant-details-properties.ts index d245b7a..756e481 100644 --- a/src/models/applicant-details-properties.ts +++ b/src/models/applicant-details-properties.ts @@ -1,31 +1,32 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface ApplicantDetailsProperties { - name?: string; - address1?: string; - address2?: string; - postTown?: string; - address3?: string; - postCode?: string; - emailAddress?: string; - telephoneNumber?: string; + name?: string; + address1?: string; + address2?: string; + postTown?: string; + address3?: string; + postCode?: string; + emailAddress?: string; + telephoneNumber?: string; } -export const parseApplicantDetailsProperties = (applicantDetailsProperties?: DynamoDbImage): Maybe => { - if (!applicantDetailsProperties) { - return undefined; - } +export const parseApplicantDetailsProperties = ( + applicantDetailsProperties?: DynamoDbImage +): Maybe => { + if (!applicantDetailsProperties) { + return undefined; + } - return { - name: applicantDetailsProperties.getString("name"), - address1: applicantDetailsProperties.getString("address1"), - address2: applicantDetailsProperties.getString("address2"), - postTown: applicantDetailsProperties.getString("postTown"), - address3: applicantDetailsProperties.getString("address3"), - postCode: applicantDetailsProperties.getString("postCode"), - emailAddress: applicantDetailsProperties.getString("emailAddress"), - telephoneNumber: applicantDetailsProperties.getString("telephoneNumber") - }; + return { + name: applicantDetailsProperties.getString("name"), + address1: applicantDetailsProperties.getString("address1"), + address2: applicantDetailsProperties.getString("address2"), + postTown: applicantDetailsProperties.getString("postTown"), + address3: applicantDetailsProperties.getString("address3"), + postCode: applicantDetailsProperties.getString("postCode"), + emailAddress: applicantDetailsProperties.getString("emailAddress"), + telephoneNumber: applicantDetailsProperties.getString("telephoneNumber"), + }; }; - diff --git a/src/models/auth-into-service.ts b/src/models/auth-into-service.ts index 58b181d..1a0fede 100644 --- a/src/models/auth-into-service.ts +++ b/src/models/auth-into-service.ts @@ -1,28 +1,30 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface AuthIntoService { - cocIssueDate?: string; - dateReceived?: string; - datePending?: string; - dateAuthorised?: string; - dateRejected?: string; + cocIssueDate?: string; + dateReceived?: string; + datePending?: string; + dateAuthorised?: string; + dateRejected?: string; } -export const parseAuthIntoService = (authIntoServiceImage?: DynamoDbImage): Maybe => { - const authIntoService = { - cocIssueDate: authIntoServiceImage?.getString("cocIssueDate"), - dateAuthorised: authIntoServiceImage?.getString("dateAuthorised"), - datePending: authIntoServiceImage?.getString("datePending"), - dateReceived: authIntoServiceImage?.getString("dateReceived"), - dateRejected: authIntoServiceImage?.getString("dateRejected") - }; +export const parseAuthIntoService = ( + authIntoServiceImage?: DynamoDbImage +): Maybe => { + const authIntoService = { + cocIssueDate: authIntoServiceImage?.getString("cocIssueDate"), + dateAuthorised: authIntoServiceImage?.getString("dateAuthorised"), + datePending: authIntoServiceImage?.getString("datePending"), + dateReceived: authIntoServiceImage?.getString("dateReceived"), + dateRejected: authIntoServiceImage?.getString("dateRejected"), + }; - for (const value of Object.values(authIntoService)) { - if (value) { - return authIntoService; - } + for (const value of Object.values(authIntoService)) { + if (value) { + return authIntoService; } + } - return undefined; + return undefined; }; diff --git a/src/models/aws-sm-config.ts b/src/models/aws-sm-config.ts index 664743b..decdec4 100644 --- a/src/models/aws-sm-config.ts +++ b/src/models/aws-sm-config.ts @@ -1,9 +1,9 @@ export interface SecretsManagerConfig { - username: string; - password: string; - engine: string; - host: string; - port: number; - dbname: string; - dbClusterIdentifier: string; + username: string; + password: string; + engine: string; + host: string; + port: number; + dbname: string; + dbClusterIdentifier: string; } diff --git a/src/models/axles.ts b/src/models/axles.ts index ac6d931..d816450 100644 --- a/src/models/axles.ts +++ b/src/models/axles.ts @@ -1,121 +1,133 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export type Axles = Axle[]; export interface Axle { - axleNumber?: number; - parkingBrakeMrk?: boolean; - weights?: AxleWeightProperties; - tyres?: AxleTyreProperties; - brakes?: AxleBrakeProperties; + axleNumber?: number; + parkingBrakeMrk?: boolean; + weights?: AxleWeightProperties; + tyres?: AxleTyreProperties; + brakes?: AxleBrakeProperties; } export interface AxleWeightProperties { - kerbWeight?: number; - ladenWeight?: number; - gbWeight?: number; - eecWeight?: number; - designWeight?: number; + kerbWeight?: number; + ladenWeight?: number; + gbWeight?: number; + eecWeight?: number; + designWeight?: number; } export interface AxleTyreProperties { - tyreSize?: string; - plyRating?: string; - fitmentCode?: FitmentCode; - dataTrAxles?: number; - speedCategorySymbol?: SpeedCategorySymbol; - tyreCode?: number; + tyreSize?: string; + plyRating?: string; + fitmentCode?: FitmentCode; + dataTrAxles?: number; + speedCategorySymbol?: SpeedCategorySymbol; + tyreCode?: number; } export type FitmentCode = "double" | "single"; export type SpeedCategorySymbol = - "a7" - | "a8" - | "b" - | "c" - | "d" - | "e" - | "f" - | "g" - | "j" - | "k" - | "l" - | "m" - | "n" - | "p" - | "q"; + | "a7" + | "a8" + | "b" + | "c" + | "d" + | "e" + | "f" + | "g" + | "j" + | "k" + | "l" + | "m" + | "n" + | "p" + | "q"; export interface AxleBrakeProperties { - brakeActuator?: number; - leverLength?: number; - springBrakeParking?: boolean; + brakeActuator?: number; + leverLength?: number; + springBrakeParking?: boolean; } export const parseAxles = (axlesImage?: DynamoDbImage): Axles => { - if (!axlesImage) { - return [] as Axles; - } + if (!axlesImage) { + return [] as Axles; + } - const axles: Axles = []; + const axles: Axles = []; - for (const key of axlesImage.getKeys()) { - const axleImage = axlesImage.getMap(key)!; + for (const key of axlesImage.getKeys()) { + const axleImage = axlesImage.getMap(key)!; - const weights = parseAxleWeightProperties(axleImage.getMap("weights")); - const tyres = parseAxleTyreProperties(axleImage.getMap("tyres")); - const brakes = parseAxleBrakeProperties(axleImage.getMap("brakes")); + const weights = parseAxleWeightProperties(axleImage.getMap("weights")); + const tyres = parseAxleTyreProperties(axleImage.getMap("tyres")); + const brakes = parseAxleBrakeProperties(axleImage.getMap("brakes")); - axles.push({ - axleNumber: axleImage.getNumber("axleNumber"), - parkingBrakeMrk: axleImage.getBoolean("parkingBrakeMrk"), - weights, - brakes, - tyres - }); - } + axles.push({ + axleNumber: axleImage.getNumber("axleNumber"), + parkingBrakeMrk: axleImage.getBoolean("parkingBrakeMrk"), + weights, + brakes, + tyres, + }); + } - return axles; + return axles; }; -const parseAxleWeightProperties = (axleWeightPropertiesImage?: DynamoDbImage): Maybe => { - if (!axleWeightPropertiesImage) { - return undefined; - } - - return { - kerbWeight: axleWeightPropertiesImage.getNumber("kerbWeight"), - ladenWeight: axleWeightPropertiesImage.getNumber("ladenWeight"), - gbWeight: axleWeightPropertiesImage.getNumber("gbWeight"), - eecWeight: axleWeightPropertiesImage.getNumber("eecWeight"), - designWeight: axleWeightPropertiesImage.getNumber("designWeight") - }; +const parseAxleWeightProperties = ( + axleWeightPropertiesImage?: DynamoDbImage +): Maybe => { + if (!axleWeightPropertiesImage) { + return undefined; + } + + return { + kerbWeight: axleWeightPropertiesImage.getNumber("kerbWeight"), + ladenWeight: axleWeightPropertiesImage.getNumber("ladenWeight"), + gbWeight: axleWeightPropertiesImage.getNumber("gbWeight"), + eecWeight: axleWeightPropertiesImage.getNumber("eecWeight"), + designWeight: axleWeightPropertiesImage.getNumber("designWeight"), + }; }; -const parseAxleTyreProperties = (axleTyrePropertiesImage?: DynamoDbImage): Maybe => { - if (!axleTyrePropertiesImage) { - return undefined; - } - - return { - tyreSize: axleTyrePropertiesImage.getString("tyreSize"), - plyRating: axleTyrePropertiesImage.getString("plyRating"), - fitmentCode: axleTyrePropertiesImage.getString("fitmentCode") as FitmentCode, - dataTrAxles: axleTyrePropertiesImage.getNumber("dataTrAxles"), - speedCategorySymbol: axleTyrePropertiesImage.getString("speedCategorySymbol") as SpeedCategorySymbol, - tyreCode: axleTyrePropertiesImage.getNumber("tyreCode") - }; +const parseAxleTyreProperties = ( + axleTyrePropertiesImage?: DynamoDbImage +): Maybe => { + if (!axleTyrePropertiesImage) { + return undefined; + } + + return { + tyreSize: axleTyrePropertiesImage.getString("tyreSize"), + plyRating: axleTyrePropertiesImage.getString("plyRating"), + fitmentCode: axleTyrePropertiesImage.getString( + "fitmentCode" + ) as FitmentCode, + dataTrAxles: axleTyrePropertiesImage.getNumber("dataTrAxles"), + speedCategorySymbol: axleTyrePropertiesImage.getString( + "speedCategorySymbol" + ) as SpeedCategorySymbol, + tyreCode: axleTyrePropertiesImage.getNumber("tyreCode"), + }; }; -const parseAxleBrakeProperties = (axleBrakePropertiesImage?: DynamoDbImage): Maybe => { - if (!axleBrakePropertiesImage) { - return undefined; - } - - return { - brakeActuator: axleBrakePropertiesImage.getNumber("brakeActuator"), - leverLength: axleBrakePropertiesImage.getNumber("leverLength"), - springBrakeParking: axleBrakePropertiesImage.getBoolean("springBrakeParking") - }; +const parseAxleBrakeProperties = ( + axleBrakePropertiesImage?: DynamoDbImage +): Maybe => { + if (!axleBrakePropertiesImage) { + return undefined; + } + + return { + brakeActuator: axleBrakePropertiesImage.getNumber("brakeActuator"), + leverLength: axleBrakePropertiesImage.getNumber("leverLength"), + springBrakeParking: axleBrakePropertiesImage.getBoolean( + "springBrakeParking" + ), + }; }; diff --git a/src/models/batch-item-failure-response.ts b/src/models/batch-item-failure-response.ts index df30697..c86f751 100644 --- a/src/models/batch-item-failure-response.ts +++ b/src/models/batch-item-failure-response.ts @@ -1,8 +1,7 @@ export interface BatchItemFailuresResponse { - batchItemFailures: BatchItemIdentifiers[]; - } + batchItemFailures: BatchItemIdentifiers[]; +} interface BatchItemIdentifiers { - itemIdentifier: string; + itemIdentifier: string; } - diff --git a/src/models/body-type.ts b/src/models/body-type.ts index 7805c42..fbd4552 100644 --- a/src/models/body-type.ts +++ b/src/models/body-type.ts @@ -1,34 +1,47 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface BodyType { - code?: BodyTypeCode; - description?: BodyTypeDescription; + code?: BodyTypeCode; + description?: BodyTypeDescription; } -export type BodyTypeCode = "a" | "s" | "d" | "o" | "m" | "x" | "p" | "k" | "t" | "b" | "f" | "r" | "c"; +export type BodyTypeCode = + | "a" + | "s" + | "d" + | "o" + | "m" + | "x" + | "p" + | "k" + | "t" + | "b" + | "f" + | "r" + | "c"; export type BodyTypeDescription = - "articulated" - | "single decker" - | "double decker" - | "other" - | "petrol/oil tanker" - | "skeletal" - | "tipper" - | "box" - | "flat" - | "refuse" - | "skip loader" - | "refrigerated"; + | "articulated" + | "single decker" + | "double decker" + | "other" + | "petrol/oil tanker" + | "skeletal" + | "tipper" + | "box" + | "flat" + | "refuse" + | "skip loader" + | "refrigerated"; export const parseBodyType = (bodyType?: DynamoDbImage): Maybe => { - if (!bodyType) { - return undefined; - } + if (!bodyType) { + return undefined; + } - return { - code: bodyType.getString("code") as BodyTypeCode, - description: bodyType.getString("description") as BodyTypeDescription - }; + return { + code: bodyType.getString("code") as BodyTypeCode, + description: bodyType.getString("description") as BodyTypeDescription, + }; }; diff --git a/src/models/brakes.ts b/src/models/brakes.ts index a9c73ab..c6c9f3c 100644 --- a/src/models/brakes.ts +++ b/src/models/brakes.ts @@ -1,79 +1,105 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface Brakes { - brakeCodeOriginal?: string; - brakeCode?: string; - dataTrBrakeOne?: string; - dataTrBrakeTwo?: string; - dataTrBrakeThree?: string; - retarderBrakeOne?: RetarderBrakeType; - retarderBrakeTwo?: RetarderBrakeType; - dtpNumber?: string; - brakeForceWheelsNotLocked?: BrakeForceWheelsNotLocked; - brakeForceWheelsUpToHalfLocked?: BrakeForceWheelsUpToHalfLocked; - loadSensingValve?: boolean; - antilockBrakingSystem?: boolean; + brakeCodeOriginal?: string; + brakeCode?: string; + dataTrBrakeOne?: string; + dataTrBrakeTwo?: string; + dataTrBrakeThree?: string; + retarderBrakeOne?: RetarderBrakeType; + retarderBrakeTwo?: RetarderBrakeType; + dtpNumber?: string; + brakeForceWheelsNotLocked?: BrakeForceWheelsNotLocked; + brakeForceWheelsUpToHalfLocked?: BrakeForceWheelsUpToHalfLocked; + loadSensingValve?: boolean; + antilockBrakingSystem?: boolean; } -export type RetarderBrakeType = "electric" | "exhaust" | "friction" | "hydraulic" | "other" | "none"; +export type RetarderBrakeType = + | "electric" + | "exhaust" + | "friction" + | "hydraulic" + | "other" + | "none"; export interface BrakeForceWheelsNotLocked { - serviceBrakeForceA?: number; - secondaryBrakeForceA?: number; - parkingBrakeForceA?: number; + serviceBrakeForceA?: number; + secondaryBrakeForceA?: number; + parkingBrakeForceA?: number; } export interface BrakeForceWheelsUpToHalfLocked { - serviceBrakeForceB?: number; - secondaryBrakeForceB?: number; - parkingBrakeForceB?: number; + serviceBrakeForceB?: number; + secondaryBrakeForceB?: number; + parkingBrakeForceB?: number; } export const parseBrakes = (brakes?: DynamoDbImage): Maybe => { - if (!brakes) { - return undefined; - } + if (!brakes) { + return undefined; + } - const brakeForceWheelsNotLocked = parseBrakeForceWheelsNotLocked(brakes.getMap("brakeForceWheelsNotLocked")); - const brakeForceWheelsUpToHalfLocked = parseBrakeForceWheelsUpToHalfLocked(brakes.getMap("brakeForceWheelsUpToHalfLocked")); + const brakeForceWheelsNotLocked = parseBrakeForceWheelsNotLocked( + brakes.getMap("brakeForceWheelsNotLocked") + ); + const brakeForceWheelsUpToHalfLocked = parseBrakeForceWheelsUpToHalfLocked( + brakes.getMap("brakeForceWheelsUpToHalfLocked") + ); - return { - brakeCodeOriginal: brakes.getString("brakeCodeOriginal"), - brakeCode: brakes.getString("brakeCode"), - dataTrBrakeOne: brakes.getString("dataTrBrakeOne"), - dataTrBrakeTwo: brakes.getString("dataTrBrakeTwo"), - dataTrBrakeThree: brakes.getString("dataTrBrakeThree"), - retarderBrakeOne: brakes.getString("retarderBrakeOne") as RetarderBrakeType, - retarderBrakeTwo: brakes.getString("retarderBrakeTwo") as RetarderBrakeType, - dtpNumber: brakes.getString("dtpNumber"), - brakeForceWheelsNotLocked, - brakeForceWheelsUpToHalfLocked, - loadSensingValve: brakes.getBoolean("loadSensingValve"), - antilockBrakingSystem: brakes.getBoolean("antilockBrakingSystem") - }; + return { + brakeCodeOriginal: brakes.getString("brakeCodeOriginal"), + brakeCode: brakes.getString("brakeCode"), + dataTrBrakeOne: brakes.getString("dataTrBrakeOne"), + dataTrBrakeTwo: brakes.getString("dataTrBrakeTwo"), + dataTrBrakeThree: brakes.getString("dataTrBrakeThree"), + retarderBrakeOne: brakes.getString("retarderBrakeOne") as RetarderBrakeType, + retarderBrakeTwo: brakes.getString("retarderBrakeTwo") as RetarderBrakeType, + dtpNumber: brakes.getString("dtpNumber"), + brakeForceWheelsNotLocked, + brakeForceWheelsUpToHalfLocked, + loadSensingValve: brakes.getBoolean("loadSensingValve"), + antilockBrakingSystem: brakes.getBoolean("antilockBrakingSystem"), + }; }; -const parseBrakeForceWheelsNotLocked = (brakeForceWheelsNotLockedImage?: DynamoDbImage): Maybe => { - if (!brakeForceWheelsNotLockedImage) { - return undefined; - } +const parseBrakeForceWheelsNotLocked = ( + brakeForceWheelsNotLockedImage?: DynamoDbImage +): Maybe => { + if (!brakeForceWheelsNotLockedImage) { + return undefined; + } - return { - serviceBrakeForceA: brakeForceWheelsNotLockedImage.getNumber("serviceBrakeForceA"), - secondaryBrakeForceA: brakeForceWheelsNotLockedImage.getNumber("secondaryBrakeForceA"), - parkingBrakeForceA: brakeForceWheelsNotLockedImage.getNumber("parkingBrakeForceA") - }; + return { + serviceBrakeForceA: brakeForceWheelsNotLockedImage.getNumber( + "serviceBrakeForceA" + ), + secondaryBrakeForceA: brakeForceWheelsNotLockedImage.getNumber( + "secondaryBrakeForceA" + ), + parkingBrakeForceA: brakeForceWheelsNotLockedImage.getNumber( + "parkingBrakeForceA" + ), + }; }; -const parseBrakeForceWheelsUpToHalfLocked = (brakeForceWheelsUpToHalfLockedImage?: DynamoDbImage): Maybe => { - if (!brakeForceWheelsUpToHalfLockedImage) { - return undefined; - } +const parseBrakeForceWheelsUpToHalfLocked = ( + brakeForceWheelsUpToHalfLockedImage?: DynamoDbImage +): Maybe => { + if (!brakeForceWheelsUpToHalfLockedImage) { + return undefined; + } - return { - serviceBrakeForceB: brakeForceWheelsUpToHalfLockedImage.getNumber("serviceBrakeForceB"), - secondaryBrakeForceB: brakeForceWheelsUpToHalfLockedImage.getNumber("secondaryBrakeForceB"), - parkingBrakeForceB: brakeForceWheelsUpToHalfLockedImage.getNumber("parkingBrakeForceB") - }; + return { + serviceBrakeForceB: brakeForceWheelsUpToHalfLockedImage.getNumber( + "serviceBrakeForceB" + ), + secondaryBrakeForceB: brakeForceWheelsUpToHalfLockedImage.getNumber( + "secondaryBrakeForceB" + ), + parkingBrakeForceB: brakeForceWheelsUpToHalfLockedImage.getNumber( + "parkingBrakeForceB" + ), + }; }; diff --git a/src/models/dda.ts b/src/models/dda.ts index cc46854..b4f9c40 100644 --- a/src/models/dda.ts +++ b/src/models/dda.ts @@ -1,38 +1,38 @@ // (disability discrimination act) -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface Dda { - certificateIssued?: boolean; - wheelchairCapacity?: number; - wheelchairFittings?: string; - wheelchairLiftPresent?: boolean; - wheelchairLiftInformation?: string; - wheelchairRampPresent?: boolean; - wheelchairRampInformation?: string; - minEmergencyExits?: number; - outswing?: string; - ddaSchedules?: string; - seatbeltsFitted?: number; - ddaNotes?: string; + certificateIssued?: boolean; + wheelchairCapacity?: number; + wheelchairFittings?: string; + wheelchairLiftPresent?: boolean; + wheelchairLiftInformation?: string; + wheelchairRampPresent?: boolean; + wheelchairRampInformation?: string; + minEmergencyExits?: number; + outswing?: string; + ddaSchedules?: string; + seatbeltsFitted?: number; + ddaNotes?: string; } export const parseDda = (dda?: DynamoDbImage): Maybe => { - if (!dda) { - return undefined; - } - return { - certificateIssued: dda.getBoolean("certificateIssued"), - wheelchairCapacity: dda.getNumber("wheelchairCapacity"), - wheelchairFittings: dda.getString("wheelchairFittings"), - wheelchairLiftPresent: dda.getBoolean("wheelchairLiftPresent"), - wheelchairLiftInformation: dda.getString("wheelchairLiftInformation"), - wheelchairRampPresent: dda.getBoolean("wheelchairRampPresent"), - wheelchairRampInformation: dda.getString("wheelchairRampInformation"), - minEmergencyExits: dda.getNumber("minEmergencyExits"), - outswing: dda.getString("outswing"), - ddaSchedules: dda.getString("ddaSchedules"), - seatbeltsFitted: dda.getNumber("seatbeltsFitted"), - ddaNotes: dda.getString("ddaNotes") - }; + if (!dda) { + return undefined; + } + return { + certificateIssued: dda.getBoolean("certificateIssued"), + wheelchairCapacity: dda.getNumber("wheelchairCapacity"), + wheelchairFittings: dda.getString("wheelchairFittings"), + wheelchairLiftPresent: dda.getBoolean("wheelchairLiftPresent"), + wheelchairLiftInformation: dda.getString("wheelchairLiftInformation"), + wheelchairRampPresent: dda.getBoolean("wheelchairRampPresent"), + wheelchairRampInformation: dda.getString("wheelchairRampInformation"), + minEmergencyExits: dda.getNumber("minEmergencyExits"), + outswing: dda.getString("outswing"), + ddaSchedules: dda.getString("ddaSchedules"), + seatbeltsFitted: dda.getNumber("seatbeltsFitted"), + ddaNotes: dda.getString("ddaNotes"), + }; }; diff --git a/src/models/defects.ts b/src/models/defects.ts index 26799b4..f9f58d2 100644 --- a/src/models/defects.ts +++ b/src/models/defects.ts @@ -1,5 +1,5 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export type DeficiencyCategory = "advisory" | "dangerous" | "major" | "minor"; @@ -12,124 +12,133 @@ export type LateralLocation = "nearside" | "centre" | "offside"; export type LongitudinalLocation = "front" | "rear"; export interface DefectAdditionalInformation { - location?: DefectAdditionalInformationLocation; - notes?: string; + location?: DefectAdditionalInformationLocation; + notes?: string; } export interface DefectAdditionalInformationLocation { - vertical?: VerticalLocation; - horizontal?: HorizontalLocation; - lateral?: LateralLocation; - longitudinal?: LongitudinalLocation; - rowNumber?: number; - seatNumber?: number; - axleNumber?: number; + vertical?: VerticalLocation; + horizontal?: HorizontalLocation; + lateral?: LateralLocation; + longitudinal?: LongitudinalLocation; + rowNumber?: number; + seatNumber?: number; + axleNumber?: number; } export type Defects = Defect[]; export interface Defect { - imNumber?: number; - imDescription?: string; - additionalInformation?: DefectAdditionalInformation; - itemNumber?: number; - itemDescription?: string; - deficiencyRef?: string; - deficiencyId?: string; - deficiencySubId?: string; - deficiencyCategory?: DeficiencyCategory; - deficiencyText?: string; - stdForProhibition?: boolean; - prs?: boolean; - prohibitionIssued?: boolean; + imNumber?: number; + imDescription?: string; + additionalInformation?: DefectAdditionalInformation; + itemNumber?: number; + itemDescription?: string; + deficiencyRef?: string; + deficiencyId?: string; + deficiencySubId?: string; + deficiencyCategory?: DeficiencyCategory; + deficiencyText?: string; + stdForProhibition?: boolean; + prs?: boolean; + prohibitionIssued?: boolean; } export type CustomDefects = CustomDefect[]; export interface CustomDefect { - referenceNumber?: string; - defectName?: string; - defectNotes?: string; + referenceNumber?: string; + defectName?: string; + defectNotes?: string; } export const parseDefects = (image?: DynamoDbImage): Defects => { - if (!image) { - return [] as Defects; - } + if (!image) { + return [] as Defects; + } - const defects: Defects = []; + const defects: Defects = []; - for (const key of image.getKeys()) { - defects.push(parseDefect(image.getMap(key)!)); - } + for (const key of image.getKeys()) { + defects.push(parseDefect(image.getMap(key)!)); + } - return defects; + return defects; }; export const parseCustomDefects = (image?: DynamoDbImage): CustomDefects => { - if (!image) { - return [] as CustomDefects; - } + if (!image) { + return [] as CustomDefects; + } - const defects: CustomDefects = []; + const defects: CustomDefects = []; - for (const key of image.getKeys()) { - defects.push(parseCustomDefect(image.getMap(key)!)); - } - - return defects; + for (const key of image.getKeys()) { + defects.push(parseCustomDefect(image.getMap(key)!)); + } + return defects; }; export const parseDefect = (image: DynamoDbImage): Defect => { - return { - imNumber: image.getNumber("imNumber"), - imDescription: image.getString("imDescription"), - additionalInformation: parseDefectAdditionalInformation(image.getMap("additionalInformation")), - itemNumber: image.getNumber("itemNumber"), - itemDescription: image.getString("itemDescription"), - deficiencyRef: image.getString("deficiencyRef"), - deficiencyId: image.getString("deficiencyId"), - deficiencySubId: image.getString("deficiencySubId"), - deficiencyCategory: image.getString("deficiencyCategory") as DeficiencyCategory, - deficiencyText: image.getString("deficiencyText"), - stdForProhibition: image.getBoolean("stdForProhibition"), - prs: image.getBoolean("prs"), - prohibitionIssued: image.getBoolean("prohibitionIssued"), - }; + return { + imNumber: image.getNumber("imNumber"), + imDescription: image.getString("imDescription"), + additionalInformation: parseDefectAdditionalInformation( + image.getMap("additionalInformation") + ), + itemNumber: image.getNumber("itemNumber"), + itemDescription: image.getString("itemDescription"), + deficiencyRef: image.getString("deficiencyRef"), + deficiencyId: image.getString("deficiencyId"), + deficiencySubId: image.getString("deficiencySubId"), + deficiencyCategory: image.getString( + "deficiencyCategory" + ) as DeficiencyCategory, + deficiencyText: image.getString("deficiencyText"), + stdForProhibition: image.getBoolean("stdForProhibition"), + prs: image.getBoolean("prs"), + prohibitionIssued: image.getBoolean("prohibitionIssued"), + }; }; -export const parseDefectAdditionalInformation = (image?: DynamoDbImage): Maybe => { - if (!image) { - return undefined; - } - - return { - location: parseDefectAdditionalInformationLocation(image.getMap("location")), - notes: image.getString("notes") - }; +export const parseDefectAdditionalInformation = ( + image?: DynamoDbImage +): Maybe => { + if (!image) { + return undefined; + } + + return { + location: parseDefectAdditionalInformationLocation( + image.getMap("location") + ), + notes: image.getString("notes"), + }; }; -export const parseDefectAdditionalInformationLocation = (image?: DynamoDbImage): Maybe => { - if (!image) { - return undefined; - } - - return { - vertical: image.getString("vertical") as VerticalLocation, - horizontal: image.getString("horizontal") as HorizontalLocation, - lateral: image.getString("lateral") as LateralLocation, - longitudinal: image.getString("longitudinal") as LongitudinalLocation, - rowNumber: image.getNumber("rowNumber"), - seatNumber: image.getNumber("seatNumber"), - axleNumber: image.getNumber("axleNumber"), - }; +export const parseDefectAdditionalInformationLocation = ( + image?: DynamoDbImage +): Maybe => { + if (!image) { + return undefined; + } + + return { + vertical: image.getString("vertical") as VerticalLocation, + horizontal: image.getString("horizontal") as HorizontalLocation, + lateral: image.getString("lateral") as LateralLocation, + longitudinal: image.getString("longitudinal") as LongitudinalLocation, + rowNumber: image.getNumber("rowNumber"), + seatNumber: image.getNumber("seatNumber"), + axleNumber: image.getNumber("axleNumber"), + }; }; const parseCustomDefect = (image: DynamoDbImage): CustomDefect => { - return { - referenceNumber: image.getString("referenceNumber"), - defectName: image.getString("defectName"), - defectNotes: image.getString("defectNotes"), - }; + return { + referenceNumber: image.getString("referenceNumber"), + defectName: image.getString("defectName"), + defectNotes: image.getString("defectNotes"), + }; }; diff --git a/src/models/dimensions.ts b/src/models/dimensions.ts index 73553e7..d39d400 100644 --- a/src/models/dimensions.ts +++ b/src/models/dimensions.ts @@ -1,49 +1,51 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface Dimensions { - length?: number; - height?: number; - width?: number; - axleSpacing?: AxleSpacing; + length?: number; + height?: number; + width?: number; + axleSpacing?: AxleSpacing; } export type AxleSpacing = AxleSpacingItem[]; export interface AxleSpacingItem { - axles?: string; - value?: number; + axles?: string; + value?: number; } -export const parseDimensions = (dimensions?: DynamoDbImage): Maybe => { - if (!dimensions) { - return undefined; - } - - const axleSpacing = parseAxleSpacing(dimensions.getList("axleSpacing")); - - return { - length: dimensions.getNumber("length"), - height: dimensions.getNumber("height"), - width: dimensions.getNumber("width"), - axleSpacing - }; +export const parseDimensions = ( + dimensions?: DynamoDbImage +): Maybe => { + if (!dimensions) { + return undefined; + } + + const axleSpacing = parseAxleSpacing(dimensions.getList("axleSpacing")); + + return { + length: dimensions.getNumber("length"), + height: dimensions.getNumber("height"), + width: dimensions.getNumber("width"), + axleSpacing, + }; }; const parseAxleSpacing = (axleSpacingImage?: DynamoDbImage) => { - if (!axleSpacingImage) { - return [] as AxleSpacing; - } + if (!axleSpacingImage) { + return [] as AxleSpacing; + } - const axleSpacing: AxleSpacing = []; + const axleSpacing: AxleSpacing = []; - for (const key of axleSpacingImage.getKeys()) { - const axleSpacingItemImage = axleSpacingImage.getMap(key)!; - axleSpacing.push({ - axles: axleSpacingItemImage.getString("axles"), - value: axleSpacingItemImage.getNumber("value") - }); - } + for (const key of axleSpacingImage.getKeys()) { + const axleSpacingItemImage = axleSpacingImage.getMap(key)!; + axleSpacing.push({ + axles: axleSpacingItemImage.getString("axles"), + value: axleSpacingItemImage.getNumber("value"), + }); + } - return axleSpacing; + return axleSpacing; }; diff --git a/src/models/letters-of-auth.ts b/src/models/letters-of-auth.ts index 76fcb39..fae3951 100644 --- a/src/models/letters-of-auth.ts +++ b/src/models/letters-of-auth.ts @@ -1,22 +1,24 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export type LetterType = "Trailer authorization" | "Trailer rejection"; export interface LettersOfAuth { - letterType?: LetterType; - letterDateRequested?: string; - letterContents?: string; + letterType?: LetterType; + letterDateRequested?: string; + letterContents?: string; } -export const parseLettersOfAuth = (lettersOfAuth?: DynamoDbImage): Maybe => { - if (!lettersOfAuth) { - return undefined; - } +export const parseLettersOfAuth = ( + lettersOfAuth?: DynamoDbImage +): Maybe => { + if (!lettersOfAuth) { + return undefined; + } - return { - letterType: lettersOfAuth.getString("letterType") as LetterType, - letterDateRequested: lettersOfAuth.getString("letterDateRequested"), - letterContents: lettersOfAuth.getString("letterContents") - }; + return { + letterType: lettersOfAuth.getString("letterType") as LetterType, + letterDateRequested: lettersOfAuth.getString("letterDateRequested"), + letterContents: lettersOfAuth.getString("letterContents"), + }; }; diff --git a/src/models/manufacturer-details.ts b/src/models/manufacturer-details.ts index 717c4fa..6b0c9d5 100644 --- a/src/models/manufacturer-details.ts +++ b/src/models/manufacturer-details.ts @@ -1,34 +1,36 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface ManufacturerDetails { - name?: string; - address1?: string; - address2?: string; - postTown?: string; - address3?: string; - postCode?: string; - emailAddress?: string; - telephoneNumber?: string; - faxNumber?: string; - manufacturerNotes?: string; + name?: string; + address1?: string; + address2?: string; + postTown?: string; + address3?: string; + postCode?: string; + emailAddress?: string; + telephoneNumber?: string; + faxNumber?: string; + manufacturerNotes?: string; } -export const parseManufacturerDetails = (manufacturerDetails?: DynamoDbImage): Maybe => { - if (!manufacturerDetails) { - return undefined; - } +export const parseManufacturerDetails = ( + manufacturerDetails?: DynamoDbImage +): Maybe => { + if (!manufacturerDetails) { + return undefined; + } - return { - name: manufacturerDetails.getString("name"), - address1: manufacturerDetails.getString("address1"), - address2: manufacturerDetails.getString("address2"), - postTown: manufacturerDetails.getString("postTown"), - address3: manufacturerDetails.getString("address3"), - postCode: manufacturerDetails.getString("postCode"), - emailAddress: manufacturerDetails.getString("emailAddress"), - telephoneNumber: manufacturerDetails.getString("telephoneNumber"), - faxNumber: manufacturerDetails.getString("faxNumber"), - manufacturerNotes: manufacturerDetails.getString("manufacturerNotes") - }; + return { + name: manufacturerDetails.getString("name"), + address1: manufacturerDetails.getString("address1"), + address2: manufacturerDetails.getString("address2"), + postTown: manufacturerDetails.getString("postTown"), + address3: manufacturerDetails.getString("address3"), + postCode: manufacturerDetails.getString("postCode"), + emailAddress: manufacturerDetails.getString("emailAddress"), + telephoneNumber: manufacturerDetails.getString("telephoneNumber"), + faxNumber: manufacturerDetails.getString("faxNumber"), + manufacturerNotes: manufacturerDetails.getString("manufacturerNotes"), + }; }; diff --git a/src/models/microfilm.ts b/src/models/microfilm.ts index 9dc3415..4ba3017 100644 --- a/src/models/microfilm.ts +++ b/src/models/microfilm.ts @@ -1,77 +1,79 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface Microfilm { - microfilmDocumentType?: MicrofilmDocumentType; - microfilmRollNumber?: string; - microfilmSerialNumber?: string; + microfilmDocumentType?: MicrofilmDocumentType; + microfilmRollNumber?: string; + microfilmSerialNumber?: string; } export type MicrofilmDocumentType = - "PSV Miscellaneous" - | "AAT - Trailer Annual Test" - | "AIV - HGV International App" - | "COIF Modification" - | "Trailer COC + Int Plate" - | "RCT - Trailer Test Cert paid" - | "HGV COC + Int Plate" - | "PSV Carry/Auth" - | "OMO Report" - | "AIT - Trailer International App" - | "IPV - HGV EEC Plate/Cert" - | "XCV - HGV Test Cert free" - | "AAV - HGV Annual Test" - | "COIF Master" - | "Tempo 100 Sp Ord" - | "Deleted" - | "PSV N/ALT" - | "XPT - Tr Plating Cert paid" - | "FFV - HGV First Test" - | "Repl Vitesse 100" - | "TCV - HGV Test Cert" - | "ZZZ - Miscellaneous" - | "Test Certificate" - | "XCT - Trailer Test Cert free" - | "C52 - COC and VTG52A" - | "Tempo 100 Report" - | "Main File Amendment" - | "PSV Doc" - | "PSV COC" - | "PSV Repl COC" - | "TAV - COC" - | "NPT - Trailer Alteration" - | "OMO Certificate" - | "PSV Repl COIF" - | "PSV Repl COF" - | "COIF Application" - | "XPV - HGV Plating Cert Free" - | "TCT - Trailer Test Cert" - | "Tempo 100 App" - | "PSV Decision on N/ALT" - | "Special Order PSV" - | "NPV - HGV Alteration" - | "No Description Found" - | "Vitesse 100 Sp Ord" - | "Brake Test Details" - | "COIF Productional" - | "RDT - Test Disc Paid" - | "RCV - HGV Test Cert" - | "FFT - Trailer First Test" - | "IPT - Trailer EEC Plate/Cert" - | "XDT - Test Disc Free" - | "PRV - HGV Plating Cert paid" - | "COF Cert" - | "PRT - Tr Plating Cert paid" - | "Tempo 100 Permit"; + | "PSV Miscellaneous" + | "AAT - Trailer Annual Test" + | "AIV - HGV International App" + | "COIF Modification" + | "Trailer COC + Int Plate" + | "RCT - Trailer Test Cert paid" + | "HGV COC + Int Plate" + | "PSV Carry/Auth" + | "OMO Report" + | "AIT - Trailer International App" + | "IPV - HGV EEC Plate/Cert" + | "XCV - HGV Test Cert free" + | "AAV - HGV Annual Test" + | "COIF Master" + | "Tempo 100 Sp Ord" + | "Deleted" + | "PSV N/ALT" + | "XPT - Tr Plating Cert paid" + | "FFV - HGV First Test" + | "Repl Vitesse 100" + | "TCV - HGV Test Cert" + | "ZZZ - Miscellaneous" + | "Test Certificate" + | "XCT - Trailer Test Cert free" + | "C52 - COC and VTG52A" + | "Tempo 100 Report" + | "Main File Amendment" + | "PSV Doc" + | "PSV COC" + | "PSV Repl COC" + | "TAV - COC" + | "NPT - Trailer Alteration" + | "OMO Certificate" + | "PSV Repl COIF" + | "PSV Repl COF" + | "COIF Application" + | "XPV - HGV Plating Cert Free" + | "TCT - Trailer Test Cert" + | "Tempo 100 App" + | "PSV Decision on N/ALT" + | "Special Order PSV" + | "NPV - HGV Alteration" + | "No Description Found" + | "Vitesse 100 Sp Ord" + | "Brake Test Details" + | "COIF Productional" + | "RDT - Test Disc Paid" + | "RCV - HGV Test Cert" + | "FFT - Trailer First Test" + | "IPT - Trailer EEC Plate/Cert" + | "XDT - Test Disc Free" + | "PRV - HGV Plating Cert paid" + | "COF Cert" + | "PRT - Tr Plating Cert paid" + | "Tempo 100 Permit"; export const parseMicrofilm = (microfilm?: DynamoDbImage): Maybe => { - if (!microfilm) { - return undefined; - } + if (!microfilm) { + return undefined; + } - return { - microfilmDocumentType: microfilm.getString("microfilmDocumentType") as MicrofilmDocumentType, - microfilmRollNumber: microfilm.getString("microfilmRollNumber"), - microfilmSerialNumber: microfilm.getString("microfilmSerialNumber") - }; + return { + microfilmDocumentType: microfilm.getString( + "microfilmDocumentType" + ) as MicrofilmDocumentType, + microfilmRollNumber: microfilm.getString("microfilmRollNumber"), + microfilmSerialNumber: microfilm.getString("microfilmSerialNumber"), + }; }; diff --git a/src/models/mod-type.ts b/src/models/mod-type.ts index b92315c..2f98d80 100644 --- a/src/models/mod-type.ts +++ b/src/models/mod-type.ts @@ -1,22 +1,25 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export type ModTypeCode = "p" | "m" | "g"; -export type ModTypeDescription = "particulate trap" | "modification or change of engine" | "gas engine"; +export type ModTypeDescription = + | "particulate trap" + | "modification or change of engine" + | "gas engine"; export interface ModType { - code?: ModTypeCode; - description?: ModTypeDescription; + code?: ModTypeCode; + description?: ModTypeDescription; } export const parseModType = (image?: DynamoDbImage): Maybe => { - if (!image) { - return undefined; - } + if (!image) { + return undefined; + } - return { - code: image.getString("code") as ModTypeCode, - description: image.getString("description") as ModTypeDescription - }; + return { + code: image.getString("code") as ModTypeCode, + description: image.getString("description") as ModTypeDescription, + }; }; diff --git a/src/models/plates.ts b/src/models/plates.ts index 4ce54bd..7f2b0ef 100644 --- a/src/models/plates.ts +++ b/src/models/plates.ts @@ -1,41 +1,43 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; +import { DynamoDbImage } from "../services/dynamodb-images"; export type Plates = Plate[]; export interface Plate { - plateSerialNumber?: string; - plateIssueDate?: string; - plateReasonForIssue?: PlateReasonForIssue; - plateIssuer?: string; - toEmailAddress?: string; + plateSerialNumber?: string; + plateIssueDate?: string; + plateReasonForIssue?: PlateReasonForIssue; + plateIssuer?: string; + toEmailAddress?: string; } export type PlateReasonForIssue = - "Free replacement" - | "Replacement" - | "Destroyed" - | "Provisional" - | "Original" - | "Manual"; + | "Free replacement" + | "Replacement" + | "Destroyed" + | "Provisional" + | "Original" + | "Manual"; export const parsePlates = (platesImage?: DynamoDbImage): Plates => { - if (!platesImage) { - return [] as Plates; - } - - const plates: Plates = []; - - for (const key of platesImage.getKeys()) { - const plateImage = platesImage.getMap(key)!; - - plates.push({ - plateSerialNumber: plateImage.getString("plateSerialNumber"), - plateIssueDate: plateImage.getDate("plateIssueDate"), - plateReasonForIssue: plateImage.getString("plateReasonForIssue") as PlateReasonForIssue, - plateIssuer: plateImage.getString("plateIssuer"), - toEmailAddress: plateImage.getString("toEmailAddress") - }); - } - - return plates; + if (!platesImage) { + return [] as Plates; + } + + const plates: Plates = []; + + for (const key of platesImage.getKeys()) { + const plateImage = platesImage.getMap(key)!; + + plates.push({ + plateSerialNumber: plateImage.getString("plateSerialNumber"), + plateIssueDate: plateImage.getDate("plateIssueDate"), + plateReasonForIssue: plateImage.getString( + "plateReasonForIssue" + ) as PlateReasonForIssue, + plateIssuer: plateImage.getString("plateIssuer"), + toEmailAddress: plateImage.getString("toEmailAddress"), + }); + } + + return plates; }; diff --git a/src/models/purchaser-details.ts b/src/models/purchaser-details.ts index 06c2f36..5b1966e 100644 --- a/src/models/purchaser-details.ts +++ b/src/models/purchaser-details.ts @@ -1,34 +1,36 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface PurchaserDetails { - name?: string; - address1?: string; - address2?: string; - postTown?: string; - address3?: string; - postCode?: string; - emailAddress?: string; - telephoneNumber?: string; - faxNumber?: string; - purchaserNotes?: string; + name?: string; + address1?: string; + address2?: string; + postTown?: string; + address3?: string; + postCode?: string; + emailAddress?: string; + telephoneNumber?: string; + faxNumber?: string; + purchaserNotes?: string; } -export const parsePurchaserDetails = (purchaserDetails?: DynamoDbImage): Maybe => { - if (!purchaserDetails) { - return undefined; - } +export const parsePurchaserDetails = ( + purchaserDetails?: DynamoDbImage +): Maybe => { + if (!purchaserDetails) { + return undefined; + } - return { - name: purchaserDetails.getString("name"), - address1: purchaserDetails.getString("address1"), - address2: purchaserDetails.getString("address2"), - postTown: purchaserDetails.getString("postTown"), - address3: purchaserDetails.getString("address3"), - postCode: purchaserDetails.getString("postCode"), - emailAddress: purchaserDetails.getString("emailAddress"), - telephoneNumber: purchaserDetails.getString("telephoneNumber"), - faxNumber: purchaserDetails.getString("faxNumber"), - purchaserNotes: purchaserDetails.getString("purchaserNotes") - }; + return { + name: purchaserDetails.getString("name"), + address1: purchaserDetails.getString("address1"), + address2: purchaserDetails.getString("address2"), + postTown: purchaserDetails.getString("postTown"), + address3: purchaserDetails.getString("address3"), + postCode: purchaserDetails.getString("postCode"), + emailAddress: purchaserDetails.getString("emailAddress"), + telephoneNumber: purchaserDetails.getString("telephoneNumber"), + faxNumber: purchaserDetails.getString("faxNumber"), + purchaserNotes: purchaserDetails.getString("purchaserNotes"), + }; }; diff --git a/src/models/shared-enums.ts b/src/models/shared-enums.ts index 2845714..9154d3c 100644 --- a/src/models/shared-enums.ts +++ b/src/models/shared-enums.ts @@ -1,36 +1,36 @@ export type VehicleType = "psv" | "hgv" | "trl" | "car" | "lgv" | "motorcycle"; export type VehicleConfiguration = - "rigid" - | "articulated" - | "centre axle drawbar" - | "semi-car transporter" - | "semi-trailer" - | "low loader" - | "other" - | "drawbar" - | "four-in-line" - | "dolly" - | "full drawbar"; + | "rigid" + | "articulated" + | "centre axle drawbar" + | "semi-car transporter" + | "semi-trailer" + | "low loader" + | "other" + | "drawbar" + | "four-in-line" + | "dolly" + | "full drawbar"; export type EuVehicleCategory = - "m1" - | "m2" - | "m3" - | "n1" - | "n2" - | "n3" - | "o1" - | "o2" - | "o3" - | "o4" - | "l1e-a" - | "l1e" - | "l2e" - | "l3e" - | "l4e" - | "l5e" - | "l6e" - | "l7e"; + | "m1" + | "m2" + | "m3" + | "n1" + | "n2" + | "n3" + | "o1" + | "o2" + | "o3" + | "o4" + | "l1e-a" + | "l1e" + | "l2e" + | "l3e" + | "l4e" + | "l5e" + | "l6e" + | "l7e"; export type VehicleSize = "large" | "small"; diff --git a/src/models/tech-record-document.ts b/src/models/tech-record-document.ts index 4ed2999..3582862 100644 --- a/src/models/tech-record-document.ts +++ b/src/models/tech-record-document.ts @@ -1,29 +1,31 @@ -import {DynamoDbImage, parseStringArray} from "../services/dynamodb-images"; -import {parseTechRecords, TechRecords} from "./tech-record"; -import {debugLog} from "../services/logger"; +import { DynamoDbImage, parseStringArray } from "../services/dynamodb-images"; +import { parseTechRecords, TechRecords } from "./tech-record"; +import { debugLog } from "../services/logger"; // https://wiki.dvsacloud.uk/pages/viewpage.action?spaceKey=HVT&title=Technical+API+Changelog // API_Vehicle_Tech_Records_v32.yaml export interface TechRecordDocument { - systemNumber?: string; - partialVin?: string; - primaryVrm?: string; - secondaryVms?: string[]; - vin?: string; - trailerId?: string; - techRecord?: TechRecords; + systemNumber?: string; + partialVin?: string; + primaryVrm?: string; + secondaryVms?: string[]; + vin?: string; + trailerId?: string; + techRecord?: TechRecords; } -export const parseTechRecordDocument = (image: DynamoDbImage): TechRecordDocument => { - debugLog("Parsing tech records..."); +export const parseTechRecordDocument = ( + image: DynamoDbImage +): TechRecordDocument => { + debugLog("Parsing tech records..."); - return { - systemNumber: image.getString("systemNumber"), - partialVin: image.getString("partialVin"), - primaryVrm: image.getString("primaryVrm"), - secondaryVms: parseStringArray(image.getList("secondaryVrms")), - vin: image.getString("vin"), - trailerId: image.getString("trailerId"), - techRecord: parseTechRecords(image.getList("techRecord")) - }; + return { + systemNumber: image.getString("systemNumber"), + partialVin: image.getString("partialVin"), + primaryVrm: image.getString("primaryVrm"), + secondaryVms: parseStringArray(image.getList("secondaryVrms")), + vin: image.getString("vin"), + trailerId: image.getString("trailerId"), + techRecord: parseTechRecords(image.getList("techRecord")), + }; }; diff --git a/src/models/tech-record.ts b/src/models/tech-record.ts index 7f04e07..29aa1c0 100644 --- a/src/models/tech-record.ts +++ b/src/models/tech-record.ts @@ -1,268 +1,304 @@ -import {DynamoDbImage, parseStringArray} from "../services/dynamodb-images"; -import {AuthIntoService, parseAuthIntoService} from "./auth-into-service"; -import {LettersOfAuth, parseLettersOfAuth} from "./letters-of-auth"; -import {ApplicantDetailsProperties, parseApplicantDetailsProperties} from "./applicant-details-properties"; -import {parsePurchaserDetails, PurchaserDetails} from "./purchaser-details"; -import {ManufacturerDetails, parseManufacturerDetails} from "./manufacturer-details"; -import {Microfilm, parseMicrofilm} from "./microfilm"; -import {parsePlates, Plates} from "./plates"; -import {BodyType, parseBodyType} from "./body-type"; -import {Dimensions, parseDimensions} from "./dimensions"; -import {AdrDetails} from "./adr-details"; -import {parseVehicleClass, VehicleClass} from "./vehicle-class"; -import {Brakes, parseBrakes} from "./brakes"; -import {Axles, parseAxles} from "./axles"; -import {Dda} from "./dda"; -import {Maybe} from "./optionals"; -import {EuVehicleCategory, VehicleConfiguration, VehicleSize, VehicleType} from "./shared-enums"; +import { DynamoDbImage, parseStringArray } from "../services/dynamodb-images"; +import { AuthIntoService, parseAuthIntoService } from "./auth-into-service"; +import { LettersOfAuth, parseLettersOfAuth } from "./letters-of-auth"; +import { + ApplicantDetailsProperties, + parseApplicantDetailsProperties, +} from "./applicant-details-properties"; +import { parsePurchaserDetails, PurchaserDetails } from "./purchaser-details"; +import { + ManufacturerDetails, + parseManufacturerDetails, +} from "./manufacturer-details"; +import { Microfilm, parseMicrofilm } from "./microfilm"; +import { parsePlates, Plates } from "./plates"; +import { BodyType, parseBodyType } from "./body-type"; +import { Dimensions, parseDimensions } from "./dimensions"; +import { AdrDetails } from "./adr-details"; +import { parseVehicleClass, VehicleClass } from "./vehicle-class"; +import { Brakes, parseBrakes } from "./brakes"; +import { Axles, parseAxles } from "./axles"; +import { Dda } from "./dda"; +import { Maybe } from "./optionals"; +import { + EuVehicleCategory, + VehicleConfiguration, + VehicleSize, + VehicleType, +} from "./shared-enums"; export type TechRecords = TechRecord[]; export interface TechRecord { - recordCompleteness?: string; - createdAt?: string; - lastUpdatedAt?: string; - make?: string; - model?: string; - functionCode?: string; - fuelPropulsionSystem?: FuelPropulsionSystem; - offRoad?: boolean; - numberOfWheelsDriven?: number; - euVehicleCategory?: EuVehicleCategory; - emissionsLimit?: number; - departmentalVehicleMarker?: boolean; - authIntoService?: AuthIntoService; - lettersOfAuth?: LettersOfAuth; - alterationMarker?: boolean; - approvalType?: ApprovalType; - approvalTypeNumber?: string; - variantNumber?: string; - variantVersionNumber?: string; - grossEecWeight?: number; - trainEecWeight?: number; - maxTrainEecWeight?: number; - applicantDetails?: ApplicantDetailsProperties; - purchaserDetails?: PurchaserDetails; - manufacturerDetails?: ManufacturerDetails; - microfilm?: Microfilm; - plates?: Plates; - chassisMake?: string; - chassisModel?: string; - bodyMake?: string; - bodyModel?: string; - modelLiteral?: string; - bodyType?: BodyType; - manufactureYear?: number; - regnDate?: string; - firstUseDate?: string; - coifDate?: string; - ntaNumber?: string; - coifSerialNumber?: string; - coifCertifierName?: string; - conversionRefNo?: string; - seatsLowerDeck?: number; - seatsUpperDeck?: number; - standingCapacity?: number; - speedRestriction?: number; - speedLimiterMrk?: boolean; - tachoExemptMrk?: boolean; - dispensations?: string; - remarks?: string; - reasonForCreation?: string; - statusCode?: StatusCode; - unladenWeight?: number; - grossKerbWeight?: number; - grossLadenWeight?: number; - grossGbWeight?: number; - grossDesignWeight?: number; - trainGbWeight?: number; - trainDesignWeight?: number; - maxTrainGbWeight?: number; - maxTrainDesignWeight?: number; - maxLoadOnCoupling?: number; - frameDescription?: FrameDescription; - tyreUseCode?: string; - roadFriendly?: boolean; - drawbarCouplingFitted?: boolean; - euroStandard?: string; - suspensionType?: string; - couplingType?: string; - dimensions?: Dimensions; - frontAxleTo5thWheelMin?: number; - frontAxleTo5thWheelMax?: number; - frontVehicleTo5thWheelCouplingMin?: number; - frontVehicleTo5thWheelCouplingMax?: number; - frontAxleToRearAxle?: number; - rearAxleToRearTrl?: number; - couplingCenterToRearAxleMin?: number; - couplingCenterToRearAxleMax?: number; - couplingCenterToRearTrlMin?: number; - couplingCenterToRearTrlMax?: number; - centreOfRearmostAxleToRearOfTrl?: number; - notes?: string; - noOfAxles?: number; - brakeCode?: string; - adrDetails?: AdrDetails; - createdByName?: string; - createdById?: string; - lastUpdatedByName?: string; - lastUpdatedById?: string; - updateType?: UpdateType; - vehicleClass?: VehicleClass; - vehicleSubclass?: string[]; - vehicleType?: VehicleType; - vehicleSize?: VehicleSize; - numberOfSeatbelts?: string; - seatbeltInstallationApprovalDate?: string; - vehicleConfiguration?: VehicleConfiguration; - brakes?: Brakes; - axles?: Axles; - dda?: Dda; + recordCompleteness?: string; + createdAt?: string; + lastUpdatedAt?: string; + make?: string; + model?: string; + functionCode?: string; + fuelPropulsionSystem?: FuelPropulsionSystem; + offRoad?: boolean; + numberOfWheelsDriven?: number; + euVehicleCategory?: EuVehicleCategory; + emissionsLimit?: number; + departmentalVehicleMarker?: boolean; + authIntoService?: AuthIntoService; + lettersOfAuth?: LettersOfAuth; + alterationMarker?: boolean; + approvalType?: ApprovalType; + approvalTypeNumber?: string; + variantNumber?: string; + variantVersionNumber?: string; + grossEecWeight?: number; + trainEecWeight?: number; + maxTrainEecWeight?: number; + applicantDetails?: ApplicantDetailsProperties; + purchaserDetails?: PurchaserDetails; + manufacturerDetails?: ManufacturerDetails; + microfilm?: Microfilm; + plates?: Plates; + chassisMake?: string; + chassisModel?: string; + bodyMake?: string; + bodyModel?: string; + modelLiteral?: string; + bodyType?: BodyType; + manufactureYear?: number; + regnDate?: string; + firstUseDate?: string; + coifDate?: string; + ntaNumber?: string; + coifSerialNumber?: string; + coifCertifierName?: string; + conversionRefNo?: string; + seatsLowerDeck?: number; + seatsUpperDeck?: number; + standingCapacity?: number; + speedRestriction?: number; + speedLimiterMrk?: boolean; + tachoExemptMrk?: boolean; + dispensations?: string; + remarks?: string; + reasonForCreation?: string; + statusCode?: StatusCode; + unladenWeight?: number; + grossKerbWeight?: number; + grossLadenWeight?: number; + grossGbWeight?: number; + grossDesignWeight?: number; + trainGbWeight?: number; + trainDesignWeight?: number; + maxTrainGbWeight?: number; + maxTrainDesignWeight?: number; + maxLoadOnCoupling?: number; + frameDescription?: FrameDescription; + tyreUseCode?: string; + roadFriendly?: boolean; + drawbarCouplingFitted?: boolean; + euroStandard?: string; + suspensionType?: string; + couplingType?: string; + dimensions?: Dimensions; + frontAxleTo5thWheelMin?: number; + frontAxleTo5thWheelMax?: number; + frontVehicleTo5thWheelCouplingMin?: number; + frontVehicleTo5thWheelCouplingMax?: number; + frontAxleToRearAxle?: number; + rearAxleToRearTrl?: number; + couplingCenterToRearAxleMin?: number; + couplingCenterToRearAxleMax?: number; + couplingCenterToRearTrlMin?: number; + couplingCenterToRearTrlMax?: number; + centreOfRearmostAxleToRearOfTrl?: number; + notes?: string; + noOfAxles?: number; + brakeCode?: string; + adrDetails?: AdrDetails; + createdByName?: string; + createdById?: string; + lastUpdatedByName?: string; + lastUpdatedById?: string; + updateType?: UpdateType; + vehicleClass?: VehicleClass; + vehicleSubclass?: string[]; + vehicleType?: VehicleType; + vehicleSize?: VehicleSize; + numberOfSeatbelts?: string; + seatbeltInstallationApprovalDate?: string; + vehicleConfiguration?: VehicleConfiguration; + brakes?: Brakes; + axles?: Axles; + dda?: Dda; } -export type FuelPropulsionSystem = "DieselPetrol" | "Hybrid" | "Electric" | "CNG" | "Fuel cell" | "LNG" | "Other"; +export type FuelPropulsionSystem = + | "DieselPetrol" + | "Hybrid" + | "Electric" + | "CNG" + | "Fuel cell" + | "LNG" + | "Other"; export type ApprovalType = "NTA" | "ECTA" | "IVA" | "NSSTA" | "ECSSTA"; export type StatusCode = "archived" | "current" | "provisional"; export type FrameDescription = - "Channel section" - | "Space frame" - | "I section" - | "Tubular" - | "Frame section" - | "Other" - | "integral" - | "Box section" - | "U section"; + | "Channel section" + | "Space frame" + | "I section" + | "Tubular" + | "Frame section" + | "Other" + | "integral" + | "Box section" + | "U section"; export type UpdateType = "adrUpdate" | "techRecordUpdate"; export const parseTechRecords = (image?: DynamoDbImage): TechRecords => { - if (!image) { - return [] as TechRecords; - } + if (!image) { + return [] as TechRecords; + } - const techRecords: TechRecords = []; + const techRecords: TechRecords = []; - for (const key of image.getKeys()) { - techRecords.push(parseTechRecord(image.getMap(key)!)); - } + for (const key of image.getKeys()) { + techRecords.push(parseTechRecord(image.getMap(key)!)); + } - return techRecords; + return techRecords; }; const parseTechRecord = (image: DynamoDbImage): TechRecord => { - return { - recordCompleteness: image.getString("recordCompleteness"), - createdAt: image.getDate("createdAt"), - lastUpdatedAt: image.getDate("lastUpdatedAt"), - make: image.getString("make"), - model: image.getString("model"), - functionCode: image.getString("functionCode"), - fuelPropulsionSystem: image.getString("fuelPropulsionSystem") as FuelPropulsionSystem, - offRoad: image.getBoolean("offRoad"), - numberOfWheelsDriven: image.getNumber("numberOfWheelsDriven"), - euVehicleCategory: image.getString("euVehicleCategory") as EuVehicleCategory, - emissionsLimit: image.getNumber("emissionsLimit"), - departmentalVehicleMarker: image.getBoolean("departmentalVehicleMarker"), - authIntoService: parseAuthIntoService(image.getMap("authIntoService")), - lettersOfAuth: parseLettersOfAuth(image.getMap("lettersOfAuth")), - alterationMarker: image.getBoolean("alterationMarker"), - approvalType: image.getString("approvalType") as ApprovalType, - approvalTypeNumber: image.getString("approvalTypeNumber"), - variantNumber: image.getString("variantNumber"), - variantVersionNumber: image.getString("variantVersionNumber"), - grossEecWeight: image.getNumber("grossEecWeight"), - trainEecWeight: image.getNumber("trainEecWeight"), - maxTrainEecWeight: image.getNumber("maxTrainEecWeight"), - applicantDetails: parseApplicantDetailsProperties(image.getMap("applicantDetails")), - purchaserDetails: parsePurchaserDetails(image.getMap("purchaserDetails")), - manufacturerDetails: parseManufacturerDetails(image.getMap("manufacturerDetails")), - microfilm: parseMicrofilm(image.getMap("microfilm")), - plates: parsePlates(image.getList("plates")), - chassisMake: image.getString("chassisMake"), - chassisModel: image.getString("chassisModel"), - bodyMake: image.getString("bodyMake"), - bodyModel: image.getString("bodyModel"), - modelLiteral: image.getString("modelLiteral"), - bodyType: parseBodyType(image.getMap("bodyType")), - manufactureYear: image.getNumber("manufactureYear"), - regnDate: image.getString("regnDate"), - firstUseDate: image.getString("firstUseDate"), - coifDate: image.getString("coifDate"), - ntaNumber: image.getString("ntaNumber"), - coifSerialNumber: image.getString("coifSerialNumber"), - coifCertifierName: image.getString("coifCertifierName"), - conversionRefNo: image.getString("conversionRefNo"), - seatsLowerDeck: image.getNumber("seatsLowerDeck"), - seatsUpperDeck: image.getNumber("seatsUpperDeck"), - standingCapacity: image.getNumber("standingCapacity"), - speedRestriction: image.getNumber("speedRestriction"), - speedLimiterMrk: image.getBoolean("speedLimiterMrk"), - tachoExemptMrk: image.getBoolean("tachoExemptMrk"), - dispensations: image.getString("dispensations"), - remarks: image.getString("remarks"), - reasonForCreation: image.getString("reasonForCreation"), - statusCode: image.getString("statusCode") as StatusCode, - unladenWeight: image.getNumber("unladenWeight"), - grossKerbWeight: image.getNumber("grossKerbWeight"), - grossLadenWeight: image.getNumber("grossLadenWeight"), - grossGbWeight: image.getNumber("grossGbWeight"), - grossDesignWeight: image.getNumber("grossDesignWeight"), - trainGbWeight: image.getNumber("trainGbWeight"), - trainDesignWeight: image.getNumber("trainDesignWeight"), - maxTrainGbWeight: image.getNumber("maxTrainGbWeight"), - maxTrainDesignWeight: image.getNumber("maxTrainDesignWeight"), - maxLoadOnCoupling: image.getNumber("maxLoadOnCoupling"), - frameDescription: image.getString("frameDescription") as FrameDescription, - tyreUseCode: image.getString("tyreUseCode"), - roadFriendly: image.getBoolean("roadFriendly"), - drawbarCouplingFitted: image.getBoolean("drawbarCouplingFitted"), - euroStandard: image.getString("euroStandard"), - suspensionType: image.getString("suspensionType"), - couplingType: image.getString("couplingType"), - dimensions: parseDimensions(image.getMap("dimensions")), - frontAxleTo5thWheelMin: image.getNumber("frontAxleTo5thWheelMin"), - frontAxleTo5thWheelMax: image.getNumber("frontAxleTo5thWheelMax"), - frontVehicleTo5thWheelCouplingMin: image.getNumber("frontVehicleTo5thWheelCouplingMin"), - frontVehicleTo5thWheelCouplingMax: image.getNumber("frontVehicleTo5thWheelCouplingMax"), - frontAxleToRearAxle: image.getNumber("frontAxleToRearAxle"), - rearAxleToRearTrl: image.getNumber("rearAxleToRearTrl"), - couplingCenterToRearAxleMin: image.getNumber("couplingCenterToRearAxleMin"), - couplingCenterToRearAxleMax: image.getNumber("couplingCenterToRearAxleMax"), - couplingCenterToRearTrlMin: image.getNumber("couplingCenterToRearTrlMin"), - couplingCenterToRearTrlMax: image.getNumber("couplingCenterToRearTrlMax"), - centreOfRearmostAxleToRearOfTrl: image.getNumber("centreOfRearmostAxleToRearOfTrl"), - notes: image.getString("notes"), - noOfAxles: image.getNumber("noOfAxles"), - brakeCode: image.getString("brakeCode"), - adrDetails: undefined, // intentional - not implemented. parseAdrDetails(image.getMap("adrDetails")) - createdByName: image.getString("createdByName"), - createdById: image.getString("createdById"), - lastUpdatedByName: image.getString("lastUpdatedByName"), - lastUpdatedById: image.getString("lastUpdatedById"), - updateType: image.getString("updateType") as UpdateType, - vehicleClass: parseVehicleClass(image.getMap("vehicleClass")), - vehicleSubclass: parseStringArray(image.getList("vehicleSubclass")), - vehicleType: image.getString("vehicleType") as VehicleType, - vehicleSize: image.getString("vehicleSize") as VehicleSize, - numberOfSeatbelts: image.getString("numberOfSeatbelts"), - seatbeltInstallationApprovalDate: image.getString("seatbeltInstallationApprovalDate"), - vehicleConfiguration: image.getString("vehicleConfiguration") as VehicleConfiguration, - brakes: parseBrakes(image.getMap("brakes")), - axles: parseAxles(image.getList("axles")), - dda: undefined, // intentional - not implemented. parseDda(image.getMap("dda")) - }; + return { + recordCompleteness: image.getString("recordCompleteness"), + createdAt: image.getDate("createdAt"), + lastUpdatedAt: image.getDate("lastUpdatedAt"), + make: image.getString("make"), + model: image.getString("model"), + functionCode: image.getString("functionCode"), + fuelPropulsionSystem: image.getString( + "fuelPropulsionSystem" + ) as FuelPropulsionSystem, + offRoad: image.getBoolean("offRoad"), + numberOfWheelsDriven: image.getNumber("numberOfWheelsDriven"), + euVehicleCategory: image.getString( + "euVehicleCategory" + ) as EuVehicleCategory, + emissionsLimit: image.getNumber("emissionsLimit"), + departmentalVehicleMarker: image.getBoolean("departmentalVehicleMarker"), + authIntoService: parseAuthIntoService(image.getMap("authIntoService")), + lettersOfAuth: parseLettersOfAuth(image.getMap("lettersOfAuth")), + alterationMarker: image.getBoolean("alterationMarker"), + approvalType: image.getString("approvalType") as ApprovalType, + approvalTypeNumber: image.getString("approvalTypeNumber"), + variantNumber: image.getString("variantNumber"), + variantVersionNumber: image.getString("variantVersionNumber"), + grossEecWeight: image.getNumber("grossEecWeight"), + trainEecWeight: image.getNumber("trainEecWeight"), + maxTrainEecWeight: image.getNumber("maxTrainEecWeight"), + applicantDetails: parseApplicantDetailsProperties( + image.getMap("applicantDetails") + ), + purchaserDetails: parsePurchaserDetails(image.getMap("purchaserDetails")), + manufacturerDetails: parseManufacturerDetails( + image.getMap("manufacturerDetails") + ), + microfilm: parseMicrofilm(image.getMap("microfilm")), + plates: parsePlates(image.getList("plates")), + chassisMake: image.getString("chassisMake"), + chassisModel: image.getString("chassisModel"), + bodyMake: image.getString("bodyMake"), + bodyModel: image.getString("bodyModel"), + modelLiteral: image.getString("modelLiteral"), + bodyType: parseBodyType(image.getMap("bodyType")), + manufactureYear: image.getNumber("manufactureYear"), + regnDate: image.getString("regnDate"), + firstUseDate: image.getString("firstUseDate"), + coifDate: image.getString("coifDate"), + ntaNumber: image.getString("ntaNumber"), + coifSerialNumber: image.getString("coifSerialNumber"), + coifCertifierName: image.getString("coifCertifierName"), + conversionRefNo: image.getString("conversionRefNo"), + seatsLowerDeck: image.getNumber("seatsLowerDeck"), + seatsUpperDeck: image.getNumber("seatsUpperDeck"), + standingCapacity: image.getNumber("standingCapacity"), + speedRestriction: image.getNumber("speedRestriction"), + speedLimiterMrk: image.getBoolean("speedLimiterMrk"), + tachoExemptMrk: image.getBoolean("tachoExemptMrk"), + dispensations: image.getString("dispensations"), + remarks: image.getString("remarks"), + reasonForCreation: image.getString("reasonForCreation"), + statusCode: image.getString("statusCode") as StatusCode, + unladenWeight: image.getNumber("unladenWeight"), + grossKerbWeight: image.getNumber("grossKerbWeight"), + grossLadenWeight: image.getNumber("grossLadenWeight"), + grossGbWeight: image.getNumber("grossGbWeight"), + grossDesignWeight: image.getNumber("grossDesignWeight"), + trainGbWeight: image.getNumber("trainGbWeight"), + trainDesignWeight: image.getNumber("trainDesignWeight"), + maxTrainGbWeight: image.getNumber("maxTrainGbWeight"), + maxTrainDesignWeight: image.getNumber("maxTrainDesignWeight"), + maxLoadOnCoupling: image.getNumber("maxLoadOnCoupling"), + frameDescription: image.getString("frameDescription") as FrameDescription, + tyreUseCode: image.getString("tyreUseCode"), + roadFriendly: image.getBoolean("roadFriendly"), + drawbarCouplingFitted: image.getBoolean("drawbarCouplingFitted"), + euroStandard: image.getString("euroStandard"), + suspensionType: image.getString("suspensionType"), + couplingType: image.getString("couplingType"), + dimensions: parseDimensions(image.getMap("dimensions")), + frontAxleTo5thWheelMin: image.getNumber("frontAxleTo5thWheelMin"), + frontAxleTo5thWheelMax: image.getNumber("frontAxleTo5thWheelMax"), + frontVehicleTo5thWheelCouplingMin: image.getNumber( + "frontVehicleTo5thWheelCouplingMin" + ), + frontVehicleTo5thWheelCouplingMax: image.getNumber( + "frontVehicleTo5thWheelCouplingMax" + ), + frontAxleToRearAxle: image.getNumber("frontAxleToRearAxle"), + rearAxleToRearTrl: image.getNumber("rearAxleToRearTrl"), + couplingCenterToRearAxleMin: image.getNumber("couplingCenterToRearAxleMin"), + couplingCenterToRearAxleMax: image.getNumber("couplingCenterToRearAxleMax"), + couplingCenterToRearTrlMin: image.getNumber("couplingCenterToRearTrlMin"), + couplingCenterToRearTrlMax: image.getNumber("couplingCenterToRearTrlMax"), + centreOfRearmostAxleToRearOfTrl: image.getNumber( + "centreOfRearmostAxleToRearOfTrl" + ), + notes: image.getString("notes"), + noOfAxles: image.getNumber("noOfAxles"), + brakeCode: image.getString("brakeCode"), + adrDetails: undefined, // intentional - not implemented. parseAdrDetails(image.getMap("adrDetails")) + createdByName: image.getString("createdByName"), + createdById: image.getString("createdById"), + lastUpdatedByName: image.getString("lastUpdatedByName"), + lastUpdatedById: image.getString("lastUpdatedById"), + updateType: image.getString("updateType") as UpdateType, + vehicleClass: parseVehicleClass(image.getMap("vehicleClass")), + vehicleSubclass: parseStringArray(image.getList("vehicleSubclass")), + vehicleType: image.getString("vehicleType") as VehicleType, + vehicleSize: image.getString("vehicleSize") as VehicleSize, + numberOfSeatbelts: image.getString("numberOfSeatbelts"), + seatbeltInstallationApprovalDate: image.getString( + "seatbeltInstallationApprovalDate" + ), + vehicleConfiguration: image.getString( + "vehicleConfiguration" + ) as VehicleConfiguration, + brakes: parseBrakes(image.getMap("brakes")), + axles: parseAxles(image.getList("axles")), + dda: undefined, // intentional - not implemented. parseDda(image.getMap("dda")) + }; }; export const getFaxNumber = (techRecord: TechRecord): Maybe => { - if (techRecord.purchaserDetails) { - return techRecord.purchaserDetails.faxNumber; - } - if (techRecord.manufacturerDetails) { - return techRecord.manufacturerDetails.faxNumber; - } - return undefined; + if (techRecord.purchaserDetails) { + return techRecord.purchaserDetails.faxNumber; + } + if (techRecord.manufacturerDetails) { + return techRecord.manufacturerDetails.faxNumber; + } + return undefined; }; diff --git a/src/models/test-results.ts b/src/models/test-results.ts index 04e6102..61f611b 100644 --- a/src/models/test-results.ts +++ b/src/models/test-results.ts @@ -1,8 +1,13 @@ -import {parseVehicleClass, VehicleClass} from "./vehicle-class"; -import {parseTestTypes, TestTypes} from "./test-types"; -import {EuVehicleCategory, VehicleConfiguration, VehicleSize, VehicleType} from "./shared-enums"; -import {DynamoDbImage, parseStringArray} from "../services/dynamodb-images"; -import {debugLog} from "../services/logger"; +import { parseVehicleClass, VehicleClass } from "./vehicle-class"; +import { parseTestTypes, TestTypes } from "./test-types"; +import { + EuVehicleCategory, + VehicleConfiguration, + VehicleSize, + VehicleType, +} from "./shared-enums"; +import { DynamoDbImage, parseStringArray } from "../services/dynamodb-images"; +import { debugLog } from "../services/logger"; export type TestVersion = "current" | "archived"; @@ -15,110 +20,116 @@ export type OdometerReadingUnits = "kilometres" | "miles"; export type TestResults = TestResult[]; export interface TestResult { - systemNumber?: string; - vrm?: string; - trailerId?: string; - vin?: string; - vehicleId?: string; - deletionFlag?: boolean; - testVersion?: TestVersion; - reasonForCreation?: string; - createdAt?: string; - createdByName?: string; - createdById?: string; - lastUpdatedAt?: string; - lastUpdatedByName?: string; - lastUpdatedById?: string; - shouldEmailCertificate?: string; - testStationName?: string; - testStationPNumber?: string; - testStationType?: TestStationType; - testerName?: string; - testerStaffId?: string; - testResultId?: string; - testerEmailAddress?: string; - testStartTimestamp?: string; - testEndTimestamp?: string; - testStatus?: TestStatus; - reasonForCancellation?: string; - vehicleClass?: VehicleClass; - vehicleSubclass?: string[]; - vehicleType?: VehicleType; - numberOfSeats?: number; - vehicleConfiguration?: VehicleConfiguration; - odometerReading?: number; - odometerReadingUnits?: OdometerReadingUnits; - preparerId?: string; - preparerName?: string; - numberOfWheelsDriven?: number; - euVehicleCategory?: EuVehicleCategory; - countryOfRegistration?: string; - vehicleSize?: VehicleSize; - noOfAxles?: number; - regnDate?: string; - firstUseDate?: string; - testTypes?: TestTypes; + systemNumber?: string; + vrm?: string; + trailerId?: string; + vin?: string; + vehicleId?: string; + deletionFlag?: boolean; + testVersion?: TestVersion; + reasonForCreation?: string; + createdAt?: string; + createdByName?: string; + createdById?: string; + lastUpdatedAt?: string; + lastUpdatedByName?: string; + lastUpdatedById?: string; + shouldEmailCertificate?: string; + testStationName?: string; + testStationPNumber?: string; + testStationType?: TestStationType; + testerName?: string; + testerStaffId?: string; + testResultId?: string; + testerEmailAddress?: string; + testStartTimestamp?: string; + testEndTimestamp?: string; + testStatus?: TestStatus; + reasonForCancellation?: string; + vehicleClass?: VehicleClass; + vehicleSubclass?: string[]; + vehicleType?: VehicleType; + numberOfSeats?: number; + vehicleConfiguration?: VehicleConfiguration; + odometerReading?: number; + odometerReadingUnits?: OdometerReadingUnits; + preparerId?: string; + preparerName?: string; + numberOfWheelsDriven?: number; + euVehicleCategory?: EuVehicleCategory; + countryOfRegistration?: string; + vehicleSize?: VehicleSize; + noOfAxles?: number; + regnDate?: string; + firstUseDate?: string; + testTypes?: TestTypes; } export const parseTestResults = (image?: DynamoDbImage): TestResults => { - debugLog("Parsing test results..."); + debugLog("Parsing test results..."); - if (!image) { - debugLog("image is null or undefined, no test results to process"); - return [] as TestResults; - } + if (!image) { + debugLog("image is null or undefined, no test results to process"); + return [] as TestResults; + } - if (!image.getString("systemNumber")) { - throw new Error("result is missing required field \'systemNumber\'"); - } + if (!image.getString("systemNumber")) { + throw new Error("result is missing required field 'systemNumber'"); + } - return [ parseTestResult(image) ]; + return [parseTestResult(image)]; }; export const parseTestResult = (image: DynamoDbImage): TestResult => { - return { - systemNumber: image.getString("systemNumber"), - vrm: image.getString("vrm"), - trailerId: image.getString("trailerId"), - vin: image.getString("vin"), - vehicleId: image.getString("vehicleId"), - deletionFlag: image.getBoolean("deletionFlag"), - testVersion: image.getString("testVersion") as TestVersion, - reasonForCreation: image.getString("reasonForCreation"), - createdAt: image.getDate("createdAt"), - createdByName: image.getString("createdByName"), - createdById: image.getString("createdById"), - lastUpdatedAt: image.getDate("lastUpdatedAt"), - lastUpdatedByName: image.getString("lastUpdatedByName"), - lastUpdatedById: image.getString("lastUpdatedById"), - shouldEmailCertificate: image.getString("shouldEmailCertificate"), - testStationName: image.getString("testStationName"), - testStationPNumber: image.getString("testStationPNumber"), - testStationType: image.getString("testStationType") as TestStationType, - testerName: image.getString("testerName"), - testerStaffId: image.getString("testerStaffId"), - testResultId: image.getString("testResultId"), - testerEmailAddress: image.getString("testerEmailAddress"), - testStartTimestamp: image.getDate("testStartTimestamp"), - testEndTimestamp: image.getDate("testEndTimestamp"), - testStatus: image.getString("testStatus") as TestStatus, - reasonForCancellation: image.getString("reasonForCancellation"), - vehicleClass: parseVehicleClass(image.getMap("vehicleClass")), - vehicleSubclass: parseStringArray(image.getList("vehicleSubclass")), - vehicleType: image.getString("vehicleType") as VehicleType, - numberOfSeats: image.getNumber("numberOfSeats"), - vehicleConfiguration: image.getString("vehicleConfiguration") as VehicleConfiguration, - odometerReading: image.getNumber("odometerReading"), - odometerReadingUnits: image.getString("odometerReadingUnits") as OdometerReadingUnits, - preparerId: image.getString("preparerId"), - preparerName: image.getString("preparerName"), - numberOfWheelsDriven: image.getNumber("numberOfWheelsDriven"), - euVehicleCategory: image.getString("euVehicleCategory") as EuVehicleCategory, - countryOfRegistration: image.getString("countryOfRegistration"), - vehicleSize: image.getString("vehicleSize") as VehicleSize, - noOfAxles: image.getNumber("noOfAxles"), - regnDate: image.getString("regnDate"), - firstUseDate: image.getString("firstUseDate"), - testTypes: parseTestTypes(image.getList("testTypes")) - }; + return { + systemNumber: image.getString("systemNumber"), + vrm: image.getString("vrm"), + trailerId: image.getString("trailerId"), + vin: image.getString("vin"), + vehicleId: image.getString("vehicleId"), + deletionFlag: image.getBoolean("deletionFlag"), + testVersion: image.getString("testVersion") as TestVersion, + reasonForCreation: image.getString("reasonForCreation"), + createdAt: image.getDate("createdAt"), + createdByName: image.getString("createdByName"), + createdById: image.getString("createdById"), + lastUpdatedAt: image.getDate("lastUpdatedAt"), + lastUpdatedByName: image.getString("lastUpdatedByName"), + lastUpdatedById: image.getString("lastUpdatedById"), + shouldEmailCertificate: image.getString("shouldEmailCertificate"), + testStationName: image.getString("testStationName"), + testStationPNumber: image.getString("testStationPNumber"), + testStationType: image.getString("testStationType") as TestStationType, + testerName: image.getString("testerName"), + testerStaffId: image.getString("testerStaffId"), + testResultId: image.getString("testResultId"), + testerEmailAddress: image.getString("testerEmailAddress"), + testStartTimestamp: image.getDate("testStartTimestamp"), + testEndTimestamp: image.getDate("testEndTimestamp"), + testStatus: image.getString("testStatus") as TestStatus, + reasonForCancellation: image.getString("reasonForCancellation"), + vehicleClass: parseVehicleClass(image.getMap("vehicleClass")), + vehicleSubclass: parseStringArray(image.getList("vehicleSubclass")), + vehicleType: image.getString("vehicleType") as VehicleType, + numberOfSeats: image.getNumber("numberOfSeats"), + vehicleConfiguration: image.getString( + "vehicleConfiguration" + ) as VehicleConfiguration, + odometerReading: image.getNumber("odometerReading"), + odometerReadingUnits: image.getString( + "odometerReadingUnits" + ) as OdometerReadingUnits, + preparerId: image.getString("preparerId"), + preparerName: image.getString("preparerName"), + numberOfWheelsDriven: image.getNumber("numberOfWheelsDriven"), + euVehicleCategory: image.getString( + "euVehicleCategory" + ) as EuVehicleCategory, + countryOfRegistration: image.getString("countryOfRegistration"), + vehicleSize: image.getString("vehicleSize") as VehicleSize, + noOfAxles: image.getNumber("noOfAxles"), + regnDate: image.getString("regnDate"), + firstUseDate: image.getString("firstUseDate"), + testTypes: parseTestTypes(image.getList("testTypes")), + }; }; diff --git a/src/models/test-types.ts b/src/models/test-types.ts index 59d669a..01fb038 100644 --- a/src/models/test-types.ts +++ b/src/models/test-types.ts @@ -1,101 +1,126 @@ -import {ModType, parseModType} from "./mod-type"; -import {CustomDefects, Defects, parseCustomDefects, parseDefects} from "./defects"; -import {DynamoDbImage} from "../services/dynamodb-images"; +import { ModType, parseModType } from "./mod-type"; +import { + CustomDefects, + Defects, + parseCustomDefects, + parseDefects, +} from "./defects"; +import { DynamoDbImage } from "../services/dynamodb-images"; export type TestResultStatus = "fail" | "pass" | "prs" | "abandoned"; -export type EmissionStandard = "0.10 g/kWh Euro 3 PM" | "0.03 g/kWh Euro IV PM" | "Euro 3" | "Euro 4" | "Euro 6" | "Euro VI" | "Full Electric"; +export type EmissionStandard = + | "0.10 g/kWh Euro 3 PM" + | "0.03 g/kWh Euro IV PM" + | "Euro 3" + | "Euro 4" + | "Euro 6" + | "Euro VI" + | "Full Electric"; -export type FuelType = "diesel" | "gas-cng" | "gas-lng" | "gas-lpg" | "fuel cell" | "petrol" | "full electric"; +export type FuelType = + | "diesel" + | "gas-cng" + | "gas-lng" + | "gas-lpg" + | "fuel cell" + | "petrol" + | "full electric"; export type TestTypes = TestType[]; export interface TestType { - createdAt?: string; - lastUpdatedAt?: string; - deletionFlag?: boolean; - testCode?: string; - testTypeClassification?: string; // field does not exist in API schema, but is definitely present on some documents - testTypeName?: string; - name?: string; - testTypeId?: string; - testNumber?: string; - certificateNumber?: string; - secondaryCertificateNumber?: string; - certificateLink?: string; - testExpiryDate?: string; - testAnniversaryDate?: string; - testTypeStartTimestamp?: string; - testTypeEndTimestamp?: string; - statusUpdatedFlag?: boolean; - numberOfSeatbeltsFitted?: number; - lastSeatbeltInstallationCheckDate?: string; - seatbeltInstallationCheckDate?: boolean; - testResult?: TestResultStatus; - prohibitionIssued?: boolean; - reasonForAbandoning?: string; - additionalNotesRecorded?: string; - additionalCommentsForAbandon?: string; - modType?: ModType; - emissionStandard?: EmissionStandard; - fuelType?: FuelType; - particulateTrapFitted?: string; - particulateTrapSerialNumber?: string; - modificationTypeUsed?: string; - smokeTestKLimitApplied?: string; - defects?: Defects; - customDefects?: CustomDefects; + createdAt?: string; + lastUpdatedAt?: string; + deletionFlag?: boolean; + testCode?: string; + testTypeClassification?: string; // field does not exist in API schema, but is definitely present on some documents + testTypeName?: string; + name?: string; + testTypeId?: string; + testNumber?: string; + certificateNumber?: string; + secondaryCertificateNumber?: string; + certificateLink?: string; + testExpiryDate?: string; + testAnniversaryDate?: string; + testTypeStartTimestamp?: string; + testTypeEndTimestamp?: string; + statusUpdatedFlag?: boolean; + numberOfSeatbeltsFitted?: number; + lastSeatbeltInstallationCheckDate?: string; + seatbeltInstallationCheckDate?: boolean; + testResult?: TestResultStatus; + prohibitionIssued?: boolean; + reasonForAbandoning?: string; + additionalNotesRecorded?: string; + additionalCommentsForAbandon?: string; + modType?: ModType; + emissionStandard?: EmissionStandard; + fuelType?: FuelType; + particulateTrapFitted?: string; + particulateTrapSerialNumber?: string; + modificationTypeUsed?: string; + smokeTestKLimitApplied?: string; + defects?: Defects; + customDefects?: CustomDefects; } export const parseTestTypes = (image?: DynamoDbImage): TestTypes => { - if (!image) { - return [] as TestTypes; - } + if (!image) { + return [] as TestTypes; + } - const testResults: TestTypes = []; + const testResults: TestTypes = []; - for (const key of image.getKeys()) { - testResults.push(parseTestType(image.getMap(key)!)); - } + for (const key of image.getKeys()) { + testResults.push(parseTestType(image.getMap(key)!)); + } - return testResults; + return testResults; }; export const parseTestType = (image: DynamoDbImage): TestType => { - return { - createdAt: image.getDate("createdAt"), - lastUpdatedAt: image.getDate("lastUpdatedAt"), - deletionFlag: image.getBoolean("deletionFlag"), - testCode: image.getString("testCode"), - testTypeClassification: image.getString("testTypeClassification"), - testTypeName: image.getString("testTypeName"), - name: image.getString("name"), - testTypeId: image.getString("testTypeId"), - testNumber: image.getString("testNumber"), - certificateNumber: image.getString("certificateNumber"), - secondaryCertificateNumber: image.getString("secondaryCertificateNumber"), - certificateLink: image.getString("certificateLink"), - testExpiryDate: image.getDate("testExpiryDate"), - testAnniversaryDate: image.getDate("testAnniversaryDate"), - testTypeStartTimestamp: image.getDate("testTypeStartTimestamp"), - testTypeEndTimestamp: image.getDate("testTypeEndTimestamp"), - statusUpdatedFlag: image.getBoolean("statusUpdatedFlag"), - numberOfSeatbeltsFitted: image.getNumber("numberOfSeatbeltsFitted"), - lastSeatbeltInstallationCheckDate: image.getString("lastSeatbeltInstallationCheckDate"), - seatbeltInstallationCheckDate: image.getBoolean("seatbeltInstallationCheckDate"), - testResult: image.getString("testResult") as TestResultStatus, - prohibitionIssued: image.getBoolean("prohibitionIssued"), - reasonForAbandoning: image.getString("reasonForAbandoning"), - additionalNotesRecorded: image.getString("additionalNotesRecorded"), - additionalCommentsForAbandon: image.getString("additionalCommentsForAbandon"), - modType: parseModType(image.getMap("modType")), - emissionStandard: image.getString("emissionStandard") as EmissionStandard, - fuelType: image.getString("fuelType") as FuelType, - particulateTrapFitted: image.getString("particulateTrapFitted"), - particulateTrapSerialNumber: image.getString("particulateTrapSerialNumber"), - modificationTypeUsed: image.getString("modificationTypeUsed"), - smokeTestKLimitApplied: image.getString("smokeTestKLimitApplied"), - defects: parseDefects(image.getList("defects")), - customDefects: parseCustomDefects(image.getList("customDefects")) - }; + return { + createdAt: image.getDate("createdAt"), + lastUpdatedAt: image.getDate("lastUpdatedAt"), + deletionFlag: image.getBoolean("deletionFlag"), + testCode: image.getString("testCode"), + testTypeClassification: image.getString("testTypeClassification"), + testTypeName: image.getString("testTypeName"), + name: image.getString("name"), + testTypeId: image.getString("testTypeId"), + testNumber: image.getString("testNumber"), + certificateNumber: image.getString("certificateNumber"), + secondaryCertificateNumber: image.getString("secondaryCertificateNumber"), + certificateLink: image.getString("certificateLink"), + testExpiryDate: image.getDate("testExpiryDate"), + testAnniversaryDate: image.getDate("testAnniversaryDate"), + testTypeStartTimestamp: image.getDate("testTypeStartTimestamp"), + testTypeEndTimestamp: image.getDate("testTypeEndTimestamp"), + statusUpdatedFlag: image.getBoolean("statusUpdatedFlag"), + numberOfSeatbeltsFitted: image.getNumber("numberOfSeatbeltsFitted"), + lastSeatbeltInstallationCheckDate: image.getString( + "lastSeatbeltInstallationCheckDate" + ), + seatbeltInstallationCheckDate: image.getBoolean( + "seatbeltInstallationCheckDate" + ), + testResult: image.getString("testResult") as TestResultStatus, + prohibitionIssued: image.getBoolean("prohibitionIssued"), + reasonForAbandoning: image.getString("reasonForAbandoning"), + additionalNotesRecorded: image.getString("additionalNotesRecorded"), + additionalCommentsForAbandon: image.getString( + "additionalCommentsForAbandon" + ), + modType: parseModType(image.getMap("modType")), + emissionStandard: image.getString("emissionStandard") as EmissionStandard, + fuelType: image.getString("fuelType") as FuelType, + particulateTrapFitted: image.getString("particulateTrapFitted"), + particulateTrapSerialNumber: image.getString("particulateTrapSerialNumber"), + modificationTypeUsed: image.getString("modificationTypeUsed"), + smokeTestKLimitApplied: image.getString("smokeTestKLimitApplied"), + defects: parseDefects(image.getList("defects")), + customDefects: parseCustomDefects(image.getList("customDefects")), + }; }; diff --git a/src/models/vehicle-class.ts b/src/models/vehicle-class.ts index 78db6ca..5cb61ce 100644 --- a/src/models/vehicle-class.ts +++ b/src/models/vehicle-class.ts @@ -1,35 +1,48 @@ -import {DynamoDbImage} from "../services/dynamodb-images"; -import {Maybe} from "./optionals"; +import { DynamoDbImage } from "../services/dynamodb-images"; +import { Maybe } from "./optionals"; export interface VehicleClass { - code?: VehicleCode; - description?: VehicleDescription; + code?: VehicleCode; + description?: VehicleDescription; } export type VehicleDescription = - "motorbikes over 200cc or with a sidecar" - | "not applicable" - | "small psv (ie: less than or equal to 22 seats)" - | "motorbikes up to 200cc" - | "trailer" - | "large psv(ie: greater than 23 seats)" - | "3 wheelers" - | "heavy goods vehicle" - | "MOT class 4" - | "MOT class 7" - | "MOT class 5" - | "PSV of unknown or unspecified size" - | "Not Known"; + | "motorbikes over 200cc or with a sidecar" + | "not applicable" + | "small psv (ie: less than or equal to 22 seats)" + | "motorbikes up to 200cc" + | "trailer" + | "large psv(ie: greater than 23 seats)" + | "3 wheelers" + | "heavy goods vehicle" + | "MOT class 4" + | "MOT class 7" + | "MOT class 5" + | "PSV of unknown or unspecified size" + | "Not Known"; -export type VehicleCode = "2" | "n" | "s" | "1" | "t" | "l" | "3" | "v" | "4" | "7" | "5"; +export type VehicleCode = + | "2" + | "n" + | "s" + | "1" + | "t" + | "l" + | "3" + | "v" + | "4" + | "7" + | "5"; -export const parseVehicleClass = (vehicleClass?: DynamoDbImage): Maybe => { - if (!vehicleClass) { - return undefined; - } +export const parseVehicleClass = ( + vehicleClass?: DynamoDbImage +): Maybe => { + if (!vehicleClass) { + return undefined; + } - return { - code: vehicleClass.getString("code") as VehicleCode, - description: vehicleClass.getString("description") as VehicleDescription - }; + return { + code: vehicleClass.getString("code") as VehicleCode, + description: vehicleClass.getString("description") as VehicleDescription, + }; }; diff --git a/src/services/connection-pool-options.ts b/src/services/connection-pool-options.ts index c97a710..6e66f2a 100644 --- a/src/services/connection-pool-options.ts +++ b/src/services/connection-pool-options.ts @@ -1,20 +1,20 @@ -import {PoolOptions} from "mysql2/promise"; -import {getSecretValue} from "./secrets-manager"; -import {SecretsManagerConfig} from "../models/aws-sm-config"; +import { PoolOptions } from "mysql2/promise"; +import { getSecretValue } from "./secrets-manager"; +import { SecretsManagerConfig } from "../models/aws-sm-config"; export const getConnectionPoolOptions = async (): Promise => { - const config: SecretsManagerConfig = await getConfig(); - return { - host: config.host, - port: config.port, - user: config.username, - password: config.password, - database: process.env.SCHEMA_NAME, - connectionLimit: 1000, - }; + const config: SecretsManagerConfig = await getConfig(); + return { + host: config.host, + port: config.port, + user: config.username, + password: config.password, + database: process.env.SCHEMA_NAME, + connectionLimit: 1000, + }; }; const getConfig = async (): Promise => { - const configJson = await getSecretValue(process.env.SECRET!); - return JSON.parse(configJson) as SecretsManagerConfig; + const configJson = await getSecretValue(process.env.SECRET!); + return JSON.parse(configJson) as SecretsManagerConfig; }; diff --git a/src/services/connection-pool.ts b/src/services/connection-pool.ts index 7ae0299..7158e7b 100644 --- a/src/services/connection-pool.ts +++ b/src/services/connection-pool.ts @@ -1,71 +1,79 @@ import * as mysql2 from "mysql2/promise"; -import {Connection, FieldPacket, Pool} from "mysql2/promise"; -import {Maybe} from "../models/optionals"; -import {getConnectionPoolOptions} from "./connection-pool-options"; -import {debugLog} from "./logger"; +import { Connection, FieldPacket, Pool } from "mysql2/promise"; +import { Maybe } from "../models/optionals"; +import { getConnectionPoolOptions } from "./connection-pool-options"; +import { debugLog } from "./logger"; export interface QueryResponse { - rows?: any; - fields?: FieldPacket[]; + rows?: any; + fields?: FieldPacket[]; } // Lazy let pool: Maybe; export const getConnectionPool = async (): Promise => { - if (pool) { - debugLog("getConnectionPool: Returning existing connection pool"); - return pool; - } - debugLog("getConnectionPool: Creating connection pool..."); + if (pool) { + debugLog("getConnectionPool: Returning existing connection pool"); + return pool; + } + debugLog("getConnectionPool: Creating connection pool..."); - const config = await getConnectionPoolOptions(); + const config = await getConnectionPoolOptions(); - debugLog(`getConnectionPool: Destination DB ${config.database}`); + debugLog(`getConnectionPool: Destination DB ${config.database}`); - pool = mysql2.createPool(config); + pool = mysql2.createPool(config); - debugLog("getConnectionPool: Connection pool created"); - return pool; + debugLog("getConnectionPool: Connection pool created"); + return pool; }; export const destroyConnectionPool = async (): Promise => { - debugLog("destroyConnectionPool: Destroying connection pool..."); - if (pool) { - await pool.end(); - pool = undefined; - debugLog(`destroyConnectionPool: connection pool destroyed`); - } else { - debugLog(`destroyConnectionPool: nothing to do`); - } + debugLog("destroyConnectionPool: Destroying connection pool..."); + if (pool) { + await pool.end(); + pool = undefined; + debugLog(`destroyConnectionPool: connection pool destroyed`); + } else { + debugLog(`destroyConnectionPool: nothing to do`); + } }; -export const executeSql = async (sql: string, templateVariables?: any[], connection?: Connection): Promise => { - if (templateVariables) { - templateVariables = undefinedToNull(templateVariables); - } +export const executeSql = async ( + sql: string, + templateVariables?: any[], + connection?: Connection +): Promise => { + if (templateVariables) { + templateVariables = undefinedToNull(templateVariables); + } - debugLog(`Executing SQL: ${sql}`); - debugLog(`Template vars: ${templateVariables === undefined ? "[]" : templateVariables}`); + debugLog(`Executing SQL: ${sql}`); + debugLog( + `Template vars: ${ + templateVariables === undefined ? "[]" : templateVariables + }` + ); - if (connection) { - const [rows, fields] = await connection.execute(sql, templateVariables); - return {rows, fields}; - } else { - const connectionPool = await getConnectionPool(); - const [rows, fields] = await connectionPool.execute(sql, templateVariables); - return {rows, fields}; - } + if (connection) { + const [rows, fields] = await connection.execute(sql, templateVariables); + return { rows, fields }; + } else { + const connectionPool = await getConnectionPool(); + const [rows, fields] = await connectionPool.execute(sql, templateVariables); + return { rows, fields }; + } }; // npm packages mysql and mysql2 will throw an error on encountering JS "undefined". // In contrast, an explicit JS "null" translates to SQL "NULL". // hence, transform all "undefined" to "null". const undefinedToNull = (array: any[]): any[] => { - array.forEach((v, i) => { - if (v === undefined) { - array[i] = null; - } - }); - return array; + array.forEach((v, i) => { + if (v === undefined) { + array[i] = null; + } + }); + return array; }; diff --git a/src/services/dynamodb-images.ts b/src/services/dynamodb-images.ts index f7bb0a1..a9ff3a6 100644 --- a/src/services/dynamodb-images.ts +++ b/src/services/dynamodb-images.ts @@ -1,6 +1,6 @@ -import {AttributeValue} from "aws-sdk/clients/dynamodbstreams"; +import { AttributeValue } from "aws-sdk/clients/dynamodbstreams"; import { parseISO } from "date-fns"; -import {Maybe} from "../models/optionals"; +import { Maybe } from "../models/optionals"; import { padWithZeros } from "../utils/padwithzeros"; export type DynamoDbItemType = "NULL" | "BOOL" | "S" | "N" | "B" | "M" | "L"; @@ -8,258 +8,300 @@ export type DynamoDbArrayType = "SS" | "NS" | "BS"; export type DynamoDbType = DynamoDbItemType | DynamoDbArrayType; export interface DynamoDbField { - key: string; - type: DynamoDbType; - value: any; + key: string; + type: DynamoDbType; + value: any; } /** * Concise, utility-focused representation of a DynamoDb "image", i.e. a document snapshot. */ export class DynamoDbImage { - private readonly fields: Map; - - private constructor(list: DynamoDbField[]) { - this.fields = list.reduce( - (map: Map, field: DynamoDbField): Map => { - map.set(field.key!, field); - return map; - }, - new Map() - ); + private readonly fields: Map; + + private constructor(list: DynamoDbField[]) { + this.fields = list.reduce( + ( + map: Map, + field: DynamoDbField + ): Map => { + map.set(field.key!, field); + return map; + }, + new Map() + ); + } + + /** + * Parse DynamoDB's native format into a {@link DynamoDbImage}. + * + * This is the only way to instantiate this class. + * @param image + */ + public static parse(image: { [key: string]: AttributeValue }): DynamoDbImage { + const fields: DynamoDbField[] = []; + const fieldKeys = Object.keys(image); + + for (const fieldKey of fieldKeys) { + const [typeKey, value] = typeValuePair(image[fieldKey]); + + fields.push({ + key: fieldKey, + type: typeKey, + value, + }); } - /** - * Parse DynamoDB's native format into a {@link DynamoDbImage}. - * - * This is the only way to instantiate this class. - * @param image - */ - public static parse(image: { [key: string]: AttributeValue }): DynamoDbImage { - const fields: DynamoDbField[] = []; - const fieldKeys = Object.keys(image); - - for (const fieldKey of fieldKeys) { - const [typeKey, value] = typeValuePair(image[fieldKey]); - - fields.push({ - key: fieldKey, - type: typeKey, - value - }); - } - - return new DynamoDbImage(fields); + return new DynamoDbImage(fields); + } + + /** + * Parse a {@code NULL} field with any name as a {@code null}. + * + * Does nothing. Returns {@code null} in all cases. + * @param _ + * @returns {@code null}, regardless of input + */ + public getNull(_: string): null { + return null; + } + + /** + * Parse the {@code BOOL} field under {@code key} as a {@code boolean}. + * @param key + */ + public getBoolean(key: string): boolean { + return this.parse(key, "BOOL", (v: any) => v as boolean, false); + } + + /** + * Parse the {@code S} field under {@code key} as a {@code string}. + * @param key + */ + public getString(key: string): Maybe { + return this.parseItem(key, "S", (v: any) => v as string); + } + + /** + * Parse the {@code S} field under {@code key} as a {@code string}. + * @param key + */ + public getDate(key: string): Maybe { + return this.parseItem(key, "S", (v: any) => { + const parsedDate = parseISO(v); + const year = parsedDate.getUTCFullYear(); + const month = padToTwo(parsedDate.getUTCMonth() + 1); + const date = padToTwo(parsedDate.getUTCDate()); + const hours = padToTwo(parsedDate.getUTCHours()); + const minutes = padToTwo(parsedDate.getUTCMinutes()); + const seconds = padToTwo(parsedDate.getUTCSeconds()); + const ms = padWithZeros(parsedDate.getUTCMilliseconds(), 3); + + return `${year}-${month}-${date} ${hours}:${minutes}:${seconds}.${ms}`; + }); + } + + /** + * Parse the {@code SS} field under {@code key} as a {@code string[]}. + * @param key + */ + public getStrings(key: string): string[] { + return this.parseArray(key, "SS", (arr: any) => arr as string[]); + } + + /** + * Parse the {@code N} field under {@code key} as a {@code number}. + * @param key + */ + public getNumber(key: string): Maybe { + return this.parseItem(key, "N", (v: any) => parseFloat(v)); + } + + /** + * Parse the {@code NS} field under {@code key} as a {@code number[]}. + * @param key + */ + public getNumbers(key: string): number[] { + return this.parseArray( + key, + "NS", + (arr: any) => arr.map((e: any) => parseFloat(e)) as number[] + ); + } + + /** + * Parse the {@code B} field under {@code key} as a {@code Buffer}. + * @param key + */ + public getBinary(key: string): Maybe { + return this.parseItem( + key, + "B", + (v: any) => Buffer.from(v, "base64") as Buffer + ); + } + + /** + * Parse the {@code BS} field under {@code key} as a {@code Buffer[]}. + * @param key + */ + public getBinaries(key: string): Buffer[] { + return this.parseArray( + key, + "BS", + (arr: any) => arr.map((e: string) => Buffer.from(e, "base64")) as Buffer[] + ); + } + + /** + * Parse the {@code M} field under {@code key} as a {@link DynamoDbImage}. + * @param key + */ + public getMap(key: string): Maybe { + return this.parseItem( + key, + "M", + (v: any) => DynamoDbImage.parse(v) as DynamoDbImage + ); + } + + /** + * Parse the {@code L} field under {@code key} as a {@link DynamoDbImage}. + * + * The resulting image's field keys will all be numeric indexes ("0", "1", "2", ...). + * @param key + */ + public getList(key: string): Maybe { + return this.parseItem(key, "L", (v: any) => { + let index = 0; + return new DynamoDbImage( + v + .map((e: AttributeValue) => typeValuePair(e)) + .map(([type, value]: [DynamoDbType, any]) => { + return { + key: "" + index++, + type, + value, + } as DynamoDbField; + }) + ); + }); + } + + /** + * Return all field keys this instance knows about. + * + * Use this function instead of Object::keys when iterating over type {@code L} fields. + */ + public getKeys(): string[] { + return Array.from(this.fields.keys()); + } + + /** + * Parse a field of type {@link DynamoDbItemType}. + * @param key + * @param expectedType + * @param parser + * @private + */ + private parseItem( + key: string, + expectedType: DynamoDbItemType, + parser: (value: any) => T + ): Maybe { + return this.parse(key, expectedType, parser, undefined); + } + + /** + * Parse a field of type {@link DynamoDbArrayType}. + * @param key + * @param expectedType + * @param parser + * @private + */ + private parseArray( + key: string, + expectedType: DynamoDbArrayType, + parser: (value: any) => E[] + ): E[] { + return this.parse(key, expectedType, parser, []); + } + + private parse( + key: string, + expectedType: DynamoDbType, + parser: (value: any) => ANY, + defaultValue: ANY + ): ANY { + const field: Maybe = this.fields.get(key); + + if (!field) { + return defaultValue; } - /** - * Parse a {@code NULL} field with any name as a {@code null}. - * - * Does nothing. Returns {@code null} in all cases. - * @param _ - * @returns {@code null}, regardless of input - */ - public getNull(_: string): null { - return null; - } - - /** - * Parse the {@code BOOL} field under {@code key} as a {@code boolean}. - * @param key - */ - public getBoolean(key: string): boolean { - return this.parse(key, "BOOL", ((v: any) => v as boolean), false); - } - - /** - * Parse the {@code S} field under {@code key} as a {@code string}. - * @param key - */ - public getString(key: string): Maybe { - return this.parseItem(key, "S", ((v: any) => v as string)); - } - - /** - * Parse the {@code S} field under {@code key} as a {@code string}. - * @param key - */ - public getDate(key: string): Maybe { - return this.parseItem( - key, - "S", - ((v: any) => { - const parsedDate = parseISO(v); - const year = parsedDate.getUTCFullYear(); - const month = padToTwo(parsedDate.getUTCMonth() + 1); - const date = padToTwo(parsedDate.getUTCDate()); - const hours = padToTwo(parsedDate.getUTCHours()); - const minutes = padToTwo(parsedDate.getUTCMinutes()); - const seconds = padToTwo(parsedDate.getUTCSeconds()); - const ms = padWithZeros(parsedDate.getUTCMilliseconds(), 3); - - return `${year}-${month}-${date} ${hours}:${minutes}:${seconds}.${ms}`; - })); - } - - /** - * Parse the {@code SS} field under {@code key} as a {@code string[]}. - * @param key - */ - public getStrings(key: string): string[] { - return this.parseArray(key, "SS", ((arr: any) => arr as string[])); - } - - /** - * Parse the {@code N} field under {@code key} as a {@code number}. - * @param key - */ - public getNumber(key: string): Maybe { - return this.parseItem(key, "N", ((v: any) => parseFloat(v))); - } - - /** - * Parse the {@code NS} field under {@code key} as a {@code number[]}. - * @param key - */ - public getNumbers(key: string): number[] { - return this.parseArray(key, "NS", ((arr: any) => arr.map((e: any) => parseFloat(e)) as number[])); - } - - /** - * Parse the {@code B} field under {@code key} as a {@code Buffer}. - * @param key - */ - public getBinary(key: string): Maybe { - return this.parseItem(key, "B", ((v: any) => Buffer.from(v, "base64") as Buffer)); - } - - /** - * Parse the {@code BS} field under {@code key} as a {@code Buffer[]}. - * @param key - */ - public getBinaries(key: string): Buffer[] { - return this.parseArray(key, "BS", ((arr: any) => arr.map((e: string) => Buffer.from(e, "base64")) as Buffer[])); - } - - /** - * Parse the {@code M} field under {@code key} as a {@link DynamoDbImage}. - * @param key - */ - public getMap(key: string): Maybe { - return this.parseItem(key, "M", ((v: any) => DynamoDbImage.parse(v) as DynamoDbImage)); - } - - /** - * Parse the {@code L} field under {@code key} as a {@link DynamoDbImage}. - * - * The resulting image's field keys will all be numeric indexes ("0", "1", "2", ...). - * @param key - */ - public getList(key: string): Maybe { - return this.parseItem(key, "L", ((v: any) => { - let index = 0; - return new DynamoDbImage( - v - .map((e: AttributeValue) => typeValuePair(e)) - .map(([type, value]: [DynamoDbType, any]) => { - return { - key: "" + (index++), - type, - value - } as DynamoDbField; - }) - ); - })); - } - - /** - * Return all field keys this instance knows about. - * - * Use this function instead of Object::keys when iterating over type {@code L} fields. - */ - public getKeys(): string[] { - return Array.from(this.fields.keys()); - } - - /** - * Parse a field of type {@link DynamoDbItemType}. - * @param key - * @param expectedType - * @param parser - * @private - */ - private parseItem(key: string, expectedType: DynamoDbItemType, parser: (value: any) => T): Maybe { - return this.parse(key, expectedType, parser, undefined); - } - - /** - * Parse a field of type {@link DynamoDbArrayType}. - * @param key - * @param expectedType - * @param parser - * @private - */ - private parseArray(key: string, expectedType: DynamoDbArrayType, parser: (value: any) => E[]): E[] { - return this.parse(key, expectedType, parser, []); - } - - private parse(key: string, expectedType: DynamoDbType, parser: (value: any) => ANY, defaultValue: ANY): ANY { - const field: Maybe = this.fields.get(key); - - if (!field) { - return defaultValue; - } - - switch (field.type) { - case "NULL": { - // account for explicit nulls in source data - return defaultValue; - } - default: { - verifyType(expectedType, field, field.value); - return parser(field.value); - } - } + switch (field.type) { + case "NULL": { + // account for explicit nulls in source data + return defaultValue; + } + default: { + verifyType(expectedType, field, field.value); + return parser(field.value); + } } + } } const padToTwo = (digit: number): string => { - return digit > 9 ? digit.toString() : "0" + digit; + return digit > 9 ? digit.toString() : "0" + digit; }; -const verifyType = (expectedType: DynamoDbType, field: DynamoDbField, value: any) => { - if (expectedType !== field.type) { - if (expectedType === "N" && field.type === "S" && !isNaN(value) && !isNaN(parseFloat(value))) { - return; - } - throw new Error(`field ${field.key} is not of type "${expectedType}" (actual: "${field.type}")`); +const verifyType = ( + expectedType: DynamoDbType, + field: DynamoDbField, + value: any +) => { + if (expectedType !== field.type) { + if ( + expectedType === "N" && + field.type === "S" && + !isNaN(value) && + !isNaN(parseFloat(value)) + ) { + return; } + throw new Error( + `field ${field.key} is not of type "${expectedType}" (actual: "${field.type}")` + ); + } }; const typeValuePair = (value: AttributeValue): [DynamoDbType, any] => { - const typeKeys = Object.keys(value); + const typeKeys = Object.keys(value); - if (typeKeys.length !== 1) { - throw new Error(`expected exactly 1 type key, found ${typeKeys.length} (${typeKeys})`); - } + if (typeKeys.length !== 1) { + throw new Error( + `expected exactly 1 type key, found ${typeKeys.length} (${typeKeys})` + ); + } - const typeKey: DynamoDbType = typeKeys[0] as DynamoDbType; + const typeKey: DynamoDbType = typeKeys[0] as DynamoDbType; - return [typeKey, value[typeKey]]; + return [typeKey, value[typeKey]]; }; // maps type "L", subtype "S" to string[] // note difference with DynamoDbImage::getStrings, which maps type "SS" to string[] export const parseStringArray = (listOfStrings?: DynamoDbImage): string[] => { - if (!listOfStrings) { - return []; - } + if (!listOfStrings) { + return []; + } - const strings: string[] = []; + const strings: string[] = []; - for (const key of listOfStrings.getKeys()) { - strings.push(listOfStrings.getString(key)!); - } + for (const key of listOfStrings.getKeys()) { + strings.push(listOfStrings.getString(key)!); + } - return strings; + return strings; }; diff --git a/src/services/entity-conversion.ts b/src/services/entity-conversion.ts index f42b853..240b884 100644 --- a/src/services/entity-conversion.ts +++ b/src/services/entity-conversion.ts @@ -1,14 +1,14 @@ -import {DynamoDbImage} from "./dynamodb-images"; -import {techRecordDocumentConverter} from "./tech-record-document-conversion"; -import {testResultsConverter} from "./test-result-record-conversion"; -import {SqlOperation} from "./sql-operations"; -import {Maybe} from "../models/optionals"; -import {debugLog} from "./logger"; +import { DynamoDbImage } from "./dynamodb-images"; +import { techRecordDocumentConverter } from "./tech-record-document-conversion"; +import { testResultsConverter } from "./test-result-record-conversion"; +import { SqlOperation } from "./sql-operations"; +import { Maybe } from "../models/optionals"; +import { debugLog } from "./logger"; export interface EntityConverter { - parseRootImage: (image: DynamoDbImage) => T; - upsertEntity: (entity: T) => Promise; - deleteEntity: (entity: T) => Promise; + parseRootImage: (image: DynamoDbImage) => T; + upsertEntity: (entity: T) => Promise; + deleteEntity: (entity: T) => Promise; } const entityConverters: Map> = new Map(); @@ -23,40 +23,49 @@ entityConverters.set("test-results", testResultsConverter()); * @param sqlOperation * @param image DynamoDB document snapshot */ -export const convert = async (tableName: string, sqlOperation: SqlOperation, image: DynamoDbImage): Promise => { - debugLog(`source table name: '${tableName}'`); +export const convert = async ( + tableName: string, + sqlOperation: SqlOperation, + image: DynamoDbImage +): Promise => { + debugLog(`source table name: '${tableName}'`); - const converter = getEntityConverter(tableName); + const converter = getEntityConverter(tableName); - debugLog("valid converter found"); + debugLog("valid converter found"); - const entity: T = converter.parseRootImage(image) as T; + const entity: T = converter.parseRootImage(image) as T; - switch (sqlOperation) { - case "INSERT": - case "UPDATE": - debugLog(`Upserting entity...`); - return converter.upsertEntity(entity); - case "DELETE": - debugLog(`Deleting entity...`); - return converter.deleteEntity(entity); - } + switch (sqlOperation) { + case "INSERT": + case "UPDATE": + debugLog(`Upserting entity...`); + return converter.upsertEntity(entity); + case "DELETE": + debugLog(`Deleting entity...`); + return converter.deleteEntity(entity); + } }; -const getEntityConverter = (tableName: string): EntityConverter => { - if (tableName.includes("technical-records") || tableName.includes("flat-tech-records")) { - tableName = "technical-records"; - } else if (tableName.includes("test-results")) { - tableName = "test-results"; - } +const getEntityConverter = (tableName: string): EntityConverter => { + if ( + tableName.includes("technical-records") || + tableName.includes("flat-tech-records") + ) { + tableName = "technical-records"; + } else if (tableName.includes("test-results")) { + tableName = "test-results"; + } - debugLog(`converter key: '${tableName}'`); + debugLog(`converter key: '${tableName}'`); - const entityConverter: Maybe> = entityConverters.get(tableName); + const entityConverter: Maybe> = entityConverters.get( + tableName + ); - if (!entityConverter) { - throw new Error(`no entity converter for table "${tableName}"`); - } + if (!entityConverter) { + throw new Error(`no entity converter for table "${tableName}"`); + } - return entityConverter; + return entityConverter; }; diff --git a/src/services/logger.ts b/src/services/logger.ts index 4326e04..f80496b 100644 --- a/src/services/logger.ts +++ b/src/services/logger.ts @@ -1,5 +1,5 @@ export const debugLog = (message?: any, ...optionalParams: any[]) => { - if (process.env.DEBUG) { - console.info(message, optionalParams); - } + if (process.env.DEBUG) { + console.info(message, optionalParams); + } }; diff --git a/src/services/secrets-manager.ts b/src/services/secrets-manager.ts index 271df1f..03ef255 100644 --- a/src/services/secrets-manager.ts +++ b/src/services/secrets-manager.ts @@ -1,25 +1,29 @@ -import {SecretsManager} from "aws-sdk"; -import {debugLog} from "./logger"; +import { SecretsManager } from "aws-sdk"; +import { debugLog } from "./logger"; export const getSecretValue = async (secretName: string): Promise => { - // This constructor is inside the function for testability (Jest hoisting is a pain). - // It's only called once per lambda execution, so this shouldn't affect performance. - // Please refactor if the above is ever not the case :) - const secretsManager: SecretsManager = new SecretsManager(); + // This constructor is inside the function for testability (Jest hoisting is a pain). + // It's only called once per lambda execution, so this shouldn't affect performance. + // Please refactor if the above is ever not the case :) + const secretsManager: SecretsManager = new SecretsManager(); - debugLog(`Fetching secret '${secretName}' from AWS Secrets Manager`); + debugLog(`Fetching secret '${secretName}' from AWS Secrets Manager`); - const secretValue = await secretsManager.getSecretValue({ SecretId: secretName }).promise(); + const secretValue = await secretsManager + .getSecretValue({ SecretId: secretName }) + .promise(); - if (!secretValue) { - throw new Error(`secret '${secretName}' does not exist`); - } + if (!secretValue) { + throw new Error(`secret '${secretName}' does not exist`); + } - if (secretValue.SecretString) { - return secretValue.SecretString; - } else if (secretValue.SecretBinary) { - return secretValue.SecretBinary.toString("utf-8"); - } + if (secretValue.SecretString) { + return secretValue.SecretString; + } else if (secretValue.SecretBinary) { + return secretValue.SecretBinary.toString("utf-8"); + } - throw new Error(`secret '${secretName}' must contain one of ['SecretString', 'SecretBinary']`); + throw new Error( + `secret '${secretName}' must contain one of ['SecretString', 'SecretBinary']` + ); }; diff --git a/src/services/sql-execution.ts b/src/services/sql-execution.ts index cbaa619..45576ad 100644 --- a/src/services/sql-execution.ts +++ b/src/services/sql-execution.ts @@ -1,12 +1,12 @@ -import {executeSql, QueryResponse} from "./connection-pool"; -import {Connection} from "mysql2/promise"; -import {TableDetails} from "./table-details"; +import { executeSql, QueryResponse } from "./connection-pool"; +import { Connection } from "mysql2/promise"; +import { TableDetails } from "./table-details"; import { - generateFullUpsertSql, - generateSelectSql, - generatePartialUpsertSql, - generateSelectRecordIds, - generateDeleteBasedOnWhereIn + generateFullUpsertSql, + generateSelectSql, + generatePartialUpsertSql, + generateSelectRecordIds, + generateDeleteBasedOnWhereIn, } from "./sql-generation"; /** @@ -20,12 +20,16 @@ import { * @param templateVariables * @param connection */ -export const executePartialUpsert = (tableDetails: TableDetails, templateVariables: any[], connection: Connection): Promise => { - return executeSql( - generatePartialUpsertSql(tableDetails), - templateVariables, - connection - ); +export const executePartialUpsert = ( + tableDetails: TableDetails, + templateVariables: any[], + connection: Connection +): Promise => { + return executeSql( + generatePartialUpsertSql(tableDetails), + templateVariables, + connection + ); }; /** @@ -39,22 +43,26 @@ export const executePartialUpsert = (tableDetails: TableDetails, templateVariabl * @param templateVariables * @param connection */ -export const executePartialUpsertIfNotExists = async (tableDetails: TableDetails, templateVariables: any[], connection: Connection): Promise => { - const selectResultSet = await executeSql( - generateSelectSql(tableDetails), - templateVariables, - connection - ); +export const executePartialUpsertIfNotExists = async ( + tableDetails: TableDetails, + templateVariables: any[], + connection: Connection +): Promise => { + const selectResultSet = await executeSql( + generateSelectSql(tableDetails), + templateVariables, + connection + ); - if (selectResultSet.rows.length === 0) { - return executeSql( - generatePartialUpsertSql(tableDetails), - templateVariables, - connection - ); - } else { - return {rows: selectResultSet.rows[0], fields: selectResultSet.fields}; - } + if (selectResultSet.rows.length === 0) { + return executeSql( + generatePartialUpsertSql(tableDetails), + templateVariables, + connection + ); + } else { + return { rows: selectResultSet.rows[0], fields: selectResultSet.fields }; + } }; /** @@ -66,32 +74,45 @@ export const executePartialUpsertIfNotExists = async (tableDetails: TableDetails * @param templateVariables * @param connection */ -export const executeFullUpsert = async (tableDetails: TableDetails, templateVariables: any[], connection: Connection): Promise => { - templateVariables = templateVariables.concat(templateVariables.slice()); +export const executeFullUpsert = async ( + tableDetails: TableDetails, + templateVariables: any[], + connection: Connection +): Promise => { + templateVariables = templateVariables.concat(templateVariables.slice()); - return executeSql( - generateFullUpsertSql(tableDetails), - templateVariables, - connection - ); + return executeSql( + generateFullUpsertSql(tableDetails), + templateVariables, + connection + ); }; -export async function deleteBasedOnWhereIn(targetTableName: string, targetColumnName: string, ids: any[], connection: Connection): Promise { - const values: any[] | undefined = Object.values(ids); +export async function deleteBasedOnWhereIn( + targetTableName: string, + targetColumnName: string, + ids: any[], + connection: Connection +): Promise { + const values: any[] | undefined = Object.values(ids); - return executeSql( - generateDeleteBasedOnWhereIn(targetTableName, targetColumnName, ids), - values, - connection - ); + return executeSql( + generateDeleteBasedOnWhereIn(targetTableName, targetColumnName, ids), + values, + connection + ); } -export async function selectRecordIds(targetTableName: string, conditionAttributes: { [key: string]: any }, connection: Connection): Promise { - const values: any[] | undefined = Object.values(conditionAttributes); +export async function selectRecordIds( + targetTableName: string, + conditionAttributes: { [key: string]: any }, + connection: Connection +): Promise { + const values: any[] | undefined = Object.values(conditionAttributes); - return executeSql( - generateSelectRecordIds(targetTableName, conditionAttributes), - values, - connection - ); + return executeSql( + generateSelectRecordIds(targetTableName, conditionAttributes), + values, + connection + ); } diff --git a/src/services/sql-generation.ts b/src/services/sql-generation.ts index cf705be..82dda81 100644 --- a/src/services/sql-generation.ts +++ b/src/services/sql-generation.ts @@ -1,15 +1,17 @@ -import {TableDetails} from "./table-details"; +import { TableDetails } from "./table-details"; /** * Generate partial upsert SQL. See sql-execution.ts for a definition of partial upsert. * * @param tableDetails the table to generate upsert SQL for */ -export const generatePartialUpsertSql = (tableDetails: TableDetails): string => { - return generateUpsertSql( - tableDetails, - generateUpdatePlaceholders(tableDetails.primaryKeyColumnName) - ); +export const generatePartialUpsertSql = ( + tableDetails: TableDetails +): string => { + return generateUpsertSql( + tableDetails, + generateUpdatePlaceholders(tableDetails.primaryKeyColumnName) + ); }; /** @@ -18,10 +20,13 @@ export const generatePartialUpsertSql = (tableDetails: TableDetails): string => * @param tableDetails the table to generate upsert SQL for */ export const generateFullUpsertSql = (tableDetails: TableDetails): string => { - return generateUpsertSql( - tableDetails, - generateUpdatePlaceholders(tableDetails.primaryKeyColumnName, tableDetails.columnNames) - ); + return generateUpsertSql( + tableDetails, + generateUpdatePlaceholders( + tableDetails.primaryKeyColumnName, + tableDetails.columnNames + ) + ); }; /** @@ -30,49 +35,72 @@ export const generateFullUpsertSql = (tableDetails: TableDetails): string => { * @param tableDetails the table to generate select statement for */ export const generateSelectSql = (tableDetails: TableDetails): string => { - const query = `SELECT id insertId FROM \`${tableDetails.tableName}\` WHERE fingerprint = MD5(CONCAT_WS('|', ${(nCopies(tableDetails.columnNames.length, "IFNULL(?, '')").join(", "))}))`; - return query; + const query = `SELECT id insertId FROM \`${ + tableDetails.tableName + }\` WHERE fingerprint = MD5(CONCAT_WS('|', ${nCopies( + tableDetails.columnNames.length, + "IFNULL(?, '')" + ).join(", ")}))`; + return query; }; -export const generateDeleteBasedOnWhereIn = (targetTableName: string, targetColumnName: string, conditionAttributes: any[]): string => { - return `DELETE FROM ${targetTableName} WHERE ${targetColumnName} IN (${Object.entries(conditionAttributes) - .map(() => { - return `?`; - }) - })`; +export const generateDeleteBasedOnWhereIn = ( + targetTableName: string, + targetColumnName: string, + conditionAttributes: any[] +): string => { + return `DELETE FROM ${targetTableName} WHERE ${targetColumnName} IN (${Object.entries( + conditionAttributes + ).map(() => { + return `?`; + })})`; }; -export const generateSelectRecordIds = (targetTableName: string, conditionAttributes: { [key: string]: any; }): string => { - return `SELECT id FROM ${targetTableName} WHERE ${Object.entries(conditionAttributes) - .map(([key]) => { - return `${key}=?`; - }).join(" AND ")}`; +export const generateSelectRecordIds = ( + targetTableName: string, + conditionAttributes: { [key: string]: any } +): string => { + return `SELECT id FROM ${targetTableName} WHERE ${Object.entries( + conditionAttributes + ) + .map(([key]) => { + return `${key}=?`; + }) + .join(" AND ")}`; }; -const generateUpsertSql = (tableDetails: TableDetails, updatePlaceholders: string[]): string => { - return `INSERT INTO \`${tableDetails.tableName}\` (${tableDetails.columnNames.map((c) => `\`${c}\``).join(", ")})` - + ` VALUES (${(nCopies(tableDetails.columnNames.length, "?").join(", "))})` - + ` ON DUPLICATE KEY UPDATE ${updatePlaceholders.join(", ")}`; +const generateUpsertSql = ( + tableDetails: TableDetails, + updatePlaceholders: string[] +): string => { + return ( + `INSERT INTO \`${tableDetails.tableName}\` (${tableDetails.columnNames + .map((c) => `\`${c}\``) + .join(", ")})` + + ` VALUES (${nCopies(tableDetails.columnNames.length, "?").join(", ")})` + + ` ON DUPLICATE KEY UPDATE ${updatePlaceholders.join(", ")}` + ); }; -const generateUpdatePlaceholders = (primaryKeyColumn?: string, columnNames?: string[]): string[] => { - if (!primaryKeyColumn) { - primaryKeyColumn = "id"; - } +const generateUpdatePlaceholders = ( + primaryKeyColumn?: string, + columnNames?: string[] +): string[] => { + if (!primaryKeyColumn) { + primaryKeyColumn = "id"; + } - const primaryKeyPlaceholder = `\`${primaryKeyColumn}\` = LAST_INSERT_ID(\`${primaryKeyColumn}\`)`; + const primaryKeyPlaceholder = `\`${primaryKeyColumn}\` = LAST_INSERT_ID(\`${primaryKeyColumn}\`)`; - if (!columnNames) { - return [ primaryKeyPlaceholder ]; - } + if (!columnNames) { + return [primaryKeyPlaceholder]; + } - return [ primaryKeyPlaceholder ].concat( - columnNames - .filter((c) => c !== primaryKeyColumn) - .map((c) => `\`${c}\` = ?`) - ); + return [primaryKeyPlaceholder].concat( + columnNames.filter((c) => c !== primaryKeyColumn).map((c) => `\`${c}\` = ?`) + ); }; const nCopies = (n: number, s: string): string[] => { - return Array.from({length: n}).map((_: any) => s); + return Array.from({ length: n }).map((_: any) => s); }; diff --git a/src/services/sql-operations.ts b/src/services/sql-operations.ts index 7e99c55..11f0088 100644 --- a/src/services/sql-operations.ts +++ b/src/services/sql-operations.ts @@ -1,16 +1,18 @@ -import {OperationType} from "aws-sdk/clients/dynamodbstreams"; +import { OperationType } from "aws-sdk/clients/dynamodbstreams"; export type SqlOperation = "INSERT" | "UPDATE" | "DELETE"; -export const deriveSqlOperation = (operationType: OperationType): SqlOperation => { - switch (operationType) { - case "INSERT": - return "INSERT"; - case "MODIFY": - return "UPDATE"; - case "REMOVE": - return "DELETE"; - default: - throw new Error(`unrecognized operation type ${operationType}`); - } +export const deriveSqlOperation = ( + operationType: OperationType +): SqlOperation => { + switch (operationType) { + case "INSERT": + return "INSERT"; + case "MODIFY": + return "UPDATE"; + case "REMOVE": + return "DELETE"; + default: + throw new Error(`unrecognized operation type ${operationType}`); + } }; diff --git a/src/services/table-details.ts b/src/services/table-details.ts index 92fb1e2..c97e615 100644 --- a/src/services/table-details.ts +++ b/src/services/table-details.ts @@ -1,428 +1,393 @@ export interface TableDetails { - tableName: string; - columnNames: string[]; - primaryKeyColumnName?: string; + tableName: string; + columnNames: string[]; + primaryKeyColumnName?: string; } export const VEHICLE_TABLE: TableDetails = { - tableName: "vehicle", - columnNames: [ - "system_number", - "vin", - "vrm_trm", - "trailer_id", - "createdAt", - ] + tableName: "vehicle", + columnNames: ["system_number", "vin", "vrm_trm", "trailer_id", "createdAt"], }; export const MAKE_MODEL_TABLE: TableDetails = { - tableName: "make_model", - columnNames: [ - "make", - "model", - "chassisMake", - "chassisModel", - "bodyMake", - "bodyModel", - "modelLiteral", - "bodyTypeCode", - "bodyTypeDescription", - "fuelPropulsionSystem", - "dtpCode", - ] + tableName: "make_model", + columnNames: [ + "make", + "model", + "chassisMake", + "chassisModel", + "bodyMake", + "bodyModel", + "modelLiteral", + "bodyTypeCode", + "bodyTypeDescription", + "fuelPropulsionSystem", + "dtpCode", + ], }; export const VEHICLE_CLASS_TABLE: TableDetails = { - tableName: "vehicle_class", - columnNames: [ - "code", - "description", - "vehicleType", - "vehicleSize", - "vehicleConfiguration", - "euVehicleCategory", - ] + tableName: "vehicle_class", + columnNames: [ + "code", + "description", + "vehicleType", + "vehicleSize", + "vehicleConfiguration", + "euVehicleCategory", + ], }; export const VEHICLE_SUBCLASS_TABLE: TableDetails = { - tableName: "vehicle_subclass", - columnNames: [ - "vehicle_class_id", - "subclass", - ] + tableName: "vehicle_subclass", + columnNames: ["vehicle_class_id", "subclass"], }; export const IDENTITY_TABLE: TableDetails = { - tableName: "identity", - columnNames: [ - "identityId", - "name", - ] + tableName: "identity", + columnNames: ["identityId", "name"], }; export const CONTACT_DETAILS_TABLE: TableDetails = { - tableName: "contact_details", - columnNames: [ - "name", - "address1", - "address2", - "postTown", - "address3", - "postCode", - "emailAddress", - "telephoneNumber", - "faxNumber", - ] + tableName: "contact_details", + columnNames: [ + "name", + "address1", + "address2", + "postTown", + "address3", + "postCode", + "emailAddress", + "telephoneNumber", + "faxNumber", + ], }; export const TECHNICAL_RECORD_TABLE: TableDetails = { - tableName: "technical_record", - columnNames: [ - "vehicle_id", - "recordCompleteness", - "createdAt", - "lastUpdatedAt", - "make_model_id", - "functionCode", - "offRoad", - "numberOfWheelsDriven", - "emissionsLimit", - "departmentalVehicleMarker", - "alterationMarker", - "vehicle_class_id", - "variantVersionNumber", - "grossEecWeight", - "trainEecWeight", - "maxTrainEecWeight", - "applicant_detail_id", - "purchaser_detail_id", - "manufacturer_detail_id", - "manufactureYear", - "regnDate", - "firstUseDate", - "coifDate", - "ntaNumber", - "coifSerialNumber", - "coifCertifierName", - "approvalType", - "approvalTypeNumber", - "variantNumber", - "conversionRefNo", - "seatsLowerDeck", - "seatsUpperDeck", - "standingCapacity", - "speedRestriction", - "speedLimiterMrk", - "tachoExemptMrk", - "dispensations", - "remarks", - "reasonForCreation", - "statusCode", - "unladenWeight", - "grossKerbWeight", - "grossLadenWeight", - "grossGbWeight", - "grossDesignWeight", - "trainGbWeight", - "trainDesignWeight", - "maxTrainGbWeight", - "maxTrainDesignWeight", - "maxLoadOnCoupling", - "frameDescription", - "tyreUseCode", - "roadFriendly", - "drawbarCouplingFitted", - "euroStandard", - "suspensionType", - "couplingType", - "length", - "height", - "width", - "frontAxleTo5thWheelMin", - "frontAxleTo5thWheelMax", - "frontVehicleTo5thWheelCouplingMin", - "frontVehicleTo5thWheelCouplingMax", - "frontAxleToRearAxle", - "rearAxleToRearTrl", - "couplingCenterToRearAxleMin", - "couplingCenterToRearAxleMax", - "couplingCenterToRearTrlMin", - "couplingCenterToRearTrlMax", - "centreOfRearmostAxleToRearOfTrl", - "notes", - "purchaserNotes", - "manufacturerNotes", - "noOfAxles", - "brakeCode", - "brakes_dtpNumber", - "brakes_loadSensingValve", - "brakes_antilockBrakingSystem", - "createdBy_Id", - "lastUpdatedBy_Id", - "updateType", - "numberOfSeatbelts", - "seatbeltInstallationApprovalDate", - ] + tableName: "technical_record", + columnNames: [ + "vehicle_id", + "recordCompleteness", + "createdAt", + "lastUpdatedAt", + "make_model_id", + "functionCode", + "offRoad", + "numberOfWheelsDriven", + "emissionsLimit", + "departmentalVehicleMarker", + "alterationMarker", + "vehicle_class_id", + "variantVersionNumber", + "grossEecWeight", + "trainEecWeight", + "maxTrainEecWeight", + "applicant_detail_id", + "purchaser_detail_id", + "manufacturer_detail_id", + "manufactureYear", + "regnDate", + "firstUseDate", + "coifDate", + "ntaNumber", + "coifSerialNumber", + "coifCertifierName", + "approvalType", + "approvalTypeNumber", + "variantNumber", + "conversionRefNo", + "seatsLowerDeck", + "seatsUpperDeck", + "standingCapacity", + "speedRestriction", + "speedLimiterMrk", + "tachoExemptMrk", + "dispensations", + "remarks", + "reasonForCreation", + "statusCode", + "unladenWeight", + "grossKerbWeight", + "grossLadenWeight", + "grossGbWeight", + "grossDesignWeight", + "trainGbWeight", + "trainDesignWeight", + "maxTrainGbWeight", + "maxTrainDesignWeight", + "maxLoadOnCoupling", + "frameDescription", + "tyreUseCode", + "roadFriendly", + "drawbarCouplingFitted", + "euroStandard", + "suspensionType", + "couplingType", + "length", + "height", + "width", + "frontAxleTo5thWheelMin", + "frontAxleTo5thWheelMax", + "frontVehicleTo5thWheelCouplingMin", + "frontVehicleTo5thWheelCouplingMax", + "frontAxleToRearAxle", + "rearAxleToRearTrl", + "couplingCenterToRearAxleMin", + "couplingCenterToRearAxleMax", + "couplingCenterToRearTrlMin", + "couplingCenterToRearTrlMax", + "centreOfRearmostAxleToRearOfTrl", + "notes", + "purchaserNotes", + "manufacturerNotes", + "noOfAxles", + "brakeCode", + "brakes_dtpNumber", + "brakes_loadSensingValve", + "brakes_antilockBrakingSystem", + "createdBy_Id", + "lastUpdatedBy_Id", + "updateType", + "numberOfSeatbelts", + "seatbeltInstallationApprovalDate", + ], }; export const PSV_BRAKES_TABLE: TableDetails = { - tableName: "psv_brakes", - columnNames: [ - "technical_record_id", - "brakeCodeOriginal", - "brakeCode", - "dataTrBrakeOne", - "dataTrBrakeTwo", - "dataTrBrakeThree", - "retarderBrakeOne", - "retarderBrakeTwo", - "serviceBrakeForceA", - "secondaryBrakeForceA", - "parkingBrakeForceA", - "serviceBrakeForceB", - "secondaryBrakeForceB", - "parkingBrakeForceB", - ] + tableName: "psv_brakes", + columnNames: [ + "technical_record_id", + "brakeCodeOriginal", + "brakeCode", + "dataTrBrakeOne", + "dataTrBrakeTwo", + "dataTrBrakeThree", + "retarderBrakeOne", + "retarderBrakeTwo", + "serviceBrakeForceA", + "secondaryBrakeForceA", + "parkingBrakeForceA", + "serviceBrakeForceB", + "secondaryBrakeForceB", + "parkingBrakeForceB", + ], }; export const AXLE_SPACING_TABLE: TableDetails = { - tableName: "axle_spacing", - columnNames: [ - "technical_record_id", - "axles", - "value", - ] + tableName: "axle_spacing", + columnNames: ["technical_record_id", "axles", "value"], }; export const MICROFILM_TABLE: TableDetails = { - tableName: "microfilm", - columnNames: [ - "technical_record_id", - "microfilmDocumentType", - "microfilmRollNumber", - "microfilmSerialNumber", - ] + tableName: "microfilm", + columnNames: [ + "technical_record_id", + "microfilmDocumentType", + "microfilmRollNumber", + "microfilmSerialNumber", + ], }; export const PLATE_TABLE: TableDetails = { - tableName: "plate", - columnNames: [ - "technical_record_id", - "plateSerialNumber", - "plateIssueDate", - "plateReasonForIssue", - "plateIssuer", - ] + tableName: "plate", + columnNames: [ + "technical_record_id", + "plateSerialNumber", + "plateIssueDate", + "plateReasonForIssue", + "plateIssuer", + ], }; export const AXLES_TABLE: TableDetails = { - tableName: "axles", - columnNames: [ - "technical_record_id", - "tyre_id", - "axleNumber", - "parkingBrakeMrk", - "kerbWeight", - "ladenWeight", - "gbWeight", - "eecWeight", - "designWeight", - "brakeActuator", - "leverLength", - "springBrakeParking", - ] + tableName: "axles", + columnNames: [ + "technical_record_id", + "tyre_id", + "axleNumber", + "parkingBrakeMrk", + "kerbWeight", + "ladenWeight", + "gbWeight", + "eecWeight", + "designWeight", + "brakeActuator", + "leverLength", + "springBrakeParking", + ], }; export const AUTH_INTO_SERVICE_TABLE: TableDetails = { - tableName: "auth_into_service", - columnNames: [ - "technical_record_id", - "cocIssueDate", - "dateReceived", - "datePending", - "dateAuthorised", - "dateRejected", - ] + tableName: "auth_into_service", + columnNames: [ + "technical_record_id", + "cocIssueDate", + "dateReceived", + "datePending", + "dateAuthorised", + "dateRejected", + ], }; export const TYRE_TABLE: TableDetails = { - tableName: "tyre", - columnNames: [ - "tyreSize", - "plyRating", - "fitmentCode", - "dataTrAxles", - "speedCategorySymbol", - "tyreCode", - ] + tableName: "tyre", + columnNames: [ + "tyreSize", + "plyRating", + "fitmentCode", + "dataTrAxles", + "speedCategorySymbol", + "tyreCode", + ], }; export const TEST_STATION_TABLE: TableDetails = { - tableName: "test_station", - columnNames: [ - "pNumber", - "name", - "type", - ] + tableName: "test_station", + columnNames: ["pNumber", "name", "type"], }; export const TESTER_TABLE: TableDetails = { - tableName: "tester", - columnNames: [ - "staffId", - "name", - "email_address", - ] + tableName: "tester", + columnNames: ["staffId", "name", "email_address"], }; export const FUEL_EMISSION_TABLE: TableDetails = { - tableName: "fuel_emission", - columnNames: [ - "modTypeCode", - "description", - "emissionStandard", - "fuelType", - ] + tableName: "fuel_emission", + columnNames: ["modTypeCode", "description", "emissionStandard", "fuelType"], }; export const TEST_TYPE_TABLE: TableDetails = { - tableName: "test_type", - columnNames: [ - "testTypeClassification", - "testTypeName", - ] + tableName: "test_type", + columnNames: ["testTypeClassification", "testTypeName"], }; export const PREPARER_TABLE: TableDetails = { - tableName: "preparer", - columnNames: [ - "preparerId", - "name", - ] + tableName: "preparer", + columnNames: ["preparerId", "name"], }; export const DEFECTS_TABLE: TableDetails = { - tableName: "defect", - columnNames: [ - "imNumber", - "imDescription", - "itemNumber", - "itemDescription", - "deficiencyRef", - "deficiencyId", - "deficiencySubId", - "deficiencyCategory", - "deficiencyText", - "stdForProhibition", - ] + tableName: "defect", + columnNames: [ + "imNumber", + "imDescription", + "itemNumber", + "itemDescription", + "deficiencyRef", + "deficiencyId", + "deficiencySubId", + "deficiencyCategory", + "deficiencyText", + "stdForProhibition", + ], }; export const LOCATION_TABLE: TableDetails = { - tableName: "location", - columnNames: [ - "vertical", - "horizontal", - "lateral", - "longitudinal", - "rowNumber", - "seatNumber", - "axleNumber", - ] + tableName: "location", + columnNames: [ + "vertical", + "horizontal", + "lateral", + "longitudinal", + "rowNumber", + "seatNumber", + "axleNumber", + ], }; export const TEST_DEFECT_TABLE: TableDetails = { - tableName: "test_defect", - columnNames: [ - "test_result_id", - "defect_id", - "location_id", - "notes", - "prs", - "prohibitionIssued", - ] + tableName: "test_defect", + columnNames: [ + "test_result_id", + "defect_id", + "location_id", + "notes", + "prs", + "prohibitionIssued", + ], }; export const CUSTOM_DEFECT_TABLE: TableDetails = { - tableName: "custom_defect", - columnNames: [ - "test_result_id", - "referenceNumber", - "defectName", - "defectNotes", - ] + tableName: "custom_defect", + columnNames: [ + "test_result_id", + "referenceNumber", + "defectName", + "defectNotes", + ], }; export const TEST_RESULT_TABLE: TableDetails = { - tableName: "test_result", - columnNames: [ - "vehicle_id", - "fuel_emission_id", - "test_station_id", - "tester_id", - "preparer_id", - "vehicle_class_id", - "test_type_id", - "testResultId", - "testStatus", - "reasonForCancellation", - "numberOfSeats", - "odometerReading", - "odometerReadingUnits", - "countryOfRegistration", - "noOfAxles", - "regnDate", - "firstUseDate", - "createdAt", - "lastUpdatedAt", - "testCode", - "testNumber", - "certificateNumber", - "secondaryCertificateNumber", - "testExpiryDate", - "testAnniversaryDate", - "testTypeStartTimestamp", - "testTypeEndTimestamp", - "numberOfSeatbeltsFitted", - "lastSeatbeltInstallationCheckDate", - "seatbeltInstallationCheckDate", - "testResult", - "reasonForAbandoning", - "additionalNotesRecorded", - "additionalCommentsForAbandon", - "particulateTrapFitted", - "particulateTrapSerialNumber", - "modificationTypeUsed", - "smokeTestKLimitApplied", - "createdBy_Id", - "lastUpdatedBy_Id", - "nopInsertedAt" - ] + tableName: "test_result", + columnNames: [ + "vehicle_id", + "fuel_emission_id", + "test_station_id", + "tester_id", + "preparer_id", + "vehicle_class_id", + "test_type_id", + "testResultId", + "testStatus", + "reasonForCancellation", + "numberOfSeats", + "odometerReading", + "odometerReadingUnits", + "countryOfRegistration", + "noOfAxles", + "regnDate", + "firstUseDate", + "createdAt", + "lastUpdatedAt", + "testCode", + "testNumber", + "certificateNumber", + "secondaryCertificateNumber", + "testExpiryDate", + "testAnniversaryDate", + "testTypeStartTimestamp", + "testTypeEndTimestamp", + "numberOfSeatbeltsFitted", + "lastSeatbeltInstallationCheckDate", + "seatbeltInstallationCheckDate", + "testResult", + "reasonForAbandoning", + "additionalNotesRecorded", + "additionalCommentsForAbandon", + "particulateTrapFitted", + "particulateTrapSerialNumber", + "modificationTypeUsed", + "smokeTestKLimitApplied", + "createdBy_Id", + "lastUpdatedBy_Id", + "nopInsertedAt", + ], }; export const allTables = (): TableDetails[] => { - return [ - VEHICLE_TABLE, - MAKE_MODEL_TABLE, - VEHICLE_CLASS_TABLE, - VEHICLE_SUBCLASS_TABLE, - IDENTITY_TABLE, - CONTACT_DETAILS_TABLE, - TECHNICAL_RECORD_TABLE, - PSV_BRAKES_TABLE, - AXLE_SPACING_TABLE, - MICROFILM_TABLE, - PLATE_TABLE, - AXLES_TABLE, - TYRE_TABLE, - TEST_STATION_TABLE, - TESTER_TABLE, - FUEL_EMISSION_TABLE, - TEST_TYPE_TABLE, - PREPARER_TABLE, - DEFECTS_TABLE, - LOCATION_TABLE, - TEST_DEFECT_TABLE, - CUSTOM_DEFECT_TABLE, - TEST_RESULT_TABLE, - ]; + return [ + VEHICLE_TABLE, + MAKE_MODEL_TABLE, + VEHICLE_CLASS_TABLE, + VEHICLE_SUBCLASS_TABLE, + IDENTITY_TABLE, + CONTACT_DETAILS_TABLE, + TECHNICAL_RECORD_TABLE, + PSV_BRAKES_TABLE, + AXLE_SPACING_TABLE, + MICROFILM_TABLE, + PLATE_TABLE, + AXLES_TABLE, + TYRE_TABLE, + TEST_STATION_TABLE, + TESTER_TABLE, + FUEL_EMISSION_TABLE, + TEST_TYPE_TABLE, + PREPARER_TABLE, + DEFECTS_TABLE, + LOCATION_TABLE, + TEST_DEFECT_TABLE, + CUSTOM_DEFECT_TABLE, + TEST_RESULT_TABLE, + ]; }; diff --git a/src/services/tech-record-document-conversion.ts b/src/services/tech-record-document-conversion.ts index 0a9c4a2..3bc9293 100644 --- a/src/services/tech-record-document-conversion.ts +++ b/src/services/tech-record-document-conversion.ts @@ -1,515 +1,636 @@ -import {parseTechRecordDocument, TechRecordDocument} from "../models/tech-record-document"; -import {getFaxNumber, TechRecord} from "../models/tech-record"; import { - AXLE_SPACING_TABLE, - AXLES_TABLE, - CONTACT_DETAILS_TABLE, - IDENTITY_TABLE, - MAKE_MODEL_TABLE, - MICROFILM_TABLE, - PLATE_TABLE, - PSV_BRAKES_TABLE, - TECHNICAL_RECORD_TABLE, - TYRE_TABLE, - VEHICLE_CLASS_TABLE, - VEHICLE_SUBCLASS_TABLE, - VEHICLE_TABLE, - AUTH_INTO_SERVICE_TABLE + parseTechRecordDocument, + TechRecordDocument, +} from "../models/tech-record-document"; +import { getFaxNumber, TechRecord } from "../models/tech-record"; +import { + AXLE_SPACING_TABLE, + AXLES_TABLE, + CONTACT_DETAILS_TABLE, + IDENTITY_TABLE, + MAKE_MODEL_TABLE, + MICROFILM_TABLE, + PLATE_TABLE, + PSV_BRAKES_TABLE, + TECHNICAL_RECORD_TABLE, + TYRE_TABLE, + VEHICLE_CLASS_TABLE, + VEHICLE_SUBCLASS_TABLE, + VEHICLE_TABLE, + AUTH_INTO_SERVICE_TABLE, } from "./table-details"; -import {deleteBasedOnWhereIn, executeFullUpsert, executePartialUpsertIfNotExists} from "./sql-execution"; -import {getConnectionPool} from "./connection-pool"; -import {Connection} from "mysql2/promise"; -import {EntityConverter} from "./entity-conversion"; -import {debugLog} from "./logger"; +import { + deleteBasedOnWhereIn, + executeFullUpsert, + executePartialUpsertIfNotExists, +} from "./sql-execution"; +import { getConnectionPool } from "./connection-pool"; +import { Connection } from "mysql2/promise"; +import { EntityConverter } from "./entity-conversion"; +import { debugLog } from "./logger"; import { vinCleanser } from "../utils/cleanser"; export const techRecordDocumentConverter = (): EntityConverter => { - return { - parseRootImage: parseTechRecordDocument, - upsertEntity: upsertTechRecords, - deleteEntity: deleteTechRecords - }; + return { + parseRootImage: parseTechRecordDocument, + upsertEntity: upsertTechRecords, + deleteEntity: deleteTechRecords, + }; }; -const upsertTechRecords = async (techRecordDocument: TechRecordDocument): Promise => { - debugLog(`upsertTechRecords: START`); - - const pool = await getConnectionPool(); - - let vehicleId; - const vehicleConnection = await pool.getConnection(); - - try { - await vehicleConnection.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); - await vehicleConnection.beginTransaction(); +const upsertTechRecords = async ( + techRecordDocument: TechRecordDocument +): Promise => { + debugLog(`upsertTechRecords: START`); - vehicleId = await upsertVehicle(vehicleConnection, techRecordDocument); + const pool = await getConnectionPool(); - await vehicleConnection.commit(); - } catch (err) { - console.error(err); - await vehicleConnection.rollback(); - throw err; - } finally { - vehicleConnection.release(); - } + let vehicleId; + const vehicleConnection = await pool.getConnection(); - const techRecords = techRecordDocument.techRecord; + try { + await vehicleConnection.execute( + "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED" + ); + await vehicleConnection.beginTransaction(); - if (!techRecords) { - return; - } + vehicleId = await upsertVehicle(vehicleConnection, techRecordDocument); - debugLog(`upsertTechRecords: ${techRecords.length} tech records to upsert`); - - for (const techRecord of techRecords) { - const techRecordConnection = await pool.getConnection(); - - try { - await techRecordConnection.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); - - debugLog(`upsertTechRecords: Upserting tech record...`); - - const makeModelId = await upsertMakeModel(techRecordConnection, techRecord); - const vehicleClassId = await upsertVehicleClass(techRecordConnection, techRecord); - await upsertVehicleSubclasses(techRecordConnection, vehicleClassId, techRecord); - const createdById = await upsertIdentity(techRecordConnection, techRecord.createdById!, techRecord.createdByName!); - const lastUpdatedById = await upsertIdentity(techRecordConnection, techRecord.lastUpdatedById!, techRecord.lastUpdatedByName!); - const contactDetailsId = await upsertContactDetails(techRecordConnection, techRecord); - - await techRecordConnection.beginTransaction(); - - const response = await executeFullUpsert( - TECHNICAL_RECORD_TABLE, - [ - vehicleId, - techRecord.recordCompleteness, - techRecord.createdAt, - techRecord.lastUpdatedAt, - makeModelId, - techRecord.functionCode, - techRecord.offRoad, - techRecord.numberOfWheelsDriven, - "" + techRecord.emissionsLimit, - techRecord.departmentalVehicleMarker, - techRecord.alterationMarker, - vehicleClassId, - techRecord.variantVersionNumber, - techRecord.grossEecWeight, - techRecord.trainEecWeight, - techRecord.maxTrainEecWeight, - contactDetailsId, - contactDetailsId, - contactDetailsId, - techRecord.manufactureYear, - techRecord.regnDate, - techRecord.firstUseDate, - techRecord.coifDate, - techRecord.ntaNumber, - techRecord.coifSerialNumber, - techRecord.coifCertifierName, - techRecord.approvalType, - techRecord.approvalTypeNumber, - techRecord.variantNumber, - techRecord.conversionRefNo, - techRecord.seatsLowerDeck, - techRecord.seatsUpperDeck, - techRecord.standingCapacity, - techRecord.speedRestriction, - techRecord.speedLimiterMrk, - techRecord.tachoExemptMrk, - techRecord.dispensations, - techRecord.remarks, - techRecord.reasonForCreation, - techRecord.statusCode, - techRecord.unladenWeight, - techRecord.grossKerbWeight, - techRecord.grossLadenWeight, - techRecord.grossGbWeight, - techRecord.grossDesignWeight, - techRecord.trainGbWeight, - techRecord.trainDesignWeight, - techRecord.maxTrainGbWeight, - techRecord.maxTrainDesignWeight, - techRecord.maxLoadOnCoupling, - techRecord.frameDescription, - techRecord.tyreUseCode, - techRecord.roadFriendly, - techRecord.drawbarCouplingFitted, - techRecord.euroStandard, - techRecord.suspensionType, - techRecord.couplingType, - techRecord.dimensions?.length, - techRecord.dimensions?.height, - techRecord.dimensions?.width, - techRecord.frontAxleTo5thWheelMin, - techRecord.frontAxleTo5thWheelMax, - techRecord.frontVehicleTo5thWheelCouplingMin, - techRecord.frontVehicleTo5thWheelCouplingMax, - techRecord.frontAxleToRearAxle, - techRecord.rearAxleToRearTrl, - techRecord.couplingCenterToRearAxleMin, - techRecord.couplingCenterToRearAxleMax, - techRecord.couplingCenterToRearTrlMin, - techRecord.couplingCenterToRearTrlMax, - techRecord.centreOfRearmostAxleToRearOfTrl, - techRecord.notes, - techRecord.purchaserDetails?.purchaserNotes, - techRecord.manufacturerDetails?.manufacturerNotes, - techRecord.noOfAxles, - techRecord.brakeCode, - techRecord.brakes?.dtpNumber, - techRecord.brakes?.loadSensingValve, - techRecord.brakes?.antilockBrakingSystem, - createdById, - lastUpdatedById, - techRecord.updateType, - techRecord.numberOfSeatbelts, - techRecord.seatbeltInstallationApprovalDate, - ], - techRecordConnection - ); - - const techRecordId = response.rows.insertId; - - debugLog(`upsertTechRecords: Upserted tech record (ID: ${techRecordId})`); - - await upsertPsvBrakes(techRecordConnection, techRecordId, techRecord); - await upsertAxleSpacings(techRecordConnection, techRecordId, techRecord); - await upsertMicrofilm(techRecordConnection, techRecordId, techRecord); - await upsertPlates(techRecordConnection, techRecordId, techRecord); - await upsertAxles(techRecordConnection, techRecordId, techRecord); - await upsertAuthIntoService(techRecordConnection, techRecordId, techRecord); - - await techRecordConnection.commit(); - } catch (err) { - console.error(err); - await techRecordConnection.rollback(); - throw err; - } finally { - techRecordConnection.release(); - } - } + await vehicleConnection.commit(); + } catch (err) { + console.error(err); + await vehicleConnection.rollback(); + throw err; + } finally { + vehicleConnection.release(); + } - debugLog(`upsertTechRecords: END`); + const techRecords = techRecordDocument.techRecord; + if (!techRecords) { return; -}; + } -const deleteTechRecords = async (techRecordDocument: TechRecordDocument): Promise => { - throw new Error("deleting tech record documents is not implemented yet"); -}; + debugLog(`upsertTechRecords: ${techRecords.length} tech records to upsert`); -const upsertVehicle = async (connection: Connection, techRecordDocument: TechRecordDocument): Promise => { - debugLog(`upsertTechRecords: Upserting vehicle...`); + for (const techRecord of techRecords) { + const techRecordConnection = await pool.getConnection(); - const response = await executeFullUpsert( - VEHICLE_TABLE, + try { + await techRecordConnection.execute( + "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED" + ); + + debugLog(`upsertTechRecords: Upserting tech record...`); + + const makeModelId = await upsertMakeModel( + techRecordConnection, + techRecord + ); + const vehicleClassId = await upsertVehicleClass( + techRecordConnection, + techRecord + ); + await upsertVehicleSubclasses( + techRecordConnection, + vehicleClassId, + techRecord + ); + const createdById = await upsertIdentity( + techRecordConnection, + techRecord.createdById!, + techRecord.createdByName! + ); + const lastUpdatedById = await upsertIdentity( + techRecordConnection, + techRecord.lastUpdatedById!, + techRecord.lastUpdatedByName! + ); + const contactDetailsId = await upsertContactDetails( + techRecordConnection, + techRecord + ); + + await techRecordConnection.beginTransaction(); + + const response = await executeFullUpsert( + TECHNICAL_RECORD_TABLE, [ - techRecordDocument.systemNumber, - vinCleanser(techRecordDocument.vin), - techRecordDocument.primaryVrm, - techRecordDocument.trailerId, - new Date().toISOString().substring(0, 23) + vehicleId, + techRecord.recordCompleteness, + techRecord.createdAt, + techRecord.lastUpdatedAt, + makeModelId, + techRecord.functionCode, + techRecord.offRoad, + techRecord.numberOfWheelsDriven, + "" + techRecord.emissionsLimit, + techRecord.departmentalVehicleMarker, + techRecord.alterationMarker, + vehicleClassId, + techRecord.variantVersionNumber, + techRecord.grossEecWeight, + techRecord.trainEecWeight, + techRecord.maxTrainEecWeight, + contactDetailsId, + contactDetailsId, + contactDetailsId, + techRecord.manufactureYear, + techRecord.regnDate, + techRecord.firstUseDate, + techRecord.coifDate, + techRecord.ntaNumber, + techRecord.coifSerialNumber, + techRecord.coifCertifierName, + techRecord.approvalType, + techRecord.approvalTypeNumber, + techRecord.variantNumber, + techRecord.conversionRefNo, + techRecord.seatsLowerDeck, + techRecord.seatsUpperDeck, + techRecord.standingCapacity, + techRecord.speedRestriction, + techRecord.speedLimiterMrk, + techRecord.tachoExemptMrk, + techRecord.dispensations, + techRecord.remarks, + techRecord.reasonForCreation, + techRecord.statusCode, + techRecord.unladenWeight, + techRecord.grossKerbWeight, + techRecord.grossLadenWeight, + techRecord.grossGbWeight, + techRecord.grossDesignWeight, + techRecord.trainGbWeight, + techRecord.trainDesignWeight, + techRecord.maxTrainGbWeight, + techRecord.maxTrainDesignWeight, + techRecord.maxLoadOnCoupling, + techRecord.frameDescription, + techRecord.tyreUseCode, + techRecord.roadFriendly, + techRecord.drawbarCouplingFitted, + techRecord.euroStandard, + techRecord.suspensionType, + techRecord.couplingType, + techRecord.dimensions?.length, + techRecord.dimensions?.height, + techRecord.dimensions?.width, + techRecord.frontAxleTo5thWheelMin, + techRecord.frontAxleTo5thWheelMax, + techRecord.frontVehicleTo5thWheelCouplingMin, + techRecord.frontVehicleTo5thWheelCouplingMax, + techRecord.frontAxleToRearAxle, + techRecord.rearAxleToRearTrl, + techRecord.couplingCenterToRearAxleMin, + techRecord.couplingCenterToRearAxleMax, + techRecord.couplingCenterToRearTrlMin, + techRecord.couplingCenterToRearTrlMax, + techRecord.centreOfRearmostAxleToRearOfTrl, + techRecord.notes, + techRecord.purchaserDetails?.purchaserNotes, + techRecord.manufacturerDetails?.manufacturerNotes, + techRecord.noOfAxles, + techRecord.brakeCode, + techRecord.brakes?.dtpNumber, + techRecord.brakes?.loadSensingValve, + techRecord.brakes?.antilockBrakingSystem, + createdById, + lastUpdatedById, + techRecord.updateType, + techRecord.numberOfSeatbelts, + techRecord.seatbeltInstallationApprovalDate, ], - connection - ); + techRecordConnection + ); - debugLog(`upsertTechRecords: Upserted vehicle (ID: ${response.rows.insertId})`); + const techRecordId = response.rows.insertId; - return response.rows.insertId; -}; + debugLog(`upsertTechRecords: Upserted tech record (ID: ${techRecordId})`); -const upsertMakeModel = async (connection: Connection, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting make-model...`); + await upsertPsvBrakes(techRecordConnection, techRecordId, techRecord); + await upsertAxleSpacings(techRecordConnection, techRecordId, techRecord); + await upsertMicrofilm(techRecordConnection, techRecordId, techRecord); + await upsertPlates(techRecordConnection, techRecordId, techRecord); + await upsertAxles(techRecordConnection, techRecordId, techRecord); + await upsertAuthIntoService( + techRecordConnection, + techRecordId, + techRecord + ); - const response = await executePartialUpsertIfNotExists( - MAKE_MODEL_TABLE, - [ - techRecord.make, - techRecord.model, - techRecord.chassisMake, - techRecord.chassisModel, - techRecord.bodyMake, - techRecord.bodyModel, - techRecord.modelLiteral, - techRecord.bodyType?.code, - techRecord.bodyType?.description, - techRecord.fuelPropulsionSystem, - null // intentional hack until JSON path of make-model dtpCode is documented - ].fingerprintCleanser(), - connection - ); + await techRecordConnection.commit(); + } catch (err) { + console.error(err); + await techRecordConnection.rollback(); + throw err; + } finally { + techRecordConnection.release(); + } + } - debugLog(`upsertTechRecords: Upserted make-model (ID ${response.rows.insertId})`); + debugLog(`upsertTechRecords: END`); - return response.rows.insertId; + return; }; -const upsertVehicleClass = async (connection: Connection, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting vehicle class...`); - - const response = await executePartialUpsertIfNotExists( - VEHICLE_CLASS_TABLE, - [ - techRecord.vehicleClass?.code, - techRecord.vehicleClass?.description, - techRecord.vehicleType, - techRecord.vehicleSize, - techRecord.vehicleConfiguration, - techRecord.euVehicleCategory, - ].fingerprintCleanser(), - connection - ); +const deleteTechRecords = async ( + techRecordDocument: TechRecordDocument +): Promise => { + throw new Error("deleting tech record documents is not implemented yet"); +}; - debugLog(`upsertTechRecords: Upserted vehicle class (ID: ${response.rows.insertId})`); +const upsertVehicle = async ( + connection: Connection, + techRecordDocument: TechRecordDocument +): Promise => { + debugLog(`upsertTechRecords: Upserting vehicle...`); - return response.rows.insertId; + const response = await executeFullUpsert( + VEHICLE_TABLE, + [ + techRecordDocument.systemNumber, + vinCleanser(techRecordDocument.vin), + techRecordDocument.primaryVrm, + techRecordDocument.trailerId, + new Date().toISOString().substring(0, 23), + ], + connection + ); + + debugLog( + `upsertTechRecords: Upserted vehicle (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; }; -const upsertVehicleSubclasses = async (connection: Connection, vehicleClassId: number, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting vehicle subclasses...`); +const upsertMakeModel = async ( + connection: Connection, + techRecord: TechRecord +): Promise => { + debugLog(`upsertTechRecords: Upserting make-model...`); - if (!techRecord.vehicleSubclass) { - debugLog(`upsertTechRecords: no vehicle subclasses present`); - return; - } + const response = await executePartialUpsertIfNotExists( + MAKE_MODEL_TABLE, + [ + techRecord.make, + techRecord.model, + techRecord.chassisMake, + techRecord.chassisModel, + techRecord.bodyMake, + techRecord.bodyModel, + techRecord.modelLiteral, + techRecord.bodyType?.code, + techRecord.bodyType?.description, + techRecord.fuelPropulsionSystem, + null, // intentional hack until JSON path of make-model dtpCode is documented + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTechRecords: Upserted make-model (ID ${response.rows.insertId})` + ); + + return response.rows.insertId; +}; - debugLog(`upsertTechRecords: ${techRecord.vehicleSubclass.length} vehicle subclasses to upsert`); +const upsertVehicleClass = async ( + connection: Connection, + techRecord: TechRecord +): Promise => { + debugLog(`upsertTechRecords: Upserting vehicle class...`); - for (const vehicleSubclass of techRecord.vehicleSubclass) { - const response = await executePartialUpsertIfNotExists( - VEHICLE_SUBCLASS_TABLE, - [ - vehicleClassId, - vehicleSubclass - ].fingerprintCleanser(), - connection - ); + const response = await executePartialUpsertIfNotExists( + VEHICLE_CLASS_TABLE, + [ + techRecord.vehicleClass?.code, + techRecord.vehicleClass?.description, + techRecord.vehicleType, + techRecord.vehicleSize, + techRecord.vehicleConfiguration, + techRecord.euVehicleCategory, + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTechRecords: Upserted vehicle class (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; +}; - debugLog(`upsertTechRecords: Upserted vehicle subclass (ID: ${response.rows.insertId}`); - } +const upsertVehicleSubclasses = async ( + connection: Connection, + vehicleClassId: number, + techRecord: TechRecord +): Promise => { + debugLog(`upsertTechRecords: Upserting vehicle subclasses...`); + if (!techRecord.vehicleSubclass) { + debugLog(`upsertTechRecords: no vehicle subclasses present`); return; -}; + } -const upsertIdentity = async (connection: Connection, id: string, name: string): Promise => { - debugLog(`upsertTechRecords: Upserting identity (${id} ---> ${name})...`); + debugLog( + `upsertTechRecords: ${techRecord.vehicleSubclass.length} vehicle subclasses to upsert` + ); + for (const vehicleSubclass of techRecord.vehicleSubclass) { const response = await executePartialUpsertIfNotExists( - IDENTITY_TABLE, - [ - id, - name - ].fingerprintCleanser(), - connection + VEHICLE_SUBCLASS_TABLE, + [vehicleClassId, vehicleSubclass].fingerprintCleanser(), + connection ); - debugLog(`upsertTechRecords: Upserted identity (ID: ${response.rows.insertId})`); - - return response.rows.insertId; -}; - -const upsertContactDetails = async (connection: Connection, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting contact details...`); - - const response = await executePartialUpsertIfNotExists( - CONTACT_DETAILS_TABLE, - [ - techRecord.applicantDetails?.name, - techRecord.applicantDetails?.address1, - techRecord.applicantDetails?.address2, - techRecord.applicantDetails?.postTown, - techRecord.applicantDetails?.address3, - techRecord.applicantDetails?.postCode, - techRecord.applicantDetails?.emailAddress, - techRecord.applicantDetails?.telephoneNumber, - getFaxNumber(techRecord) - ].fingerprintCleanser(), - connection + debugLog( + `upsertTechRecords: Upserted vehicle subclass (ID: ${response.rows.insertId}` ); + } - debugLog(`upsertTechRecords: Upserted contact details (ID: ${response.rows.insertId})`); - - return response.rows.insertId; + return; }; -const upsertPsvBrakes = async (connection: Connection, techRecordId: string, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting PSV brakes (tech-record-id: ${techRecordId})...`); +const upsertIdentity = async ( + connection: Connection, + id: string, + name: string +): Promise => { + debugLog(`upsertTechRecords: Upserting identity (${id} ---> ${name})...`); - const response = await executeFullUpsert( - PSV_BRAKES_TABLE, - [ - techRecordId, - techRecord.brakes?.brakeCodeOriginal, - techRecord.brakes?.brakeCode, - techRecord.brakes?.dataTrBrakeOne, - techRecord.brakes?.dataTrBrakeTwo, - techRecord.brakes?.dataTrBrakeThree, - techRecord.brakes?.retarderBrakeOne, - techRecord.brakes?.retarderBrakeTwo, - techRecord.brakes?.brakeForceWheelsNotLocked?.serviceBrakeForceA, - techRecord.brakes?.brakeForceWheelsNotLocked?.secondaryBrakeForceA, - techRecord.brakes?.brakeForceWheelsNotLocked?.parkingBrakeForceA, - techRecord.brakes?.brakeForceWheelsUpToHalfLocked?.serviceBrakeForceB, - techRecord.brakes?.brakeForceWheelsUpToHalfLocked?.secondaryBrakeForceB, - techRecord.brakes?.brakeForceWheelsUpToHalfLocked?.parkingBrakeForceB, - ], - connection - ); + const response = await executePartialUpsertIfNotExists( + IDENTITY_TABLE, + [id, name].fingerprintCleanser(), + connection + ); - debugLog(`upsertTechRecords: Upserted PSV brakes (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})`); + debugLog( + `upsertTechRecords: Upserted identity (ID: ${response.rows.insertId})` + ); - return; + return response.rows.insertId; }; -const upsertAxleSpacings = async (connection: Connection, techRecordId: string, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting axle spacings (tech-record-id: ${techRecordId})...`); - - if (!techRecord.dimensions?.axleSpacing) { - debugLog(`upsertTechRecords: no axle spacings present`); - return; - } +const upsertContactDetails = async ( + connection: Connection, + techRecord: TechRecord +): Promise => { + debugLog(`upsertTechRecords: Upserting contact details...`); - debugLog(`upsertTechRecords: ${techRecord.dimensions.axleSpacing.length} axle spacings to upsert`); + const response = await executePartialUpsertIfNotExists( + CONTACT_DETAILS_TABLE, + [ + techRecord.applicantDetails?.name, + techRecord.applicantDetails?.address1, + techRecord.applicantDetails?.address2, + techRecord.applicantDetails?.postTown, + techRecord.applicantDetails?.address3, + techRecord.applicantDetails?.postCode, + techRecord.applicantDetails?.emailAddress, + techRecord.applicantDetails?.telephoneNumber, + getFaxNumber(techRecord), + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTechRecords: Upserted contact details (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; +}; - for (const axleSpacing of techRecord.dimensions.axleSpacing) { - const response = await executeFullUpsert( - AXLE_SPACING_TABLE, - [ - techRecordId, - axleSpacing.axles, - axleSpacing.value, - ], - connection - ); +const upsertPsvBrakes = async ( + connection: Connection, + techRecordId: string, + techRecord: TechRecord +): Promise => { + debugLog( + `upsertTechRecords: Upserting PSV brakes (tech-record-id: ${techRecordId})...` + ); - debugLog(`upsertTechRecords: Upserted axle spacing (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})`); - } + const response = await executeFullUpsert( + PSV_BRAKES_TABLE, + [ + techRecordId, + techRecord.brakes?.brakeCodeOriginal, + techRecord.brakes?.brakeCode, + techRecord.brakes?.dataTrBrakeOne, + techRecord.brakes?.dataTrBrakeTwo, + techRecord.brakes?.dataTrBrakeThree, + techRecord.brakes?.retarderBrakeOne, + techRecord.brakes?.retarderBrakeTwo, + techRecord.brakes?.brakeForceWheelsNotLocked?.serviceBrakeForceA, + techRecord.brakes?.brakeForceWheelsNotLocked?.secondaryBrakeForceA, + techRecord.brakes?.brakeForceWheelsNotLocked?.parkingBrakeForceA, + techRecord.brakes?.brakeForceWheelsUpToHalfLocked?.serviceBrakeForceB, + techRecord.brakes?.brakeForceWheelsUpToHalfLocked?.secondaryBrakeForceB, + techRecord.brakes?.brakeForceWheelsUpToHalfLocked?.parkingBrakeForceB, + ], + connection + ); + + debugLog( + `upsertTechRecords: Upserted PSV brakes (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})` + ); + + return; +}; +const upsertAxleSpacings = async ( + connection: Connection, + techRecordId: string, + techRecord: TechRecord +): Promise => { + debugLog( + `upsertTechRecords: Upserting axle spacings (tech-record-id: ${techRecordId})...` + ); + + if (!techRecord.dimensions?.axleSpacing) { + debugLog(`upsertTechRecords: no axle spacings present`); return; -}; + } -const upsertMicrofilm = async (connection: Connection, techRecordId: string, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting microfilm (tech-record-id: ${techRecordId})...`); + debugLog( + `upsertTechRecords: ${techRecord.dimensions.axleSpacing.length} axle spacings to upsert` + ); + for (const axleSpacing of techRecord.dimensions.axleSpacing) { const response = await executeFullUpsert( - MICROFILM_TABLE, - [ - techRecordId, - techRecord.microfilm?.microfilmDocumentType, - techRecord.microfilm?.microfilmRollNumber, - techRecord.microfilm?.microfilmSerialNumber - ], - connection + AXLE_SPACING_TABLE, + [techRecordId, axleSpacing.axles, axleSpacing.value], + connection ); - debugLog(`upsertTechRecords: Upserted microfilm (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})`); + debugLog( + `upsertTechRecords: Upserted axle spacing (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})` + ); + } - return; + return; }; -const upsertPlates = async (connection: Connection, techRecordId: any, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting plates (tech-record-id: ${techRecordId})...`); - - if (!techRecord.plates) { - debugLog(`upsertTechRecords: no plates present`); - return; - } +const upsertMicrofilm = async ( + connection: Connection, + techRecordId: string, + techRecord: TechRecord +): Promise => { + debugLog( + `upsertTechRecords: Upserting microfilm (tech-record-id: ${techRecordId})...` + ); - debugLog(`upsertTechRecords: ${techRecord.plates.length} plates to upsert`); - - for (const plate of techRecord.plates) { - const response = await executeFullUpsert( - PLATE_TABLE, - [ - techRecordId, - plate.plateSerialNumber, - plate.plateIssueDate, - plate.plateReasonForIssue, - plate.plateIssuer, - ], - connection - ); - - debugLog(`upsertTechRecords: Upserted plate (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})`); - } + const response = await executeFullUpsert( + MICROFILM_TABLE, + [ + techRecordId, + techRecord.microfilm?.microfilmDocumentType, + techRecord.microfilm?.microfilmRollNumber, + techRecord.microfilm?.microfilmSerialNumber, + ], + connection + ); + + debugLog( + `upsertTechRecords: Upserted microfilm (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})` + ); + + return; +}; +const upsertPlates = async ( + connection: Connection, + techRecordId: any, + techRecord: TechRecord +): Promise => { + debugLog( + `upsertTechRecords: Upserting plates (tech-record-id: ${techRecordId})...` + ); + + if (!techRecord.plates) { + debugLog(`upsertTechRecords: no plates present`); return; -}; + } -const upsertAxles = async (connection: Connection, techRecordId: any, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting axles (tech-record-id: ${techRecordId})...`); + debugLog(`upsertTechRecords: ${techRecord.plates.length} plates to upsert`); - if (!techRecord.axles) { - debugLog(`upsertTechRecords: no axles present`); - return; - } + for (const plate of techRecord.plates) { + const response = await executeFullUpsert( + PLATE_TABLE, + [ + techRecordId, + plate.plateSerialNumber, + plate.plateIssueDate, + plate.plateReasonForIssue, + plate.plateIssuer, + ], + connection + ); - for (const axle of techRecord.axles) { - const tyreUpsertResponse = await executePartialUpsertIfNotExists( - TYRE_TABLE, - [ - axle.tyres?.tyreSize, - axle.tyres?.plyRating, - axle.tyres?.fitmentCode, - axle.tyres?.dataTrAxles, - axle.tyres?.speedCategorySymbol, - axle.tyres?.tyreCode, - ].fingerprintCleanser(), - connection - ); - - const tyreId = tyreUpsertResponse.rows.insertId; - - debugLog(`upsertTechRecords: Upserted axle tyre (tech-record-id: ${techRecordId}, ID: ${tyreId})`); - - const axleUpsertResponse = await executeFullUpsert( - AXLES_TABLE, - [ - techRecordId, - tyreId, - axle.axleNumber, - axle.parkingBrakeMrk, - axle.weights?.kerbWeight, - axle.weights?.ladenWeight, - axle.weights?.gbWeight, - axle.weights?.eecWeight, - axle.weights?.designWeight, - axle.brakes?.brakeActuator, - axle.brakes?.leverLength, - axle.brakes?.springBrakeParking, - ], - connection - ); - - debugLog(`upsertTechRecords: Upserted axle (tech-record-id: ${techRecordId}, ID: ${axleUpsertResponse.rows.insertId})`); - } + debugLog( + `upsertTechRecords: Upserted plate (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})` + ); + } - return; + return; }; -const upsertAuthIntoService = async (connection: Connection, techRecordId: string, techRecord: TechRecord): Promise => { - debugLog(`upsertTechRecords: Upserting authIntoService (tech-record-id: ${techRecordId})...`); +const upsertAxles = async ( + connection: Connection, + techRecordId: any, + techRecord: TechRecord +): Promise => { + debugLog( + `upsertTechRecords: Upserting axles (tech-record-id: ${techRecordId})...` + ); + + if (!techRecord.axles) { + debugLog(`upsertTechRecords: no axles present`); + return; + } + + for (const axle of techRecord.axles) { + const tyreUpsertResponse = await executePartialUpsertIfNotExists( + TYRE_TABLE, + [ + axle.tyres?.tyreSize, + axle.tyres?.plyRating, + axle.tyres?.fitmentCode, + axle.tyres?.dataTrAxles, + axle.tyres?.speedCategorySymbol, + axle.tyres?.tyreCode, + ].fingerprintCleanser(), + connection + ); + + const tyreId = tyreUpsertResponse.rows.insertId; - if (!techRecord.authIntoService) { - debugLog(`upsertTechRecords: no authIntoService present`); - await deleteBasedOnWhereIn(AUTH_INTO_SERVICE_TABLE.tableName, "technical_record_id", [techRecordId], connection); - return; - } + debugLog( + `upsertTechRecords: Upserted axle tyre (tech-record-id: ${techRecordId}, ID: ${tyreId})` + ); - const response = await executeFullUpsert( - AUTH_INTO_SERVICE_TABLE, - [ - techRecordId, - techRecord.authIntoService?.cocIssueDate, - techRecord.authIntoService?.dateAuthorised, - techRecord.authIntoService?.datePending, - techRecord.authIntoService?.dateReceived, - techRecord.authIntoService?.dateRejected, - ], - connection + const axleUpsertResponse = await executeFullUpsert( + AXLES_TABLE, + [ + techRecordId, + tyreId, + axle.axleNumber, + axle.parkingBrakeMrk, + axle.weights?.kerbWeight, + axle.weights?.ladenWeight, + axle.weights?.gbWeight, + axle.weights?.eecWeight, + axle.weights?.designWeight, + axle.brakes?.brakeActuator, + axle.brakes?.leverLength, + axle.brakes?.springBrakeParking, + ], + connection ); - debugLog(`upsertTechRecords: Upserted authIntoService (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})`); + debugLog( + `upsertTechRecords: Upserted axle (tech-record-id: ${techRecordId}, ID: ${axleUpsertResponse.rows.insertId})` + ); + } + + return; +}; + +const upsertAuthIntoService = async ( + connection: Connection, + techRecordId: string, + techRecord: TechRecord +): Promise => { + debugLog( + `upsertTechRecords: Upserting authIntoService (tech-record-id: ${techRecordId})...` + ); + + if (!techRecord.authIntoService) { + debugLog(`upsertTechRecords: no authIntoService present`); + await deleteBasedOnWhereIn( + AUTH_INTO_SERVICE_TABLE.tableName, + "technical_record_id", + [techRecordId], + connection + ); + return; + } + + const response = await executeFullUpsert( + AUTH_INTO_SERVICE_TABLE, + [ + techRecordId, + techRecord.authIntoService?.cocIssueDate, + techRecord.authIntoService?.dateAuthorised, + techRecord.authIntoService?.datePending, + techRecord.authIntoService?.dateReceived, + techRecord.authIntoService?.dateRejected, + ], + connection + ); + + debugLog( + `upsertTechRecords: Upserted authIntoService (tech-record-id: ${techRecordId}, ID: ${response.rows.insertId})` + ); }; diff --git a/src/services/test-result-record-conversion.ts b/src/services/test-result-record-conversion.ts index 3d256ad..58ee781 100644 --- a/src/services/test-result-record-conversion.ts +++ b/src/services/test-result-record-conversion.ts @@ -1,498 +1,604 @@ -import {parseTestResults, TestResult, TestResults} from "../models/test-results"; -import {TestType} from "../models/test-types"; import { - CUSTOM_DEFECT_TABLE, - DEFECTS_TABLE, - FUEL_EMISSION_TABLE, - IDENTITY_TABLE, - LOCATION_TABLE, - PREPARER_TABLE, - TEST_DEFECT_TABLE, - TEST_RESULT_TABLE, - TEST_STATION_TABLE, - TEST_TYPE_TABLE, - TESTER_TABLE, - VEHICLE_CLASS_TABLE, - VEHICLE_SUBCLASS_TABLE, - VEHICLE_TABLE + parseTestResults, + TestResult, + TestResults, +} from "../models/test-results"; +import { TestType } from "../models/test-types"; +import { + CUSTOM_DEFECT_TABLE, + DEFECTS_TABLE, + FUEL_EMISSION_TABLE, + IDENTITY_TABLE, + LOCATION_TABLE, + PREPARER_TABLE, + TEST_DEFECT_TABLE, + TEST_RESULT_TABLE, + TEST_STATION_TABLE, + TEST_TYPE_TABLE, + TESTER_TABLE, + VEHICLE_CLASS_TABLE, + VEHICLE_SUBCLASS_TABLE, + VEHICLE_TABLE, } from "./table-details"; import { - deleteBasedOnWhereIn, - executeFullUpsert, - executePartialUpsert, - executePartialUpsertIfNotExists, - selectRecordIds + deleteBasedOnWhereIn, + executeFullUpsert, + executePartialUpsert, + executePartialUpsertIfNotExists, + selectRecordIds, } from "./sql-execution"; -import {getConnectionPool} from "./connection-pool"; -import {Connection} from "mysql2/promise"; -import {EntityConverter} from "./entity-conversion"; -import {debugLog} from "./logger"; -import {vinCleanser} from "../utils/cleanser"; +import { getConnectionPool } from "./connection-pool"; +import { Connection } from "mysql2/promise"; +import { EntityConverter } from "./entity-conversion"; +import { debugLog } from "./logger"; +import { vinCleanser } from "../utils/cleanser"; import moment from "moment"; export const testResultsConverter = (): EntityConverter => { - return { - parseRootImage: parseTestResults, - upsertEntity: upsertTestResults, - deleteEntity: deleteTestResults - }; + return { + parseRootImage: parseTestResults, + upsertEntity: upsertTestResults, + deleteEntity: deleteTestResults, + }; }; const upsertTestResults = async (testResults: TestResults): Promise => { - debugLog(`upsertTestResults: START`); + debugLog(`upsertTestResults: START`); - if (!testResults) { - return; - } + if (!testResults) { + return; + } - const pool = await getConnectionPool(); + const pool = await getConnectionPool(); - debugLog(`Upserting ${testResults.length} test results`); + debugLog(`Upserting ${testResults.length} test results`); - for (const testResult of testResults) { - if (!testResult) { - throw new Error(`testResult cannot be null`); - } - - const vehicleConnection = await pool.getConnection(); + for (const testResult of testResults) { + if (!testResult) { + throw new Error(`testResult cannot be null`); + } - let vehicleId; - try { - await vehicleConnection.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); - await vehicleConnection.beginTransaction(); + const vehicleConnection = await pool.getConnection(); - vehicleId = await upsertVehicle(vehicleConnection, testResult); + let vehicleId; + try { + await vehicleConnection.execute( + "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED" + ); + await vehicleConnection.beginTransaction(); - await vehicleConnection.commit(); - } catch (err) { - console.error(err); - await vehicleConnection.rollback(); - throw err; - } finally { - vehicleConnection.release(); - } + vehicleId = await upsertVehicle(vehicleConnection, testResult); - const testResultConnection = await pool.getConnection(); - - try { - await testResultConnection.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); - - const testStationId = await upsertTestStation(testResultConnection, testResult); - const testerId = await upsertTester(testResultConnection, testResult); - const vehicleClassId = await upsertVehicleClass(testResultConnection, testResult); - await upsertVehicleSubclasses(testResultConnection, vehicleClassId, testResult); - const preparerId = await upsertPreparer(testResultConnection, testResult); - const createdById = await upsertIdentity(testResultConnection, testResult.createdById!, testResult.createdByName!); - const lastUpdatedById = await upsertIdentity(testResultConnection, testResult.lastUpdatedById!, testResult.lastUpdatedByName!); - - if (!testResult.testTypes || testResult.testTypes.length < 1) { - await executeFullUpsert( - TEST_RESULT_TABLE, - [ - vehicleId, - undefined, - testStationId, - testerId, - preparerId, - vehicleClassId, - undefined, - testResult.testResultId, - testResult.testStatus, - testResult.reasonForCancellation, - testResult.numberOfSeats, - testResult.odometerReading, - testResult.odometerReadingUnits, - testResult.countryOfRegistration, - testResult.noOfAxles, - testResult.regnDate, - testResult.firstUseDate, - testResult.createdAt, - testResult.lastUpdatedAt, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - createdById, - lastUpdatedById, - moment().format("YYYY-MM-DD HH:mm:ss.SSS"), - ], - testResultConnection - ); - - continue; - } - - if (!process.env.DISABLE_DELETE_ON_UPDATE) { - const existingTestResultIds = await selectRecordIds(TEST_RESULT_TABLE.tableName, {vehicle_id: vehicleId, testResultId: testResult.testResultId}, testResultConnection); - if (existingTestResultIds.rows.length > 0) { - await testResultConnection.beginTransaction(); - - const testResultIds = existingTestResultIds.rows.map((row: { id: any; }) => row.id); - await deleteBasedOnWhereIn(CUSTOM_DEFECT_TABLE.tableName, "test_result_id", testResultIds, testResultConnection); - await deleteBasedOnWhereIn(TEST_DEFECT_TABLE.tableName, "test_result_id", testResultIds, testResultConnection); - await deleteBasedOnWhereIn(TEST_RESULT_TABLE.tableName, "id", testResultIds, testResultConnection); - - await testResultConnection.commit(); - } - } - - for (const testType of testResult.testTypes!) { - await testResultConnection.beginTransaction(); - - const fuelEmissionId = await upsertFuelEmission(testResultConnection, testType); - const testTypeId = await upsertTestType(testResultConnection, testType); - - debugLog(`upsertTestResults: Upserting test result...`); - - const response = await executeFullUpsert( - TEST_RESULT_TABLE, - [ - vehicleId, - fuelEmissionId, - testStationId, - testerId, - preparerId, - vehicleClassId, - testTypeId, - testResult.testResultId, - testResult.testStatus, - testResult.reasonForCancellation, - testResult.numberOfSeats, - testResult.odometerReading, - testResult.odometerReadingUnits, - testResult.countryOfRegistration, - testResult.noOfAxles, - testResult.regnDate, - testResult.firstUseDate, - testResult.createdAt, - testResult.lastUpdatedAt, - testType.testCode, - testType.testNumber, - testType.certificateNumber, - testType.secondaryCertificateNumber, - testType.testExpiryDate, - testType.testAnniversaryDate, - testType.testTypeStartTimestamp, - testType.testTypeEndTimestamp, - testType.numberOfSeatbeltsFitted, - testType.lastSeatbeltInstallationCheckDate, - testType.seatbeltInstallationCheckDate, - testType.testResult, - testType.reasonForAbandoning, - testType.additionalNotesRecorded, - testType.additionalCommentsForAbandon, - testType.particulateTrapFitted, - testType.particulateTrapSerialNumber, - testType.modificationTypeUsed, - testType.smokeTestKLimitApplied, - createdById, - lastUpdatedById, - moment().format("YYYY-MM-DD HH:mm:ss.SSS"), - ], - testResultConnection - ); - - const testResultRecordId = response.rows.insertId; - - debugLog(`upsertTestResults: Upserted test result (ID: ${testResultRecordId})`); - - await upsertDefects(testResultConnection, testResultRecordId, testType); - await upsertCustomDefects(testResultConnection, testResultRecordId, testType); - - await testResultConnection.commit(); - } - } catch (err) { - await testResultConnection.rollback(); - throw err; - } finally { - testResultConnection.release(); - } + await vehicleConnection.commit(); + } catch (err) { + console.error(err); + await vehicleConnection.rollback(); + throw err; + } finally { + vehicleConnection.release(); } - debugLog(`upsertTestResults: END`); -}; + const testResultConnection = await pool.getConnection(); + + try { + await testResultConnection.execute( + "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED" + ); + + const testStationId = await upsertTestStation( + testResultConnection, + testResult + ); + const testerId = await upsertTester(testResultConnection, testResult); + const vehicleClassId = await upsertVehicleClass( + testResultConnection, + testResult + ); + await upsertVehicleSubclasses( + testResultConnection, + vehicleClassId, + testResult + ); + const preparerId = await upsertPreparer(testResultConnection, testResult); + const createdById = await upsertIdentity( + testResultConnection, + testResult.createdById!, + testResult.createdByName! + ); + const lastUpdatedById = await upsertIdentity( + testResultConnection, + testResult.lastUpdatedById!, + testResult.lastUpdatedByName! + ); + + if (!testResult.testTypes || testResult.testTypes.length < 1) { + await executeFullUpsert( + TEST_RESULT_TABLE, + [ + vehicleId, + undefined, + testStationId, + testerId, + preparerId, + vehicleClassId, + undefined, + testResult.testResultId, + testResult.testStatus, + testResult.reasonForCancellation, + testResult.numberOfSeats, + testResult.odometerReading, + testResult.odometerReadingUnits, + testResult.countryOfRegistration, + testResult.noOfAxles, + testResult.regnDate, + testResult.firstUseDate, + testResult.createdAt, + testResult.lastUpdatedAt, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + undefined, + createdById, + lastUpdatedById, + moment().format("YYYY-MM-DD HH:mm:ss.SSS"), + ], + testResultConnection + ); -const deleteTestResults = async (testResult: TestResults): Promise => { - throw new Error("deleting test results is not implemented yet"); -}; + continue; + } -const upsertVehicle = async (connection: Connection, testResult: TestResult): Promise => { - debugLog(`upsertTestResults: Upserting vehicle...`); + if (!process.env.DISABLE_DELETE_ON_UPDATE) { + const existingTestResultIds = await selectRecordIds( + TEST_RESULT_TABLE.tableName, + { vehicle_id: vehicleId, testResultId: testResult.testResultId }, + testResultConnection + ); + if (existingTestResultIds.rows.length > 0) { + await testResultConnection.beginTransaction(); + + const testResultIds = existingTestResultIds.rows.map( + (row: { id: any }) => row.id + ); + await deleteBasedOnWhereIn( + CUSTOM_DEFECT_TABLE.tableName, + "test_result_id", + testResultIds, + testResultConnection + ); + await deleteBasedOnWhereIn( + TEST_DEFECT_TABLE.tableName, + "test_result_id", + testResultIds, + testResultConnection + ); + await deleteBasedOnWhereIn( + TEST_RESULT_TABLE.tableName, + "id", + testResultIds, + testResultConnection + ); + + await testResultConnection.commit(); + } + } - const response = await executePartialUpsert( - VEHICLE_TABLE, - [ - testResult.systemNumber, - vinCleanser(testResult.vin), - testResult.vrm, - testResult.trailerId, - new Date().toISOString().substring(0, 23) - ], - connection - ); + for (const testType of testResult.testTypes!) { + await testResultConnection.beginTransaction(); - debugLog(`upsertTestResults: Upserted vehicle (ID: ${response.rows.insertId})`); + const fuelEmissionId = await upsertFuelEmission( + testResultConnection, + testType + ); + const testTypeId = await upsertTestType(testResultConnection, testType); + + debugLog(`upsertTestResults: Upserting test result...`); + + const response = await executeFullUpsert( + TEST_RESULT_TABLE, + [ + vehicleId, + fuelEmissionId, + testStationId, + testerId, + preparerId, + vehicleClassId, + testTypeId, + testResult.testResultId, + testResult.testStatus, + testResult.reasonForCancellation, + testResult.numberOfSeats, + testResult.odometerReading, + testResult.odometerReadingUnits, + testResult.countryOfRegistration, + testResult.noOfAxles, + testResult.regnDate, + testResult.firstUseDate, + testResult.createdAt, + testResult.lastUpdatedAt, + testType.testCode, + testType.testNumber, + testType.certificateNumber, + testType.secondaryCertificateNumber, + testType.testExpiryDate, + testType.testAnniversaryDate, + testType.testTypeStartTimestamp, + testType.testTypeEndTimestamp, + testType.numberOfSeatbeltsFitted, + testType.lastSeatbeltInstallationCheckDate, + testType.seatbeltInstallationCheckDate, + testType.testResult, + testType.reasonForAbandoning, + testType.additionalNotesRecorded, + testType.additionalCommentsForAbandon, + testType.particulateTrapFitted, + testType.particulateTrapSerialNumber, + testType.modificationTypeUsed, + testType.smokeTestKLimitApplied, + createdById, + lastUpdatedById, + moment().format("YYYY-MM-DD HH:mm:ss.SSS"), + ], + testResultConnection + ); - return response.rows.insertId; -}; + const testResultRecordId = response.rows.insertId; -const upsertTestStation = async (connection: Connection, testResult: TestResult): Promise => { - debugLog(`upsertTestResults: Upserting test station...`); + debugLog( + `upsertTestResults: Upserted test result (ID: ${testResultRecordId})` + ); - const response = await executePartialUpsertIfNotExists( - TEST_STATION_TABLE, - [ - testResult.testStationPNumber, - testResult.testStationName, - testResult.testStationType - ].fingerprintCleanser(), - connection - ); + await upsertDefects(testResultConnection, testResultRecordId, testType); + await upsertCustomDefects( + testResultConnection, + testResultRecordId, + testType + ); - debugLog(`upsertTestResults: Upserted test station (ID: ${response.rows.insertId})`); + await testResultConnection.commit(); + } + } catch (err) { + await testResultConnection.rollback(); + throw err; + } finally { + testResultConnection.release(); + } + } - return response.rows.insertId; + debugLog(`upsertTestResults: END`); }; -const upsertTester = async (connection: Connection, testResult: TestResult): Promise => { - debugLog(`upsertTestResults: Upserting tester...`); - - const response = await executePartialUpsertIfNotExists( - TESTER_TABLE, - [ - testResult.testerStaffId, - testResult.testerName, - testResult.testerEmailAddress, - ].fingerprintCleanser(), - connection - ); - - debugLog(`upsertTestResults: Upserted tester (ID: ${response.rows.insertId})`); +const deleteTestResults = async (testResult: TestResults): Promise => { + throw new Error("deleting test results is not implemented yet"); +}; - return response.rows.insertId; +const upsertVehicle = async ( + connection: Connection, + testResult: TestResult +): Promise => { + debugLog(`upsertTestResults: Upserting vehicle...`); + + const response = await executePartialUpsert( + VEHICLE_TABLE, + [ + testResult.systemNumber, + vinCleanser(testResult.vin), + testResult.vrm, + testResult.trailerId, + new Date().toISOString().substring(0, 23), + ], + connection + ); + + debugLog( + `upsertTestResults: Upserted vehicle (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; }; -const upsertVehicleClass = async (connection: Connection, testResult: TestResult): Promise => { - debugLog(`upsertTestResults: Upserting vehicle class...`); +const upsertTestStation = async ( + connection: Connection, + testResult: TestResult +): Promise => { + debugLog(`upsertTestResults: Upserting test station...`); - const response = await executePartialUpsertIfNotExists( - VEHICLE_CLASS_TABLE, - [ - testResult.vehicleClass?.code, - testResult.vehicleClass?.description, - testResult.vehicleType, - testResult.vehicleSize, - testResult.vehicleConfiguration, - testResult.euVehicleCategory, - ].fingerprintCleanser(), - connection - ); + const response = await executePartialUpsertIfNotExists( + TEST_STATION_TABLE, + [ + testResult.testStationPNumber, + testResult.testStationName, + testResult.testStationType, + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTestResults: Upserted test station (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; +}; - debugLog(`upsertTestResults: Upserted vehicle class (ID: ${response.rows.insertId})`); +const upsertTester = async ( + connection: Connection, + testResult: TestResult +): Promise => { + debugLog(`upsertTestResults: Upserting tester...`); - return response.rows.insertId; + const response = await executePartialUpsertIfNotExists( + TESTER_TABLE, + [ + testResult.testerStaffId, + testResult.testerName, + testResult.testerEmailAddress, + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTestResults: Upserted tester (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; }; -const upsertVehicleSubclasses = async (connection: Connection, vehicleClassId: number, testResult: TestResult): Promise => { - debugLog(`upsertTestResults: Upserting vehicle subclasses...`); +const upsertVehicleClass = async ( + connection: Connection, + testResult: TestResult +): Promise => { + debugLog(`upsertTestResults: Upserting vehicle class...`); - if (!testResult.vehicleSubclass) { - debugLog(`upsertTestResults: no vehicle subclasses present`); - return; - } - - for (const vehicleSubclass of testResult.vehicleSubclass) { - const response = await executePartialUpsertIfNotExists( - VEHICLE_SUBCLASS_TABLE, - [ - vehicleClassId, - vehicleSubclass - ].fingerprintCleanser(), - connection - ); + const response = await executePartialUpsertIfNotExists( + VEHICLE_CLASS_TABLE, + [ + testResult.vehicleClass?.code, + testResult.vehicleClass?.description, + testResult.vehicleType, + testResult.vehicleSize, + testResult.vehicleConfiguration, + testResult.euVehicleCategory, + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTestResults: Upserted vehicle class (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; +}; - debugLog(`upsertTestResults: Upserted vehicle subclass (ID: ${response.rows.insertId})`); - } +const upsertVehicleSubclasses = async ( + connection: Connection, + vehicleClassId: number, + testResult: TestResult +): Promise => { + debugLog(`upsertTestResults: Upserting vehicle subclasses...`); + if (!testResult.vehicleSubclass) { + debugLog(`upsertTestResults: no vehicle subclasses present`); return; -}; - -const upsertFuelEmission = async (connection: Connection, testType: TestType): Promise => { - debugLog(`upsertTestResults: Upserting fuel emission...`); + } + for (const vehicleSubclass of testResult.vehicleSubclass) { const response = await executePartialUpsertIfNotExists( - FUEL_EMISSION_TABLE, - [ - testType.modType?.code, - testType.modType?.description, - testType.emissionStandard, - testType.fuelType, - ].fingerprintCleanser(), - connection + VEHICLE_SUBCLASS_TABLE, + [vehicleClassId, vehicleSubclass].fingerprintCleanser(), + connection ); - debugLog(`upsertTestResults: Upserted fuel emission (ID: ${response.rows.insertId})`); + debugLog( + `upsertTestResults: Upserted vehicle subclass (ID: ${response.rows.insertId})` + ); + } - return response.rows.insertId; + return; }; -const upsertTestType = async (connection: Connection, testType: TestType): Promise => { - debugLog(`upsertTestResults: Upserting test type...`); +const upsertFuelEmission = async ( + connection: Connection, + testType: TestType +): Promise => { + debugLog(`upsertTestResults: Upserting fuel emission...`); - const response = await executePartialUpsertIfNotExists( - TEST_TYPE_TABLE, - [ - testType.testTypeClassification, - testType.testTypeName, - ].fingerprintCleanser(), - connection - ); + const response = await executePartialUpsertIfNotExists( + FUEL_EMISSION_TABLE, + [ + testType.modType?.code, + testType.modType?.description, + testType.emissionStandard, + testType.fuelType, + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTestResults: Upserted fuel emission (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; +}; - debugLog(`upsertTestResults: Upserted test type (ID: ${response.rows.insertId})`); +const upsertTestType = async ( + connection: Connection, + testType: TestType +): Promise => { + debugLog(`upsertTestResults: Upserting test type...`); - return response.rows.insertId; + const response = await executePartialUpsertIfNotExists( + TEST_TYPE_TABLE, + [ + testType.testTypeClassification, + testType.testTypeName, + ].fingerprintCleanser(), + connection + ); + + debugLog( + `upsertTestResults: Upserted test type (ID: ${response.rows.insertId})` + ); + + return response.rows.insertId; }; -const upsertPreparer = async (connection: Connection, testResult: TestResult): Promise => { - debugLog(`upsertTestResults: Upserting preparer...`); +const upsertPreparer = async ( + connection: Connection, + testResult: TestResult +): Promise => { + debugLog(`upsertTestResults: Upserting preparer...`); - const response = await executePartialUpsertIfNotExists( - PREPARER_TABLE, - [ - testResult.preparerId, - testResult.preparerName, - ].fingerprintCleanser(), - connection - ); + const response = await executePartialUpsertIfNotExists( + PREPARER_TABLE, + [testResult.preparerId, testResult.preparerName].fingerprintCleanser(), + connection + ); - debugLog(`upsertTestResults: Upserted preparer (ID: ${response.rows.insertId})`); + debugLog( + `upsertTestResults: Upserted preparer (ID: ${response.rows.insertId})` + ); - return response.rows.insertId; + return response.rows.insertId; }; -const upsertIdentity = async (connection: Connection, id: string, name: string): Promise => { - debugLog(`upsertTestResults: Upserting identity (${id} ---> ${name})...`); +const upsertIdentity = async ( + connection: Connection, + id: string, + name: string +): Promise => { + debugLog(`upsertTestResults: Upserting identity (${id} ---> ${name})...`); - const response = await executePartialUpsertIfNotExists( - IDENTITY_TABLE, - [ - id, - name - ].fingerprintCleanser(), - connection - ); + const response = await executePartialUpsertIfNotExists( + IDENTITY_TABLE, + [id, name].fingerprintCleanser(), + connection + ); - debugLog(`upsertTestResults: Upserted identity (ID: ${response.rows.insertId})`); + debugLog( + `upsertTestResults: Upserted identity (ID: ${response.rows.insertId})` + ); - return response.rows.insertId; + return response.rows.insertId; }; -const upsertDefects = async (connection: Connection, testResultId: number, testType: TestType): Promise => { - if (!testType.defects) { - return; - } +const upsertDefects = async ( + connection: Connection, + testResultId: number, + testType: TestType +): Promise => { + if (!testType.defects) { + return; + } + + const insertedIds: number[] = []; + + for (const defect of testType.defects) { + debugLog(`upsertTestResults: Upserting defect...`); + + const insertDefectResponse = await executePartialUpsertIfNotExists( + DEFECTS_TABLE, + [ + defect.imNumber, + defect.imDescription, + defect.itemNumber, + defect.itemDescription, + defect.deficiencyRef, + defect.deficiencyId, + defect.deficiencySubId, + defect.deficiencyCategory, + defect.deficiencyText, + defect.stdForProhibition, + ].fingerprintCleanser(), + connection + ); - const insertedIds: number[] = []; - - for (const defect of testType.defects) { - debugLog(`upsertTestResults: Upserting defect...`); - - const insertDefectResponse = await executePartialUpsertIfNotExists( - DEFECTS_TABLE, - [ - defect.imNumber, - defect.imDescription, - defect.itemNumber, - defect.itemDescription, - defect.deficiencyRef, - defect.deficiencyId, - defect.deficiencySubId, - defect.deficiencyCategory, - defect.deficiencyText, - defect.stdForProhibition, - ].fingerprintCleanser(), - connection - ); + const defectId = insertDefectResponse.rows.insertId; - const defectId = insertDefectResponse.rows.insertId; + debugLog(`upsertTestResults: Upserted defect (defect ID: ${defectId})`); - debugLog(`upsertTestResults: Upserted defect (defect ID: ${defectId})`); + insertedIds.push(defectId); - insertedIds.push(defectId); + const insertLocationResponse = await executePartialUpsertIfNotExists( + LOCATION_TABLE, + [ + defect.additionalInformation?.location?.vertical, + defect.additionalInformation?.location?.horizontal, + defect.additionalInformation?.location?.lateral, + defect.additionalInformation?.location?.longitudinal, + defect.additionalInformation?.location?.rowNumber, + defect.additionalInformation?.location?.seatNumber, + defect.additionalInformation?.location?.axleNumber, + ].fingerprintCleanser(), + connection + ); - const insertLocationResponse = await executePartialUpsertIfNotExists( - LOCATION_TABLE, - [ - defect.additionalInformation?.location?.vertical, - defect.additionalInformation?.location?.horizontal, - defect.additionalInformation?.location?.lateral, - defect.additionalInformation?.location?.longitudinal, - defect.additionalInformation?.location?.rowNumber, - defect.additionalInformation?.location?.seatNumber, - defect.additionalInformation?.location?.axleNumber, - ].fingerprintCleanser(), - connection - ); + const locationId = insertLocationResponse.rows.insertId; - const locationId = insertLocationResponse.rows.insertId; - - debugLog(`upsertTestResults: Upserted defect location (location ID: ${locationId})`); - - await executePartialUpsert( - TEST_DEFECT_TABLE, - [ - testResultId, - defectId, - locationId, - defect.additionalInformation?.notes, - defect.prs, - defect.prohibitionIssued, - ], - connection - ); + debugLog( + `upsertTestResults: Upserted defect location (location ID: ${locationId})` + ); - debugLog(`upsertTestResults: Upserted defect test-defect mapping`); - } + await executePartialUpsert( + TEST_DEFECT_TABLE, + [ + testResultId, + defectId, + locationId, + defect.additionalInformation?.notes, + defect.prs, + defect.prohibitionIssued, + ], + connection + ); - return; + debugLog(`upsertTestResults: Upserted defect test-defect mapping`); + } + + return; }; -const upsertCustomDefects = async (connection: Connection, testResultId: number, testType: TestType): Promise => { - if (!testType.customDefects) { - return; - } +const upsertCustomDefects = async ( + connection: Connection, + testResultId: number, + testType: TestType +): Promise => { + if (!testType.customDefects) { + return; + } - for (const customDefect of testType.customDefects) { - debugLog(`upsertTestResults: Upserting custom defect...`); - - const response = await executePartialUpsert( - CUSTOM_DEFECT_TABLE, - [ - testResultId, - customDefect.referenceNumber, - customDefect.defectName, - customDefect.defectNotes, - ], - connection - ); + for (const customDefect of testType.customDefects) { + debugLog(`upsertTestResults: Upserting custom defect...`); - debugLog(`upsertTestResults: Upserted custom defect (ID: ${response.rows.insertId})`); - } + const response = await executePartialUpsert( + CUSTOM_DEFECT_TABLE, + [ + testResultId, + customDefect.referenceNumber, + customDefect.defectName, + customDefect.defectNotes, + ], + connection + ); - return; + debugLog( + `upsertTestResults: Upserted custom defect (ID: ${response.rows.insertId})` + ); + } + + return; }; diff --git a/src/utils/cleanser.ts b/src/utils/cleanser.ts index fc336c1..fad6a48 100644 --- a/src/utils/cleanser.ts +++ b/src/utils/cleanser.ts @@ -16,10 +16,10 @@ if (!Array.prototype.fingerprintCleanser) { writable: false, configurable: false, value: function fingerprintCleanser(this: any[]): any[] { - return this - .map((i) => typeof i === "string" ? i?.trim() : i) - .map((i) => i === "" ? null : i); - } + return this.map((i) => (typeof i === "string" ? i?.trim() : i)).map((i) => + i === "" ? null : i + ); + }, }); } diff --git a/src/utils/padwithzeros.ts b/src/utils/padwithzeros.ts index e7da676..41fe558 100644 --- a/src/utils/padwithzeros.ts +++ b/src/utils/padwithzeros.ts @@ -1,3 +1,3 @@ export function padWithZeros(num: number, maxSize: number): string { - return num.toString().padStart(maxSize, "0"); + return num.toString().padStart(maxSize, "0"); } diff --git a/tests/integration/auth-into-service-document-conversion.intTest.ts b/tests/integration/auth-into-service-document-conversion.intTest.ts index 41752ff..2a9895e 100644 --- a/tests/integration/auth-into-service-document-conversion.intTest.ts +++ b/tests/integration/auth-into-service-document-conversion.intTest.ts @@ -1,110 +1,115 @@ -import {StartedTestContainer} from "testcontainers"; -import {destroyConnectionPool, executeSql} from "../../src/services/connection-pool"; -import {exampleContext, useLocalDb} from "../utils"; +import { StartedTestContainer } from "testcontainers"; +import { + destroyConnectionPool, + executeSql, +} from "../../src/services/connection-pool"; +import { exampleContext, useLocalDb } from "../utils"; import techRecordDocumentJson from "../resources/dynamodb-image-technical-record.json"; -import {getContainerizedDatabase} from "./cvsbnop-container"; -import {processStreamEvent} from "../../src/functions/process-stream-event"; -import {getConnectionPoolOptions} from "../../src/services/connection-pool-options"; +import { getContainerizedDatabase } from "./cvsbnop-container"; +import { processStreamEvent } from "../../src/functions/process-stream-event"; +import { getConnectionPoolOptions } from "../../src/services/connection-pool-options"; useLocalDb(); -export const authIntoServiceDocumentConversion = () => describe("convertTechRecordDocument() integration tests", () => { +export const authIntoServiceDocumentConversion = () => + describe("convertTechRecordDocument() integration tests", () => { let container: StartedTestContainer; beforeAll(async () => { - jest.setTimeout(60_000); - jest.restoreAllMocks(); - - // see README for why this environment variable exists - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - container = await getContainerizedDatabase(); - } else { - (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ - host: "localhost", - port: "3306", - user: "root", - password: "12345", - database: "CVSBNOP" - }); - } + jest.setTimeout(60_000); + jest.restoreAllMocks(); + + // see README for why this environment variable exists + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + container = await getContainerizedDatabase(); + } else { + (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ + host: "localhost", + port: "3306", + user: "root", + password: "12345", + database: "CVSBNOP", + }); + } }); afterAll(async () => { - await destroyConnectionPool(); - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - await container.stop(); - } + await destroyConnectionPool(); + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + await container.stop(); + } }); describe("when adding a new vehicle with an authIntoService having some null properties.", () => { - it("should insert into auth_into_service", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1a"}; - techRecordDocumentJsonNew.vin = {S : "VIN1a"}; - techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = { - M: { - cocIssueDate: { - S: "2020-01-01" - }, - dateAuthorised: { - // @ts-ignore - NULL: true - }, - datePending: { - S: "2020-03-03" - }, - dateReceived: { - // @ts-ignore - NULL: true - }, - dateRejected: { - S: "2020-05-05" - } - } - }; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + it("should insert into auth_into_service", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1a" }; + techRecordDocumentJsonNew.vin = { S: "VIN1a" }; + techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = { + M: { + cocIssueDate: { + S: "2020-01-01", + }, + dateAuthorised: { + // @ts-ignore + NULL: true, + }, + datePending: { + S: "2020-03-03", + }, + dateReceived: { + // @ts-ignore + NULL: true, + }, + dateRejected: { + S: "2020-05-05", + }, + }, + }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1a"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1a"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1a"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1a" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1a"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`technical_record_id\`, + const authIntoServiceResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`cocIssueDate\`, \`dateReceived\`, \`datePending\`, @@ -112,86 +117,95 @@ export const authIntoServiceDocumentConversion = () => describe("convertTechReco \`dateRejected\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - - expect(authIntoServiceResultSet.rows.length).toEqual(1); - expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect((authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect(authIntoServiceResultSet.rows[0].dateReceived).toBeNull(); - expect((authIntoServiceResultSet.rows[0].datePending as Date).toUTCString()).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); - expect(authIntoServiceResultSet.rows[0].dateAuthorised).toBeNull(); - expect((authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString()).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + ); + + expect(authIntoServiceResultSet.rows.length).toEqual(1); + expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect( + (authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect(authIntoServiceResultSet.rows[0].dateReceived).toBeNull(); + expect( + (authIntoServiceResultSet.rows[0].datePending as Date).toUTCString() + ).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); + expect(authIntoServiceResultSet.rows[0].dateAuthorised).toBeNull(); + expect( + (authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString() + ).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + }); + + it("should update auth_into_service when the vehicle is updated with an authIntoService having some null properties", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1a" }; + techRecordDocumentJsonNew.vin = { S: "VIN1a" }; + techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = { + M: { + cocIssueDate: { + // @ts-ignore + NULL: true, + }, + dateAuthorised: { + S: "2020-02-02", + }, + datePending: { + // @ts-ignore + NULL: true, + }, + dateReceived: { + S: "2020-04-04", + }, + dateRejected: { + // @ts-ignore + NULL: true, + }, + }, + }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; }); - it("should update auth_into_service when the vehicle is updated with an authIntoService having some null properties", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1a"}; - techRecordDocumentJsonNew.vin = {S : "VIN1a"}; - techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = { - M: { - cocIssueDate: { - // @ts-ignore - NULL: true - }, - dateAuthorised: { - S: "2020-02-02" - }, - datePending: { - // @ts-ignore - NULL: true - }, - dateReceived: { - S: "2020-04-04" - }, - dateRejected: { - // @ts-ignore - NULL: true - } - } - }; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1a"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1a"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1a"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1a" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1a"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`technical_record_id\`, + const authIntoServiceResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`cocIssueDate\`, \`dateReceived\`, \`datePending\`, @@ -199,121 +213,130 @@ export const authIntoServiceDocumentConversion = () => describe("convertTechReco \`dateRejected\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - - expect(authIntoServiceResultSet.rows.length).toEqual(1); - expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect(authIntoServiceResultSet.rows[0].cocIssueDate).toBeNull(); - expect((authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString()).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); - expect(authIntoServiceResultSet.rows[0].datePending).toBeNull(); - expect((authIntoServiceResultSet.rows[0].dateAuthorised as Date).toUTCString()).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); - expect(authIntoServiceResultSet.rows[0].dateRejected).toBeNull(); - }); + ); + + expect(authIntoServiceResultSet.rows.length).toEqual(1); + expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect(authIntoServiceResultSet.rows[0].cocIssueDate).toBeNull(); + expect( + (authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString() + ).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); + expect(authIntoServiceResultSet.rows[0].datePending).toBeNull(); + expect( + (authIntoServiceResultSet.rows[0] + .dateAuthorised as Date).toUTCString() + ).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); + expect(authIntoServiceResultSet.rows[0].dateRejected).toBeNull(); + }); }); describe("when adding a new vehicle with an empty authIntoService.", () => { - it("should not insert into auth_into_service", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1b"}; - techRecordDocumentJsonNew.vin = {S : "VIN1b"}; - techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = {M : {}}; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + it("should not insert into auth_into_service", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1b" }; + techRecordDocumentJsonNew.vin = { S: "VIN1b" }; + techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = { M: {} }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1b"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1b"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1b"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1b" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1b"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`id\` + const authIntoServiceResultSet = await executeSql( + `SELECT \`id\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - - expect(authIntoServiceResultSet.rows.length).toEqual(0); + ); + + expect(authIntoServiceResultSet.rows.length).toEqual(0); + }); + + it("should insert into auth_into_service when the vehicle is updated with an authIntoService", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1b" }; + techRecordDocumentJsonNew.vin = { S: "VIN1b" }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; }); - it("should insert into auth_into_service when the vehicle is updated with an authIntoService", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1b"}; - techRecordDocumentJsonNew.vin = {S : "VIN1b"}; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1b"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1b"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1b"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1b" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1b"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`technical_record_id\`, + const authIntoServiceResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`cocIssueDate\`, \`dateReceived\`, \`datePending\`, @@ -321,122 +344,137 @@ export const authIntoServiceDocumentConversion = () => describe("convertTechReco \`dateRejected\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - - expect(authIntoServiceResultSet.rows.length).toEqual(1); - expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect((authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString()).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].datePending as Date).toUTCString()).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateAuthorised as Date).toUTCString()).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString()).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + ); + + expect(authIntoServiceResultSet.rows.length).toEqual(1); + expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect( + (authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString() + ).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].datePending as Date).toUTCString() + ).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0] + .dateAuthorised as Date).toUTCString() + ).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString() + ).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + }); + + it("should remove auth_into_service when the vehicle if updated and authIntoService is empty", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1b" }; + techRecordDocumentJsonNew.vin = { S: "VIN1b" }; + techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = { M: {} }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; }); - it("should remove auth_into_service when the vehicle if updated and authIntoService is empty", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1b"}; - techRecordDocumentJsonNew.vin = {S : "VIN1b"}; - techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService = {M : {}}; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1b"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1b"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1b"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1b" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1b"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`id\` + const authIntoServiceResultSet = await executeSql( + `SELECT \`id\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); + ); - expect(authIntoServiceResultSet.rows.length).toEqual(0); - }); + expect(authIntoServiceResultSet.rows.length).toEqual(0); + }); }); describe("when adding a new vehicle and authIntoService is not present.", () => { - it("should not insert into auth_into_service", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1c"}; - techRecordDocumentJsonNew.vin = {S : "VIN1c"}; - delete techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + it("should not insert into auth_into_service", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1c" }; + techRecordDocumentJsonNew.vin = { S: "VIN1c" }; + delete techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1c"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1c"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1c"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1c" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1c"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`technical_record_id\`, + const authIntoServiceResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`cocIssueDate\`, \`dateReceived\`, \`datePending\`, @@ -444,58 +482,59 @@ export const authIntoServiceDocumentConversion = () => describe("convertTechReco \`dateRejected\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - - expect(authIntoServiceResultSet.rows.length).toEqual(0); + ); + + expect(authIntoServiceResultSet.rows.length).toEqual(0); + }); + + it("should insert into auth_into_service when the vehicle is updated with an authIntoService", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1c" }; + techRecordDocumentJsonNew.vin = { S: "VIN1c" }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; }); - it("should insert into auth_into_service when the vehicle is updated with an authIntoService", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1c"}; - techRecordDocumentJsonNew.vin = {S : "VIN1c"}; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1c"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1c"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1c"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1c" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1c"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`technical_record_id\`, + const authIntoServiceResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`cocIssueDate\`, \`dateReceived\`, \`datePending\`, @@ -503,70 +542,84 @@ export const authIntoServiceDocumentConversion = () => describe("convertTechReco \`dateRejected\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - - expect(authIntoServiceResultSet.rows.length).toEqual(1); - expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect((authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString()).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].datePending as Date).toUTCString()).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateAuthorised as Date).toUTCString()).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString()).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + ); + + expect(authIntoServiceResultSet.rows.length).toEqual(1); + expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect( + (authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString() + ).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].datePending as Date).toUTCString() + ).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0] + .dateAuthorised as Date).toUTCString() + ).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString() + ).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + }); + + it("should remove auth_into_service when the vehicle if updated and authIntoService is not present", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-1c" }; + techRecordDocumentJsonNew.vin = { S: "VIN1c" }; + delete techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; }); - it("should remove auth_into_service when the vehicle if updated and authIntoService is not present", async () => { - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-1c"}; - techRecordDocumentJsonNew.vin = {S : "VIN1c"}; - delete techRecordDocumentJsonNew.techRecord.L[0].M.authIntoService; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`id\` + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1c"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1c"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1c"); - const vehicleId = vehicleResultSet.rows[0].id; - - const technicalRecordSet = await executeSql( - `SELECT \`id\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-1c" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1c"); + const vehicleId = vehicleResultSet.rows[0].id; + + const technicalRecordSet = await executeSql( + `SELECT \`id\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - const technicalRecordId = technicalRecordSet.rows[0].id; + ); + const technicalRecordId = technicalRecordSet.rows[0].id; - const authIntoServiceResultSet = await executeSql( - `SELECT \`id\` + const authIntoServiceResultSet = await executeSql( + `SELECT \`id\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); + ); - expect(authIntoServiceResultSet.rows.length).toEqual(0); - }); + expect(authIntoServiceResultSet.rows.length).toEqual(0); + }); }); -}); + }); diff --git a/tests/integration/cvsbnop-container.ts b/tests/integration/cvsbnop-container.ts index 76f8229..027e749 100644 --- a/tests/integration/cvsbnop-container.ts +++ b/tests/integration/cvsbnop-container.ts @@ -1,48 +1,62 @@ -import {spawnSync} from "child_process"; -import {pathToResources} from "../utils"; -import {GenericContainer, StartedTestContainer} from "testcontainers"; -import {Port} from "testcontainers/dist/port"; -import {PoolOptions} from "mysql2"; -import {getConnectionPoolOptions} from "../../src/services/connection-pool-options"; +import { spawnSync } from "child_process"; +import { pathToResources } from "../utils"; +import { GenericContainer, StartedTestContainer } from "testcontainers"; +import { Port } from "testcontainers/dist/port"; +import { PoolOptions } from "mysql2"; +import { getConnectionPoolOptions } from "../../src/services/connection-pool-options"; export const containerMySqlPort: Port = 3306; const databaseName: string = "CVSBNOP"; // match `${pathToResources()}/Dockerfile` export const getContainerizedDatabase = async (): Promise => { - const containerDefinition = (await GenericContainer.fromDockerfile(pathToResources(), "Dockerfile").build()) - .withExposedPorts(containerMySqlPort); - - const container: StartedTestContainer = await containerDefinition.start(); - - const hostPort: Port = container.getMappedPort(containerMySqlPort); - - console.log(`MySQL container '${container.getName()}' started on port ${hostPort} (ID: ${container.getId()})`); - - const liquibaseExecutable = process.platform === "win32" ? "liquibase.bat" : "liquibase"; - - const liquibaseProcess = spawnSync(liquibaseExecutable, [ - "--changeLogFile", "cvs-nop/changelog-master.xml", - "--username", "root", - "--password", "12345", - "--url", `jdbc:mysql://localhost:${hostPort}/${databaseName}`, - "--classpath", `${pathToResources()}/mysql-connector-java-8.0.23.jar`, - "update" - ]); - - console.log(`Liquibase process started with PID ${liquibaseProcess.pid}`); - console.log(liquibaseProcess.output.toString()); - - await mockPoolOptions(container); - - return container; + const containerDefinition = ( + await GenericContainer.fromDockerfile( + pathToResources(), + "Dockerfile" + ).build() + ).withExposedPorts(containerMySqlPort); + + const container: StartedTestContainer = await containerDefinition.start(); + + const hostPort: Port = container.getMappedPort(containerMySqlPort); + + console.log( + `MySQL container '${container.getName()}' started on port ${hostPort} (ID: ${container.getId()})` + ); + + const liquibaseExecutable = + process.platform === "win32" ? "liquibase.bat" : "liquibase"; + + const liquibaseProcess = spawnSync(liquibaseExecutable, [ + "--changeLogFile", + "cvs-nop/changelog-master.xml", + "--username", + "root", + "--password", + "12345", + "--url", + `jdbc:mysql://localhost:${hostPort}/${databaseName}`, + "--classpath", + `${pathToResources()}/mysql-connector-java-8.0.23.jar`, + "update", + ]); + + console.log(`Liquibase process started with PID ${liquibaseProcess.pid}`); + console.log(liquibaseProcess.output.toString()); + + await mockPoolOptions(container); + + return container; }; -const mockPoolOptions = async (container: StartedTestContainer): Promise => { - const poolOptions: PoolOptions = await getConnectionPoolOptions(); +const mockPoolOptions = async ( + container: StartedTestContainer +): Promise => { + const poolOptions: PoolOptions = await getConnectionPoolOptions(); - (getConnectionPoolOptions as jest.Mock) = jest.fn().mockReturnValue({ - ...poolOptions, - port: container.getMappedPort(containerMySqlPort) - }); + (getConnectionPoolOptions as jest.Mock) = jest.fn().mockReturnValue({ + ...poolOptions, + port: container.getMappedPort(containerMySqlPort), + }); }; diff --git a/tests/integration/database-teardown.ts b/tests/integration/database-teardown.ts index 30988da..4d6b9a4 100644 --- a/tests/integration/database-teardown.ts +++ b/tests/integration/database-teardown.ts @@ -1,12 +1,15 @@ -import {executeSql} from "../../src/services/connection-pool"; -import {allTables, TableDetails} from "../../src/services/table-details"; +import { executeSql } from "../../src/services/connection-pool"; +import { allTables, TableDetails } from "../../src/services/table-details"; export const databaseTearDown = async () => { - // only run if database is not containerized - no point in tearing down data on an ephemeral environment - if (!process.env.USE_CONTAINERIZED_DATABASE || process.env.USE_CONTAINERIZED_DATABASE === "0") { - const tables: TableDetails[] = allTables(); - for (const table of tables) { - await executeSql(`TRUNCATE TABLE ${table.tableName}`); - } + // only run if database is not containerized - no point in tearing down data on an ephemeral environment + if ( + !process.env.USE_CONTAINERIZED_DATABASE || + process.env.USE_CONTAINERIZED_DATABASE === "0" + ) { + const tables: TableDetails[] = allTables(); + for (const table of tables) { + await executeSql(`TRUNCATE TABLE ${table.tableName}`); } + } }; diff --git a/tests/integration/integration.allIntTest.ts b/tests/integration/integration.allIntTest.ts index 3ace54b..ac73e73 100644 --- a/tests/integration/integration.allIntTest.ts +++ b/tests/integration/integration.allIntTest.ts @@ -4,12 +4,12 @@ import { testResultsConversionWithDelete } from "./test-results-conversion-with- import { testResultsConversionWithUpsert } from "./test-results-conversion-with-upsert.intTest"; describe("convert TechRecord document integration tests", () => { - techRecordDocumentConversion(); + techRecordDocumentConversion(); }); describe("convert authIntoService document integration tests", () => { - authIntoServiceDocumentConversion(); + authIntoServiceDocumentConversion(); }); describe("convert TestResults integration tests", () => { - testResultsConversionWithDelete(); - testResultsConversionWithUpsert(); + testResultsConversionWithDelete(); + testResultsConversionWithUpsert(); }); diff --git a/tests/integration/tech-record-document-conversion.intTest.ts b/tests/integration/tech-record-document-conversion.intTest.ts index cff81ee..b070bf9 100644 --- a/tests/integration/tech-record-document-conversion.intTest.ts +++ b/tests/integration/tech-record-document-conversion.intTest.ts @@ -1,93 +1,106 @@ -import {StartedTestContainer} from "testcontainers"; -import {destroyConnectionPool, executeSql} from "../../src/services/connection-pool"; -import {exampleContext, useLocalDb} from "../utils"; +import { StartedTestContainer } from "testcontainers"; +import { + destroyConnectionPool, + executeSql, +} from "../../src/services/connection-pool"; +import { exampleContext, useLocalDb } from "../utils"; import techRecordDocumentJson from "../resources/dynamodb-image-technical-record.json"; -import {getContainerizedDatabase} from "./cvsbnop-container"; -import {processStreamEvent} from "../../src/functions/process-stream-event"; -import {getConnectionPoolOptions} from "../../src/services/connection-pool-options"; +import { getContainerizedDatabase } from "./cvsbnop-container"; +import { processStreamEvent } from "../../src/functions/process-stream-event"; +import { getConnectionPoolOptions } from "../../src/services/connection-pool-options"; useLocalDb(); -export const techRecordDocumentConversion = () => describe("convertTechRecordDocument() integration tests", () => { +export const techRecordDocumentConversion = () => + describe("convertTechRecordDocument() integration tests", () => { let container: StartedTestContainer; beforeAll(async () => { - jest.setTimeout(60_000); - jest.restoreAllMocks(); - - // see README for why this environment variable exists - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - container = await getContainerizedDatabase(); - } else { - (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ - host: "localhost", - port: "3306", - user: "root", - password: "12345", - database: "CVSBNOP" - }); - } + jest.setTimeout(60_000); + jest.restoreAllMocks(); + + // see README for why this environment variable exists + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + container = await getContainerizedDatabase(); + } else { + (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ + host: "localhost", + port: "3306", + user: "root", + password: "12345", + database: "CVSBNOP", + }); + } }); afterAll(async () => { - await destroyConnectionPool(); - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - await container.stop(); - } + await destroyConnectionPool(); + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + await container.stop(); + } }); it("should correctly convert a DynamoDB event into Aurora rows", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJson - } - }) - } - ] - }; - - // array of arrays: event contains array of records, each with array of tech record entities - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJson, + }, + }), + }, + ], + }; + + // array of arrays: event contains array of records, each with array of tech record entities + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "SYSTEM-NUMBER-1"` - ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN1"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-1"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-1"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); // todo This returns null - - const vehicleId = vehicleResultSet.rows[0].id; - const technicalRecordSet = await executeSql( - `SELECT \`make_model_id\`, \`vehicle_class_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`applicant_detail_id\`, \`purchaser_detail_id\`, \`manufacturer_detail_id\`, \`id\`, \`createdAt\` + ); + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-1"); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN1"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-1"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-1"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); // todo This returns null + + const vehicleId = vehicleResultSet.rows[0].id; + const technicalRecordSet = await executeSql( + `SELECT \`make_model_id\`, \`vehicle_class_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`applicant_detail_id\`, \`purchaser_detail_id\`, \`manufacturer_detail_id\`, \`id\`, \`createdAt\` FROM \`technical_record\` WHERE \`technical_record\`.\`vehicle_id\` = ${vehicleId}` - ); - - expect(technicalRecordSet.rows.length).toEqual(1); - expect((technicalRecordSet.rows[0].createdAt as Date).toISOString()).toEqual("2020-01-01T00:00:00.055Z"); - - const { make_model_id, vehicle_class_id, createdBy_Id, lastUpdatedBy_Id, applicant_detail_id, purchaser_detail_id, manufacturer_detail_id } = technicalRecordSet.rows[0]; - - const technicalRecordId = technicalRecordSet.rows[0].id; - - const makeModelResultSet = await executeSql( - `SELECT \`make\`, + ); + + expect(technicalRecordSet.rows.length).toEqual(1); + expect( + (technicalRecordSet.rows[0].createdAt as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.055Z"); + + const { + make_model_id, + vehicle_class_id, + createdBy_Id, + lastUpdatedBy_Id, + applicant_detail_id, + purchaser_detail_id, + manufacturer_detail_id, + } = technicalRecordSet.rows[0]; + + const technicalRecordId = technicalRecordSet.rows[0].id; + + const makeModelResultSet = await executeSql( + `SELECT \`make\`, \`model\`, \`chassisMake\`, \`chassisModel\`, @@ -100,22 +113,26 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc \`dtpCode\` FROM \`make_model\` WHERE \`make_model\`.\`id\` = ${make_model_id}` - ); - expect(makeModelResultSet.rows.length).toEqual(1); - expect(makeModelResultSet.rows[0].make).toEqual("MAKE"); - expect(makeModelResultSet.rows[0].model).toEqual("MODEL"); - expect(makeModelResultSet.rows[0].chassisMake).toEqual("CHASSIS-MAKE"); - expect(makeModelResultSet.rows[0].chassisModel).toEqual("CHASSIS-MODEL"); - expect(makeModelResultSet.rows[0].bodyMake).toEqual("BODY-MAKE"); - expect(makeModelResultSet.rows[0].bodyModel).toEqual("BODY-MODEL"); - expect(makeModelResultSet.rows[0].modelLiteral).toEqual("MODEL-LITERAL"); - expect(makeModelResultSet.rows[0].bodyTypeCode).toEqual("a"); - expect(makeModelResultSet.rows[0].bodyTypeDescription).toEqual("articulated"); - expect(makeModelResultSet.rows[0].fuelPropulsionSystem).toEqual("DieselPetrol"); - expect(makeModelResultSet.rows[0].dtpCode).toEqual(null); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(makeModelResultSet.rows.length).toEqual(1); + expect(makeModelResultSet.rows[0].make).toEqual("MAKE"); + expect(makeModelResultSet.rows[0].model).toEqual("MODEL"); + expect(makeModelResultSet.rows[0].chassisMake).toEqual("CHASSIS-MAKE"); + expect(makeModelResultSet.rows[0].chassisModel).toEqual("CHASSIS-MODEL"); + expect(makeModelResultSet.rows[0].bodyMake).toEqual("BODY-MAKE"); + expect(makeModelResultSet.rows[0].bodyModel).toEqual("BODY-MODEL"); + expect(makeModelResultSet.rows[0].modelLiteral).toEqual("MODEL-LITERAL"); + expect(makeModelResultSet.rows[0].bodyTypeCode).toEqual("a"); + expect(makeModelResultSet.rows[0].bodyTypeDescription).toEqual( + "articulated" + ); + expect(makeModelResultSet.rows[0].fuelPropulsionSystem).toEqual( + "DieselPetrol" + ); + expect(makeModelResultSet.rows[0].dtpCode).toEqual(null); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -123,35 +140,43 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("small"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("small"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-2"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-2"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-2"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-2"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-2"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-2"); - - const contactDetailsResultSet = await executeSql( - `SELECT \`name\`, + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-2" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-2" + ); + + const contactDetailsResultSet = await executeSql( + `SELECT \`name\`, \`address1\`, \`address2\`, \`postTown\`, @@ -162,24 +187,32 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc \`faxNumber\` FROM \`contact_details\` WHERE \`contact_details\`.\`id\` = ${applicant_detail_id}` - ); - - const contactIds = [applicant_detail_id, manufacturer_detail_id, purchaser_detail_id]; - expect(contactIds.every((id) => contactIds[0] === id)).toBe(true); - - expect(contactDetailsResultSet.rows.length).toEqual(1); - expect(contactDetailsResultSet.rows[0].name).toEqual("NAME"); - expect(contactDetailsResultSet.rows[0].address1).toEqual("ADDRESS-1"); - expect(contactDetailsResultSet.rows[0].address2).toEqual("ADDRESS-2"); - expect(contactDetailsResultSet.rows[0].postTown).toEqual("POST-TOWN"); - expect(contactDetailsResultSet.rows[0].address3).toEqual("ADDRESS-3"); - expect(contactDetailsResultSet.rows[0].postCode).toEqual("POST-CODE"); - expect(contactDetailsResultSet.rows[0].emailAddress).toEqual("EMAIL-ADDRESS"); - expect(contactDetailsResultSet.rows[0].telephoneNumber).toEqual("TELEPHONE-NUMBER"); - expect(contactDetailsResultSet.rows[0].faxNumber).toEqual("FAX-NUMBER"); - - const techRecordResultSet = await executeSql( - `SELECT \`vehicle_id\`, + ); + + const contactIds = [ + applicant_detail_id, + manufacturer_detail_id, + purchaser_detail_id, + ]; + expect(contactIds.every((id) => contactIds[0] === id)).toBe(true); + + expect(contactDetailsResultSet.rows.length).toEqual(1); + expect(contactDetailsResultSet.rows[0].name).toEqual("NAME"); + expect(contactDetailsResultSet.rows[0].address1).toEqual("ADDRESS-1"); + expect(contactDetailsResultSet.rows[0].address2).toEqual("ADDRESS-2"); + expect(contactDetailsResultSet.rows[0].postTown).toEqual("POST-TOWN"); + expect(contactDetailsResultSet.rows[0].address3).toEqual("ADDRESS-3"); + expect(contactDetailsResultSet.rows[0].postCode).toEqual("POST-CODE"); + expect(contactDetailsResultSet.rows[0].emailAddress).toEqual( + "EMAIL-ADDRESS" + ); + expect(contactDetailsResultSet.rows[0].telephoneNumber).toEqual( + "TELEPHONE-NUMBER" + ); + expect(contactDetailsResultSet.rows[0].faxNumber).toEqual("FAX-NUMBER"); + + const techRecordResultSet = await executeSql( + `SELECT \`vehicle_id\`, \`recordCompleteness\`, \`createdAt\`, \`lastUpdatedAt\`, @@ -265,93 +298,136 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc \`seatbeltInstallationApprovalDate\` FROM \`technical_record\` WHERE \`technical_record\`.\`id\` = ${technicalRecordId}` - ); - // check a few fields of different types here - expect((techRecordResultSet.rows[0].vehicle_id)).toEqual(vehicleId); - expect((techRecordResultSet.rows[0].recordCompleteness)).toEqual("88888888"); - expect((techRecordResultSet.rows[0].createdAt as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((techRecordResultSet.rows[0].lastUpdatedAt as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((techRecordResultSet.rows[0].make_model_id)).toEqual(1); - expect((techRecordResultSet.rows[0].functionCode)).toEqual("1"); - expect(techRecordResultSet.rows[0].offRoad).toEqual(1); - expect(techRecordResultSet.rows[0].numberOfWheelsDriven).toEqual(1); - expect((techRecordResultSet.rows[0].regnDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((techRecordResultSet.rows[0].unladenWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].emissionsLimit)).toEqual("1"); - expect((techRecordResultSet.rows[0].departmentalVehicleMarker)).toEqual(1); - expect((techRecordResultSet.rows[0].alterationMarker)).toEqual(1); - expect((techRecordResultSet.rows[0].vehicle_class_id)).toEqual(vehicle_class_id); - expect((techRecordResultSet.rows[0].variantVersionNumber)).toEqual("1"); - expect((techRecordResultSet.rows[0].grossEecWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].trainEecWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].maxTrainEecWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].applicant_detail_id)).toEqual(1); - expect((techRecordResultSet.rows[0].purchaser_detail_id)).toEqual(1); - expect((techRecordResultSet.rows[0].manufacturer_detail_id)).toEqual(1); - expect((techRecordResultSet.rows[0].manufactureYear)).toEqual(2020); - expect((techRecordResultSet.rows[0].firstUseDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((techRecordResultSet.rows[0].coifDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((techRecordResultSet.rows[0].ntaNumber)).toEqual("NTA-NUMBER"); - expect((techRecordResultSet.rows[0].coifSerialNumber)).toEqual("88888888"); - expect((techRecordResultSet.rows[0].coifCertifierName)).toEqual("COIF-CERTIFIER-NAME"); - expect((techRecordResultSet.rows[0].approvalType)).toEqual("NTA"); - expect((techRecordResultSet.rows[0].approvalTypeNumber)).toEqual("1"); - expect((techRecordResultSet.rows[0].variantNumber)).toEqual("1"); - expect((techRecordResultSet.rows[0].conversionRefNo)).toEqual("1010101010"); - expect((techRecordResultSet.rows[0].seatsLowerDeck)).toEqual(1); - expect((techRecordResultSet.rows[0].seatsUpperDeck)).toEqual(1); - expect((techRecordResultSet.rows[0].standingCapacity)).toEqual(1); - expect((techRecordResultSet.rows[0].speedRestriction)).toEqual(1); - expect((techRecordResultSet.rows[0].speedLimiterMrk)).toEqual(1); - expect((techRecordResultSet.rows[0].tachoExemptMrk)).toEqual(1); - expect((techRecordResultSet.rows[0].dispensations)).toEqual("DISPENSATIONS"); - expect((techRecordResultSet.rows[0].remarks)).toEqual("REMARKS"); - expect((techRecordResultSet.rows[0].reasonForCreation)).toEqual("REASON-FOR-CREATION"); - expect((techRecordResultSet.rows[0].statusCode)).toEqual("STATUS-CODE"); - expect((techRecordResultSet.rows[0].grossKerbWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].grossLadenWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].grossGbWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].grossDesignWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].trainGbWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].trainDesignWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].maxTrainGbWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].maxTrainDesignWeight)).toEqual(1); - expect((techRecordResultSet.rows[0].maxLoadOnCoupling)).toEqual(1); - expect((techRecordResultSet.rows[0].frameDescription)).toEqual("Channel section"); - expect((techRecordResultSet.rows[0].tyreUseCode)).toEqual("22"); - expect((techRecordResultSet.rows[0].roadFriendly)).toEqual(1); - expect((techRecordResultSet.rows[0].drawbarCouplingFitted)).toEqual(1); - expect((techRecordResultSet.rows[0].euroStandard)).toEqual("euroStd"); - expect((techRecordResultSet.rows[0].suspensionType)).toEqual("1"); - expect((techRecordResultSet.rows[0].couplingType)).toEqual("1"); - expect((techRecordResultSet.rows[0].length)).toEqual(1); - expect((techRecordResultSet.rows[0].height)).toEqual(1); - expect((techRecordResultSet.rows[0].width)).toEqual(1); - expect((techRecordResultSet.rows[0].frontAxleTo5thWheelMin)).toEqual(1); - expect((techRecordResultSet.rows[0].frontAxleTo5thWheelMax)).toEqual(1); - expect((techRecordResultSet.rows[0].frontVehicleTo5thWheelCouplingMin)).toEqual(1); - expect((techRecordResultSet.rows[0].frontVehicleTo5thWheelCouplingMax)).toEqual(1); - expect((techRecordResultSet.rows[0].frontAxleToRearAxle)).toEqual(1); - expect((techRecordResultSet.rows[0].rearAxleToRearTrl)).toEqual(1); - expect((techRecordResultSet.rows[0].couplingCenterToRearAxleMin)).toEqual(1); - expect((techRecordResultSet.rows[0].couplingCenterToRearAxleMax)).toEqual(1); - expect((techRecordResultSet.rows[0].couplingCenterToRearTrlMin)).toEqual(1); - expect((techRecordResultSet.rows[0].couplingCenterToRearTrlMax)).toEqual(1); - expect((techRecordResultSet.rows[0].centreOfRearmostAxleToRearOfTrl)).toEqual(1); - expect((techRecordResultSet.rows[0].notes)).toEqual("NOTES"); - expect((techRecordResultSet.rows[0].purchaserNotes)).toEqual("PURCHASER-NOTES"); - expect((techRecordResultSet.rows[0].manufacturerNotes)).toEqual("MANUFACTURER-NOTES"); - expect((techRecordResultSet.rows[0].noOfAxles)).toEqual(1); - expect((techRecordResultSet.rows[0].brakeCode)).toEqual("1"); - expect((techRecordResultSet.rows[0].brakes_dtpNumber)).toEqual("666666"); - expect((techRecordResultSet.rows[0].brakes_loadSensingValve)).toEqual(1); - expect((techRecordResultSet.rows[0].brakes_antilockBrakingSystem)).toEqual(1); - expect((techRecordResultSet.rows[0].updateType)).toEqual("adrUpdate"); - expect((techRecordResultSet.rows[0].numberOfSeatbelts)).toEqual("NUMBER-OF-SEATBELTS"); - expect((techRecordResultSet.rows[0].seatbeltInstallationApprovalDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - - const brakesResultSet = await executeSql( - `SELECT \`technical_record_id\`, + ); + // check a few fields of different types here + expect(techRecordResultSet.rows[0].vehicle_id).toEqual(vehicleId); + expect(techRecordResultSet.rows[0].recordCompleteness).toEqual( + "88888888" + ); + expect( + (techRecordResultSet.rows[0].createdAt as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect( + (techRecordResultSet.rows[0].lastUpdatedAt as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect(techRecordResultSet.rows[0].make_model_id).toEqual(1); + expect(techRecordResultSet.rows[0].functionCode).toEqual("1"); + expect(techRecordResultSet.rows[0].offRoad).toEqual(1); + expect(techRecordResultSet.rows[0].numberOfWheelsDriven).toEqual(1); + expect( + (techRecordResultSet.rows[0].regnDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect(techRecordResultSet.rows[0].unladenWeight).toEqual(1); + expect(techRecordResultSet.rows[0].emissionsLimit).toEqual("1"); + expect(techRecordResultSet.rows[0].departmentalVehicleMarker).toEqual(1); + expect(techRecordResultSet.rows[0].alterationMarker).toEqual(1); + expect(techRecordResultSet.rows[0].vehicle_class_id).toEqual( + vehicle_class_id + ); + expect(techRecordResultSet.rows[0].variantVersionNumber).toEqual("1"); + expect(techRecordResultSet.rows[0].grossEecWeight).toEqual(1); + expect(techRecordResultSet.rows[0].trainEecWeight).toEqual(1); + expect(techRecordResultSet.rows[0].maxTrainEecWeight).toEqual(1); + expect(techRecordResultSet.rows[0].applicant_detail_id).toEqual(1); + expect(techRecordResultSet.rows[0].purchaser_detail_id).toEqual(1); + expect(techRecordResultSet.rows[0].manufacturer_detail_id).toEqual(1); + expect(techRecordResultSet.rows[0].manufactureYear).toEqual(2020); + expect( + (techRecordResultSet.rows[0].firstUseDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect( + (techRecordResultSet.rows[0].coifDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect(techRecordResultSet.rows[0].ntaNumber).toEqual("NTA-NUMBER"); + expect(techRecordResultSet.rows[0].coifSerialNumber).toEqual("88888888"); + expect(techRecordResultSet.rows[0].coifCertifierName).toEqual( + "COIF-CERTIFIER-NAME" + ); + expect(techRecordResultSet.rows[0].approvalType).toEqual("NTA"); + expect(techRecordResultSet.rows[0].approvalTypeNumber).toEqual("1"); + expect(techRecordResultSet.rows[0].variantNumber).toEqual("1"); + expect(techRecordResultSet.rows[0].conversionRefNo).toEqual("1010101010"); + expect(techRecordResultSet.rows[0].seatsLowerDeck).toEqual(1); + expect(techRecordResultSet.rows[0].seatsUpperDeck).toEqual(1); + expect(techRecordResultSet.rows[0].standingCapacity).toEqual(1); + expect(techRecordResultSet.rows[0].speedRestriction).toEqual(1); + expect(techRecordResultSet.rows[0].speedLimiterMrk).toEqual(1); + expect(techRecordResultSet.rows[0].tachoExemptMrk).toEqual(1); + expect(techRecordResultSet.rows[0].dispensations).toEqual( + "DISPENSATIONS" + ); + expect(techRecordResultSet.rows[0].remarks).toEqual("REMARKS"); + expect(techRecordResultSet.rows[0].reasonForCreation).toEqual( + "REASON-FOR-CREATION" + ); + expect(techRecordResultSet.rows[0].statusCode).toEqual("STATUS-CODE"); + expect(techRecordResultSet.rows[0].grossKerbWeight).toEqual(1); + expect(techRecordResultSet.rows[0].grossLadenWeight).toEqual(1); + expect(techRecordResultSet.rows[0].grossGbWeight).toEqual(1); + expect(techRecordResultSet.rows[0].grossDesignWeight).toEqual(1); + expect(techRecordResultSet.rows[0].trainGbWeight).toEqual(1); + expect(techRecordResultSet.rows[0].trainDesignWeight).toEqual(1); + expect(techRecordResultSet.rows[0].maxTrainGbWeight).toEqual(1); + expect(techRecordResultSet.rows[0].maxTrainDesignWeight).toEqual(1); + expect(techRecordResultSet.rows[0].maxLoadOnCoupling).toEqual(1); + expect(techRecordResultSet.rows[0].frameDescription).toEqual( + "Channel section" + ); + expect(techRecordResultSet.rows[0].tyreUseCode).toEqual("22"); + expect(techRecordResultSet.rows[0].roadFriendly).toEqual(1); + expect(techRecordResultSet.rows[0].drawbarCouplingFitted).toEqual(1); + expect(techRecordResultSet.rows[0].euroStandard).toEqual("euroStd"); + expect(techRecordResultSet.rows[0].suspensionType).toEqual("1"); + expect(techRecordResultSet.rows[0].couplingType).toEqual("1"); + expect(techRecordResultSet.rows[0].length).toEqual(1); + expect(techRecordResultSet.rows[0].height).toEqual(1); + expect(techRecordResultSet.rows[0].width).toEqual(1); + expect(techRecordResultSet.rows[0].frontAxleTo5thWheelMin).toEqual(1); + expect(techRecordResultSet.rows[0].frontAxleTo5thWheelMax).toEqual(1); + expect( + techRecordResultSet.rows[0].frontVehicleTo5thWheelCouplingMin + ).toEqual(1); + expect( + techRecordResultSet.rows[0].frontVehicleTo5thWheelCouplingMax + ).toEqual(1); + expect(techRecordResultSet.rows[0].frontAxleToRearAxle).toEqual(1); + expect(techRecordResultSet.rows[0].rearAxleToRearTrl).toEqual(1); + expect(techRecordResultSet.rows[0].couplingCenterToRearAxleMin).toEqual( + 1 + ); + expect(techRecordResultSet.rows[0].couplingCenterToRearAxleMax).toEqual( + 1 + ); + expect(techRecordResultSet.rows[0].couplingCenterToRearTrlMin).toEqual(1); + expect(techRecordResultSet.rows[0].couplingCenterToRearTrlMax).toEqual(1); + expect( + techRecordResultSet.rows[0].centreOfRearmostAxleToRearOfTrl + ).toEqual(1); + expect(techRecordResultSet.rows[0].notes).toEqual("NOTES"); + expect(techRecordResultSet.rows[0].purchaserNotes).toEqual( + "PURCHASER-NOTES" + ); + expect(techRecordResultSet.rows[0].manufacturerNotes).toEqual( + "MANUFACTURER-NOTES" + ); + expect(techRecordResultSet.rows[0].noOfAxles).toEqual(1); + expect(techRecordResultSet.rows[0].brakeCode).toEqual("1"); + expect(techRecordResultSet.rows[0].brakes_dtpNumber).toEqual("666666"); + expect(techRecordResultSet.rows[0].brakes_loadSensingValve).toEqual(1); + expect(techRecordResultSet.rows[0].brakes_antilockBrakingSystem).toEqual( + 1 + ); + expect(techRecordResultSet.rows[0].updateType).toEqual("adrUpdate"); + expect(techRecordResultSet.rows[0].numberOfSeatbelts).toEqual( + "NUMBER-OF-SEATBELTS" + ); + expect( + (techRecordResultSet.rows[0] + .seatbeltInstallationApprovalDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + + const brakesResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`brakeCodeOriginal\`, \`brakeCode\`, \`dataTrBrakeOne\`, @@ -367,50 +443,64 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc \`parkingBrakeForceB\` FROM \`psv_brakes\` WHERE \`psv_brakes\`.\`technical_record_id\` = ${technicalRecordId}` - ); - expect(brakesResultSet.rows.length).toEqual(1); - expect(brakesResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect(brakesResultSet.rows[0].brakeCodeOriginal).toEqual("333"); - expect(brakesResultSet.rows[0].brakeCode).toEqual("666666"); - expect(brakesResultSet.rows[0].dataTrBrakeOne).toEqual("DATA-TR-BRAKE-ONE"); - expect(brakesResultSet.rows[0].dataTrBrakeTwo).toEqual("DATA-TR-BRAKE-TWO"); - expect(brakesResultSet.rows[0].dataTrBrakeThree).toEqual("DATA-TR-BRAKE-THREE"); - expect(brakesResultSet.rows[0].retarderBrakeOne).toEqual("electric"); - expect(brakesResultSet.rows[0].retarderBrakeTwo).toEqual("electric"); - expect(brakesResultSet.rows[0].serviceBrakeForceA).toEqual(1); - expect(brakesResultSet.rows[0].secondaryBrakeForceA).toEqual(1); - expect(brakesResultSet.rows[0].parkingBrakeForceA).toEqual(1); - expect(brakesResultSet.rows[0].serviceBrakeForceB).toEqual(1); - expect(brakesResultSet.rows[0].secondaryBrakeForceB).toEqual(1); - expect(brakesResultSet.rows[0].parkingBrakeForceB).toEqual(1); - - const axleSpacingResultSet = await executeSql( - `SELECT \`technical_record_id\`, \`axles\`, \`value\` + ); + expect(brakesResultSet.rows.length).toEqual(1); + expect(brakesResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect(brakesResultSet.rows[0].brakeCodeOriginal).toEqual("333"); + expect(brakesResultSet.rows[0].brakeCode).toEqual("666666"); + expect(brakesResultSet.rows[0].dataTrBrakeOne).toEqual( + "DATA-TR-BRAKE-ONE" + ); + expect(brakesResultSet.rows[0].dataTrBrakeTwo).toEqual( + "DATA-TR-BRAKE-TWO" + ); + expect(brakesResultSet.rows[0].dataTrBrakeThree).toEqual( + "DATA-TR-BRAKE-THREE" + ); + expect(brakesResultSet.rows[0].retarderBrakeOne).toEqual("electric"); + expect(brakesResultSet.rows[0].retarderBrakeTwo).toEqual("electric"); + expect(brakesResultSet.rows[0].serviceBrakeForceA).toEqual(1); + expect(brakesResultSet.rows[0].secondaryBrakeForceA).toEqual(1); + expect(brakesResultSet.rows[0].parkingBrakeForceA).toEqual(1); + expect(brakesResultSet.rows[0].serviceBrakeForceB).toEqual(1); + expect(brakesResultSet.rows[0].secondaryBrakeForceB).toEqual(1); + expect(brakesResultSet.rows[0].parkingBrakeForceB).toEqual(1); + + const axleSpacingResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`axles\`, \`value\` FROM \`axle_spacing\` WHERE \`axle_spacing\`.\`id\` IN ( SELECT \`id\` FROM \`axle_spacing\` WHERE \`axle_spacing\`.\`technical_record_id\` = ${technicalRecordId} )` - ); - expect(axleSpacingResultSet.rows.length).toEqual(1); - expect(axleSpacingResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect(axleSpacingResultSet.rows[0].axles).toEqual("1-2"); - expect(axleSpacingResultSet.rows[0].value).toEqual(1); - - const microfilmResultSet = await executeSql( - `SELECT \`technical_record_id\`, \`microfilmDocumentType\`, \`microfilmRollNumber\`, \`microfilmSerialNumber\` + ); + expect(axleSpacingResultSet.rows.length).toEqual(1); + expect(axleSpacingResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect(axleSpacingResultSet.rows[0].axles).toEqual("1-2"); + expect(axleSpacingResultSet.rows[0].value).toEqual(1); + + const microfilmResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`microfilmDocumentType\`, \`microfilmRollNumber\`, \`microfilmSerialNumber\` FROM \`microfilm\` WHERE \`microfilm\`.\`technical_record_id\` = ${technicalRecordId}` - ); - expect(microfilmResultSet.rows.length).toEqual(1); - expect(microfilmResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect(microfilmResultSet.rows[0].microfilmDocumentType).toEqual("PSV Miscellaneous"); - expect(microfilmResultSet.rows[0].microfilmRollNumber).toEqual("1"); - expect(microfilmResultSet.rows[0].microfilmSerialNumber).toEqual("1"); - - const platesResultSet = await executeSql( - `SELECT \`technical_record_id\`, + ); + expect(microfilmResultSet.rows.length).toEqual(1); + expect(microfilmResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect(microfilmResultSet.rows[0].microfilmDocumentType).toEqual( + "PSV Miscellaneous" + ); + expect(microfilmResultSet.rows[0].microfilmRollNumber).toEqual("1"); + expect(microfilmResultSet.rows[0].microfilmSerialNumber).toEqual("1"); + + const platesResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`plateSerialNumber\`, \`plateIssueDate\`, \`plateReasonForIssue\`, @@ -421,16 +511,22 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc FROM \`plate\` WHERE \`plate\`.\`technical_record_id\` = ${technicalRecordId} )` - ); - expect(platesResultSet.rows.length).toEqual(1); - expect(platesResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect(platesResultSet.rows[0].plateSerialNumber).toEqual("1"); - expect((platesResultSet.rows[0].plateIssueDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect(platesResultSet.rows[0].plateReasonForIssue).toEqual("Free replacement"); - expect(platesResultSet.rows[0].plateIssuer).toEqual("PLATE-ISSUER"); - - const axlesResultSet = await executeSql( - `SELECT \`technical_record_id\`, + ); + expect(platesResultSet.rows.length).toEqual(1); + expect(platesResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect(platesResultSet.rows[0].plateSerialNumber).toEqual("1"); + expect( + (platesResultSet.rows[0].plateIssueDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect(platesResultSet.rows[0].plateReasonForIssue).toEqual( + "Free replacement" + ); + expect(platesResultSet.rows[0].plateIssuer).toEqual("PLATE-ISSUER"); + + const axlesResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`tyre_id\`, \`axleNumber\`, \`parkingBrakeMrk\`, @@ -448,23 +544,25 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc FROM \`axles\` WHERE \`axles\`.\`technical_record_id\` = ${technicalRecordId} )` - ); - expect(axlesResultSet.rows.length).toEqual(1); - expect(axlesResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect(axlesResultSet.rows[0].tyre_id).toEqual(technicalRecordId); - expect(axlesResultSet.rows[0].axleNumber).toEqual(1); - expect(axlesResultSet.rows[0].parkingBrakeMrk).toEqual(1); - expect(axlesResultSet.rows[0].kerbWeight).toEqual(1); - expect(axlesResultSet.rows[0].ladenWeight).toEqual(1); - expect(axlesResultSet.rows[0].gbWeight).toEqual(1); - expect(axlesResultSet.rows[0].eecWeight).toEqual(1); - expect(axlesResultSet.rows[0].designWeight).toEqual(1); - expect(axlesResultSet.rows[0].brakeActuator).toEqual(1); - expect(axlesResultSet.rows[0].leverLength).toEqual(1); - expect(axlesResultSet.rows[0].springBrakeParking).toEqual(1); - - const authIntoServiceResultSet = await executeSql( - `SELECT \`technical_record_id\`, + ); + expect(axlesResultSet.rows.length).toEqual(1); + expect(axlesResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect(axlesResultSet.rows[0].tyre_id).toEqual(technicalRecordId); + expect(axlesResultSet.rows[0].axleNumber).toEqual(1); + expect(axlesResultSet.rows[0].parkingBrakeMrk).toEqual(1); + expect(axlesResultSet.rows[0].kerbWeight).toEqual(1); + expect(axlesResultSet.rows[0].ladenWeight).toEqual(1); + expect(axlesResultSet.rows[0].gbWeight).toEqual(1); + expect(axlesResultSet.rows[0].eecWeight).toEqual(1); + expect(axlesResultSet.rows[0].designWeight).toEqual(1); + expect(axlesResultSet.rows[0].brakeActuator).toEqual(1); + expect(axlesResultSet.rows[0].leverLength).toEqual(1); + expect(axlesResultSet.rows[0].springBrakeParking).toEqual(1); + + const authIntoServiceResultSet = await executeSql( + `SELECT \`technical_record_id\`, \`cocIssueDate\`, \`dateReceived\`, \`datePending\`, @@ -472,104 +570,119 @@ export const techRecordDocumentConversion = () => describe("convertTechRecordDoc \`dateRejected\` FROM \`auth_into_service\` WHERE \`auth_into_service\`.\`technical_record_id\` = ${technicalRecordId}` - ); - expect(authIntoServiceResultSet.rows.length).toEqual(1); - expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual(technicalRecordId); - expect((authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString()).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString()).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].datePending as Date).toUTCString()).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateAuthorised as Date).toUTCString()).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); - expect((authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString()).toEqual("Tue, 05 May 2020 00:00:00 GMT"); + ); + expect(authIntoServiceResultSet.rows.length).toEqual(1); + expect(authIntoServiceResultSet.rows[0].technical_record_id).toEqual( + technicalRecordId + ); + expect( + (authIntoServiceResultSet.rows[0].cocIssueDate as Date).toUTCString() + ).toEqual("Wed, 01 Jan 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateReceived as Date).toUTCString() + ).toEqual("Sun, 02 Feb 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].datePending as Date).toUTCString() + ).toEqual("Tue, 03 Mar 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateAuthorised as Date).toUTCString() + ).toEqual("Sat, 04 Apr 2020 00:00:00 GMT"); + expect( + (authIntoServiceResultSet.rows[0].dateRejected as Date).toUTCString() + ).toEqual("Tue, 05 May 2020 00:00:00 GMT"); }); describe("when adding a new vehicle and changing VRM to a new value, VRM should change on existing vehicle.", () => { - it("A new vehicle is present", async () => { - - // arrange - create a record so we can later query for it and assert for is existence - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-2"}; - techRecordDocumentJsonNew.vin = {S : "VIN2"}; - techRecordDocumentJsonNew.primaryVrm = {S : "VRM7777"}; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - // array of arrays: event contains array of records, each with array of tech record entities - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\` - FROM \`vehicle\` - WHERE \`system_number\` = "SYSTEM-NUMBER-2"` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-2"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN2"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM7777"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-1"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); // todo This returns null + it("A new vehicle is present", async () => { + // arrange - create a record so we can later query for it and assert for is existence + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-2" }; + techRecordDocumentJsonNew.vin = { S: "VIN2" }; + techRecordDocumentJsonNew.primaryVrm = { S: "VRM7777" }; + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + // array of arrays: event contains array of records, each with array of tech record entities + await processStreamEvent(event, exampleContext(), () => { + return; }); - it("VRM has changed", async () => { - - // arrange - create a record with existing pair of (SystemNumber, VIN) and new VRM so we can later query for it and assert its value - const techRecordDocumentJsonNew = JSON.parse(JSON.stringify(techRecordDocumentJson)); - techRecordDocumentJsonNew.systemNumber = {S : "SYSTEM-NUMBER-2"}; - techRecordDocumentJsonNew.vin = {S : "VIN2"}; - techRecordDocumentJsonNew.primaryVrm = {S : "VRM888NEW"}; - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: techRecordDocumentJsonNew - } - }) - } - ] - }; - // array of arrays: event contains array of records, each with array of tech record entities - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\` + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\` FROM \`vehicle\` WHERE \`system_number\` = "SYSTEM-NUMBER-2"` - ); + ); - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-2"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN2"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM888NEW"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-1"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); // todo This returns null + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-2" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN2"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM7777"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-1"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); // todo This returns null + }); + + it("VRM has changed", async () => { + // arrange - create a record with existing pair of (SystemNumber, VIN) and new VRM so we can later query for it and assert its value + const techRecordDocumentJsonNew = JSON.parse( + JSON.stringify(techRecordDocumentJson) + ); + techRecordDocumentJsonNew.systemNumber = { S: "SYSTEM-NUMBER-2" }; + techRecordDocumentJsonNew.vin = { S: "VIN2" }; + techRecordDocumentJsonNew.primaryVrm = { S: "VRM888NEW" }; + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: techRecordDocumentJsonNew, + }, + }), + }, + ], + }; + // array of arrays: event contains array of records, each with array of tech record entities + await processStreamEvent(event, exampleContext(), () => { + return; }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\` + FROM \`vehicle\` + WHERE \`system_number\` = "SYSTEM-NUMBER-2"` + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-2" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN2"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM888NEW"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-1"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); // todo This returns null + }); }); -}); + }); diff --git a/tests/integration/test-results-conversion-with-delete.intTest.ts b/tests/integration/test-results-conversion-with-delete.intTest.ts index 242d063..2956024 100644 --- a/tests/integration/test-results-conversion-with-delete.intTest.ts +++ b/tests/integration/test-results-conversion-with-delete.intTest.ts @@ -1,148 +1,206 @@ -import {StartedTestContainer} from "testcontainers"; -import {destroyConnectionPool, executeSql} from "../../src/services/connection-pool"; -import {exampleContext, useLocalDb} from "../utils"; -import {getContainerizedDatabase} from "./cvsbnop-container"; -import {processStreamEvent} from "../../src/functions/process-stream-event"; -import {getConnectionPoolOptions} from "../../src/services/connection-pool-options"; -import {marshall, unmarshall} from "@aws-sdk/util-dynamodb"; +import { StartedTestContainer } from "testcontainers"; +import { + destroyConnectionPool, + executeSql, +} from "../../src/services/connection-pool"; +import { exampleContext, useLocalDb } from "../utils"; +import { getContainerizedDatabase } from "./cvsbnop-container"; +import { processStreamEvent } from "../../src/functions/process-stream-event"; +import { getConnectionPoolOptions } from "../../src/services/connection-pool-options"; +import { marshall, unmarshall } from "@aws-sdk/util-dynamodb"; useLocalDb(); -export const testResultsConversionWithDelete = () => describe("convertTestResults() integration tests with delete", async () => { +export const testResultsConversionWithDelete = () => + describe("convertTestResults() integration tests with delete", async () => { let container: StartedTestContainer; - const testResultsJson = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results.json"))); - const testResultsJsonWithTestTypes = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results-with-testtypes.json"))); - const testResultsJsonWithNoSystemNumber = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results-with-no-systemNumber.json"))); - const testResultsJsonWithoutTestTypes = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results-without-testtypes.json"))); + const testResultsJson = JSON.parse( + JSON.stringify(require("../resources/dynamodb-image-test-results.json")) + ); + const testResultsJsonWithTestTypes = JSON.parse( + JSON.stringify( + require("../resources/dynamodb-image-test-results-with-testtypes.json") + ) + ); + const testResultsJsonWithNoSystemNumber = JSON.parse( + JSON.stringify( + require("../resources/dynamodb-image-test-results-with-no-systemNumber.json") + ) + ); + const testResultsJsonWithoutTestTypes = JSON.parse( + JSON.stringify( + require("../resources/dynamodb-image-test-results-without-testtypes.json") + ) + ); testResultsJson.testResultId.S = testResultsJson.testResultId.S + "-D"; testResultsJson.systemNumber.S = testResultsJson.systemNumber.S + "-D"; - testResultsJsonWithTestTypes.testResultId.S = testResultsJsonWithTestTypes.testResultId.S + "-D"; - testResultsJsonWithTestTypes.systemNumber.S = testResultsJsonWithTestTypes.systemNumber.S + "-D"; - testResultsJsonWithNoSystemNumber.testResultId.S = testResultsJsonWithNoSystemNumber.testResultId.S + "-D"; - testResultsJsonWithoutTestTypes.testResultId.S = testResultsJsonWithoutTestTypes.testResultId.S + "-D"; - testResultsJsonWithoutTestTypes.systemNumber.S = testResultsJsonWithoutTestTypes.systemNumber.S + "-D"; + testResultsJsonWithTestTypes.testResultId.S = + testResultsJsonWithTestTypes.testResultId.S + "-D"; + testResultsJsonWithTestTypes.systemNumber.S = + testResultsJsonWithTestTypes.systemNumber.S + "-D"; + testResultsJsonWithNoSystemNumber.testResultId.S = + testResultsJsonWithNoSystemNumber.testResultId.S + "-D"; + testResultsJsonWithoutTestTypes.testResultId.S = + testResultsJsonWithoutTestTypes.testResultId.S + "-D"; + testResultsJsonWithoutTestTypes.systemNumber.S = + testResultsJsonWithoutTestTypes.systemNumber.S + "-D"; beforeAll(async () => { - delete process.env.DISABLE_DELETE_ON_UPDATE; - jest.setTimeout(60_000); - jest.restoreAllMocks(); - - // see README for why this environment variable exists - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - container = await getContainerizedDatabase(); - } else { - (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ - host: "localhost", - port: "3306", - user: "root", - password: "12345", - database: "CVSBNOP" - }); - } + delete process.env.DISABLE_DELETE_ON_UPDATE; + jest.setTimeout(60_000); + jest.restoreAllMocks(); + + // see README for why this environment variable exists + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + container = await getContainerizedDatabase(); + } else { + (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ + host: "localhost", + port: "3306", + user: "root", + password: "12345", + database: "CVSBNOP", + }); + } }); afterAll(async () => { - await destroyConnectionPool(); - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - await container.stop(); - } + await destroyConnectionPool(); + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + await container.stop(); + } }); it("should correctly convert a DynamoDB event into Aurora rows", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJson - } - }) - } - ] - }; - - // array of arrays: event contains array of records, each with array of test result entities - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJson, + }, + }), + }, + ], + }; + + // array of arrays: event contains array of records, each with array of test result entities + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-D"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-D" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("333"); - expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("2ND-CERTIFICATE-NO"); - expect((testResultSet.rows[0].testExpiryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testAnniversaryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2020-01-01T00:00:00.023Z"); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); - expect(testResultSet.rows[0].testResult).toEqual("fail"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("PARTICULATE-TRAP-FITTED"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("PARTICULATE-TRAP-SERIAL-NUMBER"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("SMOKE-TEST-K-LIMIT-APPLIED"); - - expect(testResultSet.rows.length).toEqual(1); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("333"); + expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "2ND-CERTIFICATE-NO" + ); + expect( + (testResultSet.rows[0].testExpiryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testAnniversaryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.023Z"); + expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); + expect(testResultSet.rows[0].testResult).toEqual("fail"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual( + "PARTICULATE-TRAP-FITTED" + ); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual( + "PARTICULATE-TRAP-SERIAL-NUMBER" + ); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "SMOKE-TEST-K-LIMIT-APPLIED" + ); + + expect(testResultSet.rows.length).toEqual(1); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -150,78 +208,92 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(1); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(1); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -233,130 +305,179 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("should correctly convert a DynamoDB event into Aurora rows when processed a second time", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJson - } - }) - } - ] - }; - - const consoleSpy = jest.spyOn(global.console, "error").mockImplementation(); - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - expect(consoleSpy).toBeCalledTimes(0); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJson, + }, + }), + }, + ], + }; + + const consoleSpy = jest + .spyOn(global.console, "error") + .mockImplementation(); + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + expect(consoleSpy).toBeCalledTimes(0); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-D"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-D" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("333"); - expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("2ND-CERTIFICATE-NO"); - expect((testResultSet.rows[0].testExpiryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testAnniversaryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2020-01-01T00:00:00.023Z"); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); - expect(testResultSet.rows[0].testResult).toEqual("fail"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("PARTICULATE-TRAP-FITTED"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("PARTICULATE-TRAP-SERIAL-NUMBER"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("SMOKE-TEST-K-LIMIT-APPLIED"); - - expect(testResultSet.rows.length).toEqual(1); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("333"); + expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "2ND-CERTIFICATE-NO" + ); + expect( + (testResultSet.rows[0].testExpiryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testAnniversaryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.023Z"); + expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); + expect(testResultSet.rows[0].testResult).toEqual("fail"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual( + "PARTICULATE-TRAP-FITTED" + ); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual( + "PARTICULATE-TRAP-SERIAL-NUMBER" + ); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "SMOKE-TEST-K-LIMIT-APPLIED" + ); + + expect(testResultSet.rows.length).toEqual(1); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -364,78 +485,92 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(1); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(1); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -447,146 +582,198 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("should correctly update when non-unique attributes changed", async () => { - const deserializedJson = unmarshall(testResultsJson); - deserializedJson.testTypes[0].testCode = "444"; - deserializedJson.testTypes[0].certificateNumber = "W323232"; - deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; - deserializedJson.testTypes[0].testExpiryDate = "2022-01-01T00:00:00.000Z"; - deserializedJson.testTypes[0].testAnniversaryDate = "2022-01-01T00:00:00.000Z"; - deserializedJson.testTypes[0].testTypeStartTimestamp = "2021-01-01T00:00:00.000Z"; - deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; - deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = "2021-01-01"; - deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; - deserializedJson.testTypes[0].testResult = "pass"; - deserializedJson.testTypes[0].reasonForAbandoning = "NEW-REASON-FOR-ABANDONING"; - deserializedJson.testTypes[0].additionalNotesRecorded = "NEW-ADDITIONAL-NOTES-RECORDED"; - deserializedJson.testTypes[0].additionalCommentsForAbandon = "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; - deserializedJson.testTypes[0].particulateTrapFitted = "t"; - deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; - deserializedJson.testTypes[0].modificationTypeUsed = "NEW-MODIFICATION-TYPE-USED"; - deserializedJson.testTypes[0].smokeTestKLimitApplied = "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; - - const serializedJSONb = marshall(deserializedJson); - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: serializedJSONb - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const deserializedJson = unmarshall(testResultsJson); + deserializedJson.testTypes[0].testCode = "444"; + deserializedJson.testTypes[0].certificateNumber = "W323232"; + deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; + deserializedJson.testTypes[0].testExpiryDate = "2022-01-01T00:00:00.000Z"; + deserializedJson.testTypes[0].testAnniversaryDate = + "2022-01-01T00:00:00.000Z"; + deserializedJson.testTypes[0].testTypeStartTimestamp = + "2021-01-01T00:00:00.000Z"; + deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; + deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = + "2021-01-01"; + deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; + deserializedJson.testTypes[0].testResult = "pass"; + deserializedJson.testTypes[0].reasonForAbandoning = + "NEW-REASON-FOR-ABANDONING"; + deserializedJson.testTypes[0].additionalNotesRecorded = + "NEW-ADDITIONAL-NOTES-RECORDED"; + deserializedJson.testTypes[0].additionalCommentsForAbandon = + "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; + deserializedJson.testTypes[0].particulateTrapFitted = "t"; + deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; + deserializedJson.testTypes[0].modificationTypeUsed = + "NEW-MODIFICATION-TYPE-USED"; + deserializedJson.testTypes[0].smokeTestKLimitApplied = + "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; + + const serializedJSONb = marshall(deserializedJson); + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: serializedJSONb, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-D"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-D" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("444"); - expect(testResultSet.rows[0].certificateNumber).toEqual("W323232"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("111111"); - expect(testResultSet.rows[0].testExpiryDate).toEqual(new Date("2022-01-01")); - expect(testResultSet.rows[0].testAnniversaryDate).toEqual(new Date("2022-01-01")); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2021-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].lastSeatbeltInstallationCheckDate as Date).toISOString()).toEqual("2021-01-01T00:00:00.000Z"); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); - expect(testResultSet.rows[0].testResult).toEqual("pass"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("NEW-REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("NEW-ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("NEW-MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("NEW-SMOKE-TEST-K-LIMIT-APPLIED"); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("444"); + expect(testResultSet.rows[0].certificateNumber).toEqual("W323232"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "111111" + ); + expect(testResultSet.rows[0].testExpiryDate).toEqual( + new Date("2022-01-01") + ); + expect(testResultSet.rows[0].testAnniversaryDate).toEqual( + new Date("2022-01-01") + ); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2021-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0] + .lastSeatbeltInstallationCheckDate as Date).toISOString() + ).toEqual("2021-01-01T00:00:00.000Z"); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); + expect(testResultSet.rows[0].testResult).toEqual("pass"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "NEW-REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "NEW-ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "NEW-MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "NEW-SMOKE-TEST-K-LIMIT-APPLIED" + ); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -594,78 +781,92 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(1); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(1); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -677,149 +878,201 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); - + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("should correctly insert when unique attributes changed", async () => { - const deserializedJson = unmarshall(testResultsJson); - deserializedJson.testTypes[0].testNumber = "NewTestNumber"; - deserializedJson.testTypes[0].testCode = "555"; - deserializedJson.testTypes[0].certificateNumber = "W43434343"; - deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; - deserializedJson.testTypes[0].testExpiryDate = "2022-01-02T00:00:00.000Z"; - deserializedJson.testTypes[0].testAnniversaryDate = "2022-01-02T00:00:00.000Z"; - deserializedJson.testTypes[0].testTypeStartTimestamp = "2021-01-02T00:00:00.000Z"; - deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; - deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = "2021-01-02"; - deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; - deserializedJson.testTypes[0].testResult = "pass"; - deserializedJson.testTypes[0].reasonForAbandoning = "NEW-REASON-FOR-ABANDONING"; - deserializedJson.testTypes[0].additionalNotesRecorded = "NEW-ADDITIONAL-NOTES-RECORDED"; - deserializedJson.testTypes[0].additionalCommentsForAbandon = "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; - deserializedJson.testTypes[0].particulateTrapFitted = "t"; - deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; - deserializedJson.testTypes[0].modificationTypeUsed = "NEW-MODIFICATION-TYPE-USED"; - deserializedJson.testTypes[0].smokeTestKLimitApplied = "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; - deserializedJson.testTypes[0].defects[0].imDescription = "IM-DESCRIPTION-5a"; - - const serializedJSONb = marshall(deserializedJson); - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: serializedJSONb - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const deserializedJson = unmarshall(testResultsJson); + deserializedJson.testTypes[0].testNumber = "NewTestNumber"; + deserializedJson.testTypes[0].testCode = "555"; + deserializedJson.testTypes[0].certificateNumber = "W43434343"; + deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; + deserializedJson.testTypes[0].testExpiryDate = "2022-01-02T00:00:00.000Z"; + deserializedJson.testTypes[0].testAnniversaryDate = + "2022-01-02T00:00:00.000Z"; + deserializedJson.testTypes[0].testTypeStartTimestamp = + "2021-01-02T00:00:00.000Z"; + deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; + deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = + "2021-01-02"; + deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; + deserializedJson.testTypes[0].testResult = "pass"; + deserializedJson.testTypes[0].reasonForAbandoning = + "NEW-REASON-FOR-ABANDONING"; + deserializedJson.testTypes[0].additionalNotesRecorded = + "NEW-ADDITIONAL-NOTES-RECORDED"; + deserializedJson.testTypes[0].additionalCommentsForAbandon = + "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; + deserializedJson.testTypes[0].particulateTrapFitted = "t"; + deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; + deserializedJson.testTypes[0].modificationTypeUsed = + "NEW-MODIFICATION-TYPE-USED"; + deserializedJson.testTypes[0].smokeTestKLimitApplied = + "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; + deserializedJson.testTypes[0].defects[0].imDescription = + "IM-DESCRIPTION-5a"; + + const serializedJSONb = marshall(deserializedJson); + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: serializedJSONb, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-D"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-D" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("555"); - expect(testResultSet.rows[0].certificateNumber).toEqual("W43434343"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("111111"); - expect(testResultSet.rows[0].testExpiryDate).toEqual(new Date("2022-01-02")); - expect(testResultSet.rows[0].testAnniversaryDate).toEqual(new Date("2022-01-02")); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2021-01-02T00:00:00.000Z"); - expect((testResultSet.rows[0].lastSeatbeltInstallationCheckDate as Date).toISOString()).toEqual("2021-01-02T00:00:00.000Z"); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); - expect(testResultSet.rows[0].testResult).toEqual("pass"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("NEW-REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("NEW-ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("NEW-MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("NEW-SMOKE-TEST-K-LIMIT-APPLIED"); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-D"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("555"); + expect(testResultSet.rows[0].certificateNumber).toEqual("W43434343"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "111111" + ); + expect(testResultSet.rows[0].testExpiryDate).toEqual( + new Date("2022-01-02") + ); + expect(testResultSet.rows[0].testAnniversaryDate).toEqual( + new Date("2022-01-02") + ); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2021-01-02T00:00:00.000Z"); + expect( + (testResultSet.rows[0] + .lastSeatbeltInstallationCheckDate as Date).toISOString() + ).toEqual("2021-01-02T00:00:00.000Z"); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); + expect(testResultSet.rows[0].testResult).toEqual("pass"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "NEW-REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "NEW-ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "NEW-MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "NEW-SMOKE-TEST-K-LIMIT-APPLIED" + ); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -827,78 +1080,92 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(2); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(2); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -910,76 +1177,90 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5a"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual( + "IM-DESCRIPTION-5a" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); - + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("A new Test Result with two TestTypes is inserted correctly", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJsonWithTestTypes - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJsonWithTestTypes, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJsonWithTestTypes.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-3-D"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN3"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-3"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-3"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-3-D" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN3"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-3"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-3"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, @@ -987,71 +1268,119 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id} ORDER BY id ASC` - ); - - expect(testResultSet.rows.length).toEqual(2); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-3-D"); - expect(testResultSet.rows[0].testCode).toEqual("333"); - expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("2ND-CERTIFICATE-NO"); - expect(testResultSet.rows[0].testExpiryDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].testAnniversaryDate).toEqual(new Date("2020-01-01")); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testTypeEndTimestamp as Date).toISOString()).toEqual("2020-01-01T16:54:44.123Z"); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); - expect(testResultSet.rows[0].testResult).toEqual("fail"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("PARTICULATE-TRAP-FITTED"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("PARTICULATE-TRAP-SERIAL-NUMBER"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("SMOKE-TEST-K-LIMIT-APPLIED"); - - expect(testResultSet.rows[1].testResultId).toEqual("TEST-RESULT-ID-3-D"); - expect(testResultSet.rows[1].testCode).toEqual("aav"); - expect(testResultSet.rows[1].certificateNumber).toEqual("W123123"); - expect(testResultSet.rows[1].secondaryCertificateNumber).toBeNull(); - expect(testResultSet.rows[1].testExpiryDate).toEqual(new Date(2022, 5, 30)); - expect(testResultSet.rows[1].testAnniversaryDate).toEqual(new Date(2022, 5, 30)); - expect((testResultSet.rows[1].testTypeStartTimestamp as Date).toISOString()).toEqual("2021-06-21T12:07:22.000Z"); - expect((testResultSet.rows[1].testTypeEndTimestamp as Date).toISOString()).toEqual("2021-06-21T12:59:07.000Z"); - expect(testResultSet.rows[1].lastSeatbeltInstallationCheckDate).toBeNull(); - expect(testResultSet.rows[1].seatbeltInstallationCheckDate).toEqual(0); - expect(testResultSet.rows[1].testResult).toEqual("pass"); - expect(testResultSet.rows[1].reasonForAbandoning).toBeNull(); - expect(testResultSet.rows[1].additionalNotesRecorded).toEqual("No emission plate default 0.70"); - expect(testResultSet.rows[1].particulateTrapFitted).toBeNull(); - expect(testResultSet.rows[1].particulateTrapSerialNumber).toBeNull(); - expect(testResultSet.rows[1].modificationTypeUsed).toBeNull(); - expect(testResultSet.rows[1].smokeTestKLimitApplied).toBeNull(); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows.length).toEqual(2); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-3-D"); + expect(testResultSet.rows[0].testCode).toEqual("333"); + expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "2ND-CERTIFICATE-NO" + ); + expect(testResultSet.rows[0].testExpiryDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].testAnniversaryDate).toEqual( + new Date("2020-01-01") + ); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testTypeEndTimestamp as Date).toISOString() + ).toEqual("2020-01-01T16:54:44.123Z"); + expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); + expect(testResultSet.rows[0].testResult).toEqual("fail"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual( + "PARTICULATE-TRAP-FITTED" + ); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual( + "PARTICULATE-TRAP-SERIAL-NUMBER" + ); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "SMOKE-TEST-K-LIMIT-APPLIED" + ); + + expect(testResultSet.rows[1].testResultId).toEqual("TEST-RESULT-ID-3-D"); + expect(testResultSet.rows[1].testCode).toEqual("aav"); + expect(testResultSet.rows[1].certificateNumber).toEqual("W123123"); + expect(testResultSet.rows[1].secondaryCertificateNumber).toBeNull(); + expect(testResultSet.rows[1].testExpiryDate).toEqual( + new Date(2022, 5, 30) + ); + expect(testResultSet.rows[1].testAnniversaryDate).toEqual( + new Date(2022, 5, 30) + ); + expect( + (testResultSet.rows[1].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2021-06-21T12:07:22.000Z"); + expect( + (testResultSet.rows[1].testTypeEndTimestamp as Date).toISOString() + ).toEqual("2021-06-21T12:59:07.000Z"); + expect( + testResultSet.rows[1].lastSeatbeltInstallationCheckDate + ).toBeNull(); + expect(testResultSet.rows[1].seatbeltInstallationCheckDate).toEqual(0); + expect(testResultSet.rows[1].testResult).toEqual("pass"); + expect(testResultSet.rows[1].reasonForAbandoning).toBeNull(); + expect(testResultSet.rows[1].additionalNotesRecorded).toEqual( + "No emission plate default 0.70" + ); + expect(testResultSet.rows[1].particulateTrapFitted).toBeNull(); + expect(testResultSet.rows[1].particulateTrapSerialNumber).toBeNull(); + expect(testResultSet.rows[1].modificationTypeUsed).toBeNull(); + expect(testResultSet.rows[1].smokeTestKLimitApplied).toBeNull(); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); + ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-3"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-3"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-3"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-3"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("999999998"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-3"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-3"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("999999998"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-3"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-3" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -1059,80 +1388,103 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("v"); - expect(vehicleClassResultSet.rows[0].description).toEqual("heavy goods vehicle"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("v"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "heavy goods vehicle" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-3"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-3"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-3"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-3"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-3"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-3"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-3"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-3"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-3" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-3" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - const testDefectLastIndex = testDefectResultSet.rows.length - 1; - - expect(testDefectResultSet.rows[testDefectLastIndex].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[testDefectLastIndex].defect_id).toEqual(3); - expect(testDefectResultSet.rows[testDefectLastIndex].location_id).toEqual(1); - expect(testDefectResultSet.rows[testDefectLastIndex].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[testDefectLastIndex].prs).toEqual(1); - expect(testDefectResultSet.rows[testDefectLastIndex].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + const testDefectLastIndex = testDefectResultSet.rows.length - 1; + + expect( + testDefectResultSet.rows[testDefectLastIndex].test_result_id + ).toEqual(id); + expect(testDefectResultSet.rows[testDefectLastIndex].defect_id).toEqual( + 3 + ); + expect(testDefectResultSet.rows[testDefectLastIndex].location_id).toEqual( + 1 + ); + expect(testDefectResultSet.rows[testDefectLastIndex].notes).toEqual( + "NOTES" + ); + expect(testDefectResultSet.rows[testDefectLastIndex].prs).toEqual(1); + expect( + testDefectResultSet.rows[testDefectLastIndex].prohibitionIssued + ).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -1144,114 +1496,133 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[testDefectLastIndex].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(3); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-3"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-3"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-3"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-3"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(3); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-3"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-3" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-3"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-3" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def3"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-3"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-3"); - + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def3"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-3"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-3"); }); it("A new Test Result with no systemNumber throws an error", async () => { - const event = { - Records: [ - { - messageId: "faf41ab1-5b42-462c-b242-c4450e15c724", - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJsonWithNoSystemNumber - } - }) - } - ] - }; - - const consoleSpy = jest.spyOn(global.console, "error").mockImplementation(); - const returnValue = await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const expectedValue = { - batchItemFailures: [{ itemIdentifier: "faf41ab1-5b42-462c-b242-c4450e15c724" }], - }; - - expect(returnValue).toEqual(expectedValue); - expect(consoleSpy).nthCalledWith( - 1, - "Couldn't convert DynamoDB entity to Aurora, will return record to SQS for retry", - ["messageId: faf41ab1-5b42-462c-b242-c4450e15c724", new Error("result is missing required field 'systemNumber'")] - ); + const event = { + Records: [ + { + messageId: "faf41ab1-5b42-462c-b242-c4450e15c724", + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJsonWithNoSystemNumber, + }, + }), + }, + ], + }; + + const consoleSpy = jest + .spyOn(global.console, "error") + .mockImplementation(); + const returnValue = await processStreamEvent( + event, + exampleContext(), + () => { + return; + } + ); + + const expectedValue = { + batchItemFailures: [ + { itemIdentifier: "faf41ab1-5b42-462c-b242-c4450e15c724" }, + ], + }; + + expect(returnValue).toEqual(expectedValue); + expect(consoleSpy).nthCalledWith( + 1, + "Couldn't convert DynamoDB entity to Aurora, will return record to SQS for retry", + [ + "messageId: faf41ab1-5b42-462c-b242-c4450e15c724", + new Error("result is missing required field 'systemNumber'"), + ] + ); }); it("A new Test Result with no TestTypes is inserted correctly", async () => { - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJsonWithoutTestTypes - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJsonWithoutTestTypes, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJsonWithoutTestTypes.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-4-D"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN4"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-4"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-4"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-4-D" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN4"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-4"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-4"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, @@ -1259,53 +1630,67 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id} ORDER BY id ASC` - ); - - expect(testResultSet.rows.length).toEqual(1); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-4-D"); - expect(testResultSet.rows[0].testCode).toBeNull(); - expect(testResultSet.rows[0].certificateNumber).toBeNull(); - expect(testResultSet.rows[0].secondaryCertificateNumber).toBeNull(); - expect(testResultSet.rows[0].testExpiryDate).toBeNull(); - expect(testResultSet.rows[0].testAnniversaryDate).toBeNull(); - expect(testResultSet.rows[0].testTypeStartTimestamp).toBeNull(); - expect(testResultSet.rows[0].testTypeEndTimestamp).toBeNull(); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toBeNull(); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toBeNull(); - expect(testResultSet.rows[0].testResult).toBeNull(); - expect(testResultSet.rows[0].reasonForAbandoning).toBeNull(); - expect(testResultSet.rows[0].additionalNotesRecorded).toBeNull(); - expect(testResultSet.rows[0].particulateTrapFitted).toBeNull(); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toBeNull(); - expect(testResultSet.rows[0].modificationTypeUsed).toBeNull(); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toBeNull(); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows.length).toEqual(1); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-4-D"); + expect(testResultSet.rows[0].testCode).toBeNull(); + expect(testResultSet.rows[0].certificateNumber).toBeNull(); + expect(testResultSet.rows[0].secondaryCertificateNumber).toBeNull(); + expect(testResultSet.rows[0].testExpiryDate).toBeNull(); + expect(testResultSet.rows[0].testAnniversaryDate).toBeNull(); + expect(testResultSet.rows[0].testTypeStartTimestamp).toBeNull(); + expect(testResultSet.rows[0].testTypeEndTimestamp).toBeNull(); + expect( + testResultSet.rows[0].lastSeatbeltInstallationCheckDate + ).toBeNull(); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toBeNull(); + expect(testResultSet.rows[0].testResult).toBeNull(); + expect(testResultSet.rows[0].reasonForAbandoning).toBeNull(); + expect(testResultSet.rows[0].additionalNotesRecorded).toBeNull(); + expect(testResultSet.rows[0].particulateTrapFitted).toBeNull(); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toBeNull(); + expect(testResultSet.rows[0].modificationTypeUsed).toBeNull(); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toBeNull(); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); + ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-4"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-4"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-4"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-4"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("999999998"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-4"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-4"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("999999998"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-4"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-4" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -1313,103 +1698,111 @@ export const testResultsConversionWithDelete = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("v"); - expect(vehicleClassResultSet.rows[0].description).toEqual("heavy goods vehicle"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("v"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "heavy goods vehicle" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-4"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-4"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-4"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-4"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-4"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-4"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-4"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-4"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-4" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-4" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(0); + ); + expect(fuelEmissionResultSet.rows.length).toEqual(0); - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(0); + ); + expect(testTypeResultSet.rows.length).toEqual(0); - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - expect(testDefectResultSet.rows.length).toEqual(0); + ); + expect(testDefectResultSet.rows.length).toEqual(0); }); it("After all tests the database has all the expected data", async () => { - const testResultResultSet = await executeSql( - `SELECT id FROM test_result + const testResultResultSet = await executeSql( + `SELECT id FROM test_result WHERE testResultId like '%-D';` - ); + ); - expect(testResultResultSet.rows.length).toEqual(4); + expect(testResultResultSet.rows.length).toEqual(4); - const customDefectResultSet = await executeSql( - `SELECT DISTINCT cd.id FROM custom_defect cd + const customDefectResultSet = await executeSql( + `SELECT DISTINCT cd.id FROM custom_defect cd INNER JOIN test_result tr ON cd.test_result_id = tr.id WHERE testResultId like '%-D';` - ); + ); - expect(customDefectResultSet.rows.length).toEqual(2); + expect(customDefectResultSet.rows.length).toEqual(2); - const testTypeResultSet = await executeSql( - `SELECT DISTINCT tt.id FROM test_type tt + const testTypeResultSet = await executeSql( + `SELECT DISTINCT tt.id FROM test_type tt JOIN test_result tr ON tt.id = tr.test_type_id WHERE testResultId like '%-D';` - ); + ); - expect(testTypeResultSet.rows.length).toEqual(2); + expect(testTypeResultSet.rows.length).toEqual(2); - const testDefectResultSet = await executeSql( - `SELECT DISTINCT td.id FROM test_defect td + const testDefectResultSet = await executeSql( + `SELECT DISTINCT td.id FROM test_defect td INNER JOIN test_result tr ON td.test_result_id = tr.id WHERE testResultId like '%-D';` - ); + ); - expect(testDefectResultSet.rows.length).toEqual(2); + expect(testDefectResultSet.rows.length).toEqual(2); - const defectResultSet = await executeSql( - `SELECT DISTINCT d.id FROM defect d + const defectResultSet = await executeSql( + `SELECT DISTINCT d.id FROM defect d JOIN test_defect td ON d.id = td.defect_id JOIN test_result tr ON td.test_result_id = tr.id WHERE testResultId like '%-D';` - ); + ); - expect(defectResultSet.rows.length).toEqual(2); + expect(defectResultSet.rows.length).toEqual(2); }); -}); + }); diff --git a/tests/integration/test-results-conversion-with-upsert.intTest.ts b/tests/integration/test-results-conversion-with-upsert.intTest.ts index 98e39c2..c832caf 100644 --- a/tests/integration/test-results-conversion-with-upsert.intTest.ts +++ b/tests/integration/test-results-conversion-with-upsert.intTest.ts @@ -1,148 +1,206 @@ -import {StartedTestContainer} from "testcontainers"; -import {destroyConnectionPool, executeSql} from "../../src/services/connection-pool"; -import {exampleContext, useLocalDb} from "../utils"; -import {getContainerizedDatabase} from "./cvsbnop-container"; -import {processStreamEvent} from "../../src/functions/process-stream-event"; -import {getConnectionPoolOptions} from "../../src/services/connection-pool-options"; -import {marshall, unmarshall} from "@aws-sdk/util-dynamodb"; +import { StartedTestContainer } from "testcontainers"; +import { + destroyConnectionPool, + executeSql, +} from "../../src/services/connection-pool"; +import { exampleContext, useLocalDb } from "../utils"; +import { getContainerizedDatabase } from "./cvsbnop-container"; +import { processStreamEvent } from "../../src/functions/process-stream-event"; +import { getConnectionPoolOptions } from "../../src/services/connection-pool-options"; +import { marshall, unmarshall } from "@aws-sdk/util-dynamodb"; useLocalDb(); -export const testResultsConversionWithUpsert = () => describe("convertTestResults() integration tests with upsert", () => { +export const testResultsConversionWithUpsert = () => + describe("convertTestResults() integration tests with upsert", () => { let container: StartedTestContainer; - const testResultsJson = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results.json"))); - const testResultsJsonWithTestTypes = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results-with-testtypes.json"))); - const testResultsJsonWithNoSystemNumber = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results-with-no-systemNumber.json"))); - const testResultsJsonWithoutTestTypes = JSON.parse(JSON.stringify(require("../resources/dynamodb-image-test-results-without-testtypes.json"))); + const testResultsJson = JSON.parse( + JSON.stringify(require("../resources/dynamodb-image-test-results.json")) + ); + const testResultsJsonWithTestTypes = JSON.parse( + JSON.stringify( + require("../resources/dynamodb-image-test-results-with-testtypes.json") + ) + ); + const testResultsJsonWithNoSystemNumber = JSON.parse( + JSON.stringify( + require("../resources/dynamodb-image-test-results-with-no-systemNumber.json") + ) + ); + const testResultsJsonWithoutTestTypes = JSON.parse( + JSON.stringify( + require("../resources/dynamodb-image-test-results-without-testtypes.json") + ) + ); testResultsJson.testResultId.S = testResultsJson.testResultId.S + "-U"; testResultsJson.systemNumber.S = testResultsJson.systemNumber.S + "-U"; - testResultsJsonWithTestTypes.testResultId.S = testResultsJsonWithTestTypes.testResultId.S + "-U"; - testResultsJsonWithTestTypes.systemNumber.S = testResultsJsonWithTestTypes.systemNumber.S + "-U"; - testResultsJsonWithNoSystemNumber.testResultId.S = testResultsJsonWithNoSystemNumber.testResultId.S + "-U"; - testResultsJsonWithoutTestTypes.testResultId.S = testResultsJsonWithoutTestTypes.testResultId.S + "-U"; - testResultsJsonWithoutTestTypes.systemNumber.S = testResultsJsonWithoutTestTypes.systemNumber.S + "-U"; + testResultsJsonWithTestTypes.testResultId.S = + testResultsJsonWithTestTypes.testResultId.S + "-U"; + testResultsJsonWithTestTypes.systemNumber.S = + testResultsJsonWithTestTypes.systemNumber.S + "-U"; + testResultsJsonWithNoSystemNumber.testResultId.S = + testResultsJsonWithNoSystemNumber.testResultId.S + "-U"; + testResultsJsonWithoutTestTypes.testResultId.S = + testResultsJsonWithoutTestTypes.testResultId.S + "-U"; + testResultsJsonWithoutTestTypes.systemNumber.S = + testResultsJsonWithoutTestTypes.systemNumber.S + "-U"; beforeAll(async () => { - process.env.DISABLE_DELETE_ON_UPDATE = "true"; - jest.setTimeout(60_000); - jest.restoreAllMocks(); - - // see README for why this environment variable exists - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - container = await getContainerizedDatabase(); - } else { - (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ - host: "localhost", - port: "3306", - user: "root", - password: "12345", - database: "CVSBNOP" - }); - } + process.env.DISABLE_DELETE_ON_UPDATE = "true"; + jest.setTimeout(60_000); + jest.restoreAllMocks(); + + // see README for why this environment variable exists + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + container = await getContainerizedDatabase(); + } else { + (getConnectionPoolOptions as jest.Mock) = jest.fn().mockResolvedValue({ + host: "localhost", + port: "3306", + user: "root", + password: "12345", + database: "CVSBNOP", + }); + } }); afterAll(async () => { - await destroyConnectionPool(); - if (process.env.USE_CONTAINERIZED_DATABASE === "1") { - await container.stop(); - } + await destroyConnectionPool(); + if (process.env.USE_CONTAINERIZED_DATABASE === "1") { + await container.stop(); + } }); it("should correctly convert a DynamoDB event into Aurora rows", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJson - } - }) - } - ] - }; - - // array of arrays: event contains array of records, each with array of test result entities - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJson, + }, + }), + }, + ], + }; + + // array of arrays: event contains array of records, each with array of test result entities + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-U"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-U" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("333"); - expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("2ND-CERTIFICATE-NO"); - expect((testResultSet.rows[0].testExpiryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testAnniversaryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2020-01-01T00:00:00.023Z"); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); - expect(testResultSet.rows[0].testResult).toEqual("fail"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("PARTICULATE-TRAP-FITTED"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("PARTICULATE-TRAP-SERIAL-NUMBER"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("SMOKE-TEST-K-LIMIT-APPLIED"); - - expect(testResultSet.rows.length).toEqual(1); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("333"); + expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "2ND-CERTIFICATE-NO" + ); + expect( + (testResultSet.rows[0].testExpiryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testAnniversaryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.023Z"); + expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); + expect(testResultSet.rows[0].testResult).toEqual("fail"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual( + "PARTICULATE-TRAP-FITTED" + ); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual( + "PARTICULATE-TRAP-SERIAL-NUMBER" + ); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "SMOKE-TEST-K-LIMIT-APPLIED" + ); + + expect(testResultSet.rows.length).toEqual(1); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -150,78 +208,92 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(1); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(1); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -233,130 +305,179 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("should correctly convert a DynamoDB event into Aurora rows when processed a second time", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJson - } - }) - } - ] - }; - - const consoleSpy = jest.spyOn(global.console, "error").mockImplementation(); - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - expect(consoleSpy).toBeCalledTimes(0); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJson, + }, + }), + }, + ], + }; + + const consoleSpy = jest + .spyOn(global.console, "error") + .mockImplementation(); + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + expect(consoleSpy).toBeCalledTimes(0); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-U"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-U" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("333"); - expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("2ND-CERTIFICATE-NO"); - expect((testResultSet.rows[0].testExpiryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testAnniversaryDate as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2020-01-01T00:00:00.023Z"); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); - expect(testResultSet.rows[0].testResult).toEqual("fail"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("PARTICULATE-TRAP-FITTED"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("PARTICULATE-TRAP-SERIAL-NUMBER"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("SMOKE-TEST-K-LIMIT-APPLIED"); - - expect(testResultSet.rows.length).toEqual(1); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("333"); + expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "2ND-CERTIFICATE-NO" + ); + expect( + (testResultSet.rows[0].testExpiryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testAnniversaryDate as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.023Z"); + expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); + expect(testResultSet.rows[0].testResult).toEqual("fail"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual( + "PARTICULATE-TRAP-FITTED" + ); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual( + "PARTICULATE-TRAP-SERIAL-NUMBER" + ); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "SMOKE-TEST-K-LIMIT-APPLIED" + ); + + expect(testResultSet.rows.length).toEqual(1); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -364,78 +485,92 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(1); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(1); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -447,146 +582,198 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("should correctly update when non-unique attributes changed", async () => { - const deserializedJson = unmarshall(testResultsJson); - deserializedJson.testTypes[0].testCode = "444"; - deserializedJson.testTypes[0].certificateNumber = "W323232"; - deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; - deserializedJson.testTypes[0].testExpiryDate = "2022-01-01T00:00:00.000Z"; - deserializedJson.testTypes[0].testAnniversaryDate = "2022-01-01T00:00:00.000Z"; - deserializedJson.testTypes[0].testTypeStartTimestamp = "2021-01-01T00:00:00.000Z"; - deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; - deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = "2021-01-01"; - deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; - deserializedJson.testTypes[0].testResult = "pass"; - deserializedJson.testTypes[0].reasonForAbandoning = "NEW-REASON-FOR-ABANDONING"; - deserializedJson.testTypes[0].additionalNotesRecorded = "NEW-ADDITIONAL-NOTES-RECORDED"; - deserializedJson.testTypes[0].additionalCommentsForAbandon = "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; - deserializedJson.testTypes[0].particulateTrapFitted = "t"; - deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; - deserializedJson.testTypes[0].modificationTypeUsed = "NEW-MODIFICATION-TYPE-USED"; - deserializedJson.testTypes[0].smokeTestKLimitApplied = "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; - - const serializedJSONb = marshall(deserializedJson); - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: serializedJSONb - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const deserializedJson = unmarshall(testResultsJson); + deserializedJson.testTypes[0].testCode = "444"; + deserializedJson.testTypes[0].certificateNumber = "W323232"; + deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; + deserializedJson.testTypes[0].testExpiryDate = "2022-01-01T00:00:00.000Z"; + deserializedJson.testTypes[0].testAnniversaryDate = + "2022-01-01T00:00:00.000Z"; + deserializedJson.testTypes[0].testTypeStartTimestamp = + "2021-01-01T00:00:00.000Z"; + deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; + deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = + "2021-01-01"; + deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; + deserializedJson.testTypes[0].testResult = "pass"; + deserializedJson.testTypes[0].reasonForAbandoning = + "NEW-REASON-FOR-ABANDONING"; + deserializedJson.testTypes[0].additionalNotesRecorded = + "NEW-ADDITIONAL-NOTES-RECORDED"; + deserializedJson.testTypes[0].additionalCommentsForAbandon = + "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; + deserializedJson.testTypes[0].particulateTrapFitted = "t"; + deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; + deserializedJson.testTypes[0].modificationTypeUsed = + "NEW-MODIFICATION-TYPE-USED"; + deserializedJson.testTypes[0].smokeTestKLimitApplied = + "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; + + const serializedJSONb = marshall(deserializedJson); + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: serializedJSONb, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-U"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-U" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); - expect(testResultSet.rows.length).toEqual(1); - expect(testResultSet.rows[0].testCode).toEqual("444"); - expect(testResultSet.rows[0].certificateNumber).toEqual("W323232"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("111111"); - expect(testResultSet.rows[0].testExpiryDate).toEqual(new Date("2022-01-01")); - expect(testResultSet.rows[0].testAnniversaryDate).toEqual(new Date("2022-01-01")); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2021-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].lastSeatbeltInstallationCheckDate as Date).toISOString()).toEqual("2021-01-01T00:00:00.000Z"); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); - expect(testResultSet.rows[0].testResult).toEqual("pass"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("NEW-REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("NEW-ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("NEW-MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("NEW-SMOKE-TEST-K-LIMIT-APPLIED"); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); + expect(testResultSet.rows.length).toEqual(1); + expect(testResultSet.rows[0].testCode).toEqual("444"); + expect(testResultSet.rows[0].certificateNumber).toEqual("W323232"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "111111" + ); + expect(testResultSet.rows[0].testExpiryDate).toEqual( + new Date("2022-01-01") + ); + expect(testResultSet.rows[0].testAnniversaryDate).toEqual( + new Date("2022-01-01") + ); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2021-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0] + .lastSeatbeltInstallationCheckDate as Date).toISOString() + ).toEqual("2021-01-01T00:00:00.000Z"); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); + expect(testResultSet.rows[0].testResult).toEqual("pass"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "NEW-REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "NEW-ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "NEW-MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "NEW-SMOKE-TEST-K-LIMIT-APPLIED" + ); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -594,78 +781,92 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(1); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(1); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -677,149 +878,201 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); - + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("should correctly insert when unique attributes changed", async () => { - const deserializedJson = unmarshall(testResultsJson); - deserializedJson.testTypes[0].testNumber = "NewTestNumber"; - deserializedJson.testTypes[0].testCode = "555"; - deserializedJson.testTypes[0].certificateNumber = "W43434343"; - deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; - deserializedJson.testTypes[0].testExpiryDate = "2022-01-02T00:00:00.000Z"; - deserializedJson.testTypes[0].testAnniversaryDate = "2022-01-02T00:00:00.000Z"; - deserializedJson.testTypes[0].testTypeStartTimestamp = "2021-01-02T00:00:00.000Z"; - deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; - deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = "2021-01-02"; - deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; - deserializedJson.testTypes[0].testResult = "pass"; - deserializedJson.testTypes[0].reasonForAbandoning = "NEW-REASON-FOR-ABANDONING"; - deserializedJson.testTypes[0].additionalNotesRecorded = "NEW-ADDITIONAL-NOTES-RECORDED"; - deserializedJson.testTypes[0].additionalCommentsForAbandon = "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; - deserializedJson.testTypes[0].particulateTrapFitted = "t"; - deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; - deserializedJson.testTypes[0].modificationTypeUsed = "NEW-MODIFICATION-TYPE-USED"; - deserializedJson.testTypes[0].smokeTestKLimitApplied = "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; - deserializedJson.testTypes[0].defects[0].imDescription = "IM-DESCRIPTION-5a"; - - const serializedJSONb = marshall(deserializedJson); - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: serializedJSONb - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const deserializedJson = unmarshall(testResultsJson); + deserializedJson.testTypes[0].testNumber = "NewTestNumber"; + deserializedJson.testTypes[0].testCode = "555"; + deserializedJson.testTypes[0].certificateNumber = "W43434343"; + deserializedJson.testTypes[0].secondaryCertificateNumber = "111111"; + deserializedJson.testTypes[0].testExpiryDate = "2022-01-02T00:00:00.000Z"; + deserializedJson.testTypes[0].testAnniversaryDate = + "2022-01-02T00:00:00.000Z"; + deserializedJson.testTypes[0].testTypeStartTimestamp = + "2021-01-02T00:00:00.000Z"; + deserializedJson.testTypes[0].numberOfSeatbeltsFitted = 5; + deserializedJson.testTypes[0].lastSeatbeltInstallationCheckDate = + "2021-01-02"; + deserializedJson.testTypes[0].seatbeltInstallationCheckDate = false; + deserializedJson.testTypes[0].testResult = "pass"; + deserializedJson.testTypes[0].reasonForAbandoning = + "NEW-REASON-FOR-ABANDONING"; + deserializedJson.testTypes[0].additionalNotesRecorded = + "NEW-ADDITIONAL-NOTES-RECORDED"; + deserializedJson.testTypes[0].additionalCommentsForAbandon = + "NEW-ADDITIONAL-COMMENTS-FOR-ABANDON"; + deserializedJson.testTypes[0].particulateTrapFitted = "t"; + deserializedJson.testTypes[0].particulateTrapSerialNumber = "trap"; + deserializedJson.testTypes[0].modificationTypeUsed = + "NEW-MODIFICATION-TYPE-USED"; + deserializedJson.testTypes[0].smokeTestKLimitApplied = + "NEW-SMOKE-TEST-K-LIMIT-APPLIED"; + deserializedJson.testTypes[0].defects[0].imDescription = + "IM-DESCRIPTION-5a"; + + const serializedJSONb = marshall(deserializedJson); + + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: serializedJSONb, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJson.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-5-U"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-5-U" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN5"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-5"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-5"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, \`particulateTrapFitted\`, \`particulateTrapSerialNumber\`, \`modificationTypeUsed\`, \`smokeTestKLimitApplied\` FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id}` - ); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); - expect(testResultSet.rows.length).toEqual(2); - expect(testResultSet.rows[0].testCode).toEqual("555"); - expect(testResultSet.rows[0].certificateNumber).toEqual("W43434343"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("111111"); - expect(testResultSet.rows[0].testExpiryDate).toEqual(new Date("2022-01-02")); - expect(testResultSet.rows[0].testAnniversaryDate).toEqual(new Date("2022-01-02")); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2021-01-02T00:00:00.000Z"); - expect((testResultSet.rows[0].lastSeatbeltInstallationCheckDate as Date).toISOString()).toEqual("2021-01-02T00:00:00.000Z"); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); - expect(testResultSet.rows[0].testResult).toEqual("pass"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("NEW-REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("NEW-ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("NEW-MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("NEW-SMOKE-TEST-K-LIMIT-APPLIED"); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-5-U"); + expect(testResultSet.rows.length).toEqual(2); + expect(testResultSet.rows[0].testCode).toEqual("555"); + expect(testResultSet.rows[0].certificateNumber).toEqual("W43434343"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "111111" + ); + expect(testResultSet.rows[0].testExpiryDate).toEqual( + new Date("2022-01-02") + ); + expect(testResultSet.rows[0].testAnniversaryDate).toEqual( + new Date("2022-01-02") + ); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2021-01-02T00:00:00.000Z"); + expect( + (testResultSet.rows[0] + .lastSeatbeltInstallationCheckDate as Date).toISOString() + ).toEqual("2021-01-02T00:00:00.000Z"); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(0); + expect(testResultSet.rows[0].testResult).toEqual("pass"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "NEW-REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "NEW-ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual("t"); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("trap"); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "NEW-MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "NEW-SMOKE-TEST-K-LIMIT-APPLIED" + ); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); - - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + ); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-5"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-5"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); + + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-5"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("TESTER-STAFF-ID-5"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-5"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-5" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -827,78 +1080,92 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("2"); - expect(vehicleClassResultSet.rows[0].description).toEqual("motorbikes over 200cc or with a sidecar"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("2"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "motorbikes over 200cc or with a sidecar" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("psv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("PREPARER-ID-5"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-5"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-5"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-5"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-5"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-5"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-5" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-5" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - expect(testDefectResultSet.rows.length).toEqual(1); - expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[0].defect_id).toEqual(2); - expect(testDefectResultSet.rows[0].location_id).toEqual(1); - expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[0].prs).toEqual(1); - expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + expect(testDefectResultSet.rows.length).toEqual(1); + expect(testDefectResultSet.rows[0].test_result_id).toEqual(id); + expect(testDefectResultSet.rows[0].defect_id).toEqual(2); + expect(testDefectResultSet.rows[0].location_id).toEqual(1); + expect(testDefectResultSet.rows[0].notes).toEqual("NOTES"); + expect(testDefectResultSet.rows[0].prs).toEqual(1); + expect(testDefectResultSet.rows[0].prohibitionIssued).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -910,76 +1177,90 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[0].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(5); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-5a"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-5"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-5"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(5); + expect(defectResultSet.rows[0].imDescription).toEqual( + "IM-DESCRIPTION-5a" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-5" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-5"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-5" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-5"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-5"); - + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-5"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-5"); }); it("A new Test Result with two TestTypes is inserted correctly", async () => { - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJsonWithTestTypes - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJsonWithTestTypes, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJsonWithTestTypes.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-3-U"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN3"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-3"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-3"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-3-U" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN3"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-3"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-3"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, @@ -987,71 +1268,119 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id} ORDER BY id ASC` - ); - - expect(testResultSet.rows.length).toEqual(2); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-3-U"); - expect(testResultSet.rows[0].testCode).toEqual("333"); - expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); - expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual("2ND-CERTIFICATE-NO"); - expect(testResultSet.rows[0].testExpiryDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].testAnniversaryDate).toEqual(new Date("2020-01-01")); - expect((testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString()).toEqual("2020-01-01T00:00:00.000Z"); - expect((testResultSet.rows[0].testTypeEndTimestamp as Date).toISOString()).toEqual("2020-01-01T16:54:44.123Z"); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual(new Date("2020-01-01")); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); - expect(testResultSet.rows[0].testResult).toEqual("fail"); - expect(testResultSet.rows[0].reasonForAbandoning).toEqual("REASON-FOR-ABANDONING"); - expect(testResultSet.rows[0].additionalNotesRecorded).toEqual("ADDITIONAL-NOTES-RECORDED"); - expect(testResultSet.rows[0].particulateTrapFitted).toEqual("PARTICULATE-TRAP-FITTED"); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual("PARTICULATE-TRAP-SERIAL-NUMBER"); - expect(testResultSet.rows[0].modificationTypeUsed).toEqual("MODIFICATION-TYPE-USED"); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual("SMOKE-TEST-K-LIMIT-APPLIED"); - - expect(testResultSet.rows[1].testResultId).toEqual("TEST-RESULT-ID-3-U"); - expect(testResultSet.rows[1].testCode).toEqual("aav"); - expect(testResultSet.rows[1].certificateNumber).toEqual("W123123"); - expect(testResultSet.rows[1].secondaryCertificateNumber).toBeNull(); - expect(testResultSet.rows[1].testExpiryDate).toEqual(new Date(2022, 5, 30)); - expect(testResultSet.rows[1].testAnniversaryDate).toEqual(new Date(2022, 5, 30)); - expect((testResultSet.rows[1].testTypeStartTimestamp as Date).toISOString()).toEqual("2021-06-21T12:07:22.000Z"); - expect((testResultSet.rows[1].testTypeEndTimestamp as Date).toISOString()).toEqual("2021-06-21T12:59:07.000Z"); - expect(testResultSet.rows[1].lastSeatbeltInstallationCheckDate).toBeNull(); - expect(testResultSet.rows[1].seatbeltInstallationCheckDate).toEqual(0); - expect(testResultSet.rows[1].testResult).toEqual("pass"); - expect(testResultSet.rows[1].reasonForAbandoning).toBeNull(); - expect(testResultSet.rows[1].additionalNotesRecorded).toEqual("No emission plate default 0.70"); - expect(testResultSet.rows[1].particulateTrapFitted).toBeNull(); - expect(testResultSet.rows[1].particulateTrapSerialNumber).toBeNull(); - expect(testResultSet.rows[1].modificationTypeUsed).toBeNull(); - expect(testResultSet.rows[1].smokeTestKLimitApplied).toBeNull(); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows.length).toEqual(2); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-3-U"); + expect(testResultSet.rows[0].testCode).toEqual("333"); + expect(testResultSet.rows[0].certificateNumber).toEqual("CERTIFICATE-NO"); + expect(testResultSet.rows[0].secondaryCertificateNumber).toEqual( + "2ND-CERTIFICATE-NO" + ); + expect(testResultSet.rows[0].testExpiryDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].testAnniversaryDate).toEqual( + new Date("2020-01-01") + ); + expect( + (testResultSet.rows[0].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2020-01-01T00:00:00.000Z"); + expect( + (testResultSet.rows[0].testTypeEndTimestamp as Date).toISOString() + ).toEqual("2020-01-01T16:54:44.123Z"); + expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toEqual( + new Date("2020-01-01") + ); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toEqual(1); + expect(testResultSet.rows[0].testResult).toEqual("fail"); + expect(testResultSet.rows[0].reasonForAbandoning).toEqual( + "REASON-FOR-ABANDONING" + ); + expect(testResultSet.rows[0].additionalNotesRecorded).toEqual( + "ADDITIONAL-NOTES-RECORDED" + ); + expect(testResultSet.rows[0].particulateTrapFitted).toEqual( + "PARTICULATE-TRAP-FITTED" + ); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toEqual( + "PARTICULATE-TRAP-SERIAL-NUMBER" + ); + expect(testResultSet.rows[0].modificationTypeUsed).toEqual( + "MODIFICATION-TYPE-USED" + ); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toEqual( + "SMOKE-TEST-K-LIMIT-APPLIED" + ); + + expect(testResultSet.rows[1].testResultId).toEqual("TEST-RESULT-ID-3-U"); + expect(testResultSet.rows[1].testCode).toEqual("aav"); + expect(testResultSet.rows[1].certificateNumber).toEqual("W123123"); + expect(testResultSet.rows[1].secondaryCertificateNumber).toBeNull(); + expect(testResultSet.rows[1].testExpiryDate).toEqual( + new Date(2022, 5, 30) + ); + expect(testResultSet.rows[1].testAnniversaryDate).toEqual( + new Date(2022, 5, 30) + ); + expect( + (testResultSet.rows[1].testTypeStartTimestamp as Date).toISOString() + ).toEqual("2021-06-21T12:07:22.000Z"); + expect( + (testResultSet.rows[1].testTypeEndTimestamp as Date).toISOString() + ).toEqual("2021-06-21T12:59:07.000Z"); + expect( + testResultSet.rows[1].lastSeatbeltInstallationCheckDate + ).toBeNull(); + expect(testResultSet.rows[1].seatbeltInstallationCheckDate).toEqual(0); + expect(testResultSet.rows[1].testResult).toEqual("pass"); + expect(testResultSet.rows[1].reasonForAbandoning).toBeNull(); + expect(testResultSet.rows[1].additionalNotesRecorded).toEqual( + "No emission plate default 0.70" + ); + expect(testResultSet.rows[1].particulateTrapFitted).toBeNull(); + expect(testResultSet.rows[1].particulateTrapSerialNumber).toBeNull(); + expect(testResultSet.rows[1].modificationTypeUsed).toBeNull(); + expect(testResultSet.rows[1].smokeTestKLimitApplied).toBeNull(); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); + ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-3"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-3"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-3"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-3"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("999999998"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-3"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-3"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("999999998"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-3"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-3" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -1059,80 +1388,103 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("v"); - expect(vehicleClassResultSet.rows[0].description).toEqual("heavy goods vehicle"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("v"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "heavy goods vehicle" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-3"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-3"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-3"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-3"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-3"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-3"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-3"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-3"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-3" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-3" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(1); - expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); - expect(fuelEmissionResultSet.rows[0].description).toEqual("particulate trap"); - expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual("0.10 g/kWh Euro 3 PM"); - expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); - - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + ); + expect(fuelEmissionResultSet.rows.length).toEqual(1); + expect(fuelEmissionResultSet.rows[0].modTypeCode).toEqual("p"); + expect(fuelEmissionResultSet.rows[0].description).toEqual( + "particulate trap" + ); + expect(fuelEmissionResultSet.rows[0].emissionStandard).toEqual( + "0.10 g/kWh Euro 3 PM" + ); + expect(fuelEmissionResultSet.rows[0].fuelType).toEqual("diesel"); + + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(1); - expect(testTypeResultSet.rows[0].testTypeClassification).toEqual("2323232323232323232323"); - expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); - - - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + ); + expect(testTypeResultSet.rows.length).toEqual(1); + expect(testTypeResultSet.rows[0].testTypeClassification).toEqual( + "2323232323232323232323" + ); + expect(testTypeResultSet.rows[0].testTypeName).toEqual("TEST-TYPE-NAME"); + + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - - const testDefectLastIndex = testDefectResultSet.rows.length - 1; - - expect(testDefectResultSet.rows[testDefectLastIndex].test_result_id).toEqual(id); - expect(testDefectResultSet.rows[testDefectLastIndex].defect_id).toEqual(3); - expect(testDefectResultSet.rows[testDefectLastIndex].location_id).toEqual(1); - expect(testDefectResultSet.rows[testDefectLastIndex].notes).toEqual("NOTES"); - expect(testDefectResultSet.rows[testDefectLastIndex].prs).toEqual(1); - expect(testDefectResultSet.rows[testDefectLastIndex].prohibitionIssued).toEqual(1); - - const defectResultSet = await executeSql( - `SELECT \`imNumber\`, + ); + + const testDefectLastIndex = testDefectResultSet.rows.length - 1; + + expect( + testDefectResultSet.rows[testDefectLastIndex].test_result_id + ).toEqual(id); + expect(testDefectResultSet.rows[testDefectLastIndex].defect_id).toEqual( + 3 + ); + expect(testDefectResultSet.rows[testDefectLastIndex].location_id).toEqual( + 1 + ); + expect(testDefectResultSet.rows[testDefectLastIndex].notes).toEqual( + "NOTES" + ); + expect(testDefectResultSet.rows[testDefectLastIndex].prs).toEqual(1); + expect( + testDefectResultSet.rows[testDefectLastIndex].prohibitionIssued + ).toEqual(1); + + const defectResultSet = await executeSql( + `SELECT \`imNumber\`, \`imDescription\`, \`itemNumber\`, \`itemDescription\`, @@ -1144,114 +1496,133 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`stdForProhibition\` FROM \`defect\` WHERE \`defect\`.\`id\` = ${testDefectResultSet.rows[testDefectLastIndex].defect_id}` - ); - expect(defectResultSet.rows.length).toEqual(1); - expect(defectResultSet.rows[0].imNumber).toEqual(3); - expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-3"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - expect(defectResultSet.rows[0].itemDescription).toEqual("ITEM-DESCRIPTION-3"); - expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-3"); - expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); - expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); - expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); - expect(defectResultSet.rows[0].deficiencyText).toEqual("DEFICIENCY-TEXT-3"); - expect(defectResultSet.rows[0].itemNumber).toEqual(1); - - const customDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` + ); + expect(defectResultSet.rows.length).toEqual(1); + expect(defectResultSet.rows[0].imNumber).toEqual(3); + expect(defectResultSet.rows[0].imDescription).toEqual("IM-DESCRIPTION-3"); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + expect(defectResultSet.rows[0].itemDescription).toEqual( + "ITEM-DESCRIPTION-3" + ); + expect(defectResultSet.rows[0].deficiencyRef).toEqual("DEFICIENCY-REF-3"); + expect(defectResultSet.rows[0].deficiencyId).toEqual("a"); + expect(defectResultSet.rows[0].deficiencySubId).toEqual("mdclxvi"); + expect(defectResultSet.rows[0].deficiencyCategory).toEqual("advisory"); + expect(defectResultSet.rows[0].deficiencyText).toEqual( + "DEFICIENCY-TEXT-3" + ); + expect(defectResultSet.rows[0].itemNumber).toEqual(1); + + const customDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`referenceNumber\`, \`defectName\`, \`defectNotes\` FROM \`custom_defect\` WHERE \`custom_defect\`.\`test_result_id\` = ${id}` - ); - - const customDefectLastIndex = customDefectResultSet.rows.length - 1; - - expect(customDefectResultSet.rows[customDefectLastIndex].test_result_id).toEqual(id); - expect(customDefectResultSet.rows[customDefectLastIndex].referenceNumber).toEqual("def3"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectName).toEqual("DEFECT-NAME-3"); - expect(customDefectResultSet.rows[customDefectLastIndex].defectNotes).toEqual("DEFECT-NOTES-3"); - + ); + + const customDefectLastIndex = customDefectResultSet.rows.length - 1; + + expect( + customDefectResultSet.rows[customDefectLastIndex].test_result_id + ).toEqual(id); + expect( + customDefectResultSet.rows[customDefectLastIndex].referenceNumber + ).toEqual("def3"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectName + ).toEqual("DEFECT-NAME-3"); + expect( + customDefectResultSet.rows[customDefectLastIndex].defectNotes + ).toEqual("DEFECT-NOTES-3"); }); it("A new Test Result with no systemNumber throws an error", async () => { - const event = { - Records: [ - { - messageId: "faf41ab1-5b42-462c-b242-c4450e15c724", - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJsonWithNoSystemNumber - } - }) - } - ] - }; - - const consoleSpy = jest.spyOn(global.console, "error").mockImplementation(); - const returnValue = await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const expectedValue = { - batchItemFailures: [{ itemIdentifier: "faf41ab1-5b42-462c-b242-c4450e15c724" }], - }; - - expect(returnValue).toEqual(expectedValue); - expect(consoleSpy).nthCalledWith( - 1, - "Couldn't convert DynamoDB entity to Aurora, will return record to SQS for retry", - ["messageId: faf41ab1-5b42-462c-b242-c4450e15c724", new Error("result is missing required field 'systemNumber'")] - ); + const event = { + Records: [ + { + messageId: "faf41ab1-5b42-462c-b242-c4450e15c724", + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJsonWithNoSystemNumber, + }, + }), + }, + ], + }; + + const consoleSpy = jest + .spyOn(global.console, "error") + .mockImplementation(); + const returnValue = await processStreamEvent( + event, + exampleContext(), + () => { + return; + } + ); + + const expectedValue = { + batchItemFailures: [ + { itemIdentifier: "faf41ab1-5b42-462c-b242-c4450e15c724" }, + ], + }; + + expect(returnValue).toEqual(expectedValue); + expect(consoleSpy).nthCalledWith( + 1, + "Couldn't convert DynamoDB entity to Aurora, will return record to SQS for retry", + [ + "messageId: faf41ab1-5b42-462c-b242-c4450e15c724", + new Error("result is missing required field 'systemNumber'"), + ] + ); }); it("A new Test Result with no TestTypes is inserted correctly", async () => { - - const event = { - Records: [ - { - body: JSON.stringify({ - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", - eventName: "INSERT", - dynamodb: { - NewImage: testResultsJsonWithoutTestTypes - } - }) - } - ] - }; - - await processStreamEvent( - event, - exampleContext(), - () => { - return; - } - ); - - const vehicleResultSet = await executeSql( - `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` + const event = { + Records: [ + { + body: JSON.stringify({ + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/test-results/stream/2020-01-01T00:00:00.000", + eventName: "INSERT", + dynamodb: { + NewImage: testResultsJsonWithoutTestTypes, + }, + }), + }, + ], + }; + + await processStreamEvent(event, exampleContext(), () => { + return; + }); + + const vehicleResultSet = await executeSql( + `SELECT \`system_number\`, \`vin\`, \`vrm_trm\`, \`trailer_id\`, \`createdAt\`, \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`id\` IN ( SELECT \`id\` FROM \`vehicle\` WHERE \`vehicle\`.\`system_number\` = "${testResultsJsonWithoutTestTypes.systemNumber.S}" )` - ); - - expect(vehicleResultSet.rows.length).toEqual(1); - expect(vehicleResultSet.rows[0].system_number).toEqual("SYSTEM-NUMBER-4-U"); - expect(vehicleResultSet.rows[0].vin).toEqual("VIN4"); - expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-4"); - expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-4"); - expect((vehicleResultSet.rows[0].createdAt as Date).toUTCString()).not.toBeNull(); - - const testResultSet = await executeSql( - `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, + ); + + expect(vehicleResultSet.rows.length).toEqual(1); + expect(vehicleResultSet.rows[0].system_number).toEqual( + "SYSTEM-NUMBER-4-U" + ); + expect(vehicleResultSet.rows[0].vin).toEqual("VIN4"); + expect(vehicleResultSet.rows[0].vrm_trm).toEqual("VRM-4"); + expect(vehicleResultSet.rows[0].trailer_id).toEqual("TRL-4"); + expect( + (vehicleResultSet.rows[0].createdAt as Date).toUTCString() + ).not.toBeNull(); + + const testResultSet = await executeSql( + `SELECT \`test_station_id\`, \`tester_id\`, \`vehicle_class_id\`, \`preparer_id\`, \`createdBy_Id\`, \`lastUpdatedBy_Id\`, \`fuel_emission_id\`, \`test_type_id\`, \`id\`, \`testResultId\`, \`testCode\`, \`certificateNumber\`, \`secondaryCertificateNumber\`, \`testExpiryDate\`, \`testAnniversaryDate\`, \`testTypeStartTimestamp\`, \`numberOfSeatbeltsFitted\`, \`lastSeatbeltInstallationCheckDate\`, \`seatbeltInstallationCheckDate\`, \`testResult\`, \`reasonForAbandoning\`, \`additionalNotesRecorded\`, \`additionalCommentsForAbandon\`, @@ -1259,53 +1630,67 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult FROM \`test_result\` WHERE \`test_result\`.\`vehicle_id\` = ${vehicleResultSet.rows[0].id} ORDER BY id ASC` - ); - - expect(testResultSet.rows.length).toEqual(1); - - expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-4-U"); - expect(testResultSet.rows[0].testCode).toBeNull(); - expect(testResultSet.rows[0].certificateNumber).toBeNull(); - expect(testResultSet.rows[0].secondaryCertificateNumber).toBeNull(); - expect(testResultSet.rows[0].testExpiryDate).toBeNull(); - expect(testResultSet.rows[0].testAnniversaryDate).toBeNull(); - expect(testResultSet.rows[0].testTypeStartTimestamp).toBeNull(); - expect(testResultSet.rows[0].testTypeEndTimestamp).toBeNull(); - expect(testResultSet.rows[0].lastSeatbeltInstallationCheckDate).toBeNull(); - expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toBeNull(); - expect(testResultSet.rows[0].testResult).toBeNull(); - expect(testResultSet.rows[0].reasonForAbandoning).toBeNull(); - expect(testResultSet.rows[0].additionalNotesRecorded).toBeNull(); - expect(testResultSet.rows[0].particulateTrapFitted).toBeNull(); - expect(testResultSet.rows[0].particulateTrapSerialNumber).toBeNull(); - expect(testResultSet.rows[0].modificationTypeUsed).toBeNull(); - expect(testResultSet.rows[0].smokeTestKLimitApplied).toBeNull(); - - const { test_station_id, tester_id, vehicle_class_id, preparer_id, createdBy_Id, lastUpdatedBy_Id, fuel_emission_id, test_type_id, id } = testResultSet.rows[0]; - - const testStationResultSet = await executeSql( - `SELECT \`pNumber\`, \`name\`, \`type\` + ); + + expect(testResultSet.rows.length).toEqual(1); + + expect(testResultSet.rows[0].testResultId).toEqual("TEST-RESULT-ID-4-U"); + expect(testResultSet.rows[0].testCode).toBeNull(); + expect(testResultSet.rows[0].certificateNumber).toBeNull(); + expect(testResultSet.rows[0].secondaryCertificateNumber).toBeNull(); + expect(testResultSet.rows[0].testExpiryDate).toBeNull(); + expect(testResultSet.rows[0].testAnniversaryDate).toBeNull(); + expect(testResultSet.rows[0].testTypeStartTimestamp).toBeNull(); + expect(testResultSet.rows[0].testTypeEndTimestamp).toBeNull(); + expect( + testResultSet.rows[0].lastSeatbeltInstallationCheckDate + ).toBeNull(); + expect(testResultSet.rows[0].seatbeltInstallationCheckDate).toBeNull(); + expect(testResultSet.rows[0].testResult).toBeNull(); + expect(testResultSet.rows[0].reasonForAbandoning).toBeNull(); + expect(testResultSet.rows[0].additionalNotesRecorded).toBeNull(); + expect(testResultSet.rows[0].particulateTrapFitted).toBeNull(); + expect(testResultSet.rows[0].particulateTrapSerialNumber).toBeNull(); + expect(testResultSet.rows[0].modificationTypeUsed).toBeNull(); + expect(testResultSet.rows[0].smokeTestKLimitApplied).toBeNull(); + + const { + test_station_id, + tester_id, + vehicle_class_id, + preparer_id, + createdBy_Id, + lastUpdatedBy_Id, + fuel_emission_id, + test_type_id, + id, + } = testResultSet.rows[0]; + + const testStationResultSet = await executeSql( + `SELECT \`pNumber\`, \`name\`, \`type\` FROM \`test_station\` WHERE \`test_station\`.\`id\` = ${test_station_id}` - ); + ); - expect(testStationResultSet.rows.length).toEqual(1); - expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-4"); - expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-4"); - expect(testStationResultSet.rows[0].type).toEqual("atf"); + expect(testStationResultSet.rows.length).toEqual(1); + expect(testStationResultSet.rows[0].pNumber).toEqual("P-NUMBER-4"); + expect(testStationResultSet.rows[0].name).toEqual("TEST-STATION-NAME-4"); + expect(testStationResultSet.rows[0].type).toEqual("atf"); - const testerResultSet = await executeSql( - `SELECT \`staffId\`, \`name\`, \`email_address\` + const testerResultSet = await executeSql( + `SELECT \`staffId\`, \`name\`, \`email_address\` FROM \`tester\` WHERE \`tester\`.\`id\` = ${tester_id}` - ); - expect(testerResultSet.rows.length).toEqual(1); - expect(testerResultSet.rows[0].staffId).toEqual("999999998"); - expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-4"); - expect(testerResultSet.rows[0].email_address).toEqual("TESTER-EMAIL-ADDRESS-4"); - - const vehicleClassResultSet = await executeSql( - `SELECT \`code\`, + ); + expect(testerResultSet.rows.length).toEqual(1); + expect(testerResultSet.rows[0].staffId).toEqual("999999998"); + expect(testerResultSet.rows[0].name).toEqual("TESTER-NAME-4"); + expect(testerResultSet.rows[0].email_address).toEqual( + "TESTER-EMAIL-ADDRESS-4" + ); + + const vehicleClassResultSet = await executeSql( + `SELECT \`code\`, \`description\`, \`vehicleType\`, \`vehicleSize\`, @@ -1313,103 +1698,111 @@ export const testResultsConversionWithUpsert = () => describe("convertTestResult \`euVehicleCategory\` FROM \`vehicle_class\` WHERE \`vehicle_class\`.\`id\` = ${vehicle_class_id}` - ); - expect(vehicleClassResultSet.rows.length).toEqual(1); - expect(vehicleClassResultSet.rows[0].code).toEqual("v"); - expect(vehicleClassResultSet.rows[0].description).toEqual("heavy goods vehicle"); - expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); - expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); - expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual("rigid"); - expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); - - const preparerResultSet = await executeSql( - `SELECT \`preparerId\`, \`name\` + ); + expect(vehicleClassResultSet.rows.length).toEqual(1); + expect(vehicleClassResultSet.rows[0].code).toEqual("v"); + expect(vehicleClassResultSet.rows[0].description).toEqual( + "heavy goods vehicle" + ); + expect(vehicleClassResultSet.rows[0].vehicleType).toEqual("hgv"); + expect(vehicleClassResultSet.rows[0].vehicleSize).toEqual("large"); + expect(vehicleClassResultSet.rows[0].vehicleConfiguration).toEqual( + "rigid" + ); + expect(vehicleClassResultSet.rows[0].euVehicleCategory).toEqual("m1"); + + const preparerResultSet = await executeSql( + `SELECT \`preparerId\`, \`name\` FROM \`preparer\` WHERE \`preparer\`.\`id\` = ${preparer_id}` - ); - expect(preparerResultSet.rows.length).toEqual(1); - expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); - expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-4"); + ); + expect(preparerResultSet.rows.length).toEqual(1); + expect(preparerResultSet.rows[0].preparerId).toEqual("999999998"); + expect(preparerResultSet.rows[0].name).toEqual("PREPARER-NAME-4"); - const createdByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const createdByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${createdBy_Id}` - ); - expect(createdByResultSet.rows.length).toEqual(1); - expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-4"); - expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-4"); + ); + expect(createdByResultSet.rows.length).toEqual(1); + expect(createdByResultSet.rows[0].identityId).toEqual("CREATED-BY-ID-4"); + expect(createdByResultSet.rows[0].name).toEqual("CREATED-BY-NAME-4"); - const lastUpdatedByResultSet = await executeSql( - `SELECT \`identityId\`, \`name\` + const lastUpdatedByResultSet = await executeSql( + `SELECT \`identityId\`, \`name\` FROM \`identity\` WHERE \`identity\`.\`id\` = ${lastUpdatedBy_Id}` - ); - expect(lastUpdatedByResultSet.rows.length).toEqual(1); - expect(lastUpdatedByResultSet.rows[0].identityId).toEqual("LAST-UPDATED-BY-ID-4"); - expect(lastUpdatedByResultSet.rows[0].name).toEqual("LAST-UPDATED-BY-NAME-4"); - - const fuelEmissionResultSet = await executeSql( - `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` + ); + expect(lastUpdatedByResultSet.rows.length).toEqual(1); + expect(lastUpdatedByResultSet.rows[0].identityId).toEqual( + "LAST-UPDATED-BY-ID-4" + ); + expect(lastUpdatedByResultSet.rows[0].name).toEqual( + "LAST-UPDATED-BY-NAME-4" + ); + + const fuelEmissionResultSet = await executeSql( + `SELECT \`modTypeCode\`, \`description\`, \`emissionStandard\`, \`fuelType\` FROM \`fuel_emission\` WHERE \`fuel_emission\`.\`id\` = ${fuel_emission_id}` - ); - expect(fuelEmissionResultSet.rows.length).toEqual(0); + ); + expect(fuelEmissionResultSet.rows.length).toEqual(0); - const testTypeResultSet = await executeSql( - `SELECT \`testTypeClassification\`, \`testTypeName\` + const testTypeResultSet = await executeSql( + `SELECT \`testTypeClassification\`, \`testTypeName\` FROM \`test_type\` WHERE \`test_type\`.\`id\` = ${test_type_id}` - ); - expect(testTypeResultSet.rows.length).toEqual(0); + ); + expect(testTypeResultSet.rows.length).toEqual(0); - const testDefectResultSet = await executeSql( - `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` + const testDefectResultSet = await executeSql( + `SELECT \`test_result_id\`, \`defect_id\`, \`location_id\`, \`notes\`, \`prs\`, \`prohibitionIssued\` FROM \`test_defect\` WHERE \`test_defect\`.\`test_result_id\` = ${id}` - ); - expect(testDefectResultSet.rows.length).toEqual(0); + ); + expect(testDefectResultSet.rows.length).toEqual(0); }); it("After all tests the database has all the expected data", async () => { - const testResultResultSet = await executeSql( - `SELECT id FROM test_result + const testResultResultSet = await executeSql( + `SELECT id FROM test_result WHERE testResultId like '%-U';` - ); + ); - expect(testResultResultSet.rows.length).toEqual(5); + expect(testResultResultSet.rows.length).toEqual(5); - const customDefectResultSet = await executeSql( - `SELECT DISTINCT cd.id FROM custom_defect cd + const customDefectResultSet = await executeSql( + `SELECT DISTINCT cd.id FROM custom_defect cd INNER JOIN test_result tr ON cd.test_result_id = tr.id WHERE testResultId like '%-U';` - ); + ); - expect(customDefectResultSet.rows.length).toEqual(5); + expect(customDefectResultSet.rows.length).toEqual(5); - const testTypeResultSet = await executeSql( - `SELECT DISTINCT tt.id FROM test_type tt + const testTypeResultSet = await executeSql( + `SELECT DISTINCT tt.id FROM test_type tt JOIN test_result tr ON tt.id = tr.test_type_id WHERE testResultId like '%-U';` - ); + ); - expect(testTypeResultSet.rows.length).toEqual(2); + expect(testTypeResultSet.rows.length).toEqual(2); - const testDefectResultSet = await executeSql( - `SELECT DISTINCT td.id FROM test_defect td + const testDefectResultSet = await executeSql( + `SELECT DISTINCT td.id FROM test_defect td INNER JOIN test_result tr ON td.test_result_id = tr.id WHERE testResultId like '%-U';` - ); + ); - expect(testDefectResultSet.rows.length).toEqual(3); + expect(testDefectResultSet.rows.length).toEqual(3); - const defectResultSet = await executeSql( - `SELECT DISTINCT d.id FROM defect d + const defectResultSet = await executeSql( + `SELECT DISTINCT d.id FROM defect d JOIN test_defect td ON d.id = td.defect_id JOIN test_result tr ON td.test_result_id = tr.id WHERE testResultId like '%-U';` - ); + ); - expect(defectResultSet.rows.length).toEqual(3); + expect(defectResultSet.rows.length).toEqual(3); }); -}); + }); diff --git a/tests/unit/functions/process-stream-event.unitTest.ts b/tests/unit/functions/process-stream-event.unitTest.ts index 1dfa436..c64fc3d 100644 --- a/tests/unit/functions/process-stream-event.unitTest.ts +++ b/tests/unit/functions/process-stream-event.unitTest.ts @@ -1,212 +1,238 @@ -import {getTableNameFromArn, processStreamEvent} from "../../../src/functions/process-stream-event"; -import {convert} from "../../../src/services/entity-conversion"; -import {exampleContext} from "../../utils"; -import {mocked} from 'ts-jest' - -jest.mock('../../../src/services/entity-conversion', () => ({ - convert: jest.fn() -})) +import { + getTableNameFromArn, + processStreamEvent, +} from "../../../src/functions/process-stream-event"; +import { convert } from "../../../src/services/entity-conversion"; +import { exampleContext } from "../../utils"; +import { mocked } from "ts-jest"; + +jest.mock("../../../src/services/entity-conversion", () => ({ + convert: jest.fn(), +})); describe("processStreamEvent()", () => { - beforeEach(() => { - jest.resetAllMocks(); - mocked(convert).mockResolvedValueOnce({}); - }) - - it("should allow valid events to reach the entity conversion procedure", async () => { - await expect(processStreamEvent( + beforeEach(() => { + jest.resetAllMocks(); + mocked(convert).mockResolvedValueOnce({}); + }); + + it("should allow valid events to reach the entity conversion procedure", async () => { + await expect( + processStreamEvent( + { + Records: [ { - Records: [ - { - body: JSON.stringify({ - eventName: "INSERT", - dynamodb: { - NewImage: {} - }, - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000" - }) - } - ] + body: JSON.stringify({ + eventName: "INSERT", + dynamodb: { + NewImage: {}, + }, + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + }), }, - exampleContext(), - () => { - return; - }) - ).resolves.not.toThrowError(); - expect(convert).toHaveBeenCalledTimes(1); - }); - - it("should fail on null event", async () => { - await expect(processStreamEvent(null, exampleContext(), () => { - return; - })).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on event missing 'Records'", async () => { - await expect(processStreamEvent({}, exampleContext(), () => { - return; - })).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on event where 'Records' is not an array", async () => { - await expect(processStreamEvent({Records: ""}, exampleContext(), () => { - return; - })).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on null record", async () => { - await expect(processStreamEvent( - { Records: [ null ]}, - exampleContext(), - () => { - return; - }) - ).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on record missing 'eventName'", async () => { - await expect(processStreamEvent( - { Records: [ {} ]}, - exampleContext(), - () => { - return; - }) - ).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on record missing 'dynamodb'", async () => { - await expect(processStreamEvent( + ], + }, + exampleContext(), + () => { + return; + } + ) + ).resolves.not.toThrowError(); + expect(convert).toHaveBeenCalledTimes(1); + }); + + it("should fail on null event", async () => { + await expect( + processStreamEvent(null, exampleContext(), () => { + return; + }) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on event missing 'Records'", async () => { + await expect( + processStreamEvent({}, exampleContext(), () => { + return; + }) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on event where 'Records' is not an array", async () => { + await expect( + processStreamEvent({ Records: "" }, exampleContext(), () => { + return; + }) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on null record", async () => { + await expect( + processStreamEvent({ Records: [null] }, exampleContext(), () => { + return; + }) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on record missing 'eventName'", async () => { + await expect( + processStreamEvent({ Records: [{}] }, exampleContext(), () => { + return; + }) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on record missing 'dynamodb'", async () => { + await expect( + processStreamEvent( + { + Records: [ { - Records: [ - { - eventName: "INSERT" - } - ] + eventName: "INSERT", }, - exampleContext(), - () => { - return; - }) - ).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on record missing 'eventSourceARN'", async () => { - await expect(processStreamEvent( + ], + }, + exampleContext(), + () => { + return; + } + ) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on record missing 'eventSourceARN'", async () => { + await expect( + processStreamEvent( + { + Records: [ { - Records: [ - { - eventName: "INSERT", - dynamodb: {} - } - ] + eventName: "INSERT", + dynamodb: {}, }, - exampleContext(), - () => { - return; - }) - ).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on record missing 'NewImage' when eventName is 'INSERT'", async () => { - await expect(processStreamEvent( - { - Records: [ - { - eventName: "INSERT", - dynamodb: { - OldImage: {} - }, - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/t/stream/2020-01-01T00:00:00.000" - } - ] - }, - exampleContext(), - () => { - return; - }) - ).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should fail on record missing 'OldImage' when eventName is 'REMOVE'", async () => { - await expect(processStreamEvent( + ], + }, + exampleContext(), + () => { + return; + } + ) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on record missing 'NewImage' when eventName is 'INSERT'", async () => { + await expect( + processStreamEvent( + { + Records: [ { - Records: [ - { - eventName: "REMOVE", - dynamodb: { - NewImage: {} - }, - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/t/stream/2020-01-01T00:00:00.000" - } - ] + eventName: "INSERT", + dynamodb: { + OldImage: {}, + }, + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/t/stream/2020-01-01T00:00:00.000", }, - exampleContext(), - () => { - return; - }) - ).resolves.toEqual({batchItemFailures: []}); - expect(convert).toHaveBeenCalledTimes(0); - }); - - it("should return events that failed in entity conversion to the queue, but not halt processing of other records", async () => { - (convert as jest.Mock) = jest.fn().mockResolvedValueOnce({}).mockRejectedValueOnce({}).mockResolvedValueOnce({}); - - const res = await processStreamEvent( + ], + }, + exampleContext(), + () => { + return; + } + ) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should fail on record missing 'OldImage' when eventName is 'REMOVE'", async () => { + await expect( + processStreamEvent( + { + Records: [ { - Records: [ - { - messageId: "SUCCESS", - body: JSON.stringify({ - eventName: "INSERT", - dynamodb: { - NewImage: {} - }, - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000" - }) - }, - { - messageId: "FAILURE", - body: JSON.stringify({ - eventName: "INSERT", - dynamodb: { - NewImage: {} - }, - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000" - }) - }, - { - messageId: "SUCCESS", - body: JSON.stringify({ - eventName: "INSERT", - dynamodb: { - NewImage: {} - }, - eventSourceARN: "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000" - }) - } - ] + eventName: "REMOVE", + dynamodb: { + NewImage: {}, + }, + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/t/stream/2020-01-01T00:00:00.000", }, - exampleContext(), - () => { - return; - }) - expect(res).toEqual({ batchItemFailures: [{ itemIdentifier: "FAILURE" }]}) - expect(convert).toHaveBeenCalledTimes(3); - }) + ], + }, + exampleContext(), + () => { + return; + } + ) + ).resolves.toEqual({ batchItemFailures: [] }); + expect(convert).toHaveBeenCalledTimes(0); + }); + + it("should return events that failed in entity conversion to the queue, but not halt processing of other records", async () => { + (convert as jest.Mock) = jest + .fn() + .mockResolvedValueOnce({}) + .mockRejectedValueOnce({}) + .mockResolvedValueOnce({}); + + const res = await processStreamEvent( + { + Records: [ + { + messageId: "SUCCESS", + body: JSON.stringify({ + eventName: "INSERT", + dynamodb: { + NewImage: {}, + }, + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + }), + }, + { + messageId: "FAILURE", + body: JSON.stringify({ + eventName: "INSERT", + dynamodb: { + NewImage: {}, + }, + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + }), + }, + { + messageId: "SUCCESS", + body: JSON.stringify({ + eventName: "INSERT", + dynamodb: { + NewImage: {}, + }, + eventSourceARN: + "arn:aws:dynamodb:eu-west-1:1:table/technical-records/stream/2020-01-01T00:00:00.000", + }), + }, + ], + }, + exampleContext(), + () => { + return; + } + ); + expect(res).toEqual({ batchItemFailures: [{ itemIdentifier: "FAILURE" }] }); + expect(convert).toHaveBeenCalledTimes(3); + }); }); describe("getTableNameFromArn", () => { - it("should return table name when ARN is provided", () => { - const arn = "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525"; - expect(getTableNameFromArn(arn)).toEqual("my-table") - }) -}) - + it("should return table name when ARN is provided", () => { + const arn = + "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525"; + expect(getTableNameFromArn(arn)).toEqual("my-table"); + }); +}); diff --git a/tests/unit/handler.unitTest.ts b/tests/unit/handler.unitTest.ts index 9b76a4e..339a718 100644 --- a/tests/unit/handler.unitTest.ts +++ b/tests/unit/handler.unitTest.ts @@ -1,46 +1,46 @@ -import {processStreamEvent} from "../../src/functions/process-stream-event"; -import {handler} from "../../src/handler"; -import {config} from "aws-sdk"; -import {CredentialsOptions} from "aws-sdk/lib/credentials"; +import { processStreamEvent } from "../../src/functions/process-stream-event"; +import { handler } from "../../src/handler"; +import { config } from "aws-sdk"; +import { CredentialsOptions } from "aws-sdk/lib/credentials"; describe("handler", () => { - const oldEnv = process.env; - const oldCredentials: CredentialsOptions = config.credentials as CredentialsOptions; + const oldEnv = process.env; + const oldCredentials: CredentialsOptions = config.credentials as CredentialsOptions; - beforeEach(() => { - jest.resetModules(); - process.env = { ...oldEnv }; - config.credentials = { ...oldCredentials }; - }); + beforeEach(() => { + jest.resetModules(); + process.env = { ...oldEnv }; + config.credentials = { ...oldCredentials }; + }); - afterEach(() => { - process.env = oldEnv; - config.credentials = oldCredentials; - }); + afterEach(() => { + process.env = oldEnv; + config.credentials = oldCredentials; + }); - it("should use local credentials when BRANCH is undefined", () => { - (processStreamEvent as jest.Mock) = jest.fn(); + it("should use local credentials when BRANCH is undefined", () => { + (processStreamEvent as jest.Mock) = jest.fn(); - // @ts-ignore - handler(null, null, null); + // @ts-ignore + handler(null, null, null); - const credentials = config.credentials; + const credentials = config.credentials; - expect(credentials?.accessKeyId).toEqual("accessKey1"); - expect(credentials?.secretAccessKey).toEqual("verySecretKey1"); - }); + expect(credentials?.accessKeyId).toEqual("accessKey1"); + expect(credentials?.secretAccessKey).toEqual("verySecretKey1"); + }); - it("should use local credentials when BRANCH is 'local'", () => { - process.env.BRANCH = "local"; + it("should use local credentials when BRANCH is 'local'", () => { + process.env.BRANCH = "local"; - (processStreamEvent as jest.Mock) = jest.fn(); + (processStreamEvent as jest.Mock) = jest.fn(); - // @ts-ignore - handler(null, null, null); + // @ts-ignore + handler(null, null, null); - const credentials = config.credentials; + const credentials = config.credentials; - expect(credentials?.accessKeyId).toEqual("accessKey1"); - expect(credentials?.secretAccessKey).toEqual("verySecretKey1"); - }); + expect(credentials?.accessKeyId).toEqual("accessKey1"); + expect(credentials?.secretAccessKey).toEqual("verySecretKey1"); + }); }); diff --git a/tests/unit/models/auth-into-service.unitTest.ts b/tests/unit/models/auth-into-service.unitTest.ts index 33314a6..c29f60b 100644 --- a/tests/unit/models/auth-into-service.unitTest.ts +++ b/tests/unit/models/auth-into-service.unitTest.ts @@ -1,151 +1,186 @@ -import {DynamoDbImage} from "../../../src/services/dynamodb-images"; -import {castToImageShape} from "../../utils"; +import { DynamoDbImage } from "../../../src/services/dynamodb-images"; +import { castToImageShape } from "../../utils"; import techRecordDocumentJson from "../../resources/dynamodb-image-technical-record.json"; -import { parseTechRecordDocument, TechRecordDocument } from "../../../src/models/tech-record-document"; +import { + parseTechRecordDocument, + TechRecordDocument, +} from "../../../src/models/tech-record-document"; describe("parseAuthIntoService()", () => { - it("should successfully parse a fully populated authIntoService image into an authIntoService object", () => { - techRecordDocumentJson.techRecord.L[0].M.authIntoService = { - M: { - cocIssueDate: { - S: "2020-01-01" - }, - dateAuthorised: { - S: "2020-02-02" - }, - datePending: { - S: "2020-03-03" - }, - dateReceived: { - S: "2020-04-04" - }, - dateRejected: { - S: "2020-05-05" - } - } - }; - - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); - - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].authIntoService?.cocIssueDate).toEqual("2020-01-01"); - expect(techRecordDocument.techRecord![0].authIntoService?.dateAuthorised).toEqual("2020-02-02"); - expect(techRecordDocument.techRecord![0].authIntoService?.datePending).toEqual("2020-03-03"); - expect(techRecordDocument.techRecord![0].authIntoService?.dateReceived).toEqual("2020-04-04"); - expect(techRecordDocument.techRecord![0].authIntoService?.dateRejected).toEqual("2020-05-05"); - }); - - it("should successfully parse an authIntoService image into an authIntoService object with some null properties", () => { - techRecordDocumentJson.techRecord.L[0].M.authIntoService = { - M: { - cocIssueDate: { - // @ts-ignore - NULL: true - }, - dateAuthorised: { - S: "2020-02-02" - }, - datePending: { - // @ts-ignore - NULL: true - }, - dateReceived: { - S: "2020-04-04" - }, - dateRejected: { - // @ts-ignore - NULL: true - } - } - }; - - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); - - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].authIntoService?.cocIssueDate).toBeUndefined(); - expect(techRecordDocument.techRecord![0].authIntoService?.dateAuthorised).toEqual("2020-02-02"); - expect(techRecordDocument.techRecord![0].authIntoService?.datePending).toBeUndefined(); - expect(techRecordDocument.techRecord![0].authIntoService?.dateReceived).toEqual("2020-04-04"); - expect(techRecordDocument.techRecord![0].authIntoService?.dateRejected).toBeUndefined(); - }); - - it("should return undefined for an empty authIntoService", () => { - techRecordDocumentJson.techRecord.L[0].M.authIntoService = { - // @ts-ignore - M: {} - }; - - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); - - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); - }); - - it("should return undefined when no authIntoService present", () => { - // @ts-ignore - delete techRecordDocumentJson.techRecord.L[0].M.authIntoService; - - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); - - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); - }); - - it("should return undefined for an authIntoService with all null properties", () => { - techRecordDocumentJson.techRecord.L[0].M.authIntoService = { - M: { - cocIssueDate: { - // @ts-ignore - NULL: true - }, - dateAuthorised: { - // @ts-ignore - NULL: true - }, - datePending: { - // @ts-ignore - NULL: true - }, - dateReceived: { - // @ts-ignore - NULL: true - }, - dateRejected: { - // @ts-ignore - NULL: true - } - } - }; - - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); - - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); - }); - - it("should return undefined for an authIntoService with rogue properties", () => { - techRecordDocumentJson.techRecord.L[0].M.authIntoService = { - M: { - //@ts-ignore - iDoNotBelong: { - S: "2020-01-01" - }, - //@ts-ignore - meNeither: { - S: "2020-02-02" - } - } - }; - - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); - - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); - }); + it("should successfully parse a fully populated authIntoService image into an authIntoService object", () => { + techRecordDocumentJson.techRecord.L[0].M.authIntoService = { + M: { + cocIssueDate: { + S: "2020-01-01", + }, + dateAuthorised: { + S: "2020-02-02", + }, + datePending: { + S: "2020-03-03", + }, + dateReceived: { + S: "2020-04-04", + }, + dateRejected: { + S: "2020-05-05", + }, + }, + }; + + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); + + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect( + techRecordDocument.techRecord![0].authIntoService?.cocIssueDate + ).toEqual("2020-01-01"); + expect( + techRecordDocument.techRecord![0].authIntoService?.dateAuthorised + ).toEqual("2020-02-02"); + expect( + techRecordDocument.techRecord![0].authIntoService?.datePending + ).toEqual("2020-03-03"); + expect( + techRecordDocument.techRecord![0].authIntoService?.dateReceived + ).toEqual("2020-04-04"); + expect( + techRecordDocument.techRecord![0].authIntoService?.dateRejected + ).toEqual("2020-05-05"); + }); + + it("should successfully parse an authIntoService image into an authIntoService object with some null properties", () => { + techRecordDocumentJson.techRecord.L[0].M.authIntoService = { + M: { + cocIssueDate: { + // @ts-ignore + NULL: true, + }, + dateAuthorised: { + S: "2020-02-02", + }, + datePending: { + // @ts-ignore + NULL: true, + }, + dateReceived: { + S: "2020-04-04", + }, + dateRejected: { + // @ts-ignore + NULL: true, + }, + }, + }; + + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); + + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect( + techRecordDocument.techRecord![0].authIntoService?.cocIssueDate + ).toBeUndefined(); + expect( + techRecordDocument.techRecord![0].authIntoService?.dateAuthorised + ).toEqual("2020-02-02"); + expect( + techRecordDocument.techRecord![0].authIntoService?.datePending + ).toBeUndefined(); + expect( + techRecordDocument.techRecord![0].authIntoService?.dateReceived + ).toEqual("2020-04-04"); + expect( + techRecordDocument.techRecord![0].authIntoService?.dateRejected + ).toBeUndefined(); + }); + + it("should return undefined for an empty authIntoService", () => { + techRecordDocumentJson.techRecord.L[0].M.authIntoService = { + // @ts-ignore + M: {}, + }; + + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); + + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); + }); + + it("should return undefined when no authIntoService present", () => { + // @ts-ignore + delete techRecordDocumentJson.techRecord.L[0].M.authIntoService; + + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); + + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); + }); + + it("should return undefined for an authIntoService with all null properties", () => { + techRecordDocumentJson.techRecord.L[0].M.authIntoService = { + M: { + cocIssueDate: { + // @ts-ignore + NULL: true, + }, + dateAuthorised: { + // @ts-ignore + NULL: true, + }, + datePending: { + // @ts-ignore + NULL: true, + }, + dateReceived: { + // @ts-ignore + NULL: true, + }, + dateRejected: { + // @ts-ignore + NULL: true, + }, + }, + }; + + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); + + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); + }); + + it("should return undefined for an authIntoService with rogue properties", () => { + techRecordDocumentJson.techRecord.L[0].M.authIntoService = { + M: { + //@ts-ignore + iDoNotBelong: { + S: "2020-01-01", + }, + //@ts-ignore + meNeither: { + S: "2020-02-02", + }, + }, + }; + + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); + + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined(); + }); }); diff --git a/tests/unit/models/tech-record-document.unitTest.ts b/tests/unit/models/tech-record-document.unitTest.ts index 2b61266..c6db6fd 100644 --- a/tests/unit/models/tech-record-document.unitTest.ts +++ b/tests/unit/models/tech-record-document.unitTest.ts @@ -1,54 +1,103 @@ -import {parseTechRecordDocument, TechRecordDocument} from "../../../src/models/tech-record-document"; -import {DynamoDbImage} from "../../../src/services/dynamodb-images"; -import {default as techRecordDocumentJson} from "../../resources/dynamodb-image-technical-record.json"; -import {castToImageShape} from "../../utils"; +import { + parseTechRecordDocument, + TechRecordDocument, +} from "../../../src/models/tech-record-document"; +import { DynamoDbImage } from "../../../src/services/dynamodb-images"; +import { default as techRecordDocumentJson } from "../../resources/dynamodb-image-technical-record.json"; +import { castToImageShape } from "../../utils"; describe("parseTechRecordDocument()", () => { - it("should successfully parse a DynamoDB image into a TechRecordDocument", () => { - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + it("should successfully parse a DynamoDB image into a TechRecordDocument", () => { + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); - // check only first property of each root, for now - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].recordCompleteness).toEqual("88888888"); - expect(techRecordDocument.techRecord![0].createdAt).toEqual("2020-01-01 00:00:00.055"); - expect(techRecordDocument.techRecord![0].authIntoService?.cocIssueDate).toEqual("2020-01-01"); - expect(techRecordDocument.techRecord![0].lettersOfAuth?.letterType).toEqual("Trailer authorization"); - expect(techRecordDocument.techRecord![0].applicantDetails?.name).toEqual("NAME"); - expect(techRecordDocument.techRecord![0].purchaserDetails?.name).toEqual("NAME"); - expect(techRecordDocument.techRecord![0].manufacturerDetails?.name).toEqual("NAME"); - expect(techRecordDocument.techRecord![0].microfilm?.microfilmDocumentType).toEqual("PSV Miscellaneous"); - expect(techRecordDocument.techRecord![0].plates![0].plateSerialNumber).toEqual("1"); - expect(techRecordDocument.techRecord![0].bodyType?.code).toEqual("a"); - expect(techRecordDocument.techRecord![0].dimensions?.axleSpacing![0].axles).toEqual("1-2"); - expect(techRecordDocument.techRecord![0].vehicleClass?.code).toEqual("2"); - expect(techRecordDocument.techRecord![0].brakes?.brakeCodeOriginal).toEqual("333"); - expect(techRecordDocument.techRecord![0].axles![0].axleNumber).toEqual(1); - }); + // check only first property of each root, for now + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect(techRecordDocument.techRecord![0].recordCompleteness).toEqual( + "88888888" + ); + expect(techRecordDocument.techRecord![0].createdAt).toEqual( + "2020-01-01 00:00:00.055" + ); + expect( + techRecordDocument.techRecord![0].authIntoService?.cocIssueDate + ).toEqual("2020-01-01"); + expect(techRecordDocument.techRecord![0].lettersOfAuth?.letterType).toEqual( + "Trailer authorization" + ); + expect(techRecordDocument.techRecord![0].applicantDetails?.name).toEqual( + "NAME" + ); + expect(techRecordDocument.techRecord![0].purchaserDetails?.name).toEqual( + "NAME" + ); + expect(techRecordDocument.techRecord![0].manufacturerDetails?.name).toEqual( + "NAME" + ); + expect( + techRecordDocument.techRecord![0].microfilm?.microfilmDocumentType + ).toEqual("PSV Miscellaneous"); + expect( + techRecordDocument.techRecord![0].plates![0].plateSerialNumber + ).toEqual("1"); + expect(techRecordDocument.techRecord![0].bodyType?.code).toEqual("a"); + expect( + techRecordDocument.techRecord![0].dimensions?.axleSpacing![0].axles + ).toEqual("1-2"); + expect(techRecordDocument.techRecord![0].vehicleClass?.code).toEqual("2"); + expect(techRecordDocument.techRecord![0].brakes?.brakeCodeOriginal).toEqual( + "333" + ); + expect(techRecordDocument.techRecord![0].axles![0].axleNumber).toEqual(1); + }); - it("should successfully parse a DynamoDB image, with no authIntoService, into a TechRecordDocument", () => { - // @ts-ignore - delete techRecordDocumentJson.techRecord.L[0].M.authIntoService; - const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); + it("should successfully parse a DynamoDB image, with no authIntoService, into a TechRecordDocument", () => { + // @ts-ignore + delete techRecordDocumentJson.techRecord.L[0].M.authIntoService; + const image = DynamoDbImage.parse(castToImageShape(techRecordDocumentJson)); - const techRecordDocument: TechRecordDocument = parseTechRecordDocument(image); + const techRecordDocument: TechRecordDocument = parseTechRecordDocument( + image + ); - // check only first property of each root, for now - expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); - expect(techRecordDocument.techRecord![0].recordCompleteness).toEqual("88888888"); - expect(techRecordDocument.techRecord![0].createdAt).toEqual("2020-01-01 00:00:00.055"); - expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined; - expect(techRecordDocument.techRecord![0].lettersOfAuth?.letterType).toEqual("Trailer authorization"); - expect(techRecordDocument.techRecord![0].applicantDetails?.name).toEqual("NAME"); - expect(techRecordDocument.techRecord![0].purchaserDetails?.name).toEqual("NAME"); - expect(techRecordDocument.techRecord![0].manufacturerDetails?.name).toEqual("NAME"); - expect(techRecordDocument.techRecord![0].microfilm?.microfilmDocumentType).toEqual("PSV Miscellaneous"); - expect(techRecordDocument.techRecord![0].plates![0].plateSerialNumber).toEqual("1"); - expect(techRecordDocument.techRecord![0].bodyType?.code).toEqual("a"); - expect(techRecordDocument.techRecord![0].dimensions?.axleSpacing![0].axles).toEqual("1-2"); - expect(techRecordDocument.techRecord![0].vehicleClass?.code).toEqual("2"); - expect(techRecordDocument.techRecord![0].brakes?.brakeCodeOriginal).toEqual("333"); - expect(techRecordDocument.techRecord![0].axles![0].axleNumber).toEqual(1); - }); + // check only first property of each root, for now + expect(techRecordDocument.systemNumber).toEqual("SYSTEM-NUMBER-1"); + expect(techRecordDocument.techRecord![0].recordCompleteness).toEqual( + "88888888" + ); + expect(techRecordDocument.techRecord![0].createdAt).toEqual( + "2020-01-01 00:00:00.055" + ); + expect(techRecordDocument.techRecord![0].authIntoService).toBeUndefined; + expect(techRecordDocument.techRecord![0].lettersOfAuth?.letterType).toEqual( + "Trailer authorization" + ); + expect(techRecordDocument.techRecord![0].applicantDetails?.name).toEqual( + "NAME" + ); + expect(techRecordDocument.techRecord![0].purchaserDetails?.name).toEqual( + "NAME" + ); + expect(techRecordDocument.techRecord![0].manufacturerDetails?.name).toEqual( + "NAME" + ); + expect( + techRecordDocument.techRecord![0].microfilm?.microfilmDocumentType + ).toEqual("PSV Miscellaneous"); + expect( + techRecordDocument.techRecord![0].plates![0].plateSerialNumber + ).toEqual("1"); + expect(techRecordDocument.techRecord![0].bodyType?.code).toEqual("a"); + expect( + techRecordDocument.techRecord![0].dimensions?.axleSpacing![0].axles + ).toEqual("1-2"); + expect(techRecordDocument.techRecord![0].vehicleClass?.code).toEqual("2"); + expect(techRecordDocument.techRecord![0].brakes?.brakeCodeOriginal).toEqual( + "333" + ); + expect(techRecordDocument.techRecord![0].axles![0].axleNumber).toEqual(1); + }); }); diff --git a/tests/unit/models/test-result.unitTest.ts b/tests/unit/models/test-result.unitTest.ts index cd6c245..9fa43b4 100644 --- a/tests/unit/models/test-result.unitTest.ts +++ b/tests/unit/models/test-result.unitTest.ts @@ -1,22 +1,33 @@ -import {parseTestResults, TestResult, TestResults} from "../../../src/models/test-results"; -import {DynamoDbImage} from "../../../src/services/dynamodb-images"; -import {default as testResultsJson} from "../../resources/dynamodb-image-test-results.json"; -import {castToImageShape} from "../../utils"; +import { + parseTestResults, + TestResult, + TestResults, +} from "../../../src/models/test-results"; +import { DynamoDbImage } from "../../../src/services/dynamodb-images"; +import { default as testResultsJson } from "../../resources/dynamodb-image-test-results.json"; +import { castToImageShape } from "../../utils"; describe("parseTestResults()", () => { - it("should successfully parse a DynamoDB image into a TestResults list", () => { - const image = DynamoDbImage.parse(castToImageShape(testResultsJson)); + it("should successfully parse a DynamoDB image into a TestResults list", () => { + const image = DynamoDbImage.parse(castToImageShape(testResultsJson)); - const testResults: TestResults = parseTestResults(image); - const testResult: TestResult = testResults[0]; + const testResults: TestResults = parseTestResults(image); + const testResult: TestResult = testResults[0]; - // check only first property of each root, for now - expect(testResult.systemNumber).toEqual("SYSTEM-NUMBER-5"); - expect(testResult.vehicleClass?.code).toEqual("2"); - expect(testResult.testTypes![0].createdAt).toEqual("2020-01-01 00:00:00.123"); - expect(testResult.testTypes![0].modType?.code).toEqual("p"); - expect(testResult.testTypes![0].defects![0].imNumber).toEqual(5); - expect(testResult.testTypes![0].defects![0].additionalInformation?.location?.vertical).toEqual("upper"); - expect(testResult.testTypes![0].customDefects![0].referenceNumber).toEqual("def5"); - }); + // check only first property of each root, for now + expect(testResult.systemNumber).toEqual("SYSTEM-NUMBER-5"); + expect(testResult.vehicleClass?.code).toEqual("2"); + expect(testResult.testTypes![0].createdAt).toEqual( + "2020-01-01 00:00:00.123" + ); + expect(testResult.testTypes![0].modType?.code).toEqual("p"); + expect(testResult.testTypes![0].defects![0].imNumber).toEqual(5); + expect( + testResult.testTypes![0].defects![0].additionalInformation?.location + ?.vertical + ).toEqual("upper"); + expect(testResult.testTypes![0].customDefects![0].referenceNumber).toEqual( + "def5" + ); + }); }); diff --git a/tests/unit/services/connection-pool.unitTest.ts b/tests/unit/services/connection-pool.unitTest.ts index 904f92f..3e24c06 100644 --- a/tests/unit/services/connection-pool.unitTest.ts +++ b/tests/unit/services/connection-pool.unitTest.ts @@ -1,102 +1,114 @@ -import {destroyConnectionPool, executeSql, getConnectionPool} from "../../../src/services/connection-pool"; -import {createPool} from "mysql2/promise"; -import {useLocalDb} from "../../utils"; +import { + destroyConnectionPool, + executeSql, + getConnectionPool, +} from "../../../src/services/connection-pool"; +import { createPool } from "mysql2/promise"; +import { useLocalDb } from "../../utils"; jest.mock("mysql2/promise", () => { - return { - createPool: jest.fn().mockReturnValue({ - end: jest.fn(), - execute: jest.fn() - }) - }; + return { + createPool: jest.fn().mockReturnValue({ + end: jest.fn(), + execute: jest.fn(), + }), + }; }); useLocalDb(); describe("getConnectionPool()", () => { - it("should create connection pool exactly once", async () => { - await getConnectionPool(); - await getConnectionPool(); - await getConnectionPool(); + it("should create connection pool exactly once", async () => { + await getConnectionPool(); + await getConnectionPool(); + await getConnectionPool(); - expect(createPool).toHaveBeenCalledTimes(1); - }); + expect(createPool).toHaveBeenCalledTimes(1); + }); }); describe("destroyConnectionPool()", () => { - beforeEach(async () => { - await destroyConnectionPool(); + beforeEach(async () => { + await destroyConnectionPool(); - // need to access nested function directly via mocked module parent function - // using getConnectionPool().end will implicitly add 1 to mock calls counter - // @ts-ignore - createPool().end.mockReset(); - }); + // need to access nested function directly via mocked module parent function + // using getConnectionPool().end will implicitly add 1 to mock calls counter + // @ts-ignore + createPool().end.mockReset(); + }); - it("should do nothing if connection pool is undefined", async () => { - await destroyConnectionPool(); + it("should do nothing if connection pool is undefined", async () => { + await destroyConnectionPool(); - expect((await getConnectionPool()).end).not.toHaveBeenCalled(); - }); + expect((await getConnectionPool()).end).not.toHaveBeenCalled(); + }); - it("should destroy connection pool if present", async () => { - await getConnectionPool(); - await destroyConnectionPool(); + it("should destroy connection pool if present", async () => { + await getConnectionPool(); + await destroyConnectionPool(); - expect((await getConnectionPool()).end).toHaveBeenCalledTimes(1); - }); + expect((await getConnectionPool()).end).toHaveBeenCalledTimes(1); + }); }); describe("executeSql()", () => { - beforeEach(async () => { - // need to access nested function directly via mocked module parent function - // using getConnectionPool().execute will implicitly add 1 to mock calls counter - // @ts-ignore - createPool().execute.mockReset(); - // Jest hoisting forces us to mockImplementation anywhere except in the module-level mock - // @ts-ignore - createPool().execute.mockImplementation(() => [[], []]); - }); - - it("should accept single SQL statement", async () => { - await executeSql("SELECT 1"); - - expect((await getConnectionPool()).execute).toHaveBeenCalledWith("SELECT 1", undefined); - }); - - it("should accept SQL statement + template variables", async () => { - const sql = "SELECT 1 FROM t WHERE a = ? AND b = ?"; - const templateVariables = ["a", "b"]; - await executeSql(sql, templateVariables); - - expect((await getConnectionPool()).execute).toHaveBeenCalledWith(sql, templateVariables); - }); - - it("should use explicit connection if provided", async () => { - const mockPoolExecute = jest.fn().mockReturnValue([[], []]); - (createPool as jest.Mock) = jest.fn().mockReturnValue({execute: mockPoolExecute}); - - const mockConnectionExecute = jest.fn().mockReturnValue([[], []]); - const mockConnection = { - execute: mockConnectionExecute - }; + beforeEach(async () => { + // need to access nested function directly via mocked module parent function + // using getConnectionPool().execute will implicitly add 1 to mock calls counter + // @ts-ignore + createPool().execute.mockReset(); + // Jest hoisting forces us to mockImplementation anywhere except in the module-level mock + // @ts-ignore + createPool().execute.mockImplementation(() => [[], []]); + }); + + it("should accept single SQL statement", async () => { + await executeSql("SELECT 1"); + + expect((await getConnectionPool()).execute).toHaveBeenCalledWith( + "SELECT 1", + undefined + ); + }); + + it("should accept SQL statement + template variables", async () => { + const sql = "SELECT 1 FROM t WHERE a = ? AND b = ?"; + const templateVariables = ["a", "b"]; + await executeSql(sql, templateVariables); + + expect((await getConnectionPool()).execute).toHaveBeenCalledWith( + sql, + templateVariables + ); + }); + + it("should use explicit connection if provided", async () => { + const mockPoolExecute = jest.fn().mockReturnValue([[], []]); + (createPool as jest.Mock) = jest + .fn() + .mockReturnValue({ execute: mockPoolExecute }); + + const mockConnectionExecute = jest.fn().mockReturnValue([[], []]); + const mockConnection = { + execute: mockConnectionExecute, + }; - const sql = "SELECT 1 FROM t WHERE a = ? AND b = ?"; - const templateVariables = ["a", "b"]; + const sql = "SELECT 1 FROM t WHERE a = ? AND b = ?"; + const templateVariables = ["a", "b"]; - // @ts-ignore - await executeSql(sql, templateVariables, mockConnection); + // @ts-ignore + await executeSql(sql, templateVariables, mockConnection); - expect(mockPoolExecute).not.toHaveBeenCalled(); - expect(mockConnectionExecute).toHaveBeenCalledWith(sql, templateVariables); - }); + expect(mockPoolExecute).not.toHaveBeenCalled(); + expect(mockConnectionExecute).toHaveBeenCalledWith(sql, templateVariables); + }); - it("should return object, not tuple", async () => { - const response = await executeSql("SELECT 1"); + it("should return object, not tuple", async () => { + const response = await executeSql("SELECT 1"); - expect(response).toEqual({ - rows: [], - fields: [] - }); + expect(response).toEqual({ + rows: [], + fields: [], }); + }); }); diff --git a/tests/unit/services/dynamodb-images.unitTest.ts b/tests/unit/services/dynamodb-images.unitTest.ts index 45a252d..e0329a4 100644 --- a/tests/unit/services/dynamodb-images.unitTest.ts +++ b/tests/unit/services/dynamodb-images.unitTest.ts @@ -1,112 +1,148 @@ -import {DynamoDbImage} from "../../../src/services/dynamodb-images"; -import {default as primitivesJson} from "../../resources/dynamodb-image-primitives.json"; -import {default as stringDateTime} from "../../resources/dynamodb-image-string-timestamps.json"; -import {default as setsJson} from "../../resources/dynamodb-image-sets.json"; -import {default as listJson} from "../../resources/dynamodb-image-list.json"; -import {default as mapJson} from "../../resources/dynamodb-image-map.json"; -import {default as nestedJson} from "../../resources/dynamodb-image-nested.json"; -import {castToImageShape} from "../../utils"; +import { DynamoDbImage } from "../../../src/services/dynamodb-images"; +import { default as primitivesJson } from "../../resources/dynamodb-image-primitives.json"; +import { default as stringDateTime } from "../../resources/dynamodb-image-string-timestamps.json"; +import { default as setsJson } from "../../resources/dynamodb-image-sets.json"; +import { default as listJson } from "../../resources/dynamodb-image-list.json"; +import { default as mapJson } from "../../resources/dynamodb-image-map.json"; +import { default as nestedJson } from "../../resources/dynamodb-image-nested.json"; +import { castToImageShape } from "../../utils"; describe("parse()", () => { - it("should parse a Dynamo image containing all primitive types", () => { - const image = DynamoDbImage.parse(castToImageShape(primitivesJson)); - expect(image.getNull("NullField")).toEqual(null); - expect(image.getBoolean("BooleanField")).toEqual(true); - expect(image.getNumber("NumberField")).toEqual(123.45); - expect(image.getString("StringField")).toEqual("Hello"); - expect(image.getBinary("BinaryField")!.toString("utf-8")).toEqual("this text is base64-encoded"); - }); + it("should parse a Dynamo image containing all primitive types", () => { + const image = DynamoDbImage.parse(castToImageShape(primitivesJson)); + expect(image.getNull("NullField")).toEqual(null); + expect(image.getBoolean("BooleanField")).toEqual(true); + expect(image.getNumber("NumberField")).toEqual(123.45); + expect(image.getString("StringField")).toEqual("Hello"); + expect(image.getBinary("BinaryField")!.toString("utf-8")).toEqual( + "this text is base64-encoded" + ); + }); - it("should parse a Dynamo image containing all primitive types", () => { - const image = DynamoDbImage.parse(castToImageShape(stringDateTime)); - expect(image.getDate("StringISOTimestampField")).toEqual("2023-02-16 12:07:22.056"); - expect(image.getDate("StringDateField")).toEqual("2023-02-16 00:00:00.000"); - }); + it("should parse a Dynamo image containing all primitive types", () => { + const image = DynamoDbImage.parse(castToImageShape(stringDateTime)); + expect(image.getDate("StringISOTimestampField")).toEqual( + "2023-02-16 12:07:22.056" + ); + expect(image.getDate("StringDateField")).toEqual("2023-02-16 00:00:00.000"); + }); - it("should parse a Dynamo image containing all set types", () => { - const image = DynamoDbImage.parse(castToImageShape(setsJson)); - expect(image.getStrings("StringsField")).toEqual(["Giraffe", "Hippo", "Zebra"]); - expect(image.getNumbers("NumbersField")).toEqual([42.2, -19, 7.5, 3.14]); - expect(image.getBinaries("BinariesField").map((b: Buffer) => b.toString("utf-8"))).toEqual(["Sunny", "Rainy", "Snowy"]); - }); + it("should parse a Dynamo image containing all set types", () => { + const image = DynamoDbImage.parse(castToImageShape(setsJson)); + expect(image.getStrings("StringsField")).toEqual([ + "Giraffe", + "Hippo", + "Zebra", + ]); + expect(image.getNumbers("NumbersField")).toEqual([42.2, -19, 7.5, 3.14]); + expect( + image.getBinaries("BinariesField").map((b: Buffer) => b.toString("utf-8")) + ).toEqual(["Sunny", "Rainy", "Snowy"]); + }); - it("should parse a Dynamo image containing a list type", () => { - const image = DynamoDbImage.parse(castToImageShape(listJson)); - expect(image.getList("ListField")!.getString("0")).toEqual("Cookies"); - expect(image.getList("ListField")!.getString("1")).toEqual("Coffee"); - expect(image.getList("ListField")!.getNumber("2")).toEqual(3.14159); + it("should parse a Dynamo image containing a list type", () => { + const image = DynamoDbImage.parse(castToImageShape(listJson)); + expect(image.getList("ListField")!.getString("0")).toEqual("Cookies"); + expect(image.getList("ListField")!.getString("1")).toEqual("Coffee"); + expect(image.getList("ListField")!.getNumber("2")).toEqual(3.14159); + }); + + it("should parse a Dynamo image containing a map type", () => { + const image = DynamoDbImage.parse(castToImageShape(mapJson)); + + const expectedMap: DynamoDbImage = DynamoDbImage.parse({ + Name: { S: "Joe" }, + Age: { N: "35" }, }); - it("should parse a Dynamo image containing a map type", () => { - const image = DynamoDbImage.parse(castToImageShape(mapJson)); + expect(image.getMap("MapField")).toEqual(expectedMap); + }); - const expectedMap: DynamoDbImage = DynamoDbImage.parse({ - Name: {S: "Joe"}, - Age: {N: "35"} - }); + it("should access nested values correctly", () => { + const image = DynamoDbImage.parse(castToImageShape(nestedJson)); - expect(image.getMap("MapField")).toEqual(expectedMap); - }); + const nestedListField: DynamoDbImage = image + .getMap("ParentMapField")! + .getList("ListField")!; + expect(nestedListField.getString("0")).toEqual("Hello"); + expect(nestedListField.getMap("1")!.getString("StringField")).toEqual( + "Hello" + ); - it("should access nested values correctly", () => { - const image = DynamoDbImage.parse(castToImageShape(nestedJson)); + const nestedMapField: DynamoDbImage = image + .getList("ParentListField")! + .getMap("0")!; + expect(nestedMapField.getString("StringField")).toEqual("Hello"); + expect(nestedMapField.getList("ListField")!.getString("0")).toEqual( + "Hello" + ); + }); - const nestedListField: DynamoDbImage = image.getMap("ParentMapField")!.getList("ListField")!; - expect(nestedListField.getString("0")).toEqual("Hello"); - expect(nestedListField.getMap("1")!.getString("StringField")).toEqual("Hello"); + it("should fail on request for incorrect type", () => { + const image = DynamoDbImage.parse(castToImageShape(primitivesJson)); + expect(() => image.getString("NumberField")).toThrowError("not of type"); + }); - const nestedMapField: DynamoDbImage = image.getList("ParentListField")!.getMap("0")!; - expect(nestedMapField.getString("StringField")).toEqual("Hello"); - expect(nestedMapField.getList("ListField")!.getString("0")).toEqual("Hello"); - }); + it("should handle a number when presented as a null", () => { + let image = DynamoDbImage.parse( + castToImageShape({ NumberField: { NULL: true } }) + ); + expect(image.getNumber("NumberField")).toEqual(undefined); + }); - it("should fail on request for incorrect type", () => { - const image = DynamoDbImage.parse(castToImageShape(primitivesJson)); - expect(() => image.getString("NumberField")).toThrowError("not of type"); - }); - - it("should handle a number when presented as a null", () => { - let image = DynamoDbImage.parse(castToImageShape({ NumberField: {NULL: true} })); - expect(image.getNumber("NumberField")).toEqual(undefined); - }); - - it("should handle a number when presented as a string", () => { - let image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "2.2"} })); - expect(image.getNumber("NumberField")).toEqual(2.2); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "22"} })); - expect(image.getNumber("NumberField")).toEqual(22); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "-2.2"} })); - expect(image.getNumber("NumberField")).toEqual(-2.2); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: ".2"} })); - expect(image.getNumber("NumberField")).toEqual(0.2); - }); - - it("should reject a number when presented as non numerical strings", () => { - let image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: " "} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: ""} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "."} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "1.."} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "..1"} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "1aa"} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "aa1"} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - - image = DynamoDbImage.parse(castToImageShape({ NumberField: {S: "string"} })); - expect(() => image.getNumber("NumberField")).toThrowError("not of type"); - }); + it("should handle a number when presented as a string", () => { + let image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "2.2" } }) + ); + expect(image.getNumber("NumberField")).toEqual(2.2); + + image = DynamoDbImage.parse(castToImageShape({ NumberField: { S: "22" } })); + expect(image.getNumber("NumberField")).toEqual(22); + + image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "-2.2" } }) + ); + expect(image.getNumber("NumberField")).toEqual(-2.2); + + image = DynamoDbImage.parse(castToImageShape({ NumberField: { S: ".2" } })); + expect(image.getNumber("NumberField")).toEqual(0.2); + }); + + it("should reject a number when presented as non numerical strings", () => { + let image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: " " } }) + ); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse(castToImageShape({ NumberField: { S: "" } })); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse(castToImageShape({ NumberField: { S: "." } })); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "1.." } }) + ); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "..1" } }) + ); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "1aa" } }) + ); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "aa1" } }) + ); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + + image = DynamoDbImage.parse( + castToImageShape({ NumberField: { S: "string" } }) + ); + expect(() => image.getNumber("NumberField")).toThrowError("not of type"); + }); }); diff --git a/tests/unit/services/entity-conversion.unitTest.ts b/tests/unit/services/entity-conversion.unitTest.ts index 65234c3..d1b5902 100644 --- a/tests/unit/services/entity-conversion.unitTest.ts +++ b/tests/unit/services/entity-conversion.unitTest.ts @@ -1,55 +1,58 @@ -import {techRecordDocumentConverter} from "../../../src/services/tech-record-document-conversion"; -import {convert} from "../../../src/services/entity-conversion"; -import {DynamoDbImage} from "../../../src/services/dynamodb-images"; +import { techRecordDocumentConverter } from "../../../src/services/tech-record-document-conversion"; +import { convert } from "../../../src/services/entity-conversion"; +import { DynamoDbImage } from "../../../src/services/dynamodb-images"; jest.mock("../../../src/services/tech-record-document-conversion", () => { - return { - techRecordDocumentConverter: jest.fn().mockReturnValue({ - parseRootImage: jest.fn(), - upsertEntity: jest.fn(), - deleteEntity: jest.fn() - }) - }; + return { + techRecordDocumentConverter: jest.fn().mockReturnValue({ + parseRootImage: jest.fn(), + upsertEntity: jest.fn(), + deleteEntity: jest.fn(), + }), + }; }); describe("convert()", () => { - - beforeEach(() => { - // @ts-ignore - techRecordDocumentConverter().parseRootImage.mockReset(); - // @ts-ignore - techRecordDocumentConverter().upsertEntity.mockReset(); - // @ts-ignore - techRecordDocumentConverter().deleteEntity.mockReset(); - }); - - it("should parse and upsert entities on 'INSERT'", async () => { - await expect(convert("technical-records", "INSERT", exampleImage())); - - expect(techRecordDocumentConverter().parseRootImage).toHaveBeenCalledTimes(1); - expect(techRecordDocumentConverter().upsertEntity).toHaveBeenCalledTimes(1); - expect(techRecordDocumentConverter().deleteEntity).toHaveBeenCalledTimes(0); - }); - - it("should parse and delete entities on 'DELETE'", async () => { - await expect(convert("technical-records", "DELETE", exampleImage())); - - expect(techRecordDocumentConverter().parseRootImage).toHaveBeenCalledTimes(1); - expect(techRecordDocumentConverter().upsertEntity).toHaveBeenCalledTimes(0); - expect(techRecordDocumentConverter().deleteEntity).toHaveBeenCalledTimes(1); + beforeEach(() => { + // @ts-ignore + techRecordDocumentConverter().parseRootImage.mockReset(); + // @ts-ignore + techRecordDocumentConverter().upsertEntity.mockReset(); + // @ts-ignore + techRecordDocumentConverter().deleteEntity.mockReset(); + }); + + it("should parse and upsert entities on 'INSERT'", async () => { + await expect(convert("technical-records", "INSERT", exampleImage())); + + expect(techRecordDocumentConverter().parseRootImage).toHaveBeenCalledTimes( + 1 + ); + expect(techRecordDocumentConverter().upsertEntity).toHaveBeenCalledTimes(1); + expect(techRecordDocumentConverter().deleteEntity).toHaveBeenCalledTimes(0); + }); + + it("should parse and delete entities on 'DELETE'", async () => { + await expect(convert("technical-records", "DELETE", exampleImage())); + + expect(techRecordDocumentConverter().parseRootImage).toHaveBeenCalledTimes( + 1 + ); + expect(techRecordDocumentConverter().upsertEntity).toHaveBeenCalledTimes(0); + expect(techRecordDocumentConverter().deleteEntity).toHaveBeenCalledTimes(1); + }); + + it("should fail on non-existent table", async () => { + await expect(() => + convert("any-unknown", "INSERT", exampleImage()) + ).rejects.toThrowError(); + }); + + const exampleImage = (): DynamoDbImage => { + return DynamoDbImage.parse({ + StringField: { + S: "TEST", + }, }); - - it("should fail on non-existent table", async () => { - await expect(() => convert("any-unknown", "INSERT", exampleImage())).rejects.toThrowError(); - }); - - const exampleImage = (): DynamoDbImage => { - return DynamoDbImage.parse( - { - StringField: { - S: "TEST" - } - } - ); - }; + }; }); diff --git a/tests/unit/services/secrets-manager.unitTest.ts b/tests/unit/services/secrets-manager.unitTest.ts index a1e819a..fc36720 100644 --- a/tests/unit/services/secrets-manager.unitTest.ts +++ b/tests/unit/services/secrets-manager.unitTest.ts @@ -1,54 +1,61 @@ -import {getSecretValue} from "../../../src/services/secrets-manager"; -import {SecretsManager} from "aws-sdk"; +import { getSecretValue } from "../../../src/services/secrets-manager"; +import { SecretsManager } from "aws-sdk"; jest.mock("aws-sdk"); describe("getSecretValue()", () => { - - beforeEach(() => { - // @ts-ignore - SecretsManager.mockClear(); - }); - - it("should fail on non-existent secret", async () => { - mockSecretString("MY-SECRET-KEY", "MY-SECRET-VALUE"); - await expect(getSecretValue("any")).rejects.toThrowError("does not exist"); - }); - - it("should correctly retrieve existing string secret", async () => { - mockSecretString("MY-SECRET-KEY", "MY-SECRET-VALUE"); - await expect(getSecretValue("MY-SECRET-KEY")).resolves.toEqual("MY-SECRET-VALUE"); + beforeEach(() => { + // @ts-ignore + SecretsManager.mockClear(); + }); + + it("should fail on non-existent secret", async () => { + mockSecretString("MY-SECRET-KEY", "MY-SECRET-VALUE"); + await expect(getSecretValue("any")).rejects.toThrowError("does not exist"); + }); + + it("should correctly retrieve existing string secret", async () => { + mockSecretString("MY-SECRET-KEY", "MY-SECRET-VALUE"); + await expect(getSecretValue("MY-SECRET-KEY")).resolves.toEqual( + "MY-SECRET-VALUE" + ); + }); + + it("should correctly retrieve existing binary secret", async () => { + mockSecretBinary("MY-SECRET-KEY", "MY-SECRET-VALUE"); + await expect(getSecretValue("MY-SECRET-KEY")).resolves.toEqual( + "MY-SECRET-VALUE" + ); + }); + + it("should fail on secret with no recognizable value format", async () => { + mockSecretValue("MY-SECRET-KEY", { SecretFoo: "MY-SECRET-VALUE" }); + await expect(getSecretValue("MY-SECRET-KEY")).rejects.toThrowError( + "one of" + ); + }); + + const mockSecretString = (expectedSecretKey: string, secretValue: string) => { + mockSecretValue(expectedSecretKey, { SecretString: secretValue }); + }; + + const mockSecretBinary = (expectedSecretKey: string, secretValue: string) => { + mockSecretValue(expectedSecretKey, { + SecretBinary: Buffer.from(secretValue, "utf-8"), }); - - it("should correctly retrieve existing binary secret", async () => { - mockSecretBinary("MY-SECRET-KEY", "MY-SECRET-VALUE"); - await expect(getSecretValue("MY-SECRET-KEY")).resolves.toEqual("MY-SECRET-VALUE"); - }); - - it("should fail on secret with no recognizable value format", async () => { - mockSecretValue("MY-SECRET-KEY", { SecretFoo: "MY-SECRET-VALUE" }); - await expect(getSecretValue("MY-SECRET-KEY")).rejects.toThrowError("one of"); - }); - - const mockSecretString = (expectedSecretKey: string, secretValue: string) => { - mockSecretValue(expectedSecretKey, { SecretString: secretValue }); - }; - - const mockSecretBinary = (expectedSecretKey: string, secretValue: string) => { - mockSecretValue(expectedSecretKey, { SecretBinary: Buffer.from(secretValue, "utf-8") }); - }; - - const mockSecretValue = (expectedSecretKey: string, secretValue: any) => { - // @ts-ignore - SecretsManager.mockImplementation(() => ({ - getSecretValue: jest.fn().mockImplementation((actualSecretKey) => ({ - promise: jest.fn().mockImplementation(() => { - if (expectedSecretKey === actualSecretKey?.SecretId) { - return Promise.resolve(secretValue); - } - return Promise.resolve(undefined); - }) - })) - })); - }; + }; + + const mockSecretValue = (expectedSecretKey: string, secretValue: any) => { + // @ts-ignore + SecretsManager.mockImplementation(() => ({ + getSecretValue: jest.fn().mockImplementation((actualSecretKey) => ({ + promise: jest.fn().mockImplementation(() => { + if (expectedSecretKey === actualSecretKey?.SecretId) { + return Promise.resolve(secretValue); + } + return Promise.resolve(undefined); + }), + })), + })); + }; }); diff --git a/tests/unit/services/sql-execution.unitTest.ts b/tests/unit/services/sql-execution.unitTest.ts index c669f1d..85e92cc 100644 --- a/tests/unit/services/sql-execution.unitTest.ts +++ b/tests/unit/services/sql-execution.unitTest.ts @@ -1,126 +1,143 @@ import { - deleteBasedOnWhereIn, - executeFullUpsert, - executePartialUpsert, - executePartialUpsertIfNotExists, - selectRecordIds + deleteBasedOnWhereIn, + executeFullUpsert, + executePartialUpsert, + executePartialUpsertIfNotExists, + selectRecordIds, } from "../../../src/services/sql-execution"; -import {executeSql} from "../../../src/services/connection-pool"; -import {CUSTOM_DEFECT_TABLE, TECHNICAL_RECORD_TABLE} from "../../../src/services/table-details"; +import { executeSql } from "../../../src/services/connection-pool"; import { - generateDeleteBasedOnWhereIn, - generateFullUpsertSql, - generatePartialUpsertSql, - generateSelectRecordIds, - generateSelectSql + CUSTOM_DEFECT_TABLE, + TECHNICAL_RECORD_TABLE, +} from "../../../src/services/table-details"; +import { + generateDeleteBasedOnWhereIn, + generateFullUpsertSql, + generatePartialUpsertSql, + generateSelectRecordIds, + generateSelectSql, } from "../../../src/services/sql-generation"; describe("executePartialUpsert()", () => { - it("should call partial upsert SQL generation", () => { - (generatePartialUpsertSql as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); - - (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ - rows: [], - fields: [] - }); + it("should call partial upsert SQL generation", () => { + (generatePartialUpsertSql as jest.Mock) = jest + .fn() + .mockReturnValue("SELECT 1"); + + (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ + rows: [], + fields: [], + }); - // @ts-ignore - executePartialUpsert(TECHNICAL_RECORD_TABLE, [], undefined); + // @ts-ignore + executePartialUpsert(TECHNICAL_RECORD_TABLE, [], undefined); - expect(executeSql).toHaveBeenCalledTimes(1); - expect(generatePartialUpsertSql).toHaveBeenCalledTimes(1); - expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); - }); + expect(executeSql).toHaveBeenCalledTimes(1); + expect(generatePartialUpsertSql).toHaveBeenCalledTimes(1); + expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); + }); }); describe("executeFullUpsert()", () => { - it("should call partial upsert SQL generation", () => { - (generateFullUpsertSql as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); - - (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ - rows: [], - fields: [] - }); + it("should call partial upsert SQL generation", () => { + (generateFullUpsertSql as jest.Mock) = jest + .fn() + .mockReturnValue("SELECT 1"); + + (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ + rows: [], + fields: [], + }); - // @ts-ignore - executeFullUpsert(TECHNICAL_RECORD_TABLE, [], undefined); + // @ts-ignore + executeFullUpsert(TECHNICAL_RECORD_TABLE, [], undefined); - expect(executeSql).toHaveBeenCalledTimes(1); - expect(generateFullUpsertSql).toHaveBeenCalledTimes(1); - expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); - }); + expect(executeSql).toHaveBeenCalledTimes(1); + expect(generateFullUpsertSql).toHaveBeenCalledTimes(1); + expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); + }); }); describe("executePartialUpsertIfNotExists()", () => { - it("should call partial upsert SQL generation if no row exists", () => { - (generateSelectSql as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); - (generatePartialUpsertSql as jest.Mock) = jest.fn().mockReturnValue("INSERT INTO table_name () VALUES () ON DUPLICATE KEY"); - - (executeSql as jest.Mock) = jest.fn() - .mockResolvedValue({ - rows: [{column: 1}], - fields: []}); - // @ts-ignore - executePartialUpsertIfNotExists(TECHNICAL_RECORD_TABLE, [], undefined); - - expect(executeSql).toHaveBeenCalledTimes(1); - expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); - expect(generateSelectSql).toHaveBeenCalledTimes(1); - }); - - it("should call partial upsert SQL generation if row exists", () => { - (generateSelectSql as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); - (generatePartialUpsertSql as jest.Mock) = jest.fn().mockReturnValue("INSERT INTO table_name () VALUES () ON DUPLICATE KEY"); - - (executeSql as jest.Mock) = jest.fn() - .mockResolvedValueOnce({ - rows: [], - fields: []}) - .mockResolvedValue({ - rows: [{column: 1}], - fields: [] - }); - // @ts-ignore - executePartialUpsertIfNotExists(TECHNICAL_RECORD_TABLE, [], undefined); - - expect(executeSql).toHaveBeenCalledTimes(1); - expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); - expect(generateSelectSql).toHaveBeenCalledTimes(1); + it("should call partial upsert SQL generation if no row exists", () => { + (generateSelectSql as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); + (generatePartialUpsertSql as jest.Mock) = jest + .fn() + .mockReturnValue("INSERT INTO table_name () VALUES () ON DUPLICATE KEY"); + + (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ + rows: [{ column: 1 }], + fields: [], }); + // @ts-ignore + executePartialUpsertIfNotExists(TECHNICAL_RECORD_TABLE, [], undefined); + + expect(executeSql).toHaveBeenCalledTimes(1); + expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); + expect(generateSelectSql).toHaveBeenCalledTimes(1); + }); + + it("should call partial upsert SQL generation if row exists", () => { + (generateSelectSql as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); + (generatePartialUpsertSql as jest.Mock) = jest + .fn() + .mockReturnValue("INSERT INTO table_name () VALUES () ON DUPLICATE KEY"); + + (executeSql as jest.Mock) = jest + .fn() + .mockResolvedValueOnce({ + rows: [], + fields: [], + }) + .mockResolvedValue({ + rows: [{ column: 1 }], + fields: [], + }); + // @ts-ignore + executePartialUpsertIfNotExists(TECHNICAL_RECORD_TABLE, [], undefined); + + expect(executeSql).toHaveBeenCalledTimes(1); + expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); + expect(generateSelectSql).toHaveBeenCalledTimes(1); + }); }); describe("deleteBasedOnWhereIn()", () => { - it("should call generateDeleteBasedOnWhereIn", () => { - (generateDeleteBasedOnWhereIn as jest.Mock) = jest.fn().mockReturnValue("DELETE 1"); - - (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ - rows: [], - fields: [] - }); + it("should call generateDeleteBasedOnWhereIn", () => { + (generateDeleteBasedOnWhereIn as jest.Mock) = jest + .fn() + .mockReturnValue("DELETE 1"); + + (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ + rows: [], + fields: [], + }); - // @ts-ignore - deleteBasedOnWhereIn(CUSTOM_DEFECT_TABLE.tableName, "id", [], undefined); + // @ts-ignore + deleteBasedOnWhereIn(CUSTOM_DEFECT_TABLE.tableName, "id", [], undefined); - expect(executeSql).toHaveBeenCalledTimes(1); - expect(generateDeleteBasedOnWhereIn).toHaveBeenCalledTimes(1); - expect(executeSql).toHaveBeenCalledWith("DELETE 1", [], undefined); - }); + expect(executeSql).toHaveBeenCalledTimes(1); + expect(generateDeleteBasedOnWhereIn).toHaveBeenCalledTimes(1); + expect(executeSql).toHaveBeenCalledWith("DELETE 1", [], undefined); + }); }); describe("selectRecordIds()", () => { - it("should call generateSelectRecordIds", () => { - (generateSelectRecordIds as jest.Mock) = jest.fn().mockReturnValue("SELECT 1"); - - (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ - rows: [], - fields: [] - }); + it("should call generateSelectRecordIds", () => { + (generateSelectRecordIds as jest.Mock) = jest + .fn() + .mockReturnValue("SELECT 1"); + + (executeSql as jest.Mock) = jest.fn().mockResolvedValue({ + rows: [], + fields: [], + }); - // @ts-ignore - selectRecordIds(CUSTOM_DEFECT_TABLE.tableName, [], undefined); + // @ts-ignore + selectRecordIds(CUSTOM_DEFECT_TABLE.tableName, [], undefined); - expect(executeSql).toHaveBeenCalledTimes(1); - expect(generateSelectRecordIds).toHaveBeenCalledTimes(1); - expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); - }); + expect(executeSql).toHaveBeenCalledTimes(1); + expect(generateSelectRecordIds).toHaveBeenCalledTimes(1); + expect(executeSql).toHaveBeenCalledWith("SELECT 1", [], undefined); + }); }); diff --git a/tests/unit/services/sql-generation.unitTest.ts b/tests/unit/services/sql-generation.unitTest.ts index 65f110f..77ee62e 100644 --- a/tests/unit/services/sql-generation.unitTest.ts +++ b/tests/unit/services/sql-generation.unitTest.ts @@ -1,72 +1,90 @@ import { - generateDeleteBasedOnWhereIn, - generateFullUpsertSql, - generatePartialUpsertSql, - generateSelectRecordIds, - generateSelectSql + generateDeleteBasedOnWhereIn, + generateFullUpsertSql, + generatePartialUpsertSql, + generateSelectRecordIds, + generateSelectSql, } from "../../../src/services/sql-generation"; const tableName = "myTable"; const columnNames = ["columnA", "columnZ"]; describe("generatePartialUpsertSql", () => { - it("should generate correct SQL with a default PK 'id'", async () => { - expect(generatePartialUpsertSql({ tableName, columnNames })).toEqual( - "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)" - ); - }); + it("should generate correct SQL with a default PK 'id'", async () => { + expect(generatePartialUpsertSql({ tableName, columnNames })).toEqual( + "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)" + ); + }); - it("should generate correct SQL when PK is provided", async () => { - expect(generatePartialUpsertSql({ tableName, columnNames, primaryKeyColumnName: "myId"})).toEqual( - "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `myId` = LAST_INSERT_ID(`myId`)" - ); - }); + it("should generate correct SQL when PK is provided", async () => { + expect( + generatePartialUpsertSql({ + tableName, + columnNames, + primaryKeyColumnName: "myId", + }) + ).toEqual( + "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `myId` = LAST_INSERT_ID(`myId`)" + ); + }); }); describe("generateFullUpsertSql", () => { - it("should generate correct SQL with a default PK 'id'", async () => { - expect(generateFullUpsertSql({ tableName, columnNames })).toEqual( - "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`), `columnA` = ?, `columnZ` = ?" - ); - }); + it("should generate correct SQL with a default PK 'id'", async () => { + expect(generateFullUpsertSql({ tableName, columnNames })).toEqual( + "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`), `columnA` = ?, `columnZ` = ?" + ); + }); - it("should generate correct SQL when PK is provided", async () => { - expect(generateFullUpsertSql({ tableName, columnNames, primaryKeyColumnName: "myId"})).toEqual( - "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `myId` = LAST_INSERT_ID(`myId`), `columnA` = ?, `columnZ` = ?" - ); - }); + it("should generate correct SQL when PK is provided", async () => { + expect( + generateFullUpsertSql({ + tableName, + columnNames, + primaryKeyColumnName: "myId", + }) + ).toEqual( + "INSERT INTO `myTable` (`columnA`, `columnZ`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `myId` = LAST_INSERT_ID(`myId`), `columnA` = ?, `columnZ` = ?" + ); + }); }); describe("generateSelectSql", () => { - it("should generate correct SELECT SQL with MD5 function clause, and columns placeholder", async () => { - expect(generateSelectSql({ tableName, columnNames })).toEqual( - "SELECT id insertId FROM `myTable` WHERE fingerprint = MD5(CONCAT_WS('|', IFNULL(?, ''), IFNULL(?, '')))" - ); - }); + it("should generate correct SELECT SQL with MD5 function clause, and columns placeholder", async () => { + expect(generateSelectSql({ tableName, columnNames })).toEqual( + "SELECT id insertId FROM `myTable` WHERE fingerprint = MD5(CONCAT_WS('|', IFNULL(?, ''), IFNULL(?, '')))" + ); + }); }); describe("generateDeleteBasedOnWhereIn", () => { - it("should construct a correct Delete SQL query, based on WHERE IN clause", async () => { - const targetTableName = "test_result"; - const targetColumnName = "test_result_id"; - const ids = [1, 3, 5, 6]; - - const expectedQuery = "DELETE FROM test_result WHERE test_result_id IN (?,?,?,?)"; - const result = generateDeleteBasedOnWhereIn(targetTableName, targetColumnName, ids); - expect(result).toEqual(expectedQuery); - }); + it("should construct a correct Delete SQL query, based on WHERE IN clause", async () => { + const targetTableName = "test_result"; + const targetColumnName = "test_result_id"; + const ids = [1, 3, 5, 6]; + + const expectedQuery = + "DELETE FROM test_result WHERE test_result_id IN (?,?,?,?)"; + const result = generateDeleteBasedOnWhereIn( + targetTableName, + targetColumnName, + ids + ); + expect(result).toEqual(expectedQuery); + }); }); describe("generateSelectRecordIds", () => { - it("should construct a correct Select SQL query, based on WHERE clause", async () => { - const targetTableName = "test_result"; - const attributes = { - vehicle_id: 1, - testResultId: "TEST-RESULT-ID", - }; - - const expectedQuery = "SELECT id FROM test_result WHERE vehicle_id=? AND testResultId=?"; - const result = generateSelectRecordIds(targetTableName, attributes); - expect(result).toEqual(expectedQuery); - }); + it("should construct a correct Select SQL query, based on WHERE clause", async () => { + const targetTableName = "test_result"; + const attributes = { + vehicle_id: 1, + testResultId: "TEST-RESULT-ID", + }; + + const expectedQuery = + "SELECT id FROM test_result WHERE vehicle_id=? AND testResultId=?"; + const result = generateSelectRecordIds(targetTableName, attributes); + expect(result).toEqual(expectedQuery); + }); }); diff --git a/tests/unit/services/sql-operations.unitTest.ts b/tests/unit/services/sql-operations.unitTest.ts index 3b1ce2c..c2f2e79 100644 --- a/tests/unit/services/sql-operations.unitTest.ts +++ b/tests/unit/services/sql-operations.unitTest.ts @@ -1,19 +1,19 @@ -import {deriveSqlOperation} from "../../../src/services/sql-operations"; +import { deriveSqlOperation } from "../../../src/services/sql-operations"; describe("deriveSqlOperation()", () => { - it("should return 'INSERT' for input 'INSERT'", () => { - expect(deriveSqlOperation("INSERT")).toEqual("INSERT"); - }); + it("should return 'INSERT' for input 'INSERT'", () => { + expect(deriveSqlOperation("INSERT")).toEqual("INSERT"); + }); - it("should return 'UPDATE' for input 'MODIFY'", () => { - expect(deriveSqlOperation("MODIFY")).toEqual("UPDATE"); - }); + it("should return 'UPDATE' for input 'MODIFY'", () => { + expect(deriveSqlOperation("MODIFY")).toEqual("UPDATE"); + }); - it("should return 'DELETE' for input 'REMOVE'", () => { - expect(deriveSqlOperation("REMOVE")).toEqual("DELETE"); - }); + it("should return 'DELETE' for input 'REMOVE'", () => { + expect(deriveSqlOperation("REMOVE")).toEqual("DELETE"); + }); - it("should throw error on unrecognized operation", () => { - expect(() => deriveSqlOperation("any-unknown")).toThrowError(); - }); + it("should throw error on unrecognized operation", () => { + expect(() => deriveSqlOperation("any-unknown")).toThrowError(); + }); }); diff --git a/tests/unit/updateStore.unitTest.ts b/tests/unit/updateStore.unitTest.ts index e1ce7e6..5b418f5 100644 --- a/tests/unit/updateStore.unitTest.ts +++ b/tests/unit/updateStore.unitTest.ts @@ -1,5 +1,5 @@ describe("UpdateStore function", () => { - it("should return true", () => { - expect(true).toBe(true); - }); + it("should return true", () => { + expect(true).toBe(true); + }); }); diff --git a/tests/utils/cleanser.unitTest.ts b/tests/utils/cleanser.unitTest.ts index 6c5dcf8..123543e 100644 --- a/tests/utils/cleanser.unitTest.ts +++ b/tests/utils/cleanser.unitTest.ts @@ -3,58 +3,58 @@ import { TechRecordDocument } from "../../src/models/tech-record-document"; import { vinCleanser } from "../../src/utils/cleanser"; describe("fingerprintCleanser function", () => { - it("should trim and null empty strings from data", () => { - const bodyType: BodyType = { - code: "m", - description: "skeletal", - }; - - const originalData = [ - 1234, - " Trim Me", - " ", - " ", - "", - bodyType.code, - bodyType.description, - ]; - - const expectedCleansedData = [ - 1234, - "Trim Me", - null, - null, - null, - bodyType.code, - bodyType.description, - ]; - - const cleansedData = originalData.fingerprintCleanser(); - - expect(cleansedData[0]).toBe(expectedCleansedData[0]); - expect(cleansedData[1]).toBe(expectedCleansedData[1]); - expect(cleansedData[2]).toBe(expectedCleansedData[2]); - expect(cleansedData[3]).toBe(expectedCleansedData[3]); - expect(cleansedData[4]).toBe(expectedCleansedData[4]); - expect(cleansedData[5]).toBe(expectedCleansedData[5]); - expect(cleansedData[6]).toBe(expectedCleansedData[6]); - }); + it("should trim and null empty strings from data", () => { + const bodyType: BodyType = { + code: "m", + description: "skeletal", + }; + + const originalData = [ + 1234, + " Trim Me", + " ", + " ", + "", + bodyType.code, + bodyType.description, + ]; + + const expectedCleansedData = [ + 1234, + "Trim Me", + null, + null, + null, + bodyType.code, + bodyType.description, + ]; + + const cleansedData = originalData.fingerprintCleanser(); + + expect(cleansedData[0]).toBe(expectedCleansedData[0]); + expect(cleansedData[1]).toBe(expectedCleansedData[1]); + expect(cleansedData[2]).toBe(expectedCleansedData[2]); + expect(cleansedData[3]).toBe(expectedCleansedData[3]); + expect(cleansedData[4]).toBe(expectedCleansedData[4]); + expect(cleansedData[5]).toBe(expectedCleansedData[5]); + expect(cleansedData[6]).toBe(expectedCleansedData[6]); + }); }); describe("vinCleanser function", () => { - it("should remove all non alphanumeric characters", () => { - const techRecord: TechRecordDocument = { - vin: " V!I-N&1[2 ]3`45 " - }; - const cleansedVin = vinCleanser(techRecord.vin); + it("should remove all non alphanumeric characters", () => { + const techRecord: TechRecordDocument = { + vin: " V!I-N&1[2 ]3`45 ", + }; + const cleansedVin = vinCleanser(techRecord.vin); - expect(cleansedVin).toBe("VIN12345"); - }); + expect(cleansedVin).toBe("VIN12345"); + }); - it("should convert a null vin to an empty string", () => { - const techRecord: TechRecordDocument = {}; - const cleansedVin = vinCleanser(techRecord.vin); + it("should convert a null vin to an empty string", () => { + const techRecord: TechRecordDocument = {}; + const cleansedVin = vinCleanser(techRecord.vin); - expect(cleansedVin).toBe(""); - }); + expect(cleansedVin).toBe(""); + }); }); diff --git a/tests/utils/padwithtwos.unitTest.ts b/tests/utils/padwithtwos.unitTest.ts index b1b601b..83e6052 100644 --- a/tests/utils/padwithtwos.unitTest.ts +++ b/tests/utils/padwithtwos.unitTest.ts @@ -1,14 +1,12 @@ import { padWithZeros } from "../../src/utils/padwithzeros"; describe("padWithZeros", () => { - it("pads a number with zeros to the left if it is less than the maximum size", () => { - expect(padWithZeros(7, 3)).toEqual("007"); - expect(padWithZeros(7, 5)).toEqual("00007"); - expect(padWithZeros(42, 3)).toEqual("042"); - expect(padWithZeros(123, 3)).toEqual("123"); - expect(padWithZeros(123, 5)).toEqual("00123"); - expect(padWithZeros(12345, 5)).toEqual("12345"); - }); + it("pads a number with zeros to the left if it is less than the maximum size", () => { + expect(padWithZeros(7, 3)).toEqual("007"); + expect(padWithZeros(7, 5)).toEqual("00007"); + expect(padWithZeros(42, 3)).toEqual("042"); + expect(padWithZeros(123, 3)).toEqual("123"); + expect(padWithZeros(123, 5)).toEqual("00123"); + expect(padWithZeros(12345, 5)).toEqual("12345"); }); - - +}); diff --git a/tsconfig.json b/tsconfig.json index af8e33e..cf02692 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,23 @@ { "compilerOptions": { /* Basic Options */ - "target": "ES2019", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "target": "ES2019" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, "lib": [ "es2019", "dom" - ], /* Specify library files to be included in the compilation. */ + ] /* Specify library files to be included in the compilation. */, // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": ".build", /* Redirect output structure to the directory. */ - "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + "outDir": ".build" /* Redirect output structure to the directory. */, + "rootDir": "./" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */, // "composite": true, /* Enable project compilation */ // "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ @@ -24,13 +26,13 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ + "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "strictNullChecks": true, /* Enable strict null checks. */ + "strictNullChecks": true /* Enable strict null checks. */, // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, /* Additional Checks */ // "noUnusedLocals": true, /* Report errors on unused locals. */ @@ -46,7 +48,7 @@ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ @@ -56,8 +58,9 @@ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ - "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - "resolveJsonModule": true + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, + "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, + "resolveJsonModule": true, + "types": [] } }