diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 000000000..b8cb2f523 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,13 @@ +name: pre-commit + +on: push + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + - uses: pre-commit/action@v3.0.0 + with: + extra_args: "detect-secrets --all-files" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f047d2357..34a8d50cf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,22 +1,24 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks ---- -default_stages: [commit] repos: - repo: https://github.com/Yelp/detect-secrets rev: v1.4.0 hooks: - id: detect-secrets - args: ['--baseline', '.secrets.baseline'] + args: ["--baseline", ".secrets.baseline"] - repo: https://github.com/pre-commit/mirrors-eslint - rev: "v8.30.0" # Use the sha / tag you want to point at + rev: v8.55.0 hooks: - id: eslint files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx types: [file] - repo: https://github.com/pre-commit/mirrors-prettier - rev: "v3.0.0-alpha.4" + rev: v3.1.0 hooks: - id: prettier types_or: ["javascript", "ts", "json"] -# - repo: https://github.com/mattlqx/pre-commit-sign + - repo: https://github.com/aws-cloudformation/cfn-lint + rev: v0.83.5 + hooks: + - id: cfn-lint + files: .template\.ya?ml$ \ No newline at end of file diff --git a/.secrets.baseline b/.secrets.baseline index 304896e35..499dbb5bd 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -75,10 +75,6 @@ { "path": "detect_secrets.filters.allowlist.is_line_allowlisted" }, - { - "path": "detect_secrets.filters.common.is_baseline_file", - "filename": ".secrets.baseline" - }, { "path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies", "min_level": 2 @@ -151,6 +147,22 @@ "line_number": 67 } ], + "src/tests/contract/data/session-items.json": [ + { + "type": "Hex High Entropy String", + "filename": "src/tests/contract/data/session-items.json", + "hashed_secret": "2f926f5c3897276b38dbce0691766d2ced5f12b4", + "is_verified": false, + "line_number": 25 + }, + { + "type": "Hex High Entropy String", + "filename": "src/tests/contract/data/session-items.json", + "hashed_secret": "58169924a523ee2b149e0d04214511885b6725a7", + "is_verified": false, + "line_number": 40 + } + ], "src/tests/unit/services/AccessTokenRequestProcessor.test.ts": [ { "type": "Hex High Entropy String", @@ -166,9 +178,9 @@ "filename": "src/tests/unit/services/AuthorizationRequestProcessor.test.ts", "hashed_secret": "0d2014cdd47d3f9053abb0d85fecde96189eba65", "is_verified": false, - "line_number": 24 + "line_number": 25 } ] }, - "generated_at": "2023-09-18T14:15:06Z" + "generated_at": "2024-02-21T15:19:52Z" } diff --git a/README.md b/README.md index 6c2971dd1..05d9cfb1b 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,77 @@ sam deploy --resolve-s3 --stack-name "YOUR_STACK_NAME" --confirm-changeset --con ``` If you need the reserved concurrencies set in DEV then add `ApplyReservedConcurrencyInDev=\"true\"` in to the `--parameter-overrides`. -Please only do this whilst you need them, if lots of stacks are deployed with these in DEV then deployments will start failing. \ No newline at end of file +Please only do this whilst you need them, if lots of stacks are deployed with these in DEV then deployments will start failing. + +### Code Owners + +This repo has a `CODEOWNERS` file in the root and is configured to require PRs to reviewed by Code Owners. + +## Pre-Commit Checking / Verification + +There is a `.pre-commit-config.yaml` configuration setup in this repo, this uses [pre-commit](https://pre-commit.com/) to verify your commit before actually committing, it runs the following checks: + +- Check Json files for formatting issues +- Fixes end of file issues (it will auto correct if it spots an issue - you will need to run the git commit again after it has fixed the issue) +- It automatically removes trailing whitespaces (again will need to run commit again after it detects and fixes the issue) +- Detects aws credentials or private keys accidentally added to the repo +- runs cloud formation linter and detects issues +- runs checkov and checks for any issues +- runs detect-secrets to check for secrets accidentally added - where these are false positives, the `.secrets.baseline` file should be updated by running `detect-secrets scan > .secrets.baseline` + +### Dependency Installation + +To use this locally you will first need to install the dependencies, this can be done in 2 ways: + +#### Method 1 - Python pip + +Run the following in a terminal: + +``` +sudo -H pip3 install checkov pre-commit cfn-lint +``` + +this should work across platforms + +#### Method 2 - Brew + +If you have brew installed please run the following: + +``` +brew install pre-commit ;\ +brew install cfn-lint ;\ +brew install checkov +``` + +### Post Installation Configuration + +once installed run: + +``` +pre-commit install +``` + +To update the various versions of the pre-commit plugins, this can be done by running: + +``` +pre-commit autoupdate && pre-commit install +``` + +This will install / configure the pre-commit git hooks, if it detects an issue while committing it will produce an output like the following: + +``` + git commit -a +check json...........................................(no files to check)Skipped +fix end of files.........................................................Passed +trim trailing whitespace.................................................Passed +detect aws credentials...................................................Passed +detect private key.......................................................Passed +AWS CloudFormation Linter................................................Failed +- hook id: cfn-python-lint +- exit code: 4 +W3011 Both UpdateReplacePolicy and DeletionPolicy are needed to protect Resources/PublicHostedZone from deletion +core/deploy/dns-zones/template.yaml:20:3 +Checkov..............................................(no files to check)Skipped +- hook id: checkov +``` + diff --git a/deploy/f2f-spec.yaml b/deploy/f2f-spec.yaml index a0599c533..e26c9c4da 100644 --- a/deploy/f2f-spec.yaml +++ b/deploy/f2f-spec.yaml @@ -1034,10 +1034,11 @@ components: description: claimed expiry date for the document to be presented at the post office post_office_selection: type: object - additionalProperties: false + additionalProperties: true required: - address - post_code + - fad_code properties: name: type: string @@ -1069,6 +1070,10 @@ components: description: Post code of post office example: "N1 2AA" pattern: ^[A-Za-z]{1,2}\d[A-Za-z\d]?\ ?\d[a-zA-Z]{2}$|^[Gg][Ii][Rr]\s?0[Aa]{2}$|^[Bb][Ff][Pp][Oo]\ ?\d{1,4}$ + fad_code: + type: string + description: Fad code of post office + example: "004010X" JWKSFile: type: object required: diff --git a/deploy/template.yaml b/deploy/template.yaml index 4de0b09d8..fed9f1ccf 100644 --- a/deploy/template.yaml +++ b/deploy/template.yaml @@ -293,7 +293,7 @@ Globals: DT_OPEN_TELEMETRY_ENABLE_INTEGRATION: "true" # These should always be alphabetically organised. AWS_STACK_NAME: !Sub ${AWS::StackName} # The AWS Stack Name, as passed into the template. - POWERTOOLS_LOG_LEVEL: DEBUG # The LogLevel for the AWS PowerTools LogHelper + POWERTOOLS_LOG_LEVEL: !If [IsNotProdLikeEnvironment, "DEBUG", "INFO"] # The LogLevel for the AWS PowerTools LogHelper POWERTOOLS_METRICS_NAMESPACE: F2F-CRI # The Metric Namespace for the AWS PowerTools MetricHelper RESOURCES_TTL_SECS: !FindInMap [EnvironmentVariables, !Ref Environment, RESOURCETTLSECS] SESSION_TABLE: @@ -999,6 +999,7 @@ Resources: TXMA_QUEUE_URL: !Ref TxMASQSQueue KMS_KEY_ARN: Fn::ImportValue: !Sub "${L2KMSStackName}-vc-signing-key" + DNSSUFFIX: !FindInMap [ EnvironmentVariables, !Ref Environment, DNSSUFFIX ] Policies: - AWSLambdaBasicExecutionRole - AWSXrayWriteOnlyAccess @@ -2016,9 +2017,9 @@ Resources: Properties: ActionsEnabled: true AlarmActions: - - !ImportValue platform-alarm-topic-critical-alert + - !ImportValue platform-alarm-topic-slack-warning-alert OKActions: - - !ImportValue platform-alarm-topic-critical-alert + - !ImportValue platform-alarm-topic-slack-warning-alert InsufficientDataActions: [] AlarmDescription: !Sub "Trigger the alarm if over 80% of GovNotify concurrency is used. ${SupportManualURL}" AlarmName: !Sub "${AWS::StackName}-GovNotifyFunction-concurrency" @@ -2701,6 +2702,7 @@ Resources: YOTIBASEURL: !FindInMap [ EnvironmentVariables, !Ref Environment, YOTIBASEURL ] KMS_KEY_ARN: Fn::ImportValue: !Sub "${L2KMSStackName}-vc-signing-key" + DNSSUFFIX: !FindInMap [ EnvironmentVariables, !Ref Environment, DNSSUFFIX ] IPV_CORE_QUEUE_URL: !Ref IPVCoreSQSQueue YOTI_SESSION_TTL_DAYS: !FindInMap [EnvironmentVariables, !Ref Environment, YOTISESSIONTTLDAYS] Policies: @@ -5801,6 +5803,10 @@ Outputs: Condition: IsNotProdLikeEnvironment Description: "F2F Test Harness" Value: !FindInMap [EnvironmentVariables, !Ref Environment, TESTHARNESSURL] + DNSSuffix: + Condition: IsNotProdLikeEnvironment + Description: "F2F DNS Suffix" + Value: !FindInMap [EnvironmentVariables, !Ref Environment, DNSSUFFIX] F2FGovNotifyURL: Condition: IsNotProdLikeEnvironment Description: "F2F Gov Notify API" @@ -5809,3 +5815,8 @@ Outputs: Condition: IsNotProdLikeEnvironment Description: "F2F Post Office Stub API" Value: !FindInMap [EnvironmentVariables, !Ref Environment, POSTOFFICESTUBAPI] + VcSigningKeyId: + Condition: IsNotProdLikeEnvironment + Description: "Signing Key used to sign VC" + Value: + Fn::ImportValue: !Sub "${L2KMSStackName}-vc-signing-key-id" \ No newline at end of file diff --git a/f2f-ipv-stub/src/handlers/startF2fCheck.ts b/f2f-ipv-stub/src/handlers/startF2fCheck.ts index 6fd77eb64..979d6583c 100644 --- a/f2f-ipv-stub/src/handlers/startF2fCheck.ts +++ b/f2f-ipv-stub/src/handlers/startF2fCheck.ts @@ -16,6 +16,8 @@ export const v3KmsClient = new KMSClient({ maxAttempts: 2, }); +let frontendURL: string; + export const handler = async ( event: APIGatewayProxyEvent ): Promise => { @@ -24,6 +26,7 @@ export const handler = async ( if (overrides?.target != null) { config.jwksUri = overrides.target; } + frontendURL = overrides?.frontendURL != null ? overrides.frontendURL : config.oauthUri const defaultClaims = { name: [ { @@ -71,7 +74,7 @@ export const handler = async ( overrides?.gov_uk_signin_journey_id != null ? overrides?.gov_uk_signin_journey_id : crypto.randomBytes(16).toString("hex"), - aud: config.oauthUri, + aud: frontendURL, iss: "https://ipv.core.account.gov.uk", client_id: config.clientId, state: crypto.randomBytes(16).toString("hex"), @@ -107,7 +110,7 @@ export const handler = async ( request, responseType: "code", clientId: config.clientId, - AuthorizeLocation: `${process.env.OAUTH_FRONT_BASE_URI}/oauth2/authorize?request=${request}&response_type=code&client_id=${config.clientId}`, + AuthorizeLocation: `${frontendURL}/oauth2/authorize?request=${request}&response_type=code&client_id=${config.clientId}`, sub: payload.sub, state: payload.state, }), diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 61f61bf15..000000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "di-ipv-cri-f2f-api", - "lockfileVersion": 2, - "requires": true, - "packages": {} -} diff --git a/run-tests.sh b/run-tests.sh index f8607afa5..0087bac6c 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -19,6 +19,10 @@ export DEV_F2F_TEST_HARNESS_URL=$(remove_quotes "$CFN_F2FTestHarnessURL") export GOV_NOTIFY_API=$(remove_quotes "$CFN_F2FGovNotifyURL") # shellcheck disable=SC2154 export DEV_F2F_PO_STUB_URL=$(remove_quotes "$CFN_F2FPostOfficeStubURL") +# shellcheck disable=SC2154 +export VC_SIGNING_KEY_ID=$(remove_quotes "$CFN_VcSigningKeyId") +# shellcheck disable=SC2154 +export DNS_SUFFIX=$(remove_quotes "$CFN_DNSSuffix") cd /src; npm run test:api cp -rf results $TEST_REPORT_ABSOLUTE_DIR diff --git a/src/.env.example b/src/.env.example index ffb34757d..643d34ea8 100644 --- a/src/.env.example +++ b/src/.env.example @@ -7,3 +7,4 @@ DEV_F2F_MISSING_SUB_ACCESS_TOKEN= DEV_F2F_YOTI_STUB_URL= DEV_F2F_PO_STUB_URL= GOV_NOTIFY_API= +DNS_SUFFIX= \ No newline at end of file diff --git a/src/jest.setup.ts b/src/jest.setup.ts index 30bbb4561..a52fc899a 100644 --- a/src/jest.setup.ts +++ b/src/jest.setup.ts @@ -1,5 +1,6 @@ process.env.SESSION_TABLE = 'SESSIONTABLE' process.env.KMS_KEY_ARN = 'MYKMSKEY' +process.env.DNSSUFFIX = "DNSSUFFIX" process.env.ISSUER = 'https://XXX-c.env.account.gov.uk' process.env.TXMA_QUEUE_URL = "MYQUEUE" process.env.CLIENT_CONFIG = '[{"jwksEndpoint":"https://api.identity.account.gov.uk/.well-known/jwks.json","clientId":"ipv-core-stub","redirectUri":"http://localhost:8085/callback"}]' diff --git a/src/models/YotiPayloads.ts b/src/models/YotiPayloads.ts index c720d3105..625a028be 100644 --- a/src/models/YotiPayloads.ts +++ b/src/models/YotiPayloads.ts @@ -22,6 +22,7 @@ export interface PostOfficeInfo { latitude: number; longitude: number; }; + fad_code: string; } export interface CreateSessionPayload { diff --git a/src/models/enums/MessageCodes.ts b/src/models/enums/MessageCodes.ts index 8d839196c..61bbec00a 100644 --- a/src/models/enums/MessageCodes.ts +++ b/src/models/enums/MessageCodes.ts @@ -14,7 +14,7 @@ export enum MessageCodes { FAILED_DECRYPTING_JWE = "FAILED_DECRYPTING_JWE", FAILED_VALIDATING_SESSION_ID = "FAILED_VALIDATING_SESSION_ID", FAILED_DECODING_JWT = "FAILED_DECODING_JWT", - FAILED_VERIFYING_JWT = "FAILED_VERIFYING_JWT", + FAILED_VERIFYING_JWT = "F2F_FAILED_VERIFYING_JWT", MISSING_HEADER = "MISSING_HEADER", EXPIRED_SESSION = "EXPIRED_SESSION", INCORRECT_SESSION_STATE = "INCORRECT_SESSION_STATE", diff --git a/src/package-lock.json b/src/package-lock.json index c9acd8f41..38ff955d0 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -20,20 +20,27 @@ "@aws-sdk/credential-providers": "3.352.0", "@aws-sdk/lib-dynamodb": "3.150.0", "@aws-sdk/node-http-handler": "^3.374.0", + "@pact-foundation/pact": "^12.1.3", "aws-xray-sdk-core": "^3.4.1", "axios": ">=1.3.4", + "body-parser": "^1.20.2", "class-validator": "0.14.0", + "cross-env": "^7.0.3", "ecdsa-sig-formatter": "^1.0.11", "esbuild": "0.14.14", + "express": "^4.18.2", + "express-asyncify": "^2.1.2", "jose": "^5.2.1", "lodash": "^4.17.21", "node-jose": "^2.1.1", - "notifications-node-client": "^7.0.0" + "notifications-node-client": "^7.0.0", + "npm-run-all": "^4.1.5" }, "devDependencies": { "@aws-cdk/assertions": "^1.172.0", "@aws-cdk/yaml-cfn": "^1.172.0", "@types/aws-lambda": "^8.10.109", + "@types/express": "^4.17.21", "@types/jest": "^29.4.0", "@types/js-yaml": "^4.0.5", "@types/node": "^18.11.18", @@ -58,10 +65,11 @@ "jest-mock-extended": "^3.0.1", "prettier": "^2.8.4", "ts-jest": "^29.0.5", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "ts-standard": "^12.0.2", "tslint": "^6.1.3", "typescript": "^4.9.4", + "wait-on": "^7.2.0", "yaml-cfn": "^0.3.2" }, "engines": { @@ -3527,6 +3535,21 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -4028,6 +4051,120 @@ "node": ">= 8" } }, + "node_modules/@pact-foundation/pact": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/@pact-foundation/pact/-/pact-12.1.3.tgz", + "integrity": "sha512-IUGNzLUl3ry/iLTY2oaaFLZMM/LkQZgURT4+w1K5HL0TYAX1T0M5ZNoZ+FEe37XKPD5+EUjSA3QPkdHc94hKPA==", + "dependencies": { + "@pact-foundation/pact-core": "^14.1.1", + "@types/express": "^4.17.11", + "axios": "^1.6.1", + "body-parser": "^1.20.0", + "cli-color": "^2.0.1", + "express": "^4.18.1", + "graphql": "^14.0.0", + "graphql-tag": "^2.9.1", + "http-proxy": "^1.18.1", + "js-base64": "^3.6.1", + "lodash": "^4.17.21", + "lodash.isfunction": "3.0.8", + "lodash.isnil": "4.0.0", + "lodash.isundefined": "3.0.1", + "lodash.omit": "^4.5.0", + "lodash.omitby": "4.6.0", + "pkginfo": "^0.4.1", + "ramda": "^0.28.0", + "randexp": "^0.5.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@pact-foundation/pact-core": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@pact-foundation/pact-core/-/pact-core-14.1.2.tgz", + "integrity": "sha512-H4eqPaSAl2K1U+Xgkos9wmjXuvOQ3Uzg83j7Dgtrs9l42ByGKIdN+6KG3HE5fPMbh5sCmCedKKle6zWqjIT83w==", + "cpu": [ + "x64", + "ia32", + "arm64" + ], + "hasInstallScript": true, + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "chalk": "4.1.2", + "check-types": "7.3.0", + "cross-spawn": "7.0.3", + "mkdirp": "1.0.0", + "needle": "^3.2.0", + "node-gyp-build": "^4.6.0", + "pino": "^8.7.0", + "pino-pretty": "^9.1.1", + "promise-timeout": "1.3.0", + "rimraf": "2.6.2", + "underscore": "1.12.1", + "unixify": "1.0.0" + }, + "bin": { + "pact": "bin/pact.js", + "pact-broker": "bin/pact-broker.js", + "pact-message": "bin/pact-message.js", + "pact-mock-service": "bin/pact-mock-service.js", + "pact-provider-verifier": "bin/pact-provider-verifier.js", + "pact-stub-service": "bin/pact-stub-service.js", + "pactflow": "bin/pactflow.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@pact-foundation/pact-core/node_modules/mkdirp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.0.tgz", + "integrity": "sha512-4Pb+8NJ5DdvaWD797hKOM28wMXsObb4HppQdIwKUHFiB69ICZ4wktOE+qsGGBy7GtwgYNizp0R9KEy4zKYBLMg==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pact-foundation/pact-core/node_modules/rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dependencies": { + "glob": "^7.0.5" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "node_modules/@sinclair/typebox": { "version": "0.25.23", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.23.tgz", @@ -4910,6 +5047,15 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, "node_modules/@types/cls-hooked": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@types/cls-hooked/-/cls-hooked-4.3.3.tgz", @@ -4918,6 +5064,36 @@ "@types/node": "*" } }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -4927,6 +5103,11 @@ "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -4979,6 +5160,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "node_modules/@types/node": { "version": "18.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", @@ -4999,12 +5185,41 @@ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -5237,6 +5452,29 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -5323,7 +5561,6 @@ "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" }, @@ -5363,7 +5600,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -5372,6 +5608,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -5472,7 +5713,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -5510,11 +5750,18 @@ "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", "integrity": "sha512-EFGCRj4kLX1dHv1cDzTk+xbjBFj1GnJDpui52YmEcxxHHEWjYyT6l51U7n6WQ28osZH4S9gSybxe56Vm7vB61Q==" }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, "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==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -5569,11 +5816,11 @@ } }, "node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.6.tgz", + "integrity": "sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5672,8 +5919,7 @@ "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==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -5702,6 +5948,42 @@ "node": ">=6.0.0" } }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -5711,7 +5993,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5830,11 +6111,18 @@ "semver": "^7.0.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", @@ -5882,7 +6170,6 @@ "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" @@ -5903,6 +6190,11 @@ "node": ">=10" } }, + "node_modules/check-types": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz", + "integrity": "sha512-bzDMlwEIZFtyK70RHwQhMCvXpPyJZgOCCKlvH9oAJz4quUQse8ZynYE5RQzKpY7b5PoL6G+jQMcZzUPD4p6tFg==" + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -5934,6 +6226,21 @@ "validator": "^13.7.0" } }, + "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==", + "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" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -5989,7 +6296,6 @@ "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" }, @@ -6000,8 +6306,12 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -6032,8 +6342,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", @@ -6050,23 +6359,71 @@ "node": ">= 14.17.0" } }, + "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==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "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==", "dev": true }, + "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==", + "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-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", @@ -6076,6 +6433,23 @@ "node": ">= 8" } }, + "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==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6118,7 +6492,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -6132,7 +6505,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -6152,6 +6524,23 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -6215,6 +6604,14 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -6223,6 +6620,11 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/electron-to-chromium": { "version": "1.4.301", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.301.tgz", @@ -6255,11 +6657,26 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "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" } @@ -6268,7 +6685,6 @@ "version": "1.22.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", @@ -6321,7 +6737,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -6344,7 +6759,6 @@ "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", @@ -6357,11 +6771,55 @@ "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==", + "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==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "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==", + "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==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/esbuild": { "version": "0.14.14", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.14.tgz", @@ -6616,6 +7074,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -7337,6 +7800,44 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -7385,20 +7886,140 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-asyncify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/express-asyncify/-/express-asyncify-2.1.2.tgz", + "integrity": "sha512-LHtXdJ0Op1K7K/daRMzAIHdYluk6GE3GBX7HlmrltpC1XNu8VwTYQv0U6xHyFCTpe5HAYdbVaGQxQcywTDWZeQ==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "express": "^4.18.2" + } }, - "node_modules/fast-glob": { - "version": "3.2.12", + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fast-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", + "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + }, + "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-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, @@ -7437,6 +8058,19 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fast-xml-parser": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", @@ -7501,6 +8135,36 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -7537,9 +8201,9 @@ "dev": true }, "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==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -7559,7 +8223,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -7577,11 +8240,26 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -7601,7 +8279,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7610,7 +8287,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -7628,7 +8304,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7655,7 +8330,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, "dependencies": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -7703,7 +8377,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -7719,7 +8392,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7766,7 +8438,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -7801,7 +8472,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -7812,8 +8482,7 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -7821,11 +8490,35 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphql": { + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", + "dependencies": { + "iterall": "^1.2.2" + }, + "engines": { + "node": ">= 6.x" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -7837,7 +8530,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7846,7 +8538,6 @@ "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" } @@ -7855,7 +8546,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.2" }, @@ -7867,7 +8557,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7879,7 +8568,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7891,7 +8579,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -7906,7 +8593,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7914,12 +8600,104 @@ "node": ">= 0.4" } }, + "node_modules/help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/help-me/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/help-me/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/help-me/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==" + }, "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-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7929,6 +8707,17 @@ "node": ">=10.17.0" } }, + "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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -8005,7 +8794,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8014,14 +8802,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -8031,11 +8817,18 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -8048,14 +8841,12 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, @@ -8067,7 +8858,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8083,7 +8873,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8095,7 +8884,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -8107,7 +8895,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8161,7 +8948,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8182,7 +8968,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8202,11 +8987,15 @@ "node": ">=8" } }, + "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==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8222,7 +9011,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -8246,7 +9034,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -8261,7 +9048,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -8276,7 +9062,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, "dependencies": { "which-typed-array": "^1.1.11" }, @@ -8291,7 +9076,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2" }, @@ -8302,14 +9086,12 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -8386,6 +9168,11 @@ "node": ">=8" } }, + "node_modules/iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, "node_modules/jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", @@ -8993,6 +9780,19 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/joi": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.0.tgz", + "integrity": "sha512-HSLsmSmXz+PV9PYoi3p7cgIbj06WnEBNT28n+bbBNcPZXZFqCzzvGqpTBPujx/Z0nh1+KNQPDrNgdmQ8dq0qYw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.4", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/jose": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.1.tgz", @@ -9001,6 +9801,19 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-base64": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.6.tgz", + "integrity": "sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==" + }, "node_modules/js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", @@ -9053,8 +9866,7 @@ "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 + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -9207,6 +10019,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.isfunction": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz", + "integrity": "sha512-WQj3vccQSW5IKeRl8F0bezPlZH5/LFXtNPICsbZLsv+HmVfWAfrzy2ZajGqmNLonIjPIcPOk3uXOGv5jgPgTyg==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9218,6 +10045,16 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "node_modules/lodash.omitby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.omitby/-/lodash.omitby-4.6.0.tgz", + "integrity": "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==" + }, "node_modules/long": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", @@ -9244,6 +10081,14 @@ "yallist": "^3.0.2" } }, + "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==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -9283,6 +10128,42 @@ "tmpl": "1.0.5" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "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/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9298,6 +10179,14 @@ "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==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -9311,6 +10200,17 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -9343,7 +10243,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9355,7 +10254,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9397,6 +10295,50 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -9405,6 +10347,16 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -9433,13 +10385,32 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "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==", + "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/normalize-package-data/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" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/notifications-node-client": { @@ -9463,6 +10434,155 @@ "follow-redirects": "^1.14.7" } }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/npm-run-all/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==", + "dependencies": { + "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/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/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" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -9488,7 +10608,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9497,7 +10616,6 @@ "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" } @@ -9506,7 +10624,6 @@ "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -9598,11 +10715,29 @@ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -9713,6 +10848,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9726,7 +10869,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9735,7 +10877,6 @@ "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" } @@ -9743,8 +10884,12 @@ "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 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -9773,6 +10918,17 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -9782,6 +10938,65 @@ "node": ">=6" } }, + "node_modules/pino": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.18.0.tgz", + "integrity": "sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-9.4.1.tgz", + "integrity": "sha512-loWr5SNawVycvY//hamIzyz3Fh5OSpvkcO13MwdDW+eKIGylobPLqnVGTDwDXkdmpJd1BhEG+qhDw09h6SqJiQ==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -9953,6 +11168,14 @@ "node": ">=8" } }, + "node_modules/pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -10023,6 +11246,16 @@ "node": ">= 0.6.0" } }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "node_modules/promise-timeout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz", + "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -10053,11 +11286,32 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "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" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -10067,6 +11321,20 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10087,12 +11355,149 @@ } ] }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/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==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/regexp-tree": { "version": "0.1.24", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", @@ -10106,7 +11511,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10131,6 +11535,11 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "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": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -10149,11 +11558,15 @@ "node": ">=0.10.0" } }, + "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==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10205,6 +11618,14 @@ "node": ">=10" } }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -10253,11 +11674,19 @@ "queue-microtask": "^1.2.2" } }, + "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" + } + }, "node_modules/safe-array-concat": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "get-intrinsic": "^1.2.2", @@ -10303,7 +11732,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -10313,6 +11741,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "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/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -10343,11 +11794,65 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/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==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-function-length": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, "dependencies": { "define-data-property": "^1.1.1", "function-bind": "^1.1.2", @@ -10363,7 +11868,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, "dependencies": { "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", @@ -10373,11 +11877,15 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "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" }, @@ -10389,11 +11897,18 @@ "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/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -10403,7 +11918,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -10434,6 +11948,14 @@ "node": ">=8" } }, + "node_modules/sonic-boom": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", + "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10453,17 +11975,24 @@ "source-map": "^0.6.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, "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==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "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==", - "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10472,8 +12001,15 @@ "node_modules/spdx-license-ids": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } }, "node_modules/sprintf-js": { "version": "1.0.3", @@ -10657,6 +12193,22 @@ "node": ">=6" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -10703,11 +12255,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.padend": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10724,7 +12291,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10738,7 +12304,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10782,7 +12347,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -10799,7 +12363,6 @@ "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" }, @@ -10811,7 +12374,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -10839,6 +12401,23 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "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==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -10866,6 +12445,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-essentials": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", @@ -10919,9 +12506,9 @@ } }, "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==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -11200,6 +12787,11 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/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-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11233,11 +12825,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -11251,7 +12854,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -11269,7 +12871,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11288,7 +12889,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -11315,7 +12915,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -11326,6 +12925,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unixify/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -11361,6 +12995,19 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -11395,6 +13042,15 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -11403,6 +13059,33 @@ "node": ">= 0.10" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wait-on": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "dev": true, + "dependencies": { + "axios": "^1.6.1", + "joi": "^17.11.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -11416,7 +13099,6 @@ "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" }, @@ -11431,7 +13113,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -11447,7 +13128,6 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.4", @@ -11491,8 +13171,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -14386,6 +16065,21 @@ } } }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, "@humanwhocodes/config-array": { "version": "0.11.8", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", @@ -14776,6 +16470,87 @@ "fastq": "^1.6.0" } }, + "@pact-foundation/pact": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/@pact-foundation/pact/-/pact-12.1.3.tgz", + "integrity": "sha512-IUGNzLUl3ry/iLTY2oaaFLZMM/LkQZgURT4+w1K5HL0TYAX1T0M5ZNoZ+FEe37XKPD5+EUjSA3QPkdHc94hKPA==", + "requires": { + "@pact-foundation/pact-core": "^14.1.1", + "@types/express": "^4.17.11", + "axios": "^1.6.1", + "body-parser": "^1.20.0", + "cli-color": "^2.0.1", + "express": "^4.18.1", + "graphql": "^14.0.0", + "graphql-tag": "^2.9.1", + "http-proxy": "^1.18.1", + "js-base64": "^3.6.1", + "lodash": "^4.17.21", + "lodash.isfunction": "3.0.8", + "lodash.isnil": "4.0.0", + "lodash.isundefined": "3.0.1", + "lodash.omit": "^4.5.0", + "lodash.omitby": "4.6.0", + "pkginfo": "^0.4.1", + "ramda": "^0.28.0", + "randexp": "^0.5.3" + } + }, + "@pact-foundation/pact-core": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@pact-foundation/pact-core/-/pact-core-14.1.2.tgz", + "integrity": "sha512-H4eqPaSAl2K1U+Xgkos9wmjXuvOQ3Uzg83j7Dgtrs9l42ByGKIdN+6KG3HE5fPMbh5sCmCedKKle6zWqjIT83w==", + "requires": { + "chalk": "4.1.2", + "check-types": "7.3.0", + "cross-spawn": "7.0.3", + "mkdirp": "1.0.0", + "needle": "^3.2.0", + "node-gyp-build": "^4.6.0", + "pino": "^8.7.0", + "pino-pretty": "^9.1.1", + "promise-timeout": "1.3.0", + "rimraf": "2.6.2", + "underscore": "1.12.1", + "unixify": "1.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.0.tgz", + "integrity": "sha512-4Pb+8NJ5DdvaWD797hKOM28wMXsObb4HppQdIwKUHFiB69ICZ4wktOE+qsGGBy7GtwgYNizp0R9KEy4zKYBLMg==" + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + } + } + }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, "@sinclair/typebox": { "version": "0.25.23", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.23.tgz", @@ -15521,6 +17296,15 @@ "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, "@types/cls-hooked": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@types/cls-hooked/-/cls-hooked-4.3.3.tgz", @@ -15529,6 +17313,36 @@ "@types/node": "*" } }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -15538,6 +17352,11 @@ "@types/node": "*" } }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -15590,6 +17409,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + }, "@types/node": { "version": "18.13.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", @@ -15610,12 +17434,41 @@ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, + "@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -15751,6 +17604,23 @@ "eslint-visitor-keys": "^3.3.0" } }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -15809,7 +17679,6 @@ "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" } @@ -15840,12 +17709,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, "requires": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" } }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -15919,7 +17792,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", @@ -15948,11 +17820,15 @@ "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", "integrity": "sha512-EFGCRj4kLX1dHv1cDzTk+xbjBFj1GnJDpui52YmEcxxHHEWjYyT6l51U7n6WQ28osZH4S9gSybxe56Vm7vB61Q==" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, "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==", - "dev": true + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, "aws-xray-sdk-core": { "version": "3.4.1", @@ -15991,11 +17867,11 @@ } }, "axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.6.tgz", + "integrity": "sha512-XZLZDFfXKM9U/Y/B4nNynfCRUqNyVZ4sBC/n9GDRCkq9vd2mIvKjKKsbIh1WPmHmNbg6ND7cTBY3Y2+u1G3/2Q==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -16073,8 +17949,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -16086,6 +17961,40 @@ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==" }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -16095,7 +18004,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -16175,11 +18083,15 @@ "semver": "^7.0.0" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, "requires": { "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", @@ -16208,7 +18120,6 @@ "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" @@ -16220,6 +18131,11 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "check-types": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz", + "integrity": "sha512-bzDMlwEIZFtyK70RHwQhMCvXpPyJZgOCCKlvH9oAJz4quUQse8ZynYE5RQzKpY7b5PoL6G+jQMcZzUPD4p6tFg==" + }, "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -16242,6 +18158,18 @@ "validator": "^13.7.0" } }, + "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==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.61", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + } + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -16286,7 +18214,6 @@ "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" } @@ -16294,8 +18221,12 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "combined-stream": { "version": "1.0.8", @@ -16320,8 +18251,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "confusing-browser-globals": { "version": "1.0.11", @@ -16335,29 +18265,73 @@ "integrity": "sha512-/vprVYETjkys5R8QpN9/yCdAJHy5nuA8cVYqcobA06o0N0qPKmoB2ZcSEgawa8azBpFNhWW1v3y4eqntDCitzQ==", "dev": true }, + "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==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "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==", "dev": true }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "requires": { + "cross-spawn": "^7.0.1" + } + }, "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" } }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -16389,7 +18363,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, "requires": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -16400,7 +18373,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -16411,6 +18383,16 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -16453,6 +18435,11 @@ "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "dev": true }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==" + }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -16461,6 +18448,11 @@ "safe-buffer": "^5.0.1" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "electron-to-chromium": { "version": "1.4.301", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.301.tgz", @@ -16487,11 +18479,23 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "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" + } + }, "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, "requires": { "is-arrayish": "^0.2.1" } @@ -16500,7 +18504,6 @@ "version": "1.22.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", @@ -16547,7 +18550,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -16567,18 +18569,57 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, + "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==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.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==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "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==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "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==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "esbuild": { "version": "0.14.14", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.14.tgz", @@ -16718,6 +18759,11 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -17212,6 +19258,35 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "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==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -17248,6 +19323,115 @@ "jest-util": "^29.4.3" } }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "express-asyncify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/express-asyncify/-/express-asyncify-2.1.2.tgz", + "integrity": "sha512-LHtXdJ0Op1K7K/daRMzAIHdYluk6GE3GBX7HlmrltpC1XNu8VwTYQv0U6xHyFCTpe5HAYdbVaGQxQcywTDWZeQ==", + "requires": {} + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "fast-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", + "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -17296,6 +19480,16 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "fast-xml-parser": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", @@ -17341,6 +19535,35 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -17368,15 +19591,14 @@ "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==" + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "requires": { "is-callable": "^1.1.3" } @@ -17391,11 +19613,20 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -17407,14 +19638,12 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -17425,8 +19654,7 @@ "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" }, "gensync": { "version": "1.0.0-beta.2", @@ -17444,7 +19672,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, "requires": { "function-bind": "^1.1.2", "has-proto": "^1.0.1", @@ -17474,7 +19701,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -17484,7 +19710,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17516,7 +19741,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, "requires": { "define-properties": "^1.1.3" } @@ -17539,7 +19763,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "requires": { "get-intrinsic": "^1.1.3" } @@ -17547,8 +19770,7 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "grapheme-splitter": { "version": "1.0.4", @@ -17556,11 +19778,26 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphql": { + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz", + "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==", + "requires": { + "iterall": "^1.2.2" + } + }, + "graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "requires": { + "tslib": "^2.1.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -17568,20 +19805,17 @@ "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" }, "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 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-property-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, "requires": { "get-intrinsic": "^1.2.2" } @@ -17589,20 +19823,17 @@ "has-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -17611,23 +19842,106 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, "requires": { "function-bind": "^1.1.2" } }, + "help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "requires": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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==" + }, "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 }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, "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 }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -17669,7 +19983,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -17678,25 +19991,27 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, "requires": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -17706,14 +20021,12 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -17722,7 +20035,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -17731,14 +20043,12 @@ "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "requires": { "hasown": "^2.0.0" } @@ -17747,7 +20057,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -17782,8 +20091,7 @@ "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" }, "is-number": { "version": "7.0.0", @@ -17795,7 +20103,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -17806,11 +20113,15 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "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==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -17820,7 +20131,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -17835,7 +20145,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -17844,7 +20153,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -17853,7 +20161,6 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, "requires": { "which-typed-array": "^1.1.11" } @@ -17862,7 +20169,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -17870,14 +20176,12 @@ "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -17938,6 +20242,11 @@ "istanbul-lib-report": "^3.0.0" } }, + "iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, "jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", @@ -18402,11 +20711,34 @@ } } }, + "joi": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.0.tgz", + "integrity": "sha512-HSLsmSmXz+PV9PYoi3p7cgIbj06WnEBNT28n+bbBNcPZXZFqCzzvGqpTBPujx/Z0nh1+KNQPDrNgdmQ8dq0qYw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.4", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "jose": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/jose/-/jose-5.2.1.tgz", "integrity": "sha512-qiaQhtQRw6YrOaOj0v59h3R6hUY9NvxBmmnMfKemkqYmBB0tEc97NbLP7ix44VP5p9/0YHG8Vyhzuo5YBNwviA==" }, + "joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==" + }, + "js-base64": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.6.tgz", + "integrity": "sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==" + }, "js-sdsl": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", @@ -18443,8 +20775,7 @@ "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 + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -18563,6 +20894,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.isfunction": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.8.tgz", + "integrity": "sha512-WQj3vccQSW5IKeRl8F0bezPlZH5/LFXtNPICsbZLsv+HmVfWAfrzy2ZajGqmNLonIjPIcPOk3uXOGv5jgPgTyg==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -18574,6 +20920,16 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, + "lodash.omitby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.omitby/-/lodash.omitby-4.6.0.tgz", + "integrity": "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ==" + }, "long": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", @@ -18597,6 +20953,14 @@ "yallist": "^3.0.2" } }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "requires": { + "es5-ext": "~0.10.2" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -18629,6 +20993,36 @@ "tmpl": "1.0.5" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "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" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -18641,6 +21035,11 @@ "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==" + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -18651,6 +21050,11 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -18674,7 +21078,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -18682,8 +21085,7 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "mkdirp": { "version": "0.5.6", @@ -18719,11 +21121,50 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "requires": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, + "node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==" + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -18752,6 +21193,24 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -18772,7 +21231,117 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", "requires": { - "follow-redirects": "^1.14.7" + "follow-redirects": "^1.14.7" + } + } + } + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" } } } @@ -18795,20 +21364,17 @@ "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "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 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -18876,11 +21442,23 @@ "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==" }, + "on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -18958,6 +21536,11 @@ "lines-and-columns": "^1.1.6" } }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -18967,20 +21550,22 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "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 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "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 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", @@ -19000,12 +21585,70 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==" + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, + "pino": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.18.0.tgz", + "integrity": "sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==", + "requires": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + } + }, + "pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "requires": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "pino-pretty": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-9.4.1.tgz", + "integrity": "sha512-loWr5SNawVycvY//hamIzyz3Fh5OSpvkcO13MwdDW+eKIGylobPLqnVGTDwDXkdmpJd1BhEG+qhDw09h6SqJiQ==", + "requires": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -19121,6 +21764,11 @@ } } }, + "pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -19166,6 +21814,16 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" }, + "process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "promise-timeout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/promise-timeout/-/promise-timeout-1.3.0.tgz", + "integrity": "sha512-5yANTE0tmi5++POym6OgtFmwfDvOXABD9oj/jLQr5GPEyuNEb7jH4wbbANJceJid49jwhi1RddxnhnEAb/doqg==" + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -19195,29 +21853,157 @@ } } }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "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" + } + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, "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-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==" + }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + } + } + }, + "readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + }, + "real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" + }, "regexp-tree": { "version": "0.1.24", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", @@ -19228,7 +22014,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19241,6 +22026,11 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -19253,11 +22043,15 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -19293,6 +22087,11 @@ "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", "dev": true }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -19317,11 +22116,19 @@ "queue-microtask": "^1.2.2" } }, + "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, + "requires": { + "tslib": "^2.1.0" + } + }, "safe-array-concat": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", - "dev": true, "requires": { "call-bind": "^1.0.5", "get-intrinsic": "^1.2.2", @@ -19347,13 +22154,32 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -19377,11 +22203,63 @@ } } }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, "set-function-length": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", - "dev": true, "requires": { "define-data-property": "^1.1.1", "function-bind": "^1.1.2", @@ -19394,18 +22272,21 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, "requires": { "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.0" } }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "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" } @@ -19413,8 +22294,12 @@ "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 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" }, "shimmer": { "version": "1.2.1", @@ -19425,7 +22310,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -19450,6 +22334,14 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "sonic-boom": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", + "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -19466,17 +22358,24 @@ "source-map": "^0.6.0" } }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, "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==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "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==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -19485,8 +22384,12 @@ "spdx-license-ids": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" }, "sprintf-js": { "version": "1.0.3", @@ -19618,6 +22521,19 @@ } } }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -19655,11 +22571,20 @@ "side-channel": "^1.0.4" } }, + "string.prototype.padend": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", + "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, "string.prototype.trim": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19670,7 +22595,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19681,7 +22605,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19712,8 +22635,7 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "strnum": { "version": "1.0.5", @@ -19724,7 +22646,6 @@ "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" } @@ -19732,8 +22653,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "test-exclude": { "version": "6.0.0", @@ -19752,6 +22672,23 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "requires": { + "real-require": "^0.2.0" + } + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -19773,6 +22710,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "ts-essentials": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", @@ -19797,9 +22739,9 @@ } }, "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", @@ -20007,6 +22949,11 @@ } } }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -20028,11 +22975,19 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "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==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1", @@ -20043,7 +22998,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -20055,7 +23009,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -20068,7 +23021,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, "requires": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -20085,7 +23037,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -20093,6 +23044,34 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "requires": { + "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": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -20112,6 +23091,16 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -20142,11 +23131,38 @@ } } }, + "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": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==" }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "wait-on": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "dev": true, + "requires": { + "axios": "^1.6.1", + "joi": "^17.11.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + } + }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -20160,7 +23176,6 @@ "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" } @@ -20169,7 +23184,6 @@ "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": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -20182,7 +23196,6 @@ "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.4", @@ -20211,8 +23224,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "4.0.2", diff --git a/src/package.json b/src/package.json index 45f4b52cc..88391bbdd 100644 --- a/src/package.json +++ b/src/package.json @@ -17,15 +17,21 @@ "@aws-sdk/credential-providers": "3.352.0", "@aws-sdk/lib-dynamodb": "3.150.0", "@aws-sdk/node-http-handler": "^3.374.0", + "@pact-foundation/pact": "^12.1.3", "aws-xray-sdk-core": "^3.4.1", "axios": ">=1.3.4", + "body-parser": "^1.20.2", "class-validator": "0.14.0", + "cross-env": "^7.0.3", + "express": "^4.18.2", + "express-asyncify": "^2.1.2", "ecdsa-sig-formatter": "^1.0.11", "esbuild": "0.14.14", "jose": "^5.2.1", "lodash": "^4.17.21", "node-jose": "^2.1.1", - "notifications-node-client": "^7.0.0" + "notifications-node-client": "^7.0.0", + "npm-run-all": "^4.1.5" }, "scripts": { "unit": "./node_modules/.bin/jest --testPathPattern=tests/unit --coverage", @@ -36,12 +42,20 @@ "test:e2e": "./node_modules/.bin/jest --testMatch '**/e2e/?(*.)test.ts' --passWithNoTests", "test:infra": "./node_modules/.bin/jest --testMatch '**/infra/?(*.)test.ts' ", "api": "JEST_JUNIT_OUTPUT_NAME=api-report.xml ./node_modules/.bin/jest --runInBand --testPathPattern=tests/api/", - "test:api": "npm run compile && npm run api" + "test:api": "npm run compile && npm run api", + "kill:dynamodblocal": "cd tests/contract; ./scripts/kill-dynamodb-local.sh", + "start:dynamodblocal": "cd tests/contract; ./scripts/setup-dynamodb-local.sh", + "start:contract": "npm-run-all -s start:dynamodblocal wait-start:contract", + "wait-start:contract": "wait-on tcp:127.0.0.1:8000 && cd tests/contract && ts-node ./app.ts", + "test:provider": "./node_modules/.bin/jest --testMatch '**/contract/F2fCriProvider.test.ts' --coverage=false", + "test:contract": "wait-on tcp:127.0.0.1:3000; cd tests/contract; npm run test:provider; npm run kill:dynamodblocal", + "test:contract:ci": "cross-env USE_MOCKED=true AWS_ACCESS_KEY_ID=dummy AWS_SECRET_ACCESS_KEY=dummy AWS_PAGER=\"\" npm-run-all -p -r start:contract test:contract" }, "devDependencies": { "@aws-cdk/assertions": "^1.172.0", "@aws-cdk/yaml-cfn": "^1.172.0", "@types/aws-lambda": "^8.10.109", + "@types/express": "^4.17.21", "@types/jest": "^29.4.0", "@types/js-yaml": "^4.0.5", "@types/node": "^18.11.18", @@ -66,10 +80,11 @@ "jest-mock-extended": "^3.0.1", "prettier": "^2.8.4", "ts-jest": "^29.0.5", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "ts-standard": "^12.0.2", "tslint": "^6.1.3", "typescript": "^4.9.4", + "wait-on": "^7.2.0", "yaml-cfn": "^0.3.2" }, "engines": { diff --git a/src/services/AbortRequestProcessor.ts b/src/services/AbortRequestProcessor.ts index d559ea2e5..933ec6dde 100644 --- a/src/services/AbortRequestProcessor.ts +++ b/src/services/AbortRequestProcessor.ts @@ -5,7 +5,6 @@ import { AppError } from "../utils/AppError"; import { Logger } from "@aws-lambda-powertools/logger"; import { HttpCodesEnum } from "../utils/HttpCodesEnum"; import { createDynamoDbClient } from "../utils/DynamoDBFactory"; -import { absoluteTimeNow } from "../utils/DateTimeUtils"; import { buildCoreEventFields } from "../utils/TxmaEvent"; import { EnvironmentVariables } from "./EnvironmentVariables"; import { ServicesEnum } from "../models/enums/ServicesEnum"; @@ -81,7 +80,7 @@ export class AbortRequestProcessor { try { await this.f2fService.sendToTXMA({ event_name: "F2F_CRI_SESSION_ABORTED", - ...buildCoreEventFields(f2fSessionInfo, this.environmentVariables.issuer() as string, f2fSessionInfo.clientIpAddress, absoluteTimeNow), + ...buildCoreEventFields(f2fSessionInfo, this.environmentVariables.issuer() as string, f2fSessionInfo.clientIpAddress), }); } catch (error) { this.logger.error("Auth session successfully aborted. Failed to send F2F_CRI_SESSION_ABORTED event to TXMA", { diff --git a/src/services/AccessTokenRequestProcessor.ts b/src/services/AccessTokenRequestProcessor.ts index f6786a461..4d98b1d38 100644 --- a/src/services/AccessTokenRequestProcessor.ts +++ b/src/services/AccessTokenRequestProcessor.ts @@ -95,7 +95,7 @@ export class AccessTokenRequestProcessor { }; let accessToken; try { - accessToken = await this.kmsJwtAdapter.sign(jwtPayload); + accessToken = await this.kmsJwtAdapter.sign(jwtPayload, this.environmentVariables.dnsSuffix()); } catch (error) { this.logger.error("Failed to sign the accessToken Jwt", { messageCode: MessageCodes.FAILED_SIGNING_JWT }); return new Response(HttpCodesEnum.SERVER_ERROR, "Failed to sign the accessToken Jwt"); diff --git a/src/services/AuthorizationRequestProcessor.ts b/src/services/AuthorizationRequestProcessor.ts index 900b9ab21..ce35ab708 100644 --- a/src/services/AuthorizationRequestProcessor.ts +++ b/src/services/AuthorizationRequestProcessor.ts @@ -4,7 +4,6 @@ import { Metrics, MetricUnits } from "@aws-lambda-powertools/metrics"; import { randomUUID } from "crypto"; import { APIGatewayProxyEvent } from "aws-lambda"; import { Logger } from "@aws-lambda-powertools/logger"; -import { ValidationHelper } from "../utils/ValidationHelper"; import { HttpCodesEnum } from "../utils/HttpCodesEnum"; import { absoluteTimeNow } from "../utils/DateTimeUtils"; import { createDynamoDbClient } from "../utils/DynamoDBFactory"; @@ -40,10 +39,9 @@ export class AuthorizationRequestProcessor { } async processRequest(event: APIGatewayProxyEvent, sessionId: string): Promise { - this.logger.appendKeys({ sessionId }); const session = await this.f2fService.getSessionById(sessionId); - + if (session != null) { if (session.expiryDate < absoluteTimeNow()) { this.logger.error("Session has expired", { messageCode: MessageCodes.EXPIRED_SESSION }); @@ -65,7 +63,7 @@ export class AuthorizationRequestProcessor { this.metrics.addMetric("Set authorization code", MetricUnits.Count, 1); try { - const coreEventFields = buildCoreEventFields(session, this.environmentVariables.issuer(), session.clientIpAddress, absoluteTimeNow); + const coreEventFields = buildCoreEventFields(session, this.environmentVariables.issuer(), session.clientIpAddress); await this.f2fService.sendToTXMA({ event_name: "F2F_CRI_AUTH_CODE_ISSUED", ...coreEventFields, @@ -92,7 +90,7 @@ export class AuthorizationRequestProcessor { try { await this.f2fService.sendToTXMA({ event_name: "F2F_CRI_END", - ...buildCoreEventFields(session, this.environmentVariables.issuer(), session.clientIpAddress, absoluteTimeNow), + ...buildCoreEventFields(session, this.environmentVariables.issuer(), session.clientIpAddress), extensions: { previous_govuk_signin_journey_id: session.clientSessionId, evidence: [ diff --git a/src/services/DocumentSelectionRequestProcessor.ts b/src/services/DocumentSelectionRequestProcessor.ts index 0758c9840..852292cd0 100644 --- a/src/services/DocumentSelectionRequestProcessor.ts +++ b/src/services/DocumentSelectionRequestProcessor.ts @@ -194,7 +194,6 @@ export class DocumentSelectionRequestProcessor { f2fSessionInfo, this.environmentVariables.issuer(), f2fSessionInfo.clientIpAddress, - absoluteTimeNow, ); await this.f2fService.sendToTXMA({ event_name: "F2F_YOTI_START", diff --git a/src/services/EnvironmentVariables.ts b/src/services/EnvironmentVariables.ts index 266f92c77..9d95683bf 100644 --- a/src/services/EnvironmentVariables.ts +++ b/src/services/EnvironmentVariables.ts @@ -40,6 +40,8 @@ export class EnvironmentVariables { private readonly KMS_KEY_ARN = process.env.KMS_KEY_ARN; + private readonly DNSSUFFIX = process.env.DNSSUFFIX; + private readonly CLIENT_CONFIG = process.env.CLIENT_CONFIG; private readonly ENCRYPTION_KEY_IDS = process.env.ENCRYPTION_KEY_IDS; @@ -213,8 +215,10 @@ export class EnvironmentVariables { !this.ISSUER || this.ISSUER.trim().length === 0 || !this.TXMA_QUEUE_URL || this.TXMA_QUEUE_URL.trim().length === 0 || !this.YOTI_KEY_SSM_PATH || this.YOTI_KEY_SSM_PATH.trim().length === 0 || - !this.YOTIBASEURL || this.YOTIBASEURL.trim().length === 0) { - logger.error("Environment variable PERSON_IDENTITY_TABLE_NAME or YOTI_SDK or YOTICALLBACKURL or ISSUER is not configured"); + !this.YOTIBASEURL || this.YOTIBASEURL.trim().length === 0 || + !this.KMS_KEY_ARN || this.KMS_KEY_ARN.trim().length === 0 || + !this.DNSSUFFIX || this.DNSSUFFIX.trim().length === 0) { + logger.error("Environment variable PERSON_IDENTITY_TABLE_NAME or YOTI_SDK or KMS_KEY_ARN or ISSUER or DNSSUFFIX is not configured"); throw new AppError(HttpCodesEnum.SERVER_ERROR, "Callback Service incorrectly configured"); } if (!this.YOTI_SESSION_TTL_DAYS || this.YOTI_SESSION_TTL_DAYS < 10) { @@ -354,6 +358,10 @@ export class EnvironmentVariables { return this.KMS_KEY_ARN; } + dnsSuffix(): any { + return this.DNSSUFFIX; + } + encryptionKeyIds(): any { return this.ENCRYPTION_KEY_IDS; } diff --git a/src/services/GenerateVerifiableCredential.ts b/src/services/GenerateVerifiableCredential.ts index db90aa0c3..d13d4f55f 100644 --- a/src/services/GenerateVerifiableCredential.ts +++ b/src/services/GenerateVerifiableCredential.ts @@ -146,6 +146,7 @@ export class GenerateVerifiableCredential { case "DIFFERENT_PERSON": addToCI("V01"); rejectionReasons.push({ ci: "V01", reason }); + this.logger.info({ message: "Handling face match rejection", reason, contraIndicator: "V01" }); break; default: break; diff --git a/src/services/SendEmailService.ts b/src/services/SendEmailService.ts index e7ba8c780..0df499bdc 100644 --- a/src/services/SendEmailService.ts +++ b/src/services/SendEmailService.ts @@ -11,7 +11,6 @@ import { AppError } from "../utils/AppError"; import { sleep } from "../utils/Sleep"; import { YotiService } from "./YotiService"; import { buildCoreEventFields } from "../utils/TxmaEvent"; -import { absoluteTimeNow } from "../utils/DateTimeUtils"; import { F2fService } from "./F2fService"; import { createDynamoDbClient } from "../utils/DynamoDBFactory"; import { ServicesEnum } from "../models/enums/ServicesEnum"; @@ -148,7 +147,7 @@ export class SendEmailService { async sendF2FYotiEmailedEvent(message: Email): Promise { const session = await this.f2fService.getSessionById(message.sessionId); if (session != null) { - const coreEventFields = buildCoreEventFields(session, this.environmentVariables.issuer(), session.clientIpAddress, absoluteTimeNow); + const coreEventFields = buildCoreEventFields(session, this.environmentVariables.issuer(), session.clientIpAddress); try { await this.f2fService.sendToTXMA({ event_name: "F2F_YOTI_PDF_EMAILED", diff --git a/src/services/SessionRequestProcessor.ts b/src/services/SessionRequestProcessor.ts index 9d52de073..7939d6faa 100644 --- a/src/services/SessionRequestProcessor.ts +++ b/src/services/SessionRequestProcessor.ts @@ -120,9 +120,9 @@ export class SessionRequestProcessor { return new Response(HttpCodesEnum.SERVER_ERROR, "Server Error"); } } catch (error) { - this.logger.error("Invalid request: Could not verify jwt", { + this.logger.error("Could not verify jwt", { error, - messageCode: "UNEXPECTED_ERROR_VERIFYING_JWT", + messageCode: MessageCodes.FAILED_VERIFYING_JWT, }); return unauthorizedResponse; } @@ -211,7 +211,7 @@ export class SessionRequestProcessor { } try { - const coreEventFields = buildCoreEventFields(session, this.environmentVariables.issuer() as string, clientIpAddress, absoluteTimeNow); + const coreEventFields = buildCoreEventFields(session, this.environmentVariables.issuer() as string, clientIpAddress); await this.f2fService.sendToTXMA({ event_name: "F2F_CRI_START", ...coreEventFields, diff --git a/src/services/ThankYouEmailProcessor.ts b/src/services/ThankYouEmailProcessor.ts index 844a8454f..3f71123fd 100644 --- a/src/services/ThankYouEmailProcessor.ts +++ b/src/services/ThankYouEmailProcessor.ts @@ -8,7 +8,6 @@ import { YotiCompletedSession } from "../models/YotiPayloads"; import { YotiCallbackPayload } from "../type/YotiCallbackPayload"; import { createDynamoDbClient } from "../utils/DynamoDBFactory"; import { AppError } from "../utils/AppError"; -import { absoluteTimeNow } from "../utils/DateTimeUtils"; import { HttpCodesEnum } from "../utils/HttpCodesEnum"; import { Response } from "../utils/Response"; import { buildCoreEventFields } from "../utils/TxmaEvent"; @@ -94,7 +93,7 @@ export class ThankYouEmailProcessor { await this.f2fService.sendToTXMA({ event_name: "F2F_DOCUMENT_UPLOADED", - ...buildCoreEventFields(f2fSession, this.environmentVariables.issuer() as string, f2fSession.clientIpAddress, absoluteTimeNow), + ...buildCoreEventFields(f2fSession, this.environmentVariables.issuer() as string, f2fSession.clientIpAddress), extensions: { previous_govuk_signin_journey_id: f2fSession.clientSessionId, post_office_visit_details: [{ diff --git a/src/services/VerifiableCredentialService.ts b/src/services/VerifiableCredentialService.ts index caca4046a..67eb3399f 100644 --- a/src/services/VerifiableCredentialService.ts +++ b/src/services/VerifiableCredentialService.ts @@ -20,6 +20,8 @@ export class VerifiableCredentialService { readonly issuer: string; + readonly dnsSuffix: string; + private readonly kmsJwtAdapter: KmsJwtAdapter; private static instance: VerifiableCredentialService; @@ -29,11 +31,13 @@ export class VerifiableCredentialService { kmsJwtAdapter: KmsJwtAdapter, issuer: string, logger: Logger, + dnsSuffix: string, ) { this.issuer = issuer; this.tableName = tableName; this.logger = logger; this.kmsJwtAdapter = kmsJwtAdapter; + this.dnsSuffix = dnsSuffix; } static getInstance( @@ -41,9 +45,10 @@ export class VerifiableCredentialService { kmsJwtAdapter: KmsJwtAdapter, issuer: string, logger: Logger, + dnsSuffix: string, ): VerifiableCredentialService { if (!VerifiableCredentialService.instance) { - VerifiableCredentialService.instance = new VerifiableCredentialService(tableName, kmsJwtAdapter, issuer, logger); + VerifiableCredentialService.instance = new VerifiableCredentialService(tableName, kmsJwtAdapter, issuer, logger, dnsSuffix); } return VerifiableCredentialService.instance; } @@ -52,7 +57,7 @@ export class VerifiableCredentialService { try { if (result) { // Sign the VC - const signedJwt = await this.kmsJwtAdapter.sign(result); + const signedJwt = await this.kmsJwtAdapter.sign(result, this.dnsSuffix); this.logger.info({ message: "Successfully Signed Generated Verified Credential jwt" }); return signedJwt; } diff --git a/src/services/YotiService.ts b/src/services/YotiService.ts index 228cd52ee..1d2f4d38a 100755 --- a/src/services/YotiService.ts +++ b/src/services/YotiService.ts @@ -251,13 +251,7 @@ export class YotiService { documents: requirements, branch: { type: UK_POST_OFFICE.type, - name: PostOfficeSelection.name ? PostOfficeSelection.name : UK_POST_OFFICE.name, - address: PostOfficeSelection.address, - post_code: PostOfficeSelection.post_code, - location: { - latitude: PostOfficeSelection.location.latitude, - longitude: PostOfficeSelection.location.longitude, - }, + fad_code: PostOfficeSelection.fad_code, }, }; diff --git a/src/services/YotiSessionCompletionProcessor.ts b/src/services/YotiSessionCompletionProcessor.ts index d9a803fa7..8bed60362 100644 --- a/src/services/YotiSessionCompletionProcessor.ts +++ b/src/services/YotiSessionCompletionProcessor.ts @@ -53,7 +53,7 @@ export class YotiSessionCompletionProcessor { this.yotiService = YotiService.getInstance(this.logger, this.environmentVariables.yotiSdk(), this.environmentVariables.resourcesTtlInSeconds(), this.environmentVariables.clientSessionTokenTtlInDays(), YOTI_PRIVATE_KEY, this.environmentVariables.yotiBaseUrl()); this.f2fService = F2fService.getInstance(this.environmentVariables.sessionTable(), this.logger, createDynamoDbClient()); this.kmsJwtAdapter = new KmsJwtAdapter(this.environmentVariables.kmsKeyArn()); - this.verifiableCredentialService = VerifiableCredentialService.getInstance(this.environmentVariables.sessionTable(), this.kmsJwtAdapter, this.environmentVariables.issuer(), this.logger); + this.verifiableCredentialService = VerifiableCredentialService.getInstance(this.environmentVariables.sessionTable(), this.kmsJwtAdapter, this.environmentVariables.issuer(), this.logger, this.environmentVariables.dnsSuffix()); this.generateVerifiableCredential = GenerateVerifiableCredential.getInstance(this.logger); } @@ -178,7 +178,7 @@ export class YotiSessionCompletionProcessor { f2fSession.authSessionState === AuthSessionState.F2F_ACCESS_TOKEN_ISSUED || f2fSession.authSessionState === AuthSessionState.F2F_AUTH_CODE_ISSUED ) { - const coreEventFields = buildCoreEventFields(f2fSession, this.environmentVariables.issuer(), f2fSession.clientIpAddress, absoluteTimeNow); + const coreEventFields = buildCoreEventFields(f2fSession, this.environmentVariables.issuer(), f2fSession.clientIpAddress); try { await this.f2fService.sendToTXMA({ event_name: "F2F_YOTI_RESPONSE_RECEIVED", @@ -380,7 +380,6 @@ export class YotiSessionCompletionProcessor { f2fSession, this.environmentVariables.issuer(), f2fSession.clientIpAddress, - absoluteTimeNow, ), extensions: { previous_govuk_signin_journey_id: f2fSession.clientSessionId, diff --git a/src/tests/api/CallbackApi.test.ts b/src/tests/api/CallbackApi.test.ts index 616f1a11e..add022d30 100644 --- a/src/tests/api/CallbackApi.test.ts +++ b/src/tests/api/CallbackApi.test.ts @@ -84,7 +84,7 @@ describe("Callback API", () => { sqsMessage = await getDequeuedSqsMessage(sessionResponse.data.sub); } while (!sqsMessage); const jwtToken = sqsMessage["https://vocab.account.gov.uk/v1/credentialJWT"][0]; - validateJwtToken(jwtToken, vcResponseData, yotiMockId); + await validateJwtToken(jwtToken, vcResponseData, yotiMockId); }, 20000); @@ -108,7 +108,7 @@ describe("Callback API", () => { } while (!sqsMessage); const jwtToken = sqsMessage["https://vocab.account.gov.uk/v1/credentialJWT"][0]; - validateJwtToken(jwtToken, vcResponseData, "0000"); + await validateJwtToken(jwtToken, vcResponseData, "0000"); }, 20000); describe("F2F CRI Callback Endpoint UnHappyPath - Verifiable Credential Error", () => { diff --git a/src/tests/api/DocumentSelectionNegativePath.test.ts b/src/tests/api/DocumentSelectionNegativePath.test.ts index 3fbb2b583..f6074fbdb 100644 --- a/src/tests/api/DocumentSelectionNegativePath.test.ts +++ b/src/tests/api/DocumentSelectionNegativePath.test.ts @@ -1,5 +1,9 @@ import dataDriversLicenseInvalid from "../data/docSelectionPayloadDriversLicenceInvalid.json"; import dataPassport from "../data/docSelectionPayloadPassportValid.json"; +import dataPassportMissingFad from "../data/dataPassportMissingFad.json"; +import dataPassportBlankFad from "../data/dataPassportBlankFad.json"; +import dataPassportIncorrectFad from "../data/dataPassportIncorrectFad.json"; +import dataPassportInvalidFadFormat from "../data/dataPassportInvalidFadFormat.json"; import { postDocumentSelection, startStubServiceAndReturnSessionId } from "../utils/ApiTestSteps"; import f2fStubPayload from "../data/exampleStubPayload.json"; @@ -19,9 +23,33 @@ describe("E2E Negative Path /documentSelection Endpoint", () => { }); - it("E2E Happy Path Journey - Incorrect Session Id", async () => { + it("E2E Negative Path Journey - Incorrect Session Id", async () => { const response = await postDocumentSelection(dataPassport, "sessionId"); expect(response.status).toBe(401); expect(response.data).toBe("Unauthorized"); }); + + it("E2E Negative Path Journey - Blank fad_code", async () => { + const response = await postDocumentSelection(dataPassportBlankFad, sessionId); + expect(response.status).toBe(500); + expect(response.data).toBe("Error generating Yoti instructions PDF"); + }); + + it("E2E Negative Path Journey - Incorrect fad_code", async () => { + const response = await postDocumentSelection(dataPassportIncorrectFad, sessionId); + expect(response.status).toBe(500); + expect(response.data).toBe("Error generating Yoti instructions PDF"); + }); + + it("E2E Negative Path Journey - Invalid fad format", async () => { + const response = await postDocumentSelection(dataPassportInvalidFadFormat, sessionId); + expect(response.status).toBe(500); + expect(response.data).toBe("Error generating Yoti instructions PDF"); + }); + + it("E2E Negative Path Journey - Missing fad_code", async () => { + const response = await postDocumentSelection(dataPassportMissingFad, sessionId); + expect(response.status).toBe(400); + expect(response.data).toStrictEqual({ "message": "Invalid request body" }); + }); }); diff --git a/src/tests/api/UserInfoNegativePath.test.ts b/src/tests/api/UserInfoNegativePath.test.ts index dde3455d0..2497ffc55 100644 --- a/src/tests/api/UserInfoNegativePath.test.ts +++ b/src/tests/api/UserInfoNegativePath.test.ts @@ -19,7 +19,7 @@ describe("Negative Path /userInfo Endpoint", () => { // // Post Token const tokenResponse = await tokenPost(authResponse.data.authorizationCode.value, authResponse.data.redirect_uri ); // Post User Info - const userInfoResponse = await userInfoPost("Bearer "); + const userInfoResponse = await userInfoPost("Bearer 123"); expect(userInfoResponse.status).toBe(400); expect(userInfoResponse.data).toBe("Failed to Validate - Authentication header: Failed to verify signature"); }); diff --git a/src/tests/api/Yoti.test.ts b/src/tests/api/Yoti.test.ts index 2ef25b3f4..f797e7bd3 100644 --- a/src/tests/api/Yoti.test.ts +++ b/src/tests/api/Yoti.test.ts @@ -12,7 +12,7 @@ describe("Yoti /sessions endpoint", () => { [503, "1503"], ]; it.each(postSessionsParams)("Yoti - expect '%i' response on POST/sessions '/sessions'", async (responseCode, userTrackerId) => { - const response = await postYotiSession(userTrackerId, yotiRequestData); + const response = await postYotiSession(userTrackerId as string, yotiRequestData); expect(response.status).toBe(responseCode); }); @@ -26,7 +26,7 @@ describe("Yoti /sessions endpoint", () => { [503, "2503"], ]; it.each(getConfigurationParams)("Yoti - expect '%i' response on GET/sessions/configuration '/sessions/%s/configuration'", async (responseCode, sessionId) => { - const response = await getYotiSessionsConfiguration(sessionId); + const response = await getYotiSessionsConfiguration(sessionId as string); expect(response.status).toBe(responseCode); }); @@ -39,8 +39,9 @@ describe("Yoti /sessions endpoint", () => { [409, "3409"], [503, "3503"], ]; - it.each(putInstructionsParams)("Yoti - expect '%i' response on PUT/ssessions/{id}/instructions/pdf '/sessions/%s/instructions/pdf'", async (responseCode, sessionId) => { - const response = await putYotiSessionsInstructions(sessionId); + it.each(putInstructionsParams)("Yoti - expect '%i' response on PUT/ssessions/{id}/instructions '/sessions/%s/instructions'", async (responseCode, sessionId) => { + const fadcodePayload = { "branch": { "fad_code":"1234567" } }; + const response = await putYotiSessionsInstructions(sessionId as string, fadcodePayload); expect(response.status).toBe(responseCode); }); @@ -54,8 +55,8 @@ describe("Yoti /sessions endpoint", () => { [500, "4500"], [503, "4503"], ]; - it.each(getInstructionsParams)("Yoti - expect '%i' response on GET/sessions/instructions '/sessions/%s/instructions'", async (responseCode, sessionId) => { - const response = await getYotiSessionsInstructions(sessionId); + it.each(getInstructionsParams)("Yoti - expect '%i' response on GET/sessions/instructions/pdf '/sessions/%s/instructions/pdf'", async (responseCode, sessionId) => { + const response = await getYotiSessionsInstructions(sessionId as string); expect(response.status).toBe(responseCode); }); }); diff --git a/src/tests/contract/F2fCriProvider.test.ts b/src/tests/contract/F2fCriProvider.test.ts new file mode 100644 index 000000000..cfe6d865c --- /dev/null +++ b/src/tests/contract/F2fCriProvider.test.ts @@ -0,0 +1,50 @@ +import { Logger } from "@aws-lambda-powertools/logger"; +import { Verifier, VerifierOptions } from "@pact-foundation/pact"; +import path from "path"; + +const logger = new Logger({ + logLevel: "INFO", + serviceName: "F2fCriProviderTest", +}); + +let opts: VerifierOptions; +const pactFile = path.resolve("./tests/contract/pacts/IpvCoreBack-F2fCriProviderAll.json"); +// Verify that the provider meets all consumer expectations +describe("Pact Verification", () => { + beforeAll(() => { + opts = { + // we need to know the providers name + provider: "F2fCriProvider", + // // we need to where the provider will be running, + // // we are starting it locally and defined the port above + providerBaseUrl: "http://localhost:3000", + //pactBrokerUrl: "https://ysi5tc076m.execute-api.eu-west-2.amazonaws.com", + // consumerVersionSelectors: [ + // { mainBranch: true }, + // { deployedOrReleased: true }, + // ], + pactUrls: [pactFile], + publishVerificationResult: false, + providerVersion: "1.0.1", + // You can set the log level here, useful for debugging + logLevel: "info", + }; + }); + + it("should validate the expectations of Authorization API", async () => { + logger.debug("PactBroker opts: ", { opts }); + let result; + await new Verifier(opts) + .verifyProvider() + .then((output) => { + logger.info("Pact Verification Complete!"); + logger.info("Output: ", output); + result = Number(output.match(/\d+/)); + }) + .catch((error) => { + logger.error("Pact verification failed :(", { error }); + result = 1; + }); + expect(result).toBe(0); + }); +}); diff --git a/src/tests/contract/app.ts b/src/tests/contract/app.ts new file mode 100644 index 000000000..bf5818105 --- /dev/null +++ b/src/tests/contract/app.ts @@ -0,0 +1,27 @@ +import express from "express"; +import { accessTokenRouter } from "./routes/AccessTokenRoute"; +import { userInfoRouter } from "./routes/UserInfoRoute"; +import bodyParser from "body-parser"; +import { Logger } from "@aws-lambda-powertools/logger"; +import { Constants } from "./utils/Constants"; + +const logger = new Logger({ + logLevel: "DEBUG", + serviceName: "F2fCriProvider", +}); + +const app = express(); +app.use(express.json()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); + + +const port = Constants.LOCAL_APP_PORT; + +app.listen(port, () => { + logger.debug(`Contract testing app listening on port ${port}`); +}); + +app.use(Constants.TOKEN_ENDPOINT, accessTokenRouter); +app.use(Constants.USERINFO_ENDPOINT, userInfoRouter); + diff --git a/src/tests/contract/data/session-items.json b/src/tests/contract/data/session-items.json new file mode 100644 index 000000000..5e056a30d --- /dev/null +++ b/src/tests/contract/data/session-items.json @@ -0,0 +1,97 @@ +{ + "session-table": [ + { + "PutRequest": { + "Item": { + "sessionId": { + "S": "eb80b0a6-fb2f-4c06-83e6-a6caa4892afc" + }, + "attemptCount": { + "N": "0" + }, + "authorizationCode": { + "S": "0328ba66-a1b5-4314-acf8-f4673f1f05a2" + }, + "authorizationCodeExpiryDate": { + "N": "1706200661919" + }, + "authSessionState": { + "S": "F2F_AUTH_CODE_ISSUED" + }, + "clientId": { + "S": "5C584572" + }, + "clientSessionId": { + "S": "ab8a26249a268c7d678b713c51d70fe5" + }, + "createdDate": { + "N": "1686070173439" + }, + "expiryDate": { + "N": "1687020573439" + }, + "redirectUri": { + "S": "https://identity.staging.account.gov.uk/credential-issuer/callback?id=f2f" + }, + "reminderEmailSent": { + "BOOL": true + }, + "state": { + "S": "236a9875d6baf2c3fcc651feadda3340" + }, + "subject": { + "S": "8bce6c9f-6840-448c-a2f6-212ecc77e2f7" + }, + "yotiSessionId": { + "S": "7af57b1e-740e-4ee2-8721-602a56440029" + } + } + } + }, + { + "PutRequest": { + "Item": { + "sessionId": { + "S": "74655ce3-a679-4c09-a3b0-1d0dc2eff373" + }, + "attemptCount": { + "N": "0" + }, + "authorizationCodeExpiryDate": { + "N": "1706200661919" + }, + "authSessionState": { + "S": "F2F_ACCESS_TOKEN_ISSUED" + }, + "clientId": { + "S": "5C584572" + }, + "clientSessionId": { + "S": "ab8a26249a268c7d678b713c51d70fe5" + }, + "createdDate": { + "N": "1686070173439" + }, + "expiryDate": { + "N": "1687020573439" + }, + "redirectUri": { + "S": "https://f2f-ipv-stub-ipvstub.review-o.dev.account.gov.uk/redirect" + }, + "reminderEmailSent": { + "BOOL": true + }, + "state": { + "S": "236a9875d6baf2c3fcc651feadda3340" + }, + "subject": { + "S": "dummyTestUser" + }, + "yotiSessionId": { + "S": "7af57b1e-740e-4ee2-8721-602a56440029" + } + } + } + } + ] +} \ No newline at end of file diff --git a/src/tests/contract/mocks/kmsClient.ts b/src/tests/contract/mocks/kmsClient.ts index 1c7e26a20..60ff119a4 100644 --- a/src/tests/contract/mocks/kmsClient.ts +++ b/src/tests/contract/mocks/kmsClient.ts @@ -1,5 +1,11 @@ +const dummySignArr = [48, 69, 2, 32, 40, 41, 115, 198, 65, 212, 223, 151, 36, 229, 103, 36, 238, 49, 2, 206, 221, 63, 76, 9, 34, 203, 136, 151, 70, 181, 32, 253, 167, 237, 14, 13, 2, 33, 10, 174, 82, 146, 206, 11, 64, 103, 111, 238, 251, 151, 36, 229, 133, 36, 238, 162, 209, 16, 110, 160, 117, 97, 154, 149, 221, 127, 210, 162, 209, 16, 110]; + +//const randomIntArrayInRange = Array.from( { length: 71 }, () => Math.floor(Math.random() * (238 - 2 + 1)) + 2 ); + + export const mockKmsCient = { send: () => "Success", - sign: () => "Success", - verify: () => "Success", + sign: () => { return { Signature: new Uint8Array(dummySignArr) }; }, + verify: () => { return { SignatureValid: true }; }, }; + diff --git a/src/tests/contract/routes/AccessTokenRoute.ts b/src/tests/contract/routes/AccessTokenRoute.ts new file mode 100644 index 000000000..180340c30 --- /dev/null +++ b/src/tests/contract/routes/AccessTokenRoute.ts @@ -0,0 +1,26 @@ +import express from "express"; +import asyncify from "express-asyncify"; +import { lambdaHandler } from "../../../AccessTokenHandler"; +import { APIGatewayProxyEvent } from "aws-lambda"; +import { convertUrlEncodedRequestBodyToString, eventRequest } from "../utils/ApiRequestUtils"; +import { Constants } from "../utils/Constants"; + +process.env.SESSION_TABLE = "session-table"; +process.env.TXMA_QUEUE_URL = "txma-queue"; +process.env.ISSUER = "issuer"; +process.env.USE_MOCKED = "true"; +process.env.KMS_KEY_ARN = "kid"; + +export const accessTokenRouter = asyncify(express.Router()); + +// eslint-disable-next-line @typescript-eslint/no-misused-promises +accessTokenRouter.post("/", async (req, res) => { + const event: APIGatewayProxyEvent = eventRequest; + event.body = convertUrlEncodedRequestBodyToString(req.body); + + const tokenResponse = await lambdaHandler(event, {}); + res.status(tokenResponse.statusCode); + res.setHeader(Constants.HTTP_CONTENT_TYPE_HEADER, Constants.JSON_CONTENT_TYPE); + res.send(tokenResponse.body); +}); + diff --git a/src/tests/contract/routes/UserInfoRoute.ts b/src/tests/contract/routes/UserInfoRoute.ts new file mode 100644 index 000000000..10945d05c --- /dev/null +++ b/src/tests/contract/routes/UserInfoRoute.ts @@ -0,0 +1,25 @@ +import express from "express"; +import asyncify from "express-asyncify"; +import { lambdaHandler } from "../../../UserInfoHandler"; +import { APIGatewayProxyEvent } from "aws-lambda"; +import { convertIncomingHeadersToAPIGatewayHeaders, eventRequest } from "../utils/ApiRequestUtils"; +import { Constants } from "../utils/Constants"; + +process.env.SESSION_TABLE = "session-table"; +process.env.TXMA_QUEUE_URL = "txma-queue"; +process.env.USE_MOCKED = "true"; +process.env.KMS_KEY_ARN = "kid"; + +export const userInfoRouter = asyncify(express.Router()); + +// eslint-disable-next-line @typescript-eslint/no-misused-promises +userInfoRouter.post("/", async (req, res) => { + const event: APIGatewayProxyEvent = eventRequest; + event.headers = convertIncomingHeadersToAPIGatewayHeaders(req.headers); + + const userInfoResponse = await lambdaHandler(event, {}); + res.status(userInfoResponse.statusCode); + res.setHeader(Constants.HTTP_CONTENT_TYPE_HEADER, Constants.JSON_CONTENT_TYPE); + res.send(userInfoResponse.body); +}); + diff --git a/src/tests/contract/scripts/kill-dynamodb-local.sh b/src/tests/contract/scripts/kill-dynamodb-local.sh new file mode 100755 index 000000000..0562ef652 --- /dev/null +++ b/src/tests/contract/scripts/kill-dynamodb-local.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Step 1: Identify the Running DynamoDB Local Container +echo "Identifying the running DynamoDB Local container..." +container_id=$(docker ps -q --filter ancestor=amazon/dynamodb-local) + +# Check if the container is running +if [ -z "$container_id" ] +then + echo "No DynamoDB Local container is currently running." +else + # Step 2: Stop the DynamoDB Local Container + echo "Stopping the DynamoDB Local container..." + docker stop $container_id + + # Optional: Remove the stopped container + echo "Removing the stopped container..." + docker rm $container_id + + echo "DynamoDB Local container has been stopped and removed." +fi \ No newline at end of file diff --git a/src/tests/contract/scripts/setup-dynamodb-local.sh b/src/tests/contract/scripts/setup-dynamodb-local.sh new file mode 100755 index 000000000..5342c244c --- /dev/null +++ b/src/tests/contract/scripts/setup-dynamodb-local.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# Step 1: Run DynamoDB Local in Docker + +# Pull the DynamoDB Local Docker Image +echo "Pulling DynamoDB Local Docker Image..." +docker pull amazon/dynamodb-local + +# Start the DynamoDB Local Container +echo "Starting DynamoDB Local Docker Container..." +docker run -d -p 8000:8000 amazon/dynamodb-local + +# Wait a bit to ensure DynamoDB Local starts +echo "Waiting for DynamoDB Local to start..." +sleep 5 + +# Step 2: Create the Table + +# Configure AWS CLI for local use +echo "Configuring AWS CLI for local use..." +aws configure set default.region us-west-2 +aws configure set output json + +# Create the session Table +echo "Creating the DynamoDB session-table..." +aws dynamodb create-table \ + --table-name session-table \ + --attribute-definitions AttributeName=sessionId,AttributeType=S \ + AttributeName=authorizationCode,AttributeType=S \ + --key-schema AttributeName=sessionId,KeyType=HASH \ + --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \ + --global-secondary-indexes \ + "[ + { + \"IndexName\": \"authCode-updated-index\", + \"KeySchema\": [{\"AttributeName\":\"authorizationCode\",\"KeyType\":\"HASH\"}], + \"Projection\":{ + \"ProjectionType\":\"INCLUDE\", + \"NonKeyAttributes\":[\"sessionId\", \"redirectUri\", \"clientId\", \"authSessionState\", \"clientSessionId\", \"expiryDate\"] + }, + \"ProvisionedThroughput\": { + \"ReadCapacityUnits\": 10, + \"WriteCapacityUnits\": 5 + } + } + ]" \ + --endpoint-url http://localhost:8000 + +# Step 3: Add the Record to the Table + +# Insert the session-items to session-table +echo "Inserting a record into the session-table..." +aws dynamodb batch-write-item \ + --request-items file://data/session-items.json \ + --return-consumed-capacity TOTAL \ + --endpoint-url http://localhost:8000 + + +echo "DynamoDB Local setup complete." diff --git a/src/tests/contract/utils/ApiRequestUtils.ts b/src/tests/contract/utils/ApiRequestUtils.ts new file mode 100644 index 000000000..a123f1988 --- /dev/null +++ b/src/tests/contract/utils/ApiRequestUtils.ts @@ -0,0 +1,72 @@ +import { APIGatewayProxyEventHeaders } from "aws-lambda"; +import { randomUUID } from "crypto"; +import { IncomingHttpHeaders } from "http"; + +export const eventRequest = { + body: "", + requestContext: { + requestId: randomUUID(), + accountId: "", + apiId: "", + authorizer: undefined, + protocol: "", + httpMethod: "", + identity: { + accessKey: "", + accountId: "", + apiKey: "", + apiKeyId: "", + caller: "", + clientCert: { + clientCertPem: "", + issuerDN: "", + serialNumber: "", + subjectDN: "", + validity: { notAfter: "", notBefore: "" }, + }, + cognitoAuthenticationProvider: "", + cognitoAuthenticationType: "", + cognitoIdentityId: "", + cognitoIdentityPoolId: "", + principalOrgId: "", + sourceIp: "", + user: "", + userAgent: "", + userArn: "", + }, + path: "", + stage: "", + requestTimeEpoch: 0, + resourceId: "", + resourcePath: "", + }, + headers: {}, + multiValueHeaders: {}, + httpMethod: "", + isBase64Encoded: false, + path: "", + pathParameters: null, + queryStringParameters: null, + multiValueQueryStringParameters: null, + stageVariables: null, + resource: "", +}; + +export function convertUrlEncodedRequestBodyToString(body: { [key: string]: string }): string { + const params = new URLSearchParams(body); + const formDataString = params.toString(); + const jsonString = decodeURIComponent(formDataString); + const jsonObject = JSON.parse(jsonString); + const urlEncodedString = Object.keys(jsonObject).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(jsonObject[key])}`).join("&"); + return urlEncodedString; +} + +export function convertIncomingHeadersToAPIGatewayHeaders(incomingHeaders: IncomingHttpHeaders): APIGatewayProxyEventHeaders { + const apiGatewayHeaders: APIGatewayProxyEventHeaders = {}; + + for (const [key, value] of Object.entries(incomingHeaders)) { + apiGatewayHeaders[key] = value!.toString(); + } + return apiGatewayHeaders; +} + diff --git a/src/tests/contract/utils/Constants.ts b/src/tests/contract/utils/Constants.ts new file mode 100644 index 000000000..12fab2a4b --- /dev/null +++ b/src/tests/contract/utils/Constants.ts @@ -0,0 +1,15 @@ +export class Constants { + + static readonly TOKEN_ENDPOINT = "/token"; + + static readonly USERINFO_ENDPOINT = "/userinfo"; + + static readonly LOCAL_APP_PORT = 3000; + + static readonly HTTP_CONTENT_TYPE_HEADER = "Content-Type"; + + static readonly JSON_CONTENT_TYPE = "application/json"; + + static readonly LOCAL_HOST = "http://localhost"; + +} diff --git a/src/tests/data/F2F_CRI_AUTH_CODE_ISSUED_SCHEMA.json b/src/tests/data/F2F_CRI_AUTH_CODE_ISSUED_SCHEMA.json index 8a6651586..18c97c9e0 100644 --- a/src/tests/data/F2F_CRI_AUTH_CODE_ISSUED_SCHEMA.json +++ b/src/tests/data/F2F_CRI_AUTH_CODE_ISSUED_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" } @@ -42,6 +45,8 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_END_SCHEMA.json b/src/tests/data/F2F_CRI_END_SCHEMA.json index a1e6e62ac..a0570132c 100644 --- a/src/tests/data/F2F_CRI_END_SCHEMA.json +++ b/src/tests/data/F2F_CRI_END_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -66,7 +69,9 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_START_SCHEMA.json b/src/tests/data/F2F_CRI_START_SCHEMA.json index 69369c509..746896c06 100644 --- a/src/tests/data/F2F_CRI_START_SCHEMA.json +++ b/src/tests/data/F2F_CRI_START_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" } @@ -42,6 +45,8 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_00_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_00_SCHEMA.json index e8867ff61..3d1cfc2bc 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_00_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_00_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -247,8 +250,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_01_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_01_SCHEMA.json index 9cac579f1..cb8ca90f1 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_01_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_01_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -220,8 +223,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_02_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_02_SCHEMA.json index 9cac579f1..cb8ca90f1 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_02_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_02_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -220,8 +223,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_03_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_03_SCHEMA.json index 11a3272f7..1a0903cfd 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_03_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_03_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -239,8 +242,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_04_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_04_SCHEMA.json index 2a5a4305e..98b97767d 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_04_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_04_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -243,8 +246,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_05_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_05_SCHEMA.json index 284814d40..c04cee691 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_05_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_05_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -239,8 +242,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_CRI_VC_ISSUED_SCHEMA.json b/src/tests/data/F2F_CRI_VC_ISSUED_SCHEMA.json index e8867ff61..3d1cfc2bc 100644 --- a/src/tests/data/F2F_CRI_VC_ISSUED_SCHEMA.json +++ b/src/tests/data/F2F_CRI_VC_ISSUED_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -247,8 +250,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_DOCUMENT_UPLOADED_SCHEMA.json b/src/tests/data/F2F_DOCUMENT_UPLOADED_SCHEMA.json index 248712e45..ea01c3a50 100644 --- a/src/tests/data/F2F_DOCUMENT_UPLOADED_SCHEMA.json +++ b/src/tests/data/F2F_DOCUMENT_UPLOADED_SCHEMA.json @@ -1,57 +1,98 @@ { "type": "object", "properties": { - "event_name": { + "event_name": { + "type": "string" + }, + "user": { + "type": "object", + "properties": { + "user_id": { "type": "string" - }, - "user": { - "type": "object", - "properties": { - "user_id": { - "type": "string" - } }, - "required": [ - "user_id" - ] - }, - "timestamp": { - "type": "integer" + "session_id": { + "type": "string" + }, + "ip_address": { + "type": "string" + } }, - "extensions": { - "type": "object", - "properties": { - "previous_govuk_signin_journey_id": { - "type": "string" - }, - "post_office_visit_details": { - "type": "array", - "items": [ - { - "type": "object", - "properties": { - "post_office_date_of_visit": { - "type": "string" - }, - "post_office_time_of_visit": { - "type": "string" - } - } + "required": [ + "user_id", + "session_id", + "ip_address" + ] + }, + "client_id": { + "type": "string" + }, + "timestamp": { + "type": "integer" + }, + "event_timestamp_ms": { + "type": "integer" + }, + "component_id": { + "type": "string" + }, + "extensions": { + "type": "object", + "properties": { + "previous_govuk_signin_journey_id": { + "type": "string" + }, + "evidence": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "txn": { + "type": "string" } + }, + "required": [ + "txn" ] } - } + ] }, - "required": [ - "previous_govuk_signin_journey_id", - "post_office_visit_details" - ] - } - }, - "required": [ - "event_name", - "user", - "timestamp", - "extensions" - ] - } \ No newline at end of file + "post_office_timings": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "post_office_date": { + "type": "string" + }, + "post_office_time": { + "type": "string" + } + }, + "required": [ + "post_office_date", + "post_office_time" + ] + } + ] + } + }, + "required": [ + "previous_govuk_signin_journey_id", + "evidence", + "post_office_timings" + ] + } + }, + "required": [ + "event_name", + "user", + "client_id", + "timestamp", + "event_timestamp_ms", + "component_id", + "extensions" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_PDF_EMAILED_SCHEMA.json b/src/tests/data/F2F_YOTI_PDF_EMAILED_SCHEMA.json index 8980a1fac..3ec3f2664 100644 --- a/src/tests/data/F2F_YOTI_PDF_EMAILED_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_PDF_EMAILED_SCHEMA.json @@ -37,6 +37,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -70,7 +73,9 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_RESPONSE_RECEIVED_SCHEMA.json b/src/tests/data/F2F_YOTI_RESPONSE_RECEIVED_SCHEMA.json index a1e6e62ac..a0570132c 100644 --- a/src/tests/data/F2F_YOTI_RESPONSE_RECEIVED_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_RESPONSE_RECEIVED_SCHEMA.json @@ -29,6 +29,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -66,7 +69,9 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_00_SCHEMA.json b/src/tests/data/F2F_YOTI_START_00_SCHEMA.json index f3b945ac6..f688cea2c 100644 --- a/src/tests/data/F2F_YOTI_START_00_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_00_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -105,6 +108,39 @@ "restricted": { "type": "object", "properties": { + "name": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "nameParts": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "value" + ] + } + ] + } + }, + "required": [ + "nameParts" + ] + } + ] + }, "drivingPermit": { "type": "array", "items": [ @@ -127,6 +163,7 @@ } }, "required": [ + "name", "drivingPermit" ] } @@ -136,8 +173,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_01_SCHEMA.json b/src/tests/data/F2F_YOTI_START_01_SCHEMA.json index 5f002dcf5..8d4a98a7c 100644 --- a/src/tests/data/F2F_YOTI_START_01_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_01_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -105,6 +108,39 @@ "restricted": { "type": "object", "properties": { + "name": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "nameParts": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "value" + ] + } + ] + } + }, + "required": [ + "nameParts" + ] + } + ] + }, "passport": { "type": "array", "items": [ @@ -127,6 +163,7 @@ } }, "required": [ + "name", "passport" ] } @@ -136,8 +173,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_02_SCHEMA.json b/src/tests/data/F2F_YOTI_START_02_SCHEMA.json index 5f002dcf5..8d4a98a7c 100644 --- a/src/tests/data/F2F_YOTI_START_02_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_02_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -105,6 +108,39 @@ "restricted": { "type": "object", "properties": { + "name": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "nameParts": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "value" + ] + } + ] + } + }, + "required": [ + "nameParts" + ] + } + ] + }, "passport": { "type": "array", "items": [ @@ -127,6 +163,7 @@ } }, "required": [ + "name", "passport" ] } @@ -136,8 +173,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_03_SCHEMA.json b/src/tests/data/F2F_YOTI_START_03_SCHEMA.json index fa0c7117f..c39d1e341 100644 --- a/src/tests/data/F2F_YOTI_START_03_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_03_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -105,6 +108,39 @@ "restricted": { "type": "object", "properties": { + "name": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "nameParts": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "value" + ] + } + ] + } + }, + "required": [ + "nameParts" + ] + } + ] + }, "residencePermit": { "type": "array", "items": [ @@ -127,6 +163,7 @@ } }, "required": [ + "name", "residencePermit" ] } @@ -136,8 +173,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_04_SCHEMA.json b/src/tests/data/F2F_YOTI_START_04_SCHEMA.json index f3b945ac6..f688cea2c 100644 --- a/src/tests/data/F2F_YOTI_START_04_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_04_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -105,6 +108,39 @@ "restricted": { "type": "object", "properties": { + "name": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "nameParts": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "value" + ] + } + ] + } + }, + "required": [ + "nameParts" + ] + } + ] + }, "drivingPermit": { "type": "array", "items": [ @@ -127,6 +163,7 @@ } }, "required": [ + "name", "drivingPermit" ] } @@ -136,8 +173,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_05_SCHEMA.json b/src/tests/data/F2F_YOTI_START_05_SCHEMA.json index 0e0c3b73b..5a06e2ab5 100644 --- a/src/tests/data/F2F_YOTI_START_05_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_05_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -105,6 +108,39 @@ "restricted": { "type": "object", "properties": { + "name": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "nameParts": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "value" + ] + } + ] + } + }, + "required": [ + "nameParts" + ] + } + ] + }, "idCard": { "type": "array", "items": [ @@ -127,6 +163,7 @@ } }, "required": [ + "name", "idCard" ] } @@ -136,8 +173,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/F2F_YOTI_START_SCHEMA.json b/src/tests/data/F2F_YOTI_START_SCHEMA.json index 5f002dcf5..37391db58 100644 --- a/src/tests/data/F2F_YOTI_START_SCHEMA.json +++ b/src/tests/data/F2F_YOTI_START_SCHEMA.json @@ -33,6 +33,9 @@ "timestamp": { "type": "integer" }, + "event_timestamp_ms": { + "type": "integer" + }, "component_id": { "type": "string" }, @@ -136,8 +139,10 @@ "user", "client_id", "timestamp", + "event_timestamp_ms", "component_id", "extensions", "restricted" - ] + ], + "additionalProperties": false } \ No newline at end of file diff --git a/src/tests/data/dataPassportBlankFad.json b/src/tests/data/dataPassportBlankFad.json new file mode 100644 index 000000000..876f41774 --- /dev/null +++ b/src/tests/data/dataPassportBlankFad.json @@ -0,0 +1,16 @@ +{ + "document_selection": { + "document_selected": "ukPassport", + "date_of_expiry": "1970-01-01", + "country_code": "GBR" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": "BA1 1RT", + "fad_code": "" + } + } \ No newline at end of file diff --git a/src/tests/data/dataPassportIncorrectFad.json b/src/tests/data/dataPassportIncorrectFad.json new file mode 100644 index 000000000..c771e24bc --- /dev/null +++ b/src/tests/data/dataPassportIncorrectFad.json @@ -0,0 +1,16 @@ +{ + "document_selection": { + "document_selected": "ukPassport", + "date_of_expiry": "1970-01-01", + "country_code": "GBR" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": "BA1 1RT", + "fad_code": "123XXXX" + } + } \ No newline at end of file diff --git a/src/tests/data/dataPassportInvalidFadFormat.json b/src/tests/data/dataPassportInvalidFadFormat.json new file mode 100644 index 000000000..1023f82c6 --- /dev/null +++ b/src/tests/data/dataPassportInvalidFadFormat.json @@ -0,0 +1,16 @@ +{ + "document_selection": { + "document_selected": "ukPassport", + "date_of_expiry": "1970-01-01", + "country_code": "GBR" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": "BA1 1RT", + "fad_code": "1234567X" + } + } \ No newline at end of file diff --git a/src/tests/data/dataPassportMissingFad.json b/src/tests/data/dataPassportMissingFad.json new file mode 100644 index 000000000..6aa999298 --- /dev/null +++ b/src/tests/data/dataPassportMissingFad.json @@ -0,0 +1,15 @@ +{ + "document_selection": { + "document_selected": "ukPassport", + "date_of_expiry": "1970-01-01", + "country_code": "GBR" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": "BA1 1RT" + } + } \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadBrpValid.json b/src/tests/data/docSelectionPayloadBrpValid.json index 8d458c28c..2ad36d704 100644 --- a/src/tests/data/docSelectionPayloadBrpValid.json +++ b/src/tests/data/docSelectionPayloadBrpValid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"brp", - "date_of_expiry":"1970-01-01", + "document_selection": { + "document_selected": "brp", + "date_of_expiry": "1970-01-01", "country_code": "GBR" }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 }, - "post_code":"SW19 4NS" + "post_code": "BA1 1RT", + "fad_code": "004010X" } } \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadDriversLicenceInvalid.json b/src/tests/data/docSelectionPayloadDriversLicenceInvalid.json index b915515a1..0291fecd2 100644 --- a/src/tests/data/docSelectionPayloadDriversLicenceInvalid.json +++ b/src/tests/data/docSelectionPayloadDriversLicenceInvalid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"ukPhotocardDl", - "date_of_expiry":"1970-01-01", - "country_code": "GBR" - }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 - }, - "post_code":null - } + "document_selection": { + "document_selected": "ukPhotocardDl", + "date_of_expiry": "1970-01-01", + "country_code": "GBR" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": null, + "fad_code": "004010X" + } } \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadDriversLicenceValid.json b/src/tests/data/docSelectionPayloadDriversLicenceValid.json index 968215d36..cd046475e 100644 --- a/src/tests/data/docSelectionPayloadDriversLicenceValid.json +++ b/src/tests/data/docSelectionPayloadDriversLicenceValid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"ukPhotocardDl", - "date_of_expiry":"1970-01-01", - "country_code": "GBR" - }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 - }, - "post_code":"SW19 4NS" - } + "document_selection": { + "document_selected": "ukPhotocardDl", + "date_of_expiry": "1970-01-01", + "country_code": "GBR" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": "BA1 1RT", + "fad_code": "004010X" + } } \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadEeaIdCardValid.json b/src/tests/data/docSelectionPayloadEeaIdCardValid.json index e96d20dec..7f516fb10 100644 --- a/src/tests/data/docSelectionPayloadEeaIdCardValid.json +++ b/src/tests/data/docSelectionPayloadEeaIdCardValid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"eeaIdentityCard", - "date_of_expiry":"1970-01-01", + "document_selection": { + "document_selected": "eeaIdentityCard", + "date_of_expiry": "1970-01-01", "country_code": "ESP" }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 }, - "post_code":"SW19 4NS" + "post_code": "BA1 1RT", + "fad_code": "004010X" } } \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadEuDriversLicenceValid.json b/src/tests/data/docSelectionPayloadEuDriversLicenceValid.json index b53cdc90f..7055f8fb6 100644 --- a/src/tests/data/docSelectionPayloadEuDriversLicenceValid.json +++ b/src/tests/data/docSelectionPayloadEuDriversLicenceValid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"euPhotocardDl", - "date_of_expiry":"1970-01-01", - "country_code": "DEU" - }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 - }, - "post_code":"SW19 4NS" - } + "document_selection": { + "document_selected": "euPhotocardDl", + "date_of_expiry": "1970-01-01", + "country_code": "DEU" + }, + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 + }, + "post_code": "BA1 1RT", + "fad_code": "004010X" + } } \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadNonUkPassportValid.json b/src/tests/data/docSelectionPayloadNonUkPassportValid.json index 9a6722d86..c7bdfc1aa 100644 --- a/src/tests/data/docSelectionPayloadNonUkPassportValid.json +++ b/src/tests/data/docSelectionPayloadNonUkPassportValid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"nonUkPassport", - "date_of_expiry":"1970-01-01", + "document_selection": { + "document_selected": "nonUkPassport", + "date_of_expiry": "1970-01-01", "country_code": "ESP" }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 }, - "post_code":"SW19 4NS" + "post_code": "BA1 1RT", + "fad_code": "004010X" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/tests/data/docSelectionPayloadPassportValid.json b/src/tests/data/docSelectionPayloadPassportValid.json index 55270b1af..1a8106231 100644 --- a/src/tests/data/docSelectionPayloadPassportValid.json +++ b/src/tests/data/docSelectionPayloadPassportValid.json @@ -1,15 +1,16 @@ { - "document_selection":{ - "document_selected":"ukPassport", - "date_of_expiry":"1970-01-01", + "document_selection": { + "document_selected": "ukPassport", + "date_of_expiry": "1970-01-01", "country_code": "GBR" }, - "post_office_selection":{ - "address":"1 The Street, Funkytown", - "location":{ - "latitude":0.34322, - "longitude":-42.48372 + "post_office_selection": { + "address": "6-7 Union Street, Bath, Somerset, BA1 1RT", + "location": { + "latitude": 0.34322, + "longitude": -42.48372 }, - "post_code":"SW19 4NS" + "post_code": "BA1 1RT", + "fad_code": "004010X" } - } \ No newline at end of file +} \ No newline at end of file diff --git a/src/tests/unit/data/txmaEvent.ts b/src/tests/unit/data/txmaEvent.ts index d1197724b..3771d6066 100644 --- a/src/tests/unit/data/txmaEvent.ts +++ b/src/tests/unit/data/txmaEvent.ts @@ -31,6 +31,7 @@ export const TXMA_CORE_FIELDS = { "component_id": "https://XXX-c.env.account.gov.uk", "event_name": "F2F_YOTI_RESPONSE_RECEIVED", "timestamp": 1, + "event_timestamp_ms": 1000, "extensions": { "previous_govuk_signin_journey_id": "sdfssg", "evidence": [ @@ -232,6 +233,7 @@ export const TXMA_PASSPORT_YOTI_START = { ], }, "timestamp": 1684933200, + "event_timestamp_ms": 1684933200000, "user": { "govuk_signin_journey_id": "sdfssg", "ip_address": "127.0.0.1", @@ -260,6 +262,7 @@ export const TXMA_NATIONAL_ID_YOTI_START = { ], }, "timestamp": 1684933200, + "event_timestamp_ms": 1684933200000, "user": { "govuk_signin_journey_id": "sdfssg", "ip_address": "127.0.0.1", diff --git a/src/tests/unit/services/AuthorizationRequestProcessor.test.ts b/src/tests/unit/services/AuthorizationRequestProcessor.test.ts index 7a8ec0a7a..d4a0ebd9c 100644 --- a/src/tests/unit/services/AuthorizationRequestProcessor.test.ts +++ b/src/tests/unit/services/AuthorizationRequestProcessor.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/unbound-method */ +/* eslint-disable max-lines-per-function */ import { Metrics } from "@aws-lambda-powertools/metrics"; import { mock } from "jest-mock-extended"; import { Logger } from "@aws-lambda-powertools/logger"; @@ -9,7 +11,6 @@ import { HttpCodesEnum } from "../../../utils/HttpCodesEnum"; import { AuthSessionState } from "../../../models/enums/AuthSessionState"; import { AuthorizationRequestProcessor } from "../../../services/AuthorizationRequestProcessor"; import { VALID_AUTHCODE } from "../data/auth-events"; -import { absoluteTimeNow } from "../../../utils/DateTimeUtils"; let authorizationRequestProcessorTest: AuthorizationRequestProcessor; const mockF2fService = mock(); @@ -49,6 +50,12 @@ describe("AuthorizationRequestProcessor", () => { beforeEach(() => { jest.clearAllMocks(); + jest.useFakeTimers(); + jest.setSystemTime(new Date(1585695600000)); + }); + + afterEach(() => { + jest.useRealTimers(); }); it("Return successful response with 200 OK when auth code", async () => { @@ -66,16 +73,14 @@ describe("AuthorizationRequestProcessor", () => { redirect_uri: "http://localhost:8085/callback", state: "Y@atr", })); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.setAuthorizationCode).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, { event_name: "F2F_CRI_AUTH_CODE_ISSUED", client_id: "ipv-core-stub", component_id: "https://XXX-c.env.account.gov.uk", - timestamp: absoluteTimeNow(), + timestamp: 1585695600, + event_timestamp_ms: 1585695600000, user: { govuk_signin_journey_id: "sdfssg", ip_address: "127.0.0.1", @@ -84,12 +89,12 @@ describe("AuthorizationRequestProcessor", () => { user_id: "sub", }, }); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(2, { event_name: "F2F_CRI_END", client_id: "ipv-core-stub", component_id: "https://XXX-c.env.account.gov.uk", - timestamp: absoluteTimeNow(), + timestamp: 1585695600, + event_timestamp_ms: 1585695600000, extensions: { "previous_govuk_signin_journey_id": "sdfssg", evidence: [ @@ -110,12 +115,11 @@ describe("AuthorizationRequestProcessor", () => { it("Return 401 when session is expired", async () => { const sess = getMockSessionItem(); - sess.expiryDate = 1675458564; + sess.expiryDate = 1485695600; mockF2fService.getSessionById.mockResolvedValue(sess); const out: Response = await authorizationRequestProcessorTest.processRequest(VALID_AUTHCODE, "1234"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.getSessionById).toHaveBeenCalledTimes(1); expect(out.body).toBe("Session with session id: 1234 has expired"); expect(out.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); @@ -126,7 +130,6 @@ describe("AuthorizationRequestProcessor", () => { const out: Response = await authorizationRequestProcessorTest.processRequest(VALID_AUTHCODE, "1234"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.getSessionById).toHaveBeenCalledTimes(1); expect(out.body).toBe("No session found with the session id: 1234"); expect(out.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); @@ -148,11 +151,8 @@ describe("AuthorizationRequestProcessor", () => { redirect_uri: "http://localhost:8085/callback", state: "Y@atr", })); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.setAuthorizationCode).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(logger.error).toHaveBeenCalledWith("Failed to write TXMA event F2F_CRI_AUTH_CODE_ISSUED to SQS queue.", { "messageCode": "ERROR_WRITING_TXMA" }); expect(out.statusCode).toBe(HttpCodesEnum.OK); }); diff --git a/src/tests/unit/services/DocumentSelectionRequestProcessor.test.ts b/src/tests/unit/services/DocumentSelectionRequestProcessor.test.ts index d05a76d6d..ff55872aa 100644 --- a/src/tests/unit/services/DocumentSelectionRequestProcessor.test.ts +++ b/src/tests/unit/services/DocumentSelectionRequestProcessor.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable max-lines */ +/* eslint-disable max-lines-per-function */ /* eslint-disable @typescript-eslint/dot-notation */ /* eslint-disable @typescript-eslint/unbound-method */ import { Metrics } from "@aws-lambda-powertools/metrics"; @@ -186,9 +188,15 @@ describe("DocumentSelectionRequestProcessor", () => { beforeEach(() => { jest.clearAllMocks(); + jest.useFakeTimers(); + jest.setSystemTime(new Date(1585695600000)); personIdentityItem = getPersonIdentityItem(); }); + afterEach(() => { + jest.useRealTimers(); + }); + it("Return successful response with 200 OK when YOTI session created", async () => { mockF2fService.getSessionById.mockResolvedValueOnce(f2fSessionItem); mockF2fService.getPersonIdentityById.mockResolvedValueOnce(personIdentityItem); @@ -199,22 +207,15 @@ describe("DocumentSelectionRequestProcessor", () => { mockYotiService.generateInstructions.mockResolvedValueOnce(HttpCodesEnum.OK); - jest.useFakeTimers(); - const fakeTime = 1684933200.123; - jest.setSystemTime(new Date(fakeTime * 1000)); // 2023-05-24T13:00:00.000Z - const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_REQUEST, "RandomF2FSessionID"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(1); - const passportYotiStart = TXMA_PASSPORT_YOTI_START; + const passportYotiStart = TXMA_PASSPORT_YOTI_START; passportYotiStart.event_name = "F2F_YOTI_START"; - passportYotiStart.timestamp = absoluteTimeNow(); - // eslint-disable-next-line @typescript-eslint/unbound-method + passportYotiStart.timestamp = 1585695600; + passportYotiStart.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, passportYotiStart); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.updateSessionWithYotiIdAndStatus).toHaveBeenCalledWith("RandomF2FSessionID", "b83d54ce-1565-42ee-987a-97a1f48f27dg", "F2F_YOTI_SESSION_CREATED"); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("Instructions PDF Generated"); @@ -233,16 +234,13 @@ describe("DocumentSelectionRequestProcessor", () => { mockYotiService.generateInstructions.mockResolvedValueOnce(HttpCodesEnum.OK); const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_NON_UK_PASSPORT_REQUEST, "RandomF2FSessionID"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(1); const passportYotiStart = TXMA_PASSPORT_YOTI_START; passportYotiStart.event_name = "F2F_YOTI_START"; - passportYotiStart.timestamp = absoluteTimeNow(); - // eslint-disable-next-line @typescript-eslint/unbound-method + passportYotiStart.timestamp = 1585695600; + passportYotiStart.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, passportYotiStart); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.updateSessionWithYotiIdAndStatus).toHaveBeenCalledWith("RandomF2FSessionID", "b83d54ce-1565-42ee-987a-97a1f48f27dg", "F2F_YOTI_SESSION_CREATED"); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("Instructions PDF Generated"); @@ -263,16 +261,13 @@ describe("DocumentSelectionRequestProcessor", () => { const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_EEA_ID_CARD_REQUEST, "RandomF2FSessionID"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(1); const nationalIdYotiStart = TXMA_NATIONAL_ID_YOTI_START; nationalIdYotiStart.event_name = "F2F_YOTI_START"; - nationalIdYotiStart.timestamp = absoluteTimeNow(); - // eslint-disable-next-line @typescript-eslint/unbound-method + nationalIdYotiStart.timestamp = 1585695600; + nationalIdYotiStart.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, nationalIdYotiStart); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.updateSessionWithYotiIdAndStatus).toHaveBeenCalledWith("RandomF2FSessionID", "b83d54ce-1565-42ee-987a-97a1f48f27dg", "F2F_YOTI_SESSION_CREATED"); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("Instructions PDF Generated"); @@ -523,7 +518,6 @@ describe("DocumentSelectionRequestProcessor", () => { const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_REQUEST, "1234"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(logger.error).toHaveBeenCalledWith("Failed to write TXMA event F2F_YOTI_START to SQS queue.", { "messageCode": "ERROR_WRITING_TXMA" }); expect(out.statusCode).toBe(HttpCodesEnum.OK); @@ -544,7 +538,6 @@ describe("DocumentSelectionRequestProcessor", () => { const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_REQUEST, "1234"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); expect(out.statusCode).toBe(HttpCodesEnum.SERVER_ERROR); expect(out.body).toBe("An error occurred when sending message to GovNotify handler"); @@ -572,7 +565,6 @@ describe("DocumentSelectionRequestProcessor", () => { const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_REQUEST, "1234"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); expect(out.statusCode).toBe(HttpCodesEnum.SERVER_ERROR); expect(out.body).toBe("An error has occurred"); @@ -596,7 +588,6 @@ describe("DocumentSelectionRequestProcessor", () => { const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_REQUEST, "RandomF2FSessionID"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); expect(out.statusCode).toBe(HttpCodesEnum.SERVER_ERROR); expect(out.body).toBe("An error has occurred"); @@ -616,7 +607,6 @@ describe("DocumentSelectionRequestProcessor", () => { const out: Response = await mockDocumentSelectionRequestProcessor.processRequest(VALID_REQUEST, "RandomF2FSessionID"); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToGovNotify).toHaveBeenCalledTimes(1); expect(out.statusCode).toBe(HttpCodesEnum.SERVER_ERROR); expect(out.body).toBe("An error has occurred"); diff --git a/src/tests/unit/services/EnvironmentVariables.test.ts b/src/tests/unit/services/EnvironmentVariables.test.ts index 08fae130a..03b484aa1 100644 --- a/src/tests/unit/services/EnvironmentVariables.test.ts +++ b/src/tests/unit/services/EnvironmentVariables.test.ts @@ -108,6 +108,17 @@ describe("EnvironmentVariables", () => { }); }); + describe("dnsSuffix", () => { + it("should return the value of DNSSUFFIX", () => { + process.env.DNSSUFFIX = "DNSSUFFIX"; + const envVars = new EnvironmentVariables(logger, ServicesEnum.GOV_NOTIFY_SERVICE); + + const result = envVars.dnsSuffix(); + + expect(result).toBe("DNSSUFFIX"); + }); + }); + describe("encryptionKeyIds", () => { it("should return the value of ENCRYPTION_KEY_IDS", () => { process.env.ENCRYPTION_KEY_IDS = "ENCRYPTION_KEY_IDS_VALUE"; diff --git a/src/tests/unit/services/F2fService.test.ts b/src/tests/unit/services/F2fService.test.ts index d6c93804c..dd2d0a892 100644 --- a/src/tests/unit/services/F2fService.test.ts +++ b/src/tests/unit/services/F2fService.test.ts @@ -32,6 +32,7 @@ const getTXMAEventPayload = (): TxmaEvent => ({ }, client_id: "clientId", timestamp: 123, + event_timestamp_ms: 123000, component_id: "issuer", }); diff --git a/src/tests/unit/services/SendEmailService.test.ts b/src/tests/unit/services/SendEmailService.test.ts index d2f8ed506..f70a89f91 100644 --- a/src/tests/unit/services/SendEmailService.test.ts +++ b/src/tests/unit/services/SendEmailService.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines-per-function */ /* eslint-disable @typescript-eslint/unbound-method */ import { Logger } from "@aws-lambda-powertools/logger"; import { SQSEvent } from "aws-lambda"; @@ -52,10 +53,6 @@ function getMockSessionItem(): ISessionItem { const timestamp = 1689952318; -jest.mock("../../../utils/DateTimeUtils", () => ({ - absoluteTimeNow: () => timestamp, -})); - describe("SendEmailProcessor", () => { beforeAll(() => { sendEmailServiceTest = SendEmailService.getInstance(logger, YOTI_PRIVATE_KEY, GOVUKNOTIFY_API_KEY, "serviceId"); @@ -72,9 +69,15 @@ describe("SendEmailProcessor", () => { beforeEach(() => { jest.clearAllMocks(); + jest.useFakeTimers(); + jest.setSystemTime(new Date(timestamp * 1000)); sqsEvent = VALID_SQS_EVENT; }); + afterEach(() => { + jest.useRealTimers(); + }); + it("Returns EmailResponse when YOTI PDF email is sent successfully", async () => { const mockEmailResponse = new EmailResponse(new Date().toISOString(), "", 201); const session = getMockSessionItem(); @@ -92,6 +95,7 @@ describe("SendEmailProcessor", () => { client_id: "ipv-core-stub", component_id: "https://XXX-c.env.account.gov.uk", timestamp, + event_timestamp_ms: timestamp * 1000, extensions: { evidence: [ { @@ -133,7 +137,9 @@ describe("SendEmailProcessor", () => { }); it("SendEmailService retries when GovNotify throws a 500 error", async () => { - mockGovNotify.sendEmail.mockRejectedValue( { + jest.useRealTimers(); + mockYotiService.fetchInstructionsPdf.mockResolvedValue("instructionsPdf"); + mockGovNotify.sendEmail.mockRejectedValue({ "response": { "data": { "errors": [ @@ -144,7 +150,6 @@ describe("SendEmailProcessor", () => { ], "status_code": 500, }, - }, }); @@ -155,7 +160,9 @@ describe("SendEmailProcessor", () => { }); it("SendEmailService retries when GovNotify throws a 429 error", async () => { - mockGovNotify.sendEmail.mockRejectedValue( { + jest.useRealTimers(); + mockYotiService.fetchInstructionsPdf.mockResolvedValue("instructionsPdf"); + mockGovNotify.sendEmail.mockRejectedValue({ "response": { "data": { "errors": [ @@ -166,7 +173,6 @@ describe("SendEmailProcessor", () => { ], "status_code": 429, }, - }, }); diff --git a/src/tests/unit/services/SessionRequestProcessor.test.ts b/src/tests/unit/services/SessionRequestProcessor.test.ts index f1de96b45..4c426ce3a 100644 --- a/src/tests/unit/services/SessionRequestProcessor.test.ts +++ b/src/tests/unit/services/SessionRequestProcessor.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable max-lines */ +/* eslint-disable max-lines-per-function */ import { SessionRequestProcessor } from "../../../services/SessionRequestProcessor"; import { Metrics } from "@aws-lambda-powertools/metrics"; import { mock } from "jest-mock-extended"; @@ -113,13 +115,8 @@ describe("SessionRequestProcessor", () => { }); it("should report unrecognised client", async () => { - - // Arrange - - // Act const response = await sessionRequestProcessor.processRequest(SESSION_WITH_INVALID_CLIENT); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.BAD_REQUEST); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( @@ -131,14 +128,10 @@ describe("SessionRequestProcessor", () => { }); it("should report a JWE decryption failure", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockRejectedValue("error"); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( @@ -150,17 +143,13 @@ describe("SessionRequestProcessor", () => { }); it("should report a failure to decode JWT", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockImplementation(() => { throw Error("Error"); }); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( @@ -172,59 +161,47 @@ describe("SessionRequestProcessor", () => { }); it("should report a JWT verification failure", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(null); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ - messageCode: "FAILED_VERIFYING_JWT", + messageCode: MessageCodes.FAILED_VERIFYING_JWT, }), ); }); it("should report an unexpected error verifying JWT", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockRejectedValue({}); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( expect.anything(), expect.objectContaining({ - messageCode: "UNEXPECTED_ERROR_VERIFYING_JWT", + messageCode: MessageCodes.FAILED_VERIFYING_JWT, }), ); }); it("should report a JWT validation failure", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); mockValidationHelper.isJwtValid.mockReturnValue("errors"); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledWith( expect.anything(), @@ -235,8 +212,6 @@ describe("SessionRequestProcessor", () => { }); it("should report invalid address countryCode failure", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -244,10 +219,8 @@ describe("SessionRequestProcessor", () => { mockValidationHelper.isPersonDetailsValid.mockReturnValue({ errorMessage : "", errorMessageCode : "" }); mockValidationHelper.isAddressFormatValid.mockReturnValue({ errorMessage:"Invalid country code in the postalAddress", errorMessageCode: MessageCodes.INVALID_COUNTRY_CODE }); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledWith( expect.anything(), @@ -258,8 +231,6 @@ describe("SessionRequestProcessor", () => { }); it("should report invalid address format failure", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -267,10 +238,8 @@ describe("SessionRequestProcessor", () => { mockValidationHelper.isPersonDetailsValid.mockReturnValue({ errorMessage : "", errorMessageCode : "" }); mockValidationHelper.isAddressFormatValid.mockReturnValue({ errorMessage:"Missing all or some of mandatory postalAddress fields (subBuildingName, buildingName, buildingNumber and streetName), unable to create the session", errorMessageCode: MessageCodes.MISSING_ALL_MANDATORY_POSTAL_ADDRESS_FIELDS }); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledWith( expect.anything(), @@ -281,8 +250,6 @@ describe("SessionRequestProcessor", () => { }); it("should return unauthorized when emailAddress is missing in the sharedClaim data", async () => { - - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -290,10 +257,8 @@ describe("SessionRequestProcessor", () => { mockValidationHelper.isPersonDetailsValid.mockReturnValue({ errorMessage:"Missing emailAddress from shared claims data", errorMessageCode: MessageCodes.MISSING_PERSON_EMAIL_ADDRESS }); mockValidationHelper.isAddressFormatValid.mockReturnValue({ errorMessage:"", errorMessageCode: "" }); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.UNAUTHORIZED); expect(logger.error).toHaveBeenCalledWith( expect.anything(), @@ -304,7 +269,6 @@ describe("SessionRequestProcessor", () => { }); it("should report session already exists", async () => { - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -313,10 +277,8 @@ describe("SessionRequestProcessor", () => { mockValidationHelper.isAddressFormatValid.mockReturnValue({ errorMessage:"", errorMessageCode: "" }); mockF2fService.getSessionById.mockResolvedValue(sessionItemFactory()); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( expect.anything(), @@ -332,7 +294,6 @@ describe("SessionRequestProcessor", () => { }); it("should fail to create a session", async () => { - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -342,10 +303,8 @@ describe("SessionRequestProcessor", () => { mockF2fService.getSessionById.mockResolvedValue(undefined); mockF2fService.createAuthSession.mockRejectedValue("error"); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( expect.anything(), @@ -361,7 +320,6 @@ describe("SessionRequestProcessor", () => { }); it("should create a new session", async () => { - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -371,10 +329,8 @@ describe("SessionRequestProcessor", () => { mockF2fService.getSessionById.mockResolvedValue(undefined); mockF2fService.createAuthSession.mockResolvedValue(); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.OK); expect(logger.appendKeys).toHaveBeenCalledWith({ sessionId: expect.any(String), @@ -383,7 +339,6 @@ describe("SessionRequestProcessor", () => { }); it("should create a new session but report a TxMA failure", async () => { - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -394,10 +349,8 @@ describe("SessionRequestProcessor", () => { mockF2fService.createAuthSession.mockResolvedValue(); mockF2fService.sendToTXMA.mockRejectedValue("failed"); - // Act const response = await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(response.statusCode).toBe(HttpCodesEnum.OK); expect(logger.error).toHaveBeenCalledTimes(1); expect(logger.error).toHaveBeenCalledWith( @@ -415,7 +368,6 @@ describe("SessionRequestProcessor", () => { // the test below fails as the session processor is not writing the expiryDate value correctly in // seconds, it is writing it in ms. To be fixed in separate ticket it("the session created should have a valid expiryDate", async () => { - // Arrange mockKmsJwtAdapter.decrypt.mockResolvedValue("success"); mockKmsJwtAdapter.decode.mockReturnValue(decodedJwtFactory()); mockKmsJwtAdapter.verifyWithJwks.mockResolvedValue(decryptedJwtPayloadFactory()); @@ -429,10 +381,8 @@ describe("SessionRequestProcessor", () => { const fakeTime = 1684933200.123; jest.setSystemTime(new Date(fakeTime * 1000)); // 2023-05-24T13:00:00.000Z - // Act await sessionRequestProcessor.processRequest(VALID_SESSION); - // Assert expect(mockF2fService.createAuthSession).toHaveBeenNthCalledWith( 1, expect.objectContaining({ diff --git a/src/tests/unit/services/ThankYouEmailProcessor.test.ts b/src/tests/unit/services/ThankYouEmailProcessor.test.ts index a3eb2030a..1fb14b1ab 100644 --- a/src/tests/unit/services/ThankYouEmailProcessor.test.ts +++ b/src/tests/unit/services/ThankYouEmailProcessor.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines-per-function */ /* eslint-disable @typescript-eslint/unbound-method */ import { Logger } from "@aws-lambda-powertools/logger"; import { Metrics } from "@aws-lambda-powertools/metrics"; @@ -307,6 +308,7 @@ describe("ThankYouEmailProcessor", () => { client_id: "ipv-core-stub", component_id: "https://XXX-c.env.account.gov.uk", timestamp: 1585695600, + event_timestamp_ms: 1585695600000, user: { ip_address: "127.0.0.1", persistent_session_id: "sdgsdg", diff --git a/src/tests/unit/services/VerifiableCredentialService.test.ts b/src/tests/unit/services/VerifiableCredentialService.test.ts index 976547500..f3d1e9256 100644 --- a/src/tests/unit/services/VerifiableCredentialService.test.ts +++ b/src/tests/unit/services/VerifiableCredentialService.test.ts @@ -24,6 +24,7 @@ describe("VerifiableCredentialService", () => { const issuer = "test-issuer"; const logger = mock(); const kmsJwtAdapter = new KmsJwtAdapter("kid"); + const dnsSuffix = "dnsSuffix123"; const credentialSubject = { "birthDate": [ @@ -99,6 +100,7 @@ describe("VerifiableCredentialService", () => { kmsJwtAdapter, issuer, logger, + dnsSuffix, ); }); @@ -144,7 +146,7 @@ describe("VerifiableCredentialService", () => { const result = await verifiableCredentialService.signGeneratedVerifiableCredentialJwt(jwt); expect(getNow).toHaveBeenCalled(); - expect(signMock).toHaveBeenCalledWith(payloadToSign); + expect(signMock).toHaveBeenCalledWith(payloadToSign, dnsSuffix); expect(result).toBe(signedJwt); }); @@ -218,7 +220,7 @@ describe("VerifiableCredentialService", () => { })) .rejects.toThrow(new AppError(HttpCodesEnum.SERVER_ERROR, "Failed to sign Jwt")); - expect(signMock).toHaveBeenCalledWith(payloadToSign); + expect(signMock).toHaveBeenCalledWith(payloadToSign, dnsSuffix); }); }); diff --git a/src/tests/unit/services/YotiService.test.ts b/src/tests/unit/services/YotiService.test.ts index 000743b50..8d9a912d1 100644 --- a/src/tests/unit/services/YotiService.test.ts +++ b/src/tests/unit/services/YotiService.test.ts @@ -161,13 +161,7 @@ const generateInstructionsPayload = { ], branch: { type: "UK_POST_OFFICE", - name: "UK Post Office Branch", - address: "1 The Street, Funkytown", - post_code: "SW19 4NS", - location: { - latitude: 0.34322, - longitude: -42.48372, - }, + fad_code: "004010X", }, }; @@ -523,15 +517,10 @@ describe("YotiService", () => { longitude: -42.48372, }, post_code: "SW19 4NS", + fad_code: "004010X", }; - const PostOfficeSelectionWithName = { - ...PostOfficeSelection, - name: "The Funkytown Post office", - }; - - - it("should generate instructions using hardcoded PO name and return OK status code", async () => { + it("should generate instructions and return OK status code", async () => { const generateYotiRequestMock = jest.spyOn(yotiService as any, "generateYotiRequest").mockReturnValue({ url: "https://example.com/api/sessions/session123/instructions", config: {}, @@ -550,33 +539,6 @@ describe("YotiService", () => { expect(statusCode).toBe(HttpCodesEnum.OK); }); - it("should include the received PO name from FE in the Yoti putInstructions call", async () => { - const generateYotiRequestMock = jest.spyOn(yotiService as any, "generateYotiRequest").mockReturnValue({ - url: "https://example.com/api/sessions/session123/instructions", - config: {}, - }); - - axiosMock.put.mockResolvedValueOnce({}); - - const statusCode = await yotiService.generateInstructions(sessionID, personDetails, requirements, PostOfficeSelectionWithName); - - const generateInstructionsPayloadWithName = { - ...generateInstructionsPayload, - branch: { - ...generateInstructionsPayload.branch, - name: "The Funkytown Post office", - }, - }; - - expect(generateYotiRequestMock).toHaveBeenCalled(); - expect(axios.put).toHaveBeenCalledWith( - "https://example.com/api/sessions/session123/instructions", - generateInstructionsPayloadWithName, - {}, - ); - expect(statusCode).toBe(HttpCodesEnum.OK); - }); - it("should throw an AppError if there is an error generating the instructions PDF", async () => { const generateYotiRequestMock = jest.spyOn(yotiService as any, "generateYotiRequest").mockReturnValue({ url: "https://example.com/api/sessions/session123/instructions", diff --git a/src/tests/unit/services/YotiSessionCompletionProcessor.test.ts b/src/tests/unit/services/YotiSessionCompletionProcessor.test.ts index 021f852e4..0c698d185 100644 --- a/src/tests/unit/services/YotiSessionCompletionProcessor.test.ts +++ b/src/tests/unit/services/YotiSessionCompletionProcessor.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable max-lines */ +/* eslint-disable max-lines-per-function */ /* eslint-disable @typescript-eslint/unbound-method */ import { Metrics } from "@aws-lambda-powertools/metrics"; import { mock } from "jest-mock-extended"; @@ -124,35 +126,36 @@ describe("YotiSessionCompletionProcessor", () => { beforeEach(() => { jest.clearAllMocks(); + jest.useFakeTimers(); + jest.setSystemTime(new Date(1585695600000)); // @ts-ignore mockCompletedSessionProcessor.kmsJwtAdapter = passingKmsJwtAdapterFactory(); }); + afterEach(() => { + jest.useRealTimers(); + }); + it("Return successful response with 200 OK when YOTI session created with UK Passport", async () => { - jest.useFakeTimers(); - jest.setSystemTime(absoluteTimeNow()); mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(completedYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce(documentFields); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); const out: Response = await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method const coreFields = TXMA_CORE_FIELDS; - coreFields.timestamp = absoluteTimeNow(); + coreFields.timestamp = 1585695600; + coreFields.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenCalledWith(coreFields); const vcIssued = TXMA_VC_ISSUED; vcIssued.event_name = "F2F_CRI_VC_ISSUED"; - vcIssued.timestamp = absoluteTimeNow(); + vcIssued.timestamp = 1585695600; + vcIssued.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(2, vcIssued); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledWith({ sub: "testsub", state: "Y@atr", @@ -224,38 +227,31 @@ describe("YotiSessionCompletionProcessor", () => { }); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("OK"); - jest.useRealTimers(); }); it("Return successful response with 200 OK when YOTI session created with driving permit", async () => { documentFields = getDrivingPermitFields(); const ukDLYotiSession = getCompletedYotiSession(); ukDLYotiSession.resources.id_documents[0].document_type = "DRIVING_LICENCE"; - jest.useFakeTimers(); - jest.setSystemTime(absoluteTimeNow()); mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(ukDLYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce(documentFields); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); const out: Response = await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); const ukDlcoreFields = TXMA_CORE_FIELDS; - ukDlcoreFields.timestamp = absoluteTimeNow(); + ukDlcoreFields.timestamp = 1585695600; + ukDlcoreFields.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, ukDlcoreFields); const ukDlVcIssued = TXMA_DL_VC_ISSUED; ukDlVcIssued.event_name = "F2F_CRI_VC_ISSUED"; - ukDlVcIssued.timestamp = absoluteTimeNow(); - // eslint-disable-next-line @typescript-eslint/unbound-method + ukDlVcIssued.timestamp = 1585695600; + ukDlVcIssued.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(2, ukDlVcIssued); - - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledWith({ sub: "testsub", state: "Y@atr", @@ -334,7 +330,6 @@ describe("YotiSessionCompletionProcessor", () => { }); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("OK"); - jest.useRealTimers(); }); it("Return successful response with 200 OK when YOTI session created with EU driving permit", async () => { @@ -342,8 +337,6 @@ describe("YotiSessionCompletionProcessor", () => { const euDLYotiSession = getCompletedYotiSession(); euDLYotiSession.resources.id_documents[0].document_type = "DRIVING_LICENCE"; euDLYotiSession.resources.id_documents[0].issuing_country = "DEU"; - jest.useFakeTimers(); - jest.setSystemTime(absoluteTimeNow()); mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(euDLYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce(documentFields); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); @@ -353,20 +346,17 @@ describe("YotiSessionCompletionProcessor", () => { const out: Response = await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); const euDlcoreFields = TXMA_CORE_FIELDS; - euDlcoreFields.timestamp = absoluteTimeNow(); + euDlcoreFields.timestamp = 1585695600; + euDlcoreFields.event_timestamp_ms = 1585695600000; - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, euDlcoreFields); const euDlVcIssued = TXMA_EU_DL_VC_ISSUED; euDlVcIssued.event_name = "F2F_CRI_VC_ISSUED"; - euDlVcIssued.timestamp = absoluteTimeNow(); + euDlVcIssued.timestamp = 1585695600; + euDlVcIssued.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(2, euDlVcIssued); - - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledWith({ sub: "testsub", state: "Y@atr", @@ -440,7 +430,6 @@ describe("YotiSessionCompletionProcessor", () => { }); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("OK"); - jest.useRealTimers(); }); it("Return successful response with 200 OK when YOTI session created with EEA Identity Card", async () => { @@ -448,30 +437,24 @@ describe("YotiSessionCompletionProcessor", () => { const eeaYotiSession = getCompletedYotiSession(); eeaYotiSession.resources.id_documents[0].document_type = "NATIONAL_ID"; eeaYotiSession.resources.id_documents[0].issuing_country = "NLD"; - jest.useFakeTimers(); - jest.setSystemTime(absoluteTimeNow()); mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(eeaYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce(documentFields); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); const out: Response = await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); const eeaDlcoreFields = TXMA_CORE_FIELDS; - eeaDlcoreFields.timestamp = absoluteTimeNow(); - // eslint-disable-next-line @typescript-eslint/unbound-method + eeaDlcoreFields.timestamp = 1585695600; + eeaDlcoreFields.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, eeaDlcoreFields); const eeaVcIssued = TXMA_EEA_VC_ISSUED; eeaVcIssued.event_name = "F2F_CRI_VC_ISSUED"; - eeaVcIssued.timestamp = absoluteTimeNow(); + eeaVcIssued.timestamp = 1585695600; + eeaVcIssued.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(2, eeaVcIssued); - - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledWith({ sub: "testsub", state: "Y@atr", @@ -544,38 +527,31 @@ describe("YotiSessionCompletionProcessor", () => { }); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("OK"); - jest.useRealTimers(); }); it("Return successful response with 200 OK when YOTI session created with BRP", async () => { documentFields = getBrpFields(); const brpYotiSession = getCompletedYotiSession(); brpYotiSession.resources.id_documents[0].document_type = "RESIDENCE_PERMIT"; - jest.useFakeTimers(); - jest.setSystemTime(absoluteTimeNow()); mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(brpYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce(documentFields); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); const out: Response = await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); const brpCoreFields = TXMA_CORE_FIELDS; - brpCoreFields.timestamp = absoluteTimeNow(); + brpCoreFields.timestamp = 1585695600; + brpCoreFields.event_timestamp_ms = 1585695600000; - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(1, brpCoreFields); const brpVcIssued = TXMA_BRP_VC_ISSUED; brpVcIssued.event_name = "F2F_CRI_VC_ISSUED"; - brpVcIssued.timestamp = absoluteTimeNow(); + brpVcIssued.timestamp = 1585695600; + brpVcIssued.event_timestamp_ms = 1585695600000; expect(mockF2fService.sendToTXMA).toHaveBeenNthCalledWith(2, brpVcIssued); - - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledTimes(1); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToIPVCore).toHaveBeenCalledWith({ sub: "testsub", state: "Y@atr", @@ -648,8 +624,6 @@ describe("YotiSessionCompletionProcessor", () => { }); expect(out.statusCode).toBe(HttpCodesEnum.OK); expect(out.body).toBe("OK"); - jest.useRealTimers(); - jest.clearAllMocks(); }); describe("name checks", () => { @@ -657,7 +631,6 @@ describe("YotiSessionCompletionProcessor", () => { mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(completedYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce(documentFields); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); @@ -674,18 +647,15 @@ describe("YotiSessionCompletionProcessor", () => { }); mockF2fService.getPersonIdentityById.mockResolvedValueOnce(personIdentityItem); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); - await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); + expect(logger.info).toHaveBeenCalledWith("Getting NameParts using F2F Person Identity Info"); }); it("Should use name casing from documentFields when using getNamesFromPersonIdentity", async () => { - jest.useFakeTimers(); - jest.setSystemTime(absoluteTimeNow()); mockYotiService.getCompletedSessionInfo.mockResolvedValueOnce(completedYotiSession); mockYotiService.getMediaContent.mockResolvedValueOnce({ ...documentFields, @@ -694,7 +664,6 @@ describe("YotiSessionCompletionProcessor", () => { }); mockF2fService.getPersonIdentityById.mockResolvedValueOnce(personIdentityItem); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); @@ -769,7 +738,6 @@ describe("YotiSessionCompletionProcessor", () => { }, })], }); - jest.useRealTimers(); }); it("Should throw an error of name mismatch between F2F and Yoti DocumentFields", async () => { @@ -781,7 +749,6 @@ describe("YotiSessionCompletionProcessor", () => { }); mockF2fService.getPersonIdentityById.mockResolvedValueOnce(personIdentityItem); mockF2fService.getSessionByYotiId.mockResolvedValueOnce(f2fSessionItem); - // @ts-ignore mockCompletedSessionProcessor.verifiableCredentialService.kmsJwtAdapter = passingKmsJwtAdapterFactory(); @@ -1003,10 +970,7 @@ describe("YotiSessionCompletionProcessor", () => { const out: Response = await mockCompletedSessionProcessor.processRequest(VALID_REQUEST); - // eslint-disable-next-line @typescript-eslint/unbound-method expect(mockF2fService.sendToTXMA).toHaveBeenCalledTimes(2); - - // eslint-disable-next-line @typescript-eslint/unbound-method expect(logger.error).toHaveBeenNthCalledWith(1, "Failed to write TXMA event F2F_YOTI_RESPONSE_RECEIVED to SQS queue.", { messageCode: MessageCodes.FAILED_TO_WRITE_TXMA }); expect(logger.error).toHaveBeenNthCalledWith(2, "Failed to write TXMA event F2F_CRI_VC_ISSUED to SQS queue.", { error: {}, messageCode: MessageCodes.FAILED_TO_WRITE_TXMA }); expect(out.statusCode).toBe(HttpCodesEnum.OK); diff --git a/src/tests/utils/ApiConstants.ts b/src/tests/utils/ApiConstants.ts index 34aaaf93d..60418911e 100644 --- a/src/tests/utils/ApiConstants.ts +++ b/src/tests/utils/ApiConstants.ts @@ -8,4 +8,6 @@ export const constants = { DEV_F2F_SESSION_TABLE_NAME: "session-f2f-cri-ddb", GOV_NOTIFY_API: process.env.GOV_NOTIFY_API, DEV_F2F_PO_STUB_URL: process.env.DEV_F2F_PO_STUB_URL, + VC_SIGNING_KEY_ID: process.env.VC_SIGNING_KEY_ID, + DNS_SUFFIX: process.env.DNS_SUFFIX, }; diff --git a/src/tests/utils/ApiTestSteps.ts b/src/tests/utils/ApiTestSteps.ts index d38d6ee0d..70d46f132 100644 --- a/src/tests/utils/ApiTestSteps.ts +++ b/src/tests/utils/ApiTestSteps.ts @@ -1,4 +1,4 @@ -import { fromNodeProviderChain } from "@aws-sdk/credential-providers"; +import { fromNodeProviderChain } from "@aws-sdk/credential-providers"; import Ajv from "ajv"; import axios, { AxiosInstance } from "axios"; import { aws4Interceptor } from "aws4-axios"; @@ -6,11 +6,12 @@ import { XMLParser } from "fast-xml-parser"; import { ISessionItem } from "../../models/ISessionItem"; import { constants } from "../utils/ApiConstants"; import { jwtUtils } from "../../utils/JwtUtils"; +import crypto from "node:crypto"; const GOV_NOTIFY_INSTANCE = axios.create({ baseURL: constants.GOV_NOTIFY_API }); const API_INSTANCE = axios.create({ baseURL: constants.DEV_CRI_F2F_API_URL }); const YOTI_INSTANCE = axios.create({ baseURL: constants.DEV_F2F_YOTI_STUB_URL }); -const HARNESS_API_INSTANCE : AxiosInstance = axios.create({ baseURL: constants.DEV_F2F_TEST_HARNESS_URL }); +const HARNESS_API_INSTANCE: AxiosInstance = axios.create({ baseURL: constants.DEV_F2F_TEST_HARNESS_URL }); const PO_INSTANCE = axios.create({ baseURL: constants.DEV_F2F_PO_STUB_URL }); const customCredentialsProvider = { @@ -135,17 +136,17 @@ export async function callbackPost(sessionId: string | undefined, topic = "sessi } } -export async function sessionConfigurationGet(sessionId: any):Promise { +export async function sessionConfigurationGet(sessionId: any): Promise { const path = "/sessionConfiguration"; try { - const getRequest = await API_INSTANCE.get(path, { headers:{ "x-govuk-signin-session-id": sessionId } }); + const getRequest = await API_INSTANCE.get(path, { headers: { "x-govuk-signin-session-id": sessionId } }); return getRequest; } catch (error: any) { console.log(`Error response from ${path} endpoint: ${error}`); return error.response; } } -export async function postYotiSession(trackingId: any, userData: any): Promise { +export async function postYotiSession(trackingId: string, userData: any): Promise { const path = "/sessions"; try { // update fullName to contain trackingId - this determines the behaviour of the Yoti mock @@ -159,7 +160,7 @@ export async function postYotiSession(trackingId: any, userData: any): Promise { +export async function getYotiSessionsConfiguration(sessionId: string): Promise { const path = constants.DEV_F2F_YOTI_STUB_URL + "/sessions/" + sessionId + "/configuration"; console.log(path); try { @@ -172,11 +173,11 @@ export async function getYotiSessionsConfiguration(sessionId: any): Promise } } -export async function putYotiSessionsInstructions(sessionId: any): Promise { +export async function putYotiSessionsInstructions(sessionId: string, fadcodePayload: { branch: { fad_code: string } }): Promise { const path = constants.DEV_F2F_YOTI_STUB_URL + "/sessions/" + sessionId + "/instructions"; console.log(path); try { - const postRequest = await YOTI_INSTANCE.put(path); + const postRequest = await YOTI_INSTANCE.put(path, fadcodePayload); return postRequest; } catch (error: any) { @@ -186,7 +187,7 @@ export async function putYotiSessionsInstructions(sessionId: any): Promise } -export async function getYotiSessionsInstructions(sessionId: any): Promise { +export async function getYotiSessionsInstructions(sessionId: string): Promise { const path = constants.DEV_F2F_YOTI_STUB_URL + "/sessions/" + sessionId + "/instructions/pdf"; console.log(path); try { @@ -280,7 +281,7 @@ export async function getSqsEventList(folder: string, prefix: string, txmaEventS if (!contents || !contents.length) { return undefined; } - + keyList = contents.map(({ Key }) => Key); } while (contents.length < txmaEventSize); @@ -288,14 +289,14 @@ export async function getSqsEventList(folder: string, prefix: string, txmaEventS } export async function validateTxMAEventData(keyList: any, yotiMockID: any): Promise { - let i:any; + let i: any; const yotiMockIdPrefix = yotiMockID.slice(0, 2); for (i = 0; i < keyList.length; i++) { const getObjectResponse = await HARNESS_API_INSTANCE.get("/object/" + keyList[i], {}); console.log(JSON.stringify(getObjectResponse.data, null, 2)); let valid = true; if (getObjectResponse.data.event_name === "F2F_CRI_VC_ISSUED" || getObjectResponse.data.event_name === "F2F_YOTI_START") { - import("../data/" + getObjectResponse.data.event_name + "_" + yotiMockIdPrefix + "_SCHEMA.json" ) + import("../data/" + getObjectResponse.data.event_name + "_" + yotiMockIdPrefix + "_SCHEMA.json") .then((jsonSchema) => { const validate = ajv.compile(jsonSchema); valid = validate(getObjectResponse.data); @@ -310,7 +311,7 @@ export async function validateTxMAEventData(keyList: any, yotiMockID: any): Prom expect(valid).toBe(true); }); } else { - import("../data/" + getObjectResponse.data.event_name + "_SCHEMA.json" ) + import("../data/" + getObjectResponse.data.event_name + "_SCHEMA.json") .then((jsonSchema) => { const validate = ajv.compile(jsonSchema); valid = validate(getObjectResponse.data); @@ -329,10 +330,10 @@ export async function validateTxMAEventData(keyList: any, yotiMockID: any): Prom } export async function validateTxMAEvent(txmaEvent: string, keyList: any, yotiMockId: string, failedCheck: boolean, vcData: any): Promise { - let i:any; + let i: any; for (i = 0; i < keyList.length; i++) { const getObjectResponse = await HARNESS_API_INSTANCE.get("/object/" + keyList[i], {}); - + if (getObjectResponse.data.event_name === txmaEvent) { console.log(JSON.stringify(getObjectResponse.data, null, 2)); validateCriVcIssuedTxMAEvent(getObjectResponse.data, yotiMockId); @@ -372,9 +373,20 @@ export async function getDequeuedSqsMessage(prefix: string): Promise { return getObjectResponse.data; } -export function validateJwtToken(jwtToken: any, vcData: any, yotiId?: string): void { +export async function validateJwtToken(jwtToken: any, vcData: any, yotiId?: string): Promise { const [rawHead, rawBody, signature] = jwtToken.split("."); + // Validate Header + const decodedHeader = JSON.parse(jwtUtils.base64DecodeToString(rawHead.replace(/\W/g, ""))); + expect(decodedHeader.typ).toBe("JWT"); + const msgBuffer = new TextEncoder().encode(constants.VC_SIGNING_KEY_ID); + const hashBuffer = await crypto.subtle.digest("SHA-256", msgBuffer); + const hashArray = Array.from(new Uint8Array(hashBuffer)); + const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); + expect(decodedHeader.kid).toBe("did:web:" + constants.DNS_SUFFIX + "#" + hashHex); + + // Validate Body const decodedBody = JSON.parse(jwtUtils.base64DecodeToString(rawBody.replace(/\W/g, ""))); + expect(decodedBody.jti).toBeTruthy(); // Strength Score const expecedStrengthScore = eval("vcData.s" + yotiId + ".strengthScore"); @@ -418,7 +430,7 @@ export function validateJwtToken(jwtToken: any, vcData: any, yotiId?: string): v } } -export function validateJwtTokenNamePart(jwtToken:any, givenName1:any, givenName2:any, givenName3:any, familyName:any):void { +export function validateJwtTokenNamePart(jwtToken: any, givenName1: any, givenName2: any, givenName3: any, familyName: any): void { const [rawHead, rawBody, signature] = jwtToken.split("."); const decodedBody = JSON.parse(jwtUtils.base64DecodeToString(rawBody.replace(/\W/g, ""))); expect(decodedBody.vc.credentialSubject.name[0].nameParts[0].value).toBe(givenName1); @@ -428,11 +440,11 @@ export function validateJwtTokenNamePart(jwtToken:any, givenName1:any, givenName } -export async function postAbortSession(reasion:any, sessionId:any): Promise { +export async function postAbortSession(reasion: any, sessionId: any): Promise { const path = constants.DEV_CRI_F2F_API_URL + "/abort"; console.log(path); try { - const postRequest = await API_INSTANCE.post(path, reasion, { headers:{ "x-govuk-signin-session-id": sessionId } }); + const postRequest = await API_INSTANCE.post(path, reasion, { headers: { "x-govuk-signin-session-id": sessionId } }); return postRequest; } catch (error: any) { @@ -484,7 +496,7 @@ export function validateCriVcIssuedTxMAEvent(txmaEvent: any, yotiMockId: any): a default: console.warn("Yoti Mock Id provided does not match expected list"); } -} +} export async function postPOCodeRequest(mockDelimitator: any, userData: any): Promise { const path = "/v1/locations/search"; @@ -499,7 +511,7 @@ export async function postPOCodeRequest(mockDelimitator: any, userData: any): Pr } } -function validateCriVcIssuedFailedChecks(txmaEvent: any, yotiMockId: any, vcData: any):void { +function validateCriVcIssuedFailedChecks(txmaEvent: any, yotiMockId: any, vcData: any): void { // Contra Indicators const expectedContraIndicatiors = eval("vcData.s" + yotiMockId + ".ci"); if (expectedContraIndicatiors) { @@ -518,7 +530,7 @@ function validateCriVcIssuedFailedChecks(txmaEvent: any, yotiMockId: any, vcData } } -export async function initiateUserInfo(docSelectionData:any, sessionId: string): Promise { +export async function initiateUserInfo(docSelectionData: any, sessionId: string): Promise { expect(sessionId).toBeTruthy(); const documentSelectionResponse = await postDocumentSelection(docSelectionData, sessionId); @@ -529,11 +541,11 @@ export async function initiateUserInfo(docSelectionData:any, sessionId: string): const authResponse = await authorizationGet(sessionId); expect(authResponse.status).toBe(200); - const tokenResponse = await tokenPost(authResponse.data.authorizationCode.value, authResponse.data.redirect_uri ); + const tokenResponse = await tokenPost(authResponse.data.authorizationCode.value, authResponse.data.redirect_uri); expect(tokenResponse.status).toBe(200); const userInfoResponse = await userInfoPost("Bearer " + tokenResponse.data.access_token); expect(userInfoResponse.status).toBe(202); -} +} diff --git a/src/utils/JwtUtils.ts b/src/utils/JwtUtils.ts index d1cc63f9f..c9ebf66b4 100644 --- a/src/utils/JwtUtils.ts +++ b/src/utils/JwtUtils.ts @@ -1,4 +1,5 @@ import * as jose from "node-jose"; +import crypto from "crypto"; export const jwtUtils = { @@ -28,4 +29,11 @@ export const jwtUtils = { const encoder = new TextEncoder(); return encoder.encode(value); }, + + // hash string then present output as UTF-8 encoded hexadecimal string + getHashedKid(keyId: string): string { + const kidBytes = Buffer.from(keyId, "utf8"); + const hash = crypto.createHash("sha256").update(kidBytes).digest(); + return Buffer.from(hash).toString("hex"); + }, }; diff --git a/src/utils/KmsJwtAdapter.ts b/src/utils/KmsJwtAdapter.ts index d50a59783..e81e2db9d 100644 --- a/src/utils/KmsJwtAdapter.ts +++ b/src/utils/KmsJwtAdapter.ts @@ -26,11 +26,11 @@ export class KmsJwtAdapter { this.kms = createKmsClient(); } - async sign(jwtPayload: JwtPayload): Promise { + async sign(jwtPayload: JwtPayload, dnsSuffix: string): Promise { const jwtHeader: JwtHeader = { alg: "ES256", typ: "JWT" }; const kid = this.kid.split("/").pop(); if (kid != null) { - jwtHeader.kid = kid; + jwtHeader.kid = (`did:web:${dnsSuffix}#${jwtUtils.getHashedKid(kid)}`); } const tokenComponents = { header: jwtUtils.base64Encode(JSON.stringify(jwtHeader)), diff --git a/src/utils/TxmaEvent.ts b/src/utils/TxmaEvent.ts index 9b2011823..912d555b5 100644 --- a/src/utils/TxmaEvent.ts +++ b/src/utils/TxmaEvent.ts @@ -1,6 +1,5 @@ import { ResidencePermit, IdentityCard, DrivingPermit, Passport, VerifiedCredentialSubject } from "./IVeriCredential"; import { ISessionItem } from "../models/ISessionItem"; -import { absoluteTimeNow } from "./DateTimeUtils"; export type TxmaEventName = "F2F_CRI_START" @@ -27,6 +26,7 @@ export interface BaseTxmaEvent { "user": TxmaUser; "client_id": string; "timestamp": number; + "event_timestamp_ms": number; "component_id": string; } @@ -87,8 +87,9 @@ export const buildCoreEventFields = ( session: ISessionItem, issuer: string, sourceIp?: string | undefined, - getNow: () => number = absoluteTimeNow, ): BaseTxmaEvent => { + const now = Date.now(); + return { user: { user_id: session.subject, @@ -97,7 +98,8 @@ export const buildCoreEventFields = ( ip_address: sourceIp, }, client_id: session.clientId, - timestamp: getNow(), + timestamp: Math.floor(now / 1000), + event_timestamp_ms: now, component_id: issuer, }; }; diff --git a/src/utils/ValidationHelper.ts b/src/utils/ValidationHelper.ts index 9cae8da8d..6aa8db426 100644 --- a/src/utils/ValidationHelper.ts +++ b/src/utils/ValidationHelper.ts @@ -39,12 +39,12 @@ export class ValidationHelper { throw new AppError(HttpCodesEnum.BAD_REQUEST, "Missing header: Authorization header value is missing or invalid auth_scheme"); } - const authHeader = event.headers.Authorization as string; - if (authHeader !== null && !authHeader.includes(Constants.BEARER)) { + if (!headerValue.includes(Constants.BEARER + " ")) { throw new AppError(HttpCodesEnum.BAD_REQUEST, "Missing header: Authorization header is not of Bearer type access_token"); } const token = headerValue.replace(/^Bearer\s+/, ""); + let isValidJwt = false; try { isValidJwt = await jwtAdapter.verify(token); diff --git a/yoti-stub/src/MockYotiSessionHandler.ts b/yoti-stub/src/MockYotiSessionHandler.ts index 170c4825d..4da9aada4 100644 --- a/yoti-stub/src/MockYotiSessionHandler.ts +++ b/yoti-stub/src/MockYotiSessionHandler.ts @@ -124,9 +124,10 @@ class MockYotiSessionHandler implements LambdaInterface { if (event && event.pathParameters) { // Extract attributes from queryStringParameters and add them to the data object const sessionId = event.pathParameters?.sessionId; + const fadCode = payloadParsed.branch?.fad_code; if(sessionId){ logger.info("Updating Mock YOTI Session Instructions"); - return await YotiRequestProcessor.getInstance(logger, metrics).updateSessionInstructions(sessionId); + return await YotiRequestProcessor.getInstance(logger, metrics).updateSessionInstructions(sessionId, fadCode); } } diff --git a/yoti-stub/src/data/putInstructions/fadCodeIncorrectFormat.ts b/yoti-stub/src/data/putInstructions/fadCodeIncorrectFormat.ts new file mode 100644 index 000000000..290931142 --- /dev/null +++ b/yoti-stub/src/data/putInstructions/fadCodeIncorrectFormat.ts @@ -0,0 +1,10 @@ +export const FAD_CODE_INCORRECT_FORMAT = { + "code": "PAYLOAD_VALIDATION", + "message": "There were errors validating the payload", + "errors": [ + { + "property": "branch.fad_code", + "message": "must be an alphanumeric of 7 characters in length" + } + ] +} diff --git a/yoti-stub/src/data/putInstructions/fadCodeInvalid.ts b/yoti-stub/src/data/putInstructions/fadCodeInvalid.ts new file mode 100644 index 000000000..6fc7fb811 --- /dev/null +++ b/yoti-stub/src/data/putInstructions/fadCodeInvalid.ts @@ -0,0 +1,10 @@ +export const FAD_CODE_INVALID = { + "code": "PAYLOAD_VALIDATION", + "message": "There were errors validating the payload", + "errors": [ + { + "property": "branch.fad_code", + "message": "Provided fadCode does not relate to any branch" + } + ] +} \ No newline at end of file diff --git a/yoti-stub/src/data/putInstructions/fadCodeNotIncluded.ts b/yoti-stub/src/data/putInstructions/fadCodeNotIncluded.ts new file mode 100644 index 000000000..d9effd697 --- /dev/null +++ b/yoti-stub/src/data/putInstructions/fadCodeNotIncluded.ts @@ -0,0 +1,10 @@ +export const FAD_CODE_NOT_INCLUDED = { + "code": "PAYLOAD_VALIDATION", + "message": "There were errors validating the payload", + "errors": [ + { + "property": "branch.fad_code", + "message": "must not be null" + } + ] +} diff --git a/yoti-stub/src/services/YotiRequestProcessor.ts b/yoti-stub/src/services/YotiRequestProcessor.ts index b01ffa905..d0e0d7dd8 100755 --- a/yoti-stub/src/services/YotiRequestProcessor.ts +++ b/yoti-stub/src/services/YotiRequestProcessor.ts @@ -61,6 +61,9 @@ import {PUT_INSTRUCTIONS_401} from "../data/putInstructions/putInstructions401"; import {PUT_INSTRUCTIONS_404} from "../data/putInstructions/putInstructions404"; import {PUT_INSTRUCTIONS_409} from "../data/putInstructions/putInstructions409"; import {PUT_INSTRUCTIONS_500} from "../data/putInstructions/putInstructions500"; +import {FAD_CODE_INCORRECT_FORMAT} from "../data/putInstructions/fadCodeIncorrectFormat"; +import {FAD_CODE_INVALID} from "../data/putInstructions/fadCodeInvalid"; +import {FAD_CODE_NOT_INCLUDED} from "../data/putInstructions/fadCodeNotIncluded"; import {POST_SESSIONS_400} from "../data/postSessions/postSessions400"; import {POST_SESSIONS_401} from "../data/postSessions/postSessions401"; import {POST_SESSIONS_403} from "../data/postSessions/postSessions403"; @@ -1262,13 +1265,27 @@ export class YotiRequestProcessor { * PUT /sessions/{id}/instructions * @param sessionId */ - async updateSessionInstructions(sessionId: string): Promise { + async updateSessionInstructions(sessionId: string, fadCode: string): Promise { const lastUuidChars = sessionId.slice(-4); const firstTwoChars = lastUuidChars.slice(0, 2); this.logger.info({message: "last 4 ID chars", lastUuidChars}); + const validFadCodeFormat = /^[a-zA-Z0-9]{7}$/; + const lastFadCodeChars = fadCode.slice(-4); + this.logger.info("getSessionConfiguration", SUPPORTED_DOCUMENTS); + if (!fadCode) { + this.logger.info("Fad Code not included", JSON.stringify(FAD_CODE_NOT_INCLUDED)); + return new Response(HttpCodesEnum.BAD_REQUEST, JSON.stringify(FAD_CODE_NOT_INCLUDED)); + } else if (!validFadCodeFormat.test(fadCode)) { + this.logger.info("Fad Code format incorrect", JSON.stringify(FAD_CODE_INCORRECT_FORMAT)); + return new Response(HttpCodesEnum.BAD_REQUEST, JSON.stringify(FAD_CODE_INCORRECT_FORMAT)); + } else if (lastFadCodeChars === 'XXXX') { + this.logger.info("Fad Code invalid", JSON.stringify(FAD_CODE_INVALID)); + return new Response(HttpCodesEnum.BAD_REQUEST, JSON.stringify(FAD_CODE_INVALID)); + } + if (SUPPORTED_DOCUMENTS.includes(firstTwoChars)) { this.logger.info("Put Instructions Response", JSON.stringify(VALID_PUT_INSTRUCTIONS_RESPONSE)); return new Response(HttpCodesEnum.OK, JSON.stringify(VALID_PUT_INSTRUCTIONS_RESPONSE)); diff --git a/yoti-stub/src/services/YotiService.ts b/yoti-stub/src/services/YotiService.ts deleted file mode 100644 index 39fe8d4b5..000000000 --- a/yoti-stub/src/services/YotiService.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* eslint-disable no-console */ - -import { Logger } from "@aws-lambda-powertools/logger"; -import { AppError } from "../utils/AppError"; -import { - DynamoDBDocument, GetCommand, - PutCommand, -} from "@aws-sdk/lib-dynamodb"; -import {YotiSessionItem} from "../models/YotiSessionItem"; -import {HttpCodesEnum} from "../utils/HttpCodesEnum"; - - -export class YotiService { - readonly tableName: string; - - private readonly dynamo: DynamoDBDocument; - - readonly logger: Logger; - - private static instance: YotiService; - - constructor( - tableName: any, - logger: Logger, - dynamoDbClient: DynamoDBDocument, - ) { - this.tableName = tableName; - this.dynamo = dynamoDbClient; - this.logger = logger; - } - - static getInstance( - tableName: string, - logger: Logger, - dynamoDbClient: DynamoDBDocument, - ): YotiService { - if (!YotiService.instance) { - YotiService.instance = new YotiService(tableName, logger, dynamoDbClient); - } - return YotiService.instance; - } - - async getSessionById(session_id: string): Promise { - this.logger.debug("Table name " + this.tableName); - const getSessionCommand = new GetCommand({ - TableName: this.tableName, - Key: { - session_id, - }, - }); - - let session; - try { - session = await this.dynamo.send(getSessionCommand); - } catch (e: any) { - this.logger.error({ - message: "getSessionById - failed executing get from dynamodb:", - e, - }); - throw new AppError( - "Error retrieving Session", - HttpCodesEnum.SERVER_ERROR, - ); - } - - if (session.Item) { - return session.Item as YotiSessionItem; - } - } - - async createYotiSession(session: YotiSessionItem): Promise { - const putSessionCommand = new PutCommand({ - TableName: this.tableName, - Item: session, - }); - - this.logger.info({ - message: - "Saving session data in DynamoDB: " + - JSON.stringify([putSessionCommand]), - }); - try { - await this.dynamo.send(putSessionCommand); - this.logger.info("Successfully created session in dynamodb"); - } catch (error) { - this.logger.error("got error " + error); - throw new AppError("saveItem - failed ", 500); - } - } - -}