diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml new file mode 100644 index 0000000..c93e679 --- /dev/null +++ b/.github/workflows/run_tests.yml @@ -0,0 +1,140 @@ +name: run_api_tests + +on: + push: + branches-ignore: + - "**" + # Remove the line above to run when pushing to master + pull_request: + branches: [dev] + repository_dispatch: + types: [run_api_tests] + schedule: + - cron: "0 0 * * 0" + workflow_dispatch: + +############### +# Set the Job # +############### +jobs: + UnitTest: + name: API Test Cases + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v3 + with: + # Full git history is needed to get a proper + # list of changed files within `super-linter` + fetch-depth: 0 + + - name: Install npm dependencies + run: npm install + + - name: Create env file + run: | + echo "${{ secrets.ENV_FILE }}" > .env + + - name: Create Test Log Directory + run: | + echo "Creating test log directory" + TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S") + echo "TIMESTAMP=$TIMESTAMP" >> $GITHUB_ENV + LOG_DIR="user-management-api-test-report-${TIMESTAMP}" + mkdir -p "$LOG_DIR" + echo "Test log directory created: $LOG_DIR" + ls -la "$LOG_DIR" + + - name: Run api test cases + run: | + echo "Starting test run" + LOG_DIR="user-management-api-test-report-${{ env.TIMESTAMP }}" + LOG_FILE="${LOG_DIR}/test-${{ env.TIMESTAMP }}.log" + echo "Log directory: $LOG_DIR" + echo "Log file: $LOG_FILE" + echo "Running npm test and capturing output..." + npm run test | tee "$LOG_FILE" + TEST_EXIT_CODE=${PIPESTATUS[0]} + echo "Test run complete. Log file created: $LOG_FILE" + cat "$LOG_FILE" + exit $TEST_EXIT_CODE + + - name: Install Python and Azure Dependencies + if: always() + run: | + sudo apt-get update + sudo apt-get install python3-pip -y + pip3 install azure-storage-blob + + # - name: Upload API Test Report to Azure Blob Storage + # if: always() + # env: + # AZURE_STORAGE_ACCOUNT_NAME: ${{ secrets.AZURE_STORAGE_ACCOUNT_NAME }} + # AZURE_STORAGE_ACCOUNT_KEY: ${{ secrets.AZURE_STORAGE_ACCOUNT_KEY }} + # AZURE_STORAGE_CONTAINER_NAME: ${{ secrets.AZURE_STORAGE_CONTAINER_NAME }} + # run: | + # echo " + # from azure.storage.blob import BlobServiceClient, BlobClient, ContainerClient + # import os + + # connect_str = os.getenv('AZURE_STORAGE_ACCOUNT_KEY') + # account_name = os.getenv('AZURE_STORAGE_ACCOUNT_NAME') + # blob_service_client = BlobServiceClient(account_url=f'https://{account_name}.blob.core.windows.net', credential=connect_str) + # container_client = blob_service_client.get_container_client(os.getenv('AZURE_STORAGE_CONTAINER_NAME')) + + # log_dir = './user-management-api-test-report-' + os.getenv('TIMESTAMP') + # if os.path.exists(log_dir): + # for file_name in os.listdir(log_dir): + # local_file_name = os.path.join(log_dir, file_name) + # blob_client = container_client.get_blob_client(file_name) + # with open(local_file_name, 'rb') as data: + # blob_client.upload_blob(data, overwrite=True) + # file_path = '/home/runner/work/TDEI-management-api-tester/TDEI-management-api-tester/test-report.html' + # timestamp = os.getenv('TIMESTAMP') + # blob_name = f'management-test-report-{timestamp}.html' + # blob_client = container_client.get_blob_client(blob_name) + # with open(file_path, 'rb') as data: + # blob_client.upload_blob(data, overwrite=True) + # " > upload_to_blob.py + # python3 upload_to_blob.py + + - name: Upload log to Azure + uses: LanceMcCarthy/Action-AzureBlobUpload@v2 + with: + source_folder: "user-management-api-test-report-${{ env.TIMESTAMP }}" + destination_folder: "${{ env.TIMESTAMP }}" + connection_string: ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} + container_name: "management-api-tester" + clean_destination_folder: false + delete_if_exists: false + + - name: Upload report to Azure + uses: LanceMcCarthy/Action-AzureBlobUpload@v2 + with: + source_folder: "test-report.html" + destination_folder: "${{ env.TIMESTAMP }}" + connection_string: ${{ secrets.AZURE_STORAGE_CONNECTION_STRING }} + container_name: "management-api-tester" + clean_destination_folder: false + delete_if_exists: false + + - name: send email notification + if: always() + uses: dawidd6/action-send-mail@v3 + with: + server_address: smtp.gmail.com + server_port: 587 + username: ${{ secrets.EMAIL_USER }} + password: ${{ secrets.EMAIL_PASSWORD }} + subject: ${{ job.status }} - User Management API Testing Report | ${{ github.event_name == 'pull_request' && format('{0}-{1}', 'PR', github.event.pull_request.title) || 'Triggered via Schema Changed' }} + to: gs-tdei-coreteam@gaussiansolutions.com + cc: sureshd@gaussiansolutions.com + bcc: rakeshd@gaussiansolutions.com + from: Workflow Notification + attachments: test-report.html + html_body: | +

API Testing Report

+

Workflow: ${{ github.workflow }}

+

Repository: ${{ github.repository }}

+ ${{ github.event_name == 'pull_request' && format('

Pull Request: {1}

', github.event.pull_request.html_url, github.event.pull_request.title) || '
' }} diff --git a/api.input.json b/api.input.json new file mode 100644 index 0000000..afdadd7 --- /dev/null +++ b/api.input.json @@ -0,0 +1,14 @@ +{ + "dev": { + "users": { + "poc": "adella.legros3@gmail.com", + "default_user": "defaultuser@mailinator.com" + } + }, + "stage": { + "users": { + "poc": "frederic71@gmail.com", + "default_user": "defaultuser@mailinator.com" + } + } +} \ No newline at end of file diff --git a/global-setup.ts b/global-setup.ts index 9763920..645e992 100644 --- a/global-setup.ts +++ b/global-setup.ts @@ -1,9 +1,6 @@ import seed from "./src/data.seed"; -const setup = async (): Promise => { - // whatever you need to setup globally - console.log("Setup!!"); - await seed.generate(); -}; - -export default setup; \ No newline at end of file +module.exports = async function () { + console.log("Seading the information !!"); + global.seedData = await seed.generate(); +} \ No newline at end of file diff --git a/global.d.ts b/global.d.ts new file mode 100644 index 0000000..36c37a4 --- /dev/null +++ b/global.d.ts @@ -0,0 +1,10 @@ +// global.d.ts +declare global { + namespace NodeJS { + interface Global { + seedData: SeedData; // Replace 'any' with the actual type of your seed data + } + } +} + +export { }; \ No newline at end of file diff --git a/jest.config.ts b/jest.config.ts index 015a497..e6c24f6 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -2,16 +2,24 @@ import type { Config } from 'jest'; export default async (): Promise => { return { - verbose: true, + verbose: false, preset: 'ts-jest', testEnvironment: 'node', testTimeout: 15000, globalSetup: "./global-setup.ts", reporters: [ "default", - ["./node_modules/jest-html-reporter", { - "pageTitle": "Test Report", - "includeFailureMsg": true + ["jest-html-reporters", { + "filename": "test-report.html", + "urlForTestFiles": "https://github.com/TaskarCenterAtUW/TDEI-management-api-tester/tree/dev", + "enableMergeData": true, + "inlineSource": true, + "pageTitle": `TDEI User Management API Test Report - ${new Date().toLocaleString()}`, + "logoImgPath": "src/tdei_logo.png", + "customInfos": [{ + "title": "Project", + "value": "TDEI User Management API Tester" + }] }] ], transform: { diff --git a/package-lock.json b/package-lock.json index 1baf219..65088f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,14 +10,17 @@ "license": "ISC", "dependencies": { "axios": "1.3.5", - "tdei-management-client": "git+https://github.com/TaskarCenterAtUW/TDEI-management-api-client.git#a3c0a1ef7e4d9da4c4409f0b011d348750e8410c", + "dotenv": "^16.3.1", + "jwt-decode": "^4.0.0", + "tdei-management-client": "git+https://github.com/TaskarCenterAtUW/TDEI-management-api-client.git#9c7cfea8d775d20d022038e644c7c76b23a730fc", "typescript": "5.0.4" }, "devDependencies": { "@faker-js/faker": "^7.6.0", "@types/jest": "29.5.0", "@types/node": "18.15.11", - "jest-html-reporter": "3.7.1", + "jest-html-reporters": "3.1.7", + "puppeteer": "^22.6.5", "rimraf": "^3.0.2", "ts-jest": "29.1.0", "ts-node": "^10.9.1" @@ -28,6 +31,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -53,6 +57,7 @@ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -62,6 +67,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz", "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", @@ -91,13 +97,15 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@babel/generator": { "version": "7.22.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.22.3", "@jridgewell/gen-mapping": "^0.3.2", @@ -108,35 +116,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", - "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.22.1", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", "dev": true, + "peer": true, "dependencies": { "@babel/compat-data": "^7.22.0", "@babel/helper-validator-option": "^7.21.0", @@ -151,68 +136,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", - "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.22.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", - "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", - "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.1", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -222,6 +151,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, + "peer": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" @@ -235,6 +165,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -242,23 +173,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", - "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.21.4" }, @@ -271,6 +191,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-module-imports": "^7.21.4", @@ -285,58 +206,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-plugin-utils": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", - "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" - }, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -346,6 +221,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.21.5" }, @@ -353,23 +229,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, + "peer": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -382,6 +247,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -400,21 +266,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -424,6 +276,7 @@ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", "dev": true, + "peer": true, "dependencies": { "@babel/template": "^7.21.9", "@babel/traverse": "^7.22.1", @@ -523,6 +376,7 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", "dev": true, + "peer": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -530,77 +384,12 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", - "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-transform-optional-chaining": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -626,6 +415,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -633,966 +423,40 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", - "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", - "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", - "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", - "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", - "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", - "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", - "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", - "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", - "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", - "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", - "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", - "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", - "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", - "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", - "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", - "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", - "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", - "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", - "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz", - "integrity": "sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-typescript": "^7.21.4" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1601,190 +465,92 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", - "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", - "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", - "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "peer": true, "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-attributes": "^7.22.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.3", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-class-properties": "^7.22.3", - "@babel/plugin-transform-class-static-block": "^7.22.3", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-dynamic-import": "^7.22.1", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-export-namespace-from": "^7.22.3", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-json-strings": "^7.22.3", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.3", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", - "@babel/plugin-transform-new-target": "^7.22.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", - "@babel/plugin-transform-numeric-separator": "^7.22.3", - "@babel/plugin-transform-object-rest-spread": "^7.22.3", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-optional-catch-binding": "^7.22.3", - "@babel/plugin-transform-optional-chaining": "^7.22.3", - "@babel/plugin-transform-parameters": "^7.22.3", - "@babel/plugin-transform-private-methods": "^7.22.3", - "@babel/plugin-transform-private-property-in-object": "^7.22.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.3", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.4", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1793,22 +559,20 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, + "peer": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { @@ -1816,6 +580,7 @@ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.21.4", "@babel/parser": "^7.21.9", @@ -1830,6 +595,7 @@ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", "dev": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.21.4", "@babel/generator": "^7.22.3", @@ -1851,6 +617,7 @@ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", "dev": true, + "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", @@ -1931,6 +698,7 @@ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, + "peer": true, "dependencies": { "@jest/types": "^29.5.0", "@types/node": "*", @@ -2143,6 +911,7 @@ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", "dev": true, + "peer": true, "dependencies": { "@jest/console": "^29.5.0", "@jest/types": "^29.5.0", @@ -2218,6 +987,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2241,6 +1011,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -2256,6 +1027,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -2265,7 +1037,42 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "dev": true, + "peer": true + }, + "node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dev": true, + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/@sinclair/typebox": { "version": "0.25.24", @@ -2293,30 +1100,10 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@sinonjs/samsam": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.1.tgz", - "integrity": "sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, "node_modules/@tsconfig/node10": { @@ -2466,6 +1253,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -2487,6 +1284,18 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2557,6 +1366,18 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2572,6 +1393,12 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, "node_modules/babel-jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", @@ -2627,45 +1454,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", - "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.4.0", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", - "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0", - "core-js-compat": "^3.30.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", - "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -2713,6 +1501,81 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "dev": true, + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2754,6 +1617,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001489", "electron-to-chromium": "^1.4.411", @@ -2789,6 +1653,39 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2801,7 +1698,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -2834,7 +1730,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "peer": true }, "node_modules/chalk": { "version": "4.1.2", @@ -2862,6 +1759,20 @@ "node": ">=10" } }, + "node_modules/chromium-bidi": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "dev": true, + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -2889,7 +1800,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -2914,7 +1824,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/color-convert": { "version": "2.0.1", @@ -2958,17 +1869,48 @@ "dev": true, "peer": true }, - "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/create-require": { @@ -2992,19 +1934,19 @@ "node": ">= 8" } }, - "node_modules/dateformat": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.2.tgz", - "integrity": "sha512-EelsCzH0gMC2YmXuMeaZ3c6md1sUJQxyb1XXc4xaisi/K6qKukqZhKPrEQyRkdNIncgYyLoDTReq0nNyuKerTg==", + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "engines": { - "node": "*" + "node": ">= 14" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3035,6 +1977,29 @@ "node": ">=0.10.0" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3053,6 +2018,12 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", + "dev": true + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -3071,11 +2042,23 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.413", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.413.tgz", "integrity": "sha512-Gd+/OAhRca06dkVxIQo/W7dr6Nmk9cx6lQdZ19GvFp51k5B/lUAokm6SJfNkdV8kFLsC3Z4sLTyEHWCnB1Efbw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/emittery": { "version": "0.13.1", @@ -3094,15 +2077,31 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "peer": true + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } }, "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, - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -3125,12 +2124,32 @@ "node": ">=8" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -3139,6 +2158,15 @@ "node": ">=4" } }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3198,6 +2226,47 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3214,6 +2283,15 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3241,9 +2319,9 @@ } }, "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.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -3272,6 +2350,20 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3297,13 +2389,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "dev": true, + "peer": true }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -3313,7 +2407,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -3341,6 +2434,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3366,6 +2488,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -3381,6 +2504,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, + "peer": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -3404,6 +2528,32 @@ "dev": true, "peer": true }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -3414,6 +2564,51 @@ "node": ">=10.17.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -3460,18 +2655,37 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "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, - "peer": true + "dev": true }, "node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, + "peer": true, "dependencies": { "has": "^1.0.3" }, @@ -3479,12 +2693,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "peer": true, "engines": { "node": ">=8" } @@ -3521,11 +2749,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/isexe": { "version": "2.0.0", @@ -3857,30 +3091,14 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-html-reporter": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jest-html-reporter/-/jest-html-reporter-3.7.1.tgz", - "integrity": "sha512-gWD6ngP1I100kFjx3ChfmpwaugeMkEApg1ZcVMQMYKB7q2z+EzL7HP6C8a7M3n+2EB1BUJBlRrVGtr6aL4VuOw==", + "node_modules/jest-html-reporters": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/jest-html-reporters/-/jest-html-reporters-3.1.7.tgz", + "integrity": "sha512-GTmjqK6muQ0S0Mnksf9QkL9X9z2FGIpNSxC52E0PHDzjPQ1XDu2+XTI3B3FS43ZiUzD1f354/5FfwbNIBzT7ew==", "dev": true, "dependencies": { - "@babel/core": "^7.9.0", - "@babel/preset-env": "^7.8.7", - "@babel/preset-typescript": "^7.8.3", - "@jest/console": "^29.0.2", - "@jest/test-result": "^29.0.2", - "@jest/types": "^29.0.2", - "dateformat": "3.0.2", - "mkdirp": "^1.0.3", - "sinon": "^9.0.1", - "strip-ansi": "6.0.1", - "xmlbuilder": "15.0.0" - }, - "engines": { - "node": ">=4.8.3" - }, - "peerDependencies": { - "jest": "19.x - 29.x", - "typescript": "^3.7.x || ^4.3.x || ^5.x" + "fs-extra": "^10.0.0", + "open": "^8.0.3" } }, "node_modules/jest-leak-detector": { @@ -4268,11 +3486,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -4284,8 +3509,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true + "dev": true }, "node_modules/json5": { "version": "2.2.3", @@ -4299,11 +3523,25 @@ "node": ">=6" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } }, "node_modules/kleur": { "version": "3.0.3", @@ -4329,8 +3567,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/locate-path": { "version": "5.0.0", @@ -4345,18 +3582,6 @@ "node": ">=8" } }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -4368,6 +3593,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "peer": true, "dependencies": { "yallist": "^3.0.2" } @@ -4462,21 +3688,15 @@ "brace-expansion": "^1.1.7" }, "engines": { - "node": "*" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" + "node": "*" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4490,35 +3710,13 @@ "dev": true, "peer": true }, - "node_modules/nise": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-4.1.0.tgz", - "integrity": "sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" + "engines": { + "node": ">= 0.4.0" } }, "node_modules/node-int64": { @@ -4532,7 +3730,8 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -4582,6 +3781,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4637,12 +3853,55 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -4689,22 +3948,21 @@ "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 - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "dependencies": { - "isarray": "0.0.1" - } + "peer": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -4767,6 +4025,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -4781,11 +4048,84 @@ "node": ">= 6" } }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "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==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", + "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "22.15.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/pure-rand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", @@ -4803,89 +4143,23 @@ ], "peer": true }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, "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/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -4895,6 +4169,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, + "peer": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -4960,6 +4235,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -4994,42 +4270,6 @@ "dev": true, "peer": true }, - "node_modules/sinon": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", - "integrity": "sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^6.0.1", - "@sinonjs/samsam": "^5.3.1", - "diff": "^4.0.2", - "nise": "^4.0.4", - "supports-color": "^7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/sinon/node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -5046,12 +4286,49 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5086,6 +4363,20 @@ "node": ">=10" } }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -5105,7 +4396,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5177,6 +4467,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -5184,21 +4475,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/tdei-management-client": { - "version": "1.0.1", - "resolved": "git+ssh://git@github.com/TaskarCenterAtUW/TDEI-management-api-client.git#a3c0a1ef7e4d9da4c4409f0b011d348750e8410c", - "integrity": "sha512-OW0Zjm0ycqFb/KPvSew7xKImvh0q+jeY6IdfYZmOyvu9ESGv52tJYYcaYbYBjy3MiKds1itfYUeefLSHRwXmWA==", + "version": "1.0.6", + "resolved": "git+ssh://git@github.com/TaskarCenterAtUW/TDEI-management-api-client.git#9c7cfea8d775d20d022038e644c7c76b23a730fc", + "integrity": "sha512-+BekuaxB8IEsHxXteDyIL9GxYV+ASinz0XkOFheK5YBoI2DMWvviFS/F7h2Oi8jQG6BXFroeeZzL+ly3cAoOMw==", "license": "Unlicense", "dependencies": { - "axios": "^0.21.1" + "axios": "^1.6.5" } }, "node_modules/tdei-management-client/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/test-exclude": { @@ -5216,6 +4534,21 @@ "node": ">=8" } }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5228,6 +4561,7 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -5363,11 +4697,18 @@ } } }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -5397,44 +4738,23 @@ "node": ">=12.20" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" + "buffer": "^5.2.1", + "through": "^2.3.8" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { @@ -5456,6 +4776,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -5467,6 +4788,12 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -5526,7 +4853,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5559,13 +4885,25 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/xmlbuilder": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.0.0.tgz", - "integrity": "sha512-KLu/G0DoWhkncQ9eHSI6s0/w+T4TM7rQaLhtCaL6tORv8jFlJPlnGumsgTcGfYeS1qZ/IHqrvDG7zJZ4d7e+nw==", + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { - "node": ">=8.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/y18n": { @@ -5573,7 +4911,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, - "peer": true, "engines": { "node": ">=10" } @@ -5582,14 +4919,14 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, - "peer": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -5612,6 +4949,16 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -5633,6 +4980,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index ad1f4a5..6dc4e47 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "main": "index.js", "scripts": { "test": "jest", - "seed": "npx ts-node ./src/seed-json.ts", "e2e-tests": "jest --testRegex src/**/*.e2e.test.ts", "integration-tests": "jest --testRegex src/**/*.it.test.ts", "regression-tests": "jest --testRegex src/**/*.rt.test.ts" @@ -17,14 +16,17 @@ "@faker-js/faker": "^7.6.0", "@types/jest": "29.5.0", "@types/node": "18.15.11", - "jest-html-reporter": "3.7.1", + "jest-html-reporters": "3.1.7", + "puppeteer": "^22.6.5", "rimraf": "^3.0.2", "ts-jest": "29.1.0", "ts-node": "^10.9.1" }, "dependencies": { "axios": "1.3.5", - "tdei-management-client": "git+https://github.com/TaskarCenterAtUW/TDEI-management-api-client.git#a3c0a1ef7e4d9da4c4409f0b011d348750e8410c", + "dotenv": "^16.3.1", + "jwt-decode": "^4.0.0", + "tdei-management-client": "git+https://github.com/TaskarCenterAtUW/TDEI-management-api-client.git#9c7cfea8d775d20d022038e644c7c76b23a730fc", "typescript": "5.0.4" } } \ No newline at end of file diff --git a/src/__tests__/authentication.test.ts b/src/__tests__/authentication.test.ts index 05ec929..331e263 100644 --- a/src/__tests__/authentication.test.ts +++ b/src/__tests__/authentication.test.ts @@ -1,16 +1,28 @@ import { Utility } from "../utils"; -import { AuthApi, Token } from "tdei-management-client"; +import { AuthApi, ResetCredentialModel, Token } from "tdei-management-client"; import { faker } from '@faker-js/faker'; +import { TdeiObjectFaker } from "../tdei-object-faker"; +import seed, { SeedDetails } from "../data.seed"; describe("Authentication service", () => { + let seederData: SeedDetails | undefined = undefined; + let configuration = Utility.getAdminConfiguration(); + let pocUserConfiguration = Utility.getPocConfiguration(); + let userWithoutLogin = Utility.getPocConfiguration(); + let defaultUser = Utility.getDefaultUserConfiguration(); + let apikeyUser = Utility.getApiKeyConfiguration(); + beforeAll(async () => { + seederData = await seed.generate(); + await Utility.setAuthToken(pocUserConfiguration); + await Utility.setAuthToken(defaultUser); }, 50000); describe("Authenticate", () => { describe("Validation", () => { - it("When invalid user credentials provided, expect to return HTTP status 401", async () => { + it("When invalid user credentials provided, expect to return unauthorized request", async () => { //Arrange - let configuration = Utility.getConfiguration(); + let configuration = Utility.getAdminConfiguration(); let generalAPI = new AuthApi(configuration); //Act const login = generalAPI.authenticate({ @@ -25,7 +37,7 @@ describe("Authentication service", () => { describe("Functional", () => { it("When valid user credentials provided, Expect to return object of type Token containing access_token & refresh_token", async () => { //Arrange - let configuration = Utility.getConfiguration(); + let configuration = Utility.getAdminConfiguration(); let generalAPI = new AuthApi(configuration); //Act @@ -48,9 +60,9 @@ describe("Authentication service", () => { describe("Refresh Token", () => { describe("Validation", () => { - it("When provided invalid refresh token, expect to return HTTP status 500", async () => { + it("When provided invalid refresh token, expect to return server error", async () => { //Arrange - let configuration = Utility.getConfiguration(); + let configuration = Utility.getAdminConfiguration(); let generalAPI = new AuthApi(configuration); //Act const refreshToken = generalAPI.refreshToken("random_refresh_token"); @@ -62,7 +74,7 @@ describe("Authentication service", () => { describe("Functional", () => { it("When provided valid refresh token, Expect to return object of type Token containing access_token & refresh_token", async () => { //Arrange - let configuration = Utility.getConfiguration(); + let configuration = Utility.getAdminConfiguration(); let generalAPI = new AuthApi(configuration); let loginResponse = await generalAPI.authenticate({ username: configuration.username, @@ -82,6 +94,82 @@ describe("Authentication service", () => { }); }); + describe("Reset Credentials", () => { + + describe("Validation", () => { + + it("When resetting the password with unauthenticated request, expect to return unauthenticated request", async () => { + //Arrange + let authApi = new AuthApi({ basePath: configuration.basePath }); + let username = seederData!.users?.poc.username!; + //Act + const request = authApi.resetCredentials({ username: username, password: 'Pa$s1word' }); + //Assert + await expect(request).rejects.toMatchObject({ response: { status: 401 } }); + }); + + it("When resetting the password with not satisfying password policy, expect to return bad request", async () => { + //Arrange + let authApi = new AuthApi({ basePath: configuration.basePath }); + let username = seederData!.users?.poc.username!; + //Act + const request = authApi.resetCredentials({ username: username, password: 'Pa$s1word' }); + //Assert + await expect(request).rejects.toMatchObject({ response: { status: 401 } }); + }); + }); + + describe("Functional", () => { + it("When register user, expect to return registered user detail of type User", async () => { + //Arrange + await Utility.setAuthToken(pocUserConfiguration); + let authApi = new AuthApi(pocUserConfiguration); + let username = seederData!.users?.poc.username!; + let password = "Pa$s1word"; + //Act + const response = await authApi.resetCredentials({ username: username, password: password }); + //Assert + expect(response.data).toBeTruthy(); + }); + }); + }); + + describe("User Profile", () => { + + describe("Auth", () => { + it("When no auth token provided, Expect to return un-authenticated request", async () => { + //Arrange + let userManagementApi = new AuthApi(userWithoutLogin); + //Act + const assignPermission = userManagementApi.getUserProfile(userWithoutLogin.username) + + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 401 } });; + }); + }); + + describe("Functional", () => { + it("As a POC, When assigning valid user permission, Expect to return true", async () => { + //Arrange + let userManagementApi = new AuthApi(pocUserConfiguration); + //Act + const response = await userManagementApi.getUserProfile(pocUserConfiguration.username); + + //Assert + expect(response.status).toBe(200); + }); + + it("As a Default user, When assigning valid user permission, Expect to return true", async () => { + //Arrange + let userManagementApi = new AuthApi(defaultUser); + //Act + const response = await userManagementApi.getUserProfile(defaultUser.username); + + //Assert + expect(response.status).toBe(200); + }); + }); + }); }); diff --git a/src/__tests__/gtfs-flex.roles.test.ts b/src/__tests__/gtfs-flex.roles.test.ts deleted file mode 100644 index c832fef..0000000 --- a/src/__tests__/gtfs-flex.roles.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Utility } from '../utils'; -import { - GTFSFlexServiceApi, Polygon, Service, -} from 'tdei-management-client'; -import seed, { SeedDetails } from '../data.seed'; -import { TdeiObjectFaker } from '../tdei-object-faker'; - -describe('GTFS Flex service', () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let seederData: SeedDetails | undefined = undefined; - - beforeAll(async () => { - seederData = await seed.generate(); - const loginResponse = await Utility.login(seederData.producer_user?.email!, "Tester01*"); - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; - }, 50000); - - describe('Create Service', () => { - describe('Functional', () => { - it('When creating new service, Expect to return HTTP Status 403', async () => { - //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - //Act - const serviceRequest = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id)); - //Assert - await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); - - describe('Update Service', () => { - - describe('Functional', () => { - it('When updating new service, Expect to return HTTP Status 403', async () => { - //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = seederData?.updateServiceObject!; - //Act - const serviceRequest = gtfsFlexApi.updateService(payload, seederData?.projectGroup?.tdei_project_group_id); - //Assert - await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); - - describe('Delete Service', () => { - describe('Functional', () => { - it('When deleting service id, Expect to return HTTP Status 403', async () => { - //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - //Act - const serviceRequest = gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.service?.tdei_service_id!, true); - //Assert - await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }) - }); - - describe('Get Services', () => { - describe('Functional', () => { - it('When searched without filters, Expect to return list of Services of type Service', async () => { - //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - //Act - const serviceResponse = await gtfsFlexApi.getService(); - //Assert - expect(serviceResponse.status).toBe(200); - expect(serviceResponse.data).toBeInstanceOf(Array); - serviceResponse.data.forEach(service => { - expectPolygon(service.polygon); - expect(service).toMatchObject({ - tdei_project_group_id: expect.any(String), - tdei_service_id: expect.any(String), - service_name: expect.any(String), - polygon: expect.any(Object || null) - }) - }) - }); - }) - }) -}); - -function expectPolygon(polygon: any) { - if (polygon) { - let aPolygon = polygon as Polygon; - expect(typeof aPolygon.features).not.toBeNull(); - expect(aPolygon.features?.length).toBeGreaterThan(0); - - } -} \ No newline at end of file diff --git a/src/__tests__/gtfs-flex.test.ts b/src/__tests__/gtfs-flex.test.ts index ae0f486..f65e67a 100644 --- a/src/__tests__/gtfs-flex.test.ts +++ b/src/__tests__/gtfs-flex.test.ts @@ -1,69 +1,87 @@ import { Utility } from '../utils'; import { - GTFSFlexServiceApi, - AuthApi, - Service, - Polygon, + ServiceApi, Polygon, Service, } from 'tdei-management-client'; import seed, { SeedDetails } from '../data.seed'; import { TdeiObjectFaker } from '../tdei-object-faker'; -describe('GTFS Flex service', () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let configurationWithoutAuthHeader = Utility.getConfiguration(); +describe('TDEI Service', () => { + let adminConfiguration = Utility.getAdminConfiguration(); + let pocUserConfiguration = Utility.getPocConfiguration(); + let defaultUser = Utility.getDefaultUserConfiguration(); + let apikeyUser = Utility.getApiKeyConfiguration(); + let userWithoutLogin = Utility.getPocConfiguration(); let seederData: SeedDetails | undefined = undefined; + beforeAll(async () => { seederData = await seed.generate(); - let generalAPI = new AuthApi(configurationWithAuthHeader) - const loginResponse = await generalAPI.authenticate({ - username: configurationWithAuthHeader.username, - password: configurationWithAuthHeader.password - }); - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; + await Utility.setAuthToken(adminConfiguration); + await Utility.setAuthToken(pocUserConfiguration); + await Utility.setAuthToken(defaultUser); }, 50000); describe('Create Service', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { + describe('Functional', () => { + it('No Auth, When no auth token provided, Expect to return unauthorized request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithoutAuthHeader); + const gtfsFlexApi = new ServiceApi(userWithoutLogin); //Act - const serviceResponse = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id)); + const serviceResponse = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex')); //Assert - await expect(serviceResponse).rejects.toMatchObject({ response: { status: 401 } }); + await expect(serviceResponse).rejects.toMatchObject({ response: { status: 403 } }); }); - }); - describe('Functional', () => { - it('When creating new service, Expect to return newly created service id', async () => { + it('As a Member, When creating new service, Expect to return forbidden request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); + const gtfsFlexApi = new ServiceApi(defaultUser); //Act - const serviceResponse = await gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id)); + const serviceRequest = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex')); //Assert - expect(serviceResponse.status).toBe(200); - expect(serviceResponse.data.data?.length).toBeGreaterThan(0); + await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a API Key user, When creating new service, Expect to return forbidden request', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(apikeyUser); + //Act + const serviceRequest = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex')); + //Assert + await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a POC, When creating new service, Expect to create service successfully', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + //Act + const serviceRequest = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex')); + //Assert + expect((await serviceRequest).status).toBe(200); }); - it('When creating new service with same service_name, Expect to return HTTP Status 400', async () => { + it('As an Admin, When creating new service, Expect to create service successfully', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id); - payload.service_name = seederData?.service?.service_name; + const gtfsFlexApi = new ServiceApi(adminConfiguration); + //Act + const serviceRequest = gtfsFlexApi.createService(TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex')); + //Assert + expect((await serviceRequest).status).toBe(200); + }); + + it('As a POC, When creating new service with same service_name, Expect to return bad request', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex'); + payload.service_name = seederData?.getService('flex').service_name; //Act const serviceResponse = gtfsFlexApi.createService(payload); //Assert await expect(serviceResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - }); - describe('Validation', () => { - it('When creating new service with empty service_name, Expect to return HTTP Status 400', async () => { + it('When creating new service with empty service_name, Expect to return bad request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id); + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex'); payload.service_name = ''; //Act const serviceResponse = gtfsFlexApi.createService(payload); @@ -71,10 +89,10 @@ describe('GTFS Flex service', () => { await expect(serviceResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it('When creating new service with empty tdei_project_group_id, Expect to return HTTP Status 400', async () => { + it('When creating new service with empty tdei_project_group_id, Expect to return bad request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id); + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex'); payload.tdei_project_group_id = ''; //Act const serviceResponse = gtfsFlexApi.createService(payload); @@ -82,10 +100,10 @@ describe('GTFS Flex service', () => { await expect(serviceResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it('When creating new service with invalid polygon, Expect to return HTTP Status 400', async () => { + it('When creating new service with invalid polygon, Expect to return bad request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id); + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = TdeiObjectFaker.getService(seederData?.projectGroup?.tdei_project_group_id, 'flex'); payload.polygon = TdeiObjectFaker.getInvalidPolygon(); //Act const serviceResponse = gtfsFlexApi.createService(payload); @@ -96,70 +114,97 @@ describe('GTFS Flex service', () => { }); describe('Update Service', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { + + describe('Functional', () => { + it('When no auth token provided, Expect to return unauthorized request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithoutAuthHeader); - let payload = seederData?.updateServiceObject!; + const gtfsFlexApi = new ServiceApi(userWithoutLogin); + let payload = seederData?.updateServiceObject('flex'); //Act - const serviceResponse = gtfsFlexApi.updateService(payload, seederData?.projectGroup?.tdei_project_group_id); + const serviceResponse = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); //Assert - await expect(serviceResponse).rejects.toMatchObject({ response: { status: 401 } }); + await expect(serviceResponse).rejects.toMatchObject({ response: { status: 403 } }); }); - }); - describe('Functional', () => { - it('When updating new service, Expect to return newly Updated service id', async () => { + it('As a Member, When updating any service, Expect to return forbidden request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = seederData?.updateServiceObject!; + const gtfsFlexApi = new ServiceApi(defaultUser); + let payload = seederData?.updateServiceObject('flex'); //Act - const serviceResponse = await gtfsFlexApi.updateService(payload, seederData?.projectGroup?.tdei_project_group_id); + const serviceRequest = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); //Assert - expect(serviceResponse.status).toBe(200); + await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); }); - }); - describe('Validation', () => { - it('When updating new service with empty service_name, Expect to return HTTP Status 400', async () => { + it('As a API key user, When updating any service, Expect to return forbidden request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = seederData?.updateServiceObject!; - payload.service_name = ''; + const gtfsFlexApi = new ServiceApi(apikeyUser); + let payload = seederData?.updateServiceObject('flex'); + //Act + const serviceRequest = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); + //Assert + await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a POC, When updating any service, Expect to update service successfully', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = seederData?.updateServiceObject('flex'); + //Act + const serviceRequest = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); + //Assert + expect((await serviceRequest).status).toBe(200); + }); + + it('As an Admin, When updating any service, Expect to update service successfully', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(adminConfiguration); + let payload = seederData?.updateServiceObject('flex'); //Act - const serviceResponse = gtfsFlexApi.updateService(payload, seederData?.projectGroup?.tdei_project_group_id); + const serviceRequest = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); + //Assert + expect((await serviceRequest).status).toBe(200); + }); + + it('When updating new service with empty service_name, Expect to return bad request', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = seederData?.updateServiceObject('flex'); + payload!.service_name = ''; + //Act + const serviceResponse = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); //Assert await expect(serviceResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it('When updating new service with empty tdei_project_group_id, Expect to return HTTP Status 400', async () => { + it('When updating new service with empty tdei_project_group_id, Expect to return bad request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = seederData?.updateServiceObject!; + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = seederData?.updateServiceObject('flex'); //Act - const serviceResponse = gtfsFlexApi.updateService(payload, ''); + const serviceResponse = gtfsFlexApi.updateService(payload!, ''); //Assert await expect(serviceResponse).rejects.toMatchObject({ response: { status: 404 } }); }); - it('When updating new service with empty tdei_service_id, Expect to return HTTP Status 400', async () => { + it('When updating new service with empty tdei_service_id, Expect to return bad request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = seederData?.updateServiceObject!; - payload.tdei_service_id = ''; + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = seederData?.updateServiceObject('flex'); + payload!.tdei_service_id = ''; //Act - const serviceResponse = gtfsFlexApi.updateService(payload, seederData?.projectGroup?.tdei_project_group_id); + const serviceResponse = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); //Assert await expect(serviceResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it('When updating new service with invalid polygon, Expect to return HTTP Status 400', async () => { + it('When updating new service with invalid polygon, Expect to return bad request', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - let payload = seederData?.updateServiceObject!; - payload.polygon = TdeiObjectFaker.getInvalidPolygon(); + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + let payload = seederData?.updateServiceObject('flex'); + payload!.polygon = TdeiObjectFaker.getInvalidPolygon(); //Act - const serviceResponse = gtfsFlexApi.updateService(payload, seederData?.projectGroup?.tdei_project_group_id); + const serviceResponse = gtfsFlexApi.updateService(payload!, seederData?.projectGroup?.tdei_project_group_id); //Assert await expect(serviceResponse).rejects.toMatchObject({ response: { status: 400 } }); }); @@ -167,22 +212,50 @@ describe('GTFS Flex service', () => { }); }); - describe('Get Services', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { + describe('Delete Service', () => { + describe('Functional', () => { + it('As a Member, When deleting service id, Expect to return forbidden request', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(defaultUser); + //Act + const serviceRequest = gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.getService('osw').tdei_service_id!, true); + //Assert + await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a API Key user, When deleting service id, Expect to return forbidden request', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(apikeyUser); + //Act + const serviceRequest = gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.getService('flex').tdei_service_id!, true); + //Assert + await expect(serviceRequest).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a POC, When deleting service id, Expect to delete service successfully', async () => { + //Arrange + const gtfsFlexApi = new ServiceApi(pocUserConfiguration); + //Act + const serviceRequest = gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.getService('flex').tdei_service_id!, true); + //Assert + expect((await serviceRequest).status).toBe(200); + }); + it('As an Admin, When deleting service id, Expect to delete service successfully', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithoutAuthHeader); + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act - const serviceResponse = gtfsFlexApi.getService(); + const serviceRequest = gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.getService('flex').tdei_service_id!, true); //Assert - await expect(serviceResponse).rejects.toMatchObject({ response: { status: 401 } }); + expect((await serviceRequest).status).toBe(200); }); }) + }); + describe('Get Services', () => { describe('Functional', () => { - it('When searched without filters, Expect to return list of Services of type Service', async () => { + it('As a POC, When searched without filters, Expect to return list of Services of type Service', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act const serviceResponse = await gtfsFlexApi.getService(); //Assert @@ -199,20 +272,18 @@ describe('GTFS Flex service', () => { }) }); - it('When searched with tdei_project_group_id filter, Expect to return list of Services matching filter', async () => { + it('As an Admin, When searched without filters, Expect to return list of Services of type Service', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act - const serviceResponse = await gtfsFlexApi.getService(undefined, undefined, seederData?.projectGroup?.tdei_project_group_id); - const data = serviceResponse.data; + const serviceResponse = await gtfsFlexApi.getService(); //Assert expect(serviceResponse.status).toBe(200); - expect(data).toBeInstanceOf(Array); - + expect(serviceResponse.data).toBeInstanceOf(Array); serviceResponse.data.forEach(service => { expectPolygon(service.polygon); expect(service).toMatchObject({ - tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, + tdei_project_group_id: expect.any(String), tdei_service_id: expect.any(String), service_name: expect.any(String), polygon: expect.any(Object || null) @@ -220,79 +291,104 @@ describe('GTFS Flex service', () => { }) }); - it('When searched with service name filter, Expect to return list of Services matching filter', async () => { + it('As a API key user, When searched without filters, Expect to return list of Services of type Service', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act - const serviceResponse = await gtfsFlexApi.getService(undefined, seederData?.service?.service_name); - const data = serviceResponse.data; + const serviceResponse = await gtfsFlexApi.getService(); //Assert expect(serviceResponse.status).toBe(200); - expect(data).toBeInstanceOf(Array); + expect(serviceResponse.data).toBeInstanceOf(Array); serviceResponse.data.forEach(service => { expectPolygon(service.polygon); expect(service).toMatchObject({ tdei_project_group_id: expect.any(String), tdei_service_id: expect.any(String), - service_name: seederData?.service?.service_name, + service_name: expect.any(String), polygon: expect.any(Object || null) }) }) }); - it('When searched with tdei_service_id filter, Expect to return list of Services matching filter', async () => { + it('As a Default user, When searched without filters, Expect to return list of Services of type Service', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - const tdei_service_id = seederData?.service?.tdei_service_id; + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act - const serviceResponse = await gtfsFlexApi.getService(tdei_service_id) - const data = serviceResponse.data; + const serviceResponse = await gtfsFlexApi.getService(); //Assert expect(serviceResponse.status).toBe(200); - expect(data).toBeInstanceOf(Array); + expect(serviceResponse.data).toBeInstanceOf(Array); serviceResponse.data.forEach(service => { expectPolygon(service.polygon); expect(service).toMatchObject({ tdei_project_group_id: expect.any(String), - tdei_service_id: seederData?.service?.tdei_service_id, + tdei_service_id: expect.any(String), service_name: expect.any(String), polygon: expect.any(Object || null) }) }) }); - it('When searched with bbox name filter, Expect to return list of Services matching filter', async () => { + it('When searched with tdei_project_group_id filter, Expect to return list of Services matching filter', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); - const tdei_service_id = seederData?.service?.tdei_service_id; + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act - const serviceResponse = await gtfsFlexApi.getService(undefined, undefined, undefined, [121, 154, 134, 198]); + const serviceResponse = await gtfsFlexApi.getService(undefined, undefined, undefined, seederData?.projectGroup?.tdei_project_group_id); const data = serviceResponse.data; //Assert expect(serviceResponse.status).toBe(200); expect(data).toBeInstanceOf(Array); + + serviceResponse.data.forEach(service => { + expectPolygon(service.polygon); + expect(service).toMatchObject({ + tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, + tdei_service_id: expect.any(String), + service_name: expect.any(String), + polygon: expect.any(Object || null) + }) + }) }); - }) - }); - describe('Delete Service', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { + it('When searched with service name filter, Expect to return list of Services matching filter', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithoutAuthHeader); + const gtfsFlexApi = new ServiceApi(adminConfiguration); //Act - const serviceResponse = gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.service?.tdei_service_id!, true); + const serviceResponse = await gtfsFlexApi.getService(undefined, seederData?.getService('flex').service_name); + const data = serviceResponse.data; //Assert - await expect(serviceResponse).rejects.toMatchObject({ response: { status: 401 } }); + expect(serviceResponse.status).toBe(200); + expect(data).toBeInstanceOf(Array); + serviceResponse.data.forEach(service => { + expectPolygon(service.polygon); + expect(service).toMatchObject({ + tdei_project_group_id: expect.any(String), + tdei_service_id: expect.any(String), + service_name: seederData?.getService('flex').service_name, + polygon: expect.any(Object || null) + }) + }) }); - it('When deleting service id, Expect to return success', async () => { + it('When searched with tdei_service_id filter, Expect to return list of Services matching filter', async () => { //Arrange - const gtfsFlexApi = new GTFSFlexServiceApi(configurationWithAuthHeader); + const gtfsFlexApi = new ServiceApi(adminConfiguration); + const tdei_service_id = seederData?.getService('flex').tdei_service_id; //Act - const serviceResponse = await gtfsFlexApi.deleteService(seederData?.projectGroup?.tdei_project_group_id!, seederData?.service?.tdei_service_id!, true); + const serviceResponse = await gtfsFlexApi.getService(tdei_service_id) + const data = serviceResponse.data; //Assert expect(serviceResponse.status).toBe(200); + expect(data).toBeInstanceOf(Array); + serviceResponse.data.forEach(service => { + expectPolygon(service.polygon); + expect(service).toMatchObject({ + tdei_project_group_id: expect.any(String), + tdei_service_id: seederData?.getService('flex').tdei_service_id, + service_name: expect.any(String), + polygon: expect.any(Object || null) + }) + }) }); }) }) diff --git a/src/__tests__/gtfs-pathways.roles.test.ts b/src/__tests__/gtfs-pathways.roles.test.ts deleted file mode 100644 index 77e58fc..0000000 --- a/src/__tests__/gtfs-pathways.roles.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Utility } from '../utils'; -import { - GTFSPathwaysStationApi, Polygon, Station, -} from 'tdei-management-client'; -import seed, { SeedDetails } from '../data.seed'; -import { TdeiObjectFaker } from '../tdei-object-faker'; - -describe('GTFS Pathways Service Role Testing - Data Generator User', () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let seederData: SeedDetails | undefined = undefined; - beforeAll(async () => { - seederData = await seed.generate(); - const loginResponse = await Utility.login(seederData.producer_user?.email!, "Tester01*"); - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; - }, 50000); - - describe('Create Station', () => { - describe('Functional', () => { - it('When creating new station, Expect to return HTTP Status 403', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationRequest = gtfsPathwaysApi.createStation(TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id)); - - await expect(stationRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); - - describe('Update Station', () => { - - describe('Functional', () => { - it('When updating new station, Expect to return HTTP Status 403', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = seederData?.updateStationObject!; - - const stationRequest = gtfsPathwaysApi.updateStation(payload, seederData?.projectGroup?.tdei_project_group_id); - - await expect(stationRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); - - describe('Delete Station', () => { - describe('Functional', () => { - - it('When deleting station id, Expect to return HTTP Status 403', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationRequest = gtfsPathwaysApi.setServiceStatus(seederData?.projectGroup?.tdei_project_group_id!, seederData?.station?.tdei_station_id!, true); - - await expect(stationRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }) - }); - - describe('Get Station', () => { - describe('Functional', () => { - it('When searched without filters, Expect to return list of Stations of type Station', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.getStation(); - - expect(stationResponse.status).toBe(200); - expect(stationResponse.data).toBeInstanceOf(Array); - stationResponse.data.forEach(station => { - expectPolygon(station.polygon); - expect(station).toMatchObject({ - tdei_station_id: expect.any(String), - tdei_project_group_id: expect.any(String), - station_name: expect.any(String), - polygon: expect.any(Object || null) - - }) - }) - }); - }) - }); -}); - -function expectPolygon(polygon: any) { - if (polygon) { - let aPolygon = polygon as Polygon; - expect(typeof aPolygon.features).not.toBeNull(); - expect(aPolygon.features?.length).toBeGreaterThan(0); - - } -} \ No newline at end of file diff --git a/src/__tests__/gtfs-pathways.test.ts b/src/__tests__/gtfs-pathways.test.ts deleted file mode 100644 index 7ace25a..0000000 --- a/src/__tests__/gtfs-pathways.test.ts +++ /dev/null @@ -1,288 +0,0 @@ -import { Utility } from '../utils'; -import { - GTFSPathwaysStationApi, - AuthApi, - Polygon, - Station, -} from 'tdei-management-client'; -import seed, { SeedDetails } from '../data.seed'; -import { TdeiObjectFaker } from '../tdei-object-faker'; - -describe('GTFS Pathways service', () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let configurationWithoutAuthHeader = Utility.getConfiguration(); - let seederData: SeedDetails | undefined = undefined; - beforeAll(async () => { - seederData = await seed.generate(); - let generalAPI = new AuthApi(configurationWithAuthHeader) - const loginResponse = await generalAPI.authenticate({ - username: configurationWithAuthHeader.username, - password: configurationWithAuthHeader.password - }) - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; - }, 50000); - - describe('Create Station', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithoutAuthHeader); - - const stationResponse = gtfsPathwaysApi.createStation(TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id)); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 401 } }); - }); - }); - - describe('Functional', () => { - it('When creating new station, Expect to return newly created station id', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.createStation(TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id)); - - expect(stationResponse.status).toBe(200); - expect(stationResponse.data.data?.length).toBeGreaterThan(0); - }); - - it('When creating new station with same station_name, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id); - payload.station_name = seederData?.station?.station_name; - - const stationResponse = gtfsPathwaysApi.createStation(payload); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - }); - - describe('Validation', () => { - it('When creating new station with empty station_name, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id); - payload.station_name = ''; - - const stationResponse = gtfsPathwaysApi.createStation(payload); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - - it('When creating new station with empty tdei_project_group_id, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id); - payload.tdei_project_group_id = ''; - - const stationResponse = gtfsPathwaysApi.createStation(payload); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - - it('When creating new station with invalid polygon, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = TdeiObjectFaker.getStation(seederData?.projectGroup?.tdei_project_group_id); - payload.polygon = TdeiObjectFaker.getInvalidPolygon(); - - const stationResponse = gtfsPathwaysApi.createStation(payload); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - }); - }); - - describe('Update Station', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithoutAuthHeader); - let payload = seederData?.updateStationObject!; - - const stationResponse = gtfsPathwaysApi.updateStation(payload, seederData?.projectGroup?.tdei_project_group_id) - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 401 } }); - }); - }); - - describe('Functional', () => { - it('When updating new station, Expect to return newly Updated station id', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = seederData?.updateStationObject!; - - const stationResponse = await gtfsPathwaysApi.updateStation(payload, seederData?.projectGroup?.tdei_project_group_id); - - expect(stationResponse.status).toBe(200); - }); - }); - - describe('Validation', () => { - it('When updating new station with empty station_name, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = seederData?.updateStationObject!; - payload.station_name = ''; - - const stationResponse = gtfsPathwaysApi.updateStation(payload, seederData?.projectGroup?.tdei_project_group_id); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - - it('When updating new station with empty tdei_project_group_id, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = seederData?.updateStationObject!; - - const stationResponse = gtfsPathwaysApi.updateStation(payload, ''); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 404 } }); - }); - - it('When updating new station with empty tdei_station_id, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = seederData?.updateStationObject!; - payload.station_name = ''; - - const stationResponse = gtfsPathwaysApi.updateStation(payload, seederData?.projectGroup?.tdei_project_group_id); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - - it('When updating new station with invalid polygon, Expect to return HTTP Status 400', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - let payload = seederData?.updateStationObject!; - payload.polygon = TdeiObjectFaker.getInvalidPolygon(); - - const stationResponse = gtfsPathwaysApi.updateStation(payload, seederData?.projectGroup?.tdei_project_group_id); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - - }); - }); - - describe('Get Station', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithoutAuthHeader); - - const stationResponse = gtfsPathwaysApi.getStation(); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 401 } }); - }); - }) - - describe('Functional', () => { - it('When searched without filters, Expect to return list of Stations of type Station', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.getStation(); - - expect(stationResponse.status).toBe(200); - expect(stationResponse.data).toBeInstanceOf(Array); - stationResponse.data.forEach(station => { - expectPolygon(station.polygon); - expect(station).toMatchObject({ - tdei_station_id: expect.any(String), - tdei_project_group_id: expect.any(String), - station_name: expect.any(String), - polygon: expect.any(Object || null) - }) - }) - }); - - it('When searched with tdei_project_group_id filter, Expect to return list of Stations matching filter', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.getStation(undefined, undefined, seederData?.projectGroup?.tdei_project_group_id); - - const data = stationResponse.data; - - expect(stationResponse.status).toBe(200); - expect(Array.isArray(data)).toBe(true); - expect(data).toBeInstanceOf(Array); - stationResponse.data.forEach(station => { - expectPolygon(station.polygon); - expect(station).toMatchObject({ - tdei_station_id: expect.any(String), - tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - station_name: expect.any(String), - polygon: expect.any(Object || null) - }) - }) - }); - - it('When searched with station name filter, Expect to return list of Stations matching filter', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.getStation(undefined, seederData?.station?.station_name); - const data = stationResponse.data; - - expect(stationResponse.status).toBe(200); - expect(data).toBeInstanceOf(Array); - stationResponse.data.forEach(station => { - expectPolygon(station.polygon); - expect(station).toMatchObject({ - tdei_station_id: expect.any(String), - tdei_project_group_id: expect.any(String), - station_name: seederData?.station?.station_name, - polygon: expect.any(Object || null) - }) - }) - }); - - it('When searched with tdei_station_id filter, Expect to return list of Stations matching filter', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - const tdei_station_id = seederData?.station?.tdei_station_id; - - const stationResponse = await gtfsPathwaysApi.getStation(tdei_station_id) - const data = stationResponse.data; - - expect(stationResponse.status).toBe(200); - expect(data).toBeInstanceOf(Array); - stationResponse.data.forEach(station => { - expectPolygon(station.polygon); - expect(station).toMatchObject({ - tdei_station_id: seederData?.station?.tdei_station_id, - tdei_project_group_id: expect.any(String), - station_name: expect.any(String), - polygon: expect.any(Object || null) - }) - }) - }); - - it('When searched with bbox name filter, Expect to return list of Stations matching filter', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.getStation(undefined, undefined, undefined, [123, 124, 154, 167]); - const data = stationResponse.data; - - expect(stationResponse.status).toBe(200); - expect(data).toBeInstanceOf(Array); - }); - }) - }) - - describe('Delete Station', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithoutAuthHeader); - - const stationResponse = gtfsPathwaysApi.setServiceStatus(seederData?.projectGroup?.tdei_project_group_id!, seederData?.station?.tdei_station_id!, true); - - await expect(stationResponse).rejects.toMatchObject({ response: { status: 401 } }); - }); - - it('When deleting station id, Expect to return success', async () => { - const gtfsPathwaysApi = new GTFSPathwaysStationApi(configurationWithAuthHeader); - - const stationResponse = await gtfsPathwaysApi.setServiceStatus(seederData?.projectGroup?.tdei_project_group_id!, seederData?.station?.tdei_station_id!, true); - - expect(stationResponse.status).toBe(200); - }); - }) - }) -}); - -function expectPolygon(polygon: any) { - if (polygon) { - let aPolygon = polygon as Polygon; - expect(typeof aPolygon.features).not.toBeNull(); - expect(aPolygon.features?.length).toBeGreaterThan(0); - - } -} \ No newline at end of file diff --git a/src/__tests__/project-group.test.ts b/src/__tests__/project-group.test.ts index 52da99f..8f0cd4f 100644 --- a/src/__tests__/project-group.test.ts +++ b/src/__tests__/project-group.test.ts @@ -1,83 +1,89 @@ import { Utility } from "../utils"; -import { AuthApi, ProjectGroupApi, ProjectGroup, ProjectGroupList, Polygon, POC } from "tdei-management-client"; import seed, { SeedDetails } from "../data.seed"; import { TdeiObjectFaker } from "../tdei-object-faker"; +import { AuthApi, POC, Polygon, ProjectGroup, ProjectGroupApi, ProjectGroupList } from "tdei-management-client"; describe("Project Group service", () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let configurationWithoutAuthHeader = Utility.getConfiguration(); + let adminConfiguration = Utility.getAdminConfiguration(); + let noAuthUser = Utility.getAdminConfiguration(); + let pocUserConfiguration = Utility.getPocConfiguration(); + let defaultUser = Utility.getDefaultUserConfiguration(); + let apikeyUser = Utility.getApiKeyConfiguration(); let seederData: SeedDetails | undefined = undefined; beforeAll(async () => { seederData = await seed.generate(); - let generalAPI = new AuthApi(configurationWithAuthHeader); - const loginResponse = await generalAPI.authenticate({ - username: configurationWithAuthHeader.username, - password: configurationWithAuthHeader.password - }); - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; + await Utility.setAuthToken(adminConfiguration); + await Utility.setAuthToken(pocUserConfiguration); + await Utility.setAuthToken(defaultUser); }, 50000); describe("Create Project Group", () => { describe("Auth", () => { - it("When no auth token provided, Expect to return HTTP status 401", async () => { + it("When no auth token provided, Expect to return unauthorized error", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithoutAuthHeader); + let oraganizationApi = new ProjectGroupApi(noAuthUser); //Act const request = async () => { await oraganizationApi.createProjectGroup({}) } //Assert - expect(request()).rejects.toMatchObject({ response: { status: 401 } }) + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) }); - }); - describe("Functional", () => { - it("When creating new project group, Expect to return newly created project group id", async () => { + it("As API key user, When creating project group, Expect to return unauthorized error", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(apikeyUser); //Act - const projectGroupResponse = await oraganizationApi.createProjectGroup(TdeiObjectFaker.getProjectGroup()); + const request = async () => { + await oraganizationApi.createProjectGroup({}) + } //Assert - expect(projectGroupResponse.status).toBe(200); - expect(projectGroupResponse.data.data?.length).toBeGreaterThan(0); - + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) }); - it("When creating new oraganization with same name, Expect to return HTTP Status 400", async () => { + it("As a POC, When creating project group, Expect to return unauthorized error", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(pocUserConfiguration); //Act - let payload = TdeiObjectFaker.getProjectGroup(); - payload.project_group_name = seederData?.projectGroup?.project_group_name + const request = async () => { + await oraganizationApi.createProjectGroup({}) + } + //Assert + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) + }); - const oraganizationResponse = oraganizationApi.createProjectGroup(payload); + it("As a Default user, When creating project group, Expect to return unauthorized error", async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(defaultUser); + //Act + const request = async () => { + await oraganizationApi.createProjectGroup({}) + } //Assert - await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) }); }); - describe("Validation", () => { - it("When creating new oraganization with empty name, Expect to return HTTP Status 400", async () => { + describe("Functional", () => { + it("As an Admin, When creating new project group, Expect to return newly created project group id", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act - let payload = TdeiObjectFaker.getProjectGroup(); - payload.project_group_name = ''; - - const oraganizationResponse = oraganizationApi.createProjectGroup(payload); - + const projectGroupResponse = await oraganizationApi.createProjectGroup(TdeiObjectFaker.getProjectGroup()); //Assert - await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); + expect(projectGroupResponse.status).toBe(200); + expect(projectGroupResponse.data.data?.length).toBeGreaterThan(0); + }); + }); - it("When creating new oraganization with empty phone, Expect to return HTTP Status 400", async () => { + describe("Validation", () => { + it("As an Admin, When creating new oraganization with empty name, Expect to return bad request", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act let payload = TdeiObjectFaker.getProjectGroup(); - payload.phone = ''; + payload.project_group_name = ''; const oraganizationResponse = oraganizationApi.createProjectGroup(payload); @@ -85,9 +91,9 @@ describe("Project Group service", () => { await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it("When creating new oraganization with empty address, Expect to return HTTP Status 400", async () => { + it("As an Admin, When creating new oraganization with empty address, Expect to return bad request", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act let payload = TdeiObjectFaker.getProjectGroup(); payload.address = ''; @@ -98,9 +104,9 @@ describe("Project Group service", () => { await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it('When creating new project group with invalid polygon, Expect to return HTTP Status 400', async () => { + it('As an Admin, When creating new project group with invalid polygon, Expect to return bad request', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act let payload = TdeiObjectFaker.getProjectGroup(); payload.polygon = TdeiObjectFaker.getInvalidPolygon(); @@ -115,22 +121,55 @@ describe("Project Group service", () => { describe("Update Project Group", () => { describe("Auth", () => { - it("When no auth token provided, Expect to return HTTP status 401", async () => { + it("When no auth token provided, Expect to return unauthorized request", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithoutAuthHeader); + let oraganizationApi = new ProjectGroupApi(noAuthUser); //Act const request = async () => { await oraganizationApi.updateProjectGroup({}) } //Assert - expect(request()).rejects.toMatchObject({ response: { status: 401 } }) - }); + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) + }, 20000); + + it("As an POC user, When updating project group, Expect to return unauthorized request", async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(pocUserConfiguration); + //Act + const request = async () => { + await oraganizationApi.updateProjectGroup({}) + } + //Assert + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) + }, 20000); + + it("As an API key user, When updating project group, Expect to return unauthorized request", async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(apikeyUser); + //Act + const request = async () => { + await oraganizationApi.updateProjectGroup({}) + } + //Assert + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) + }, 20000); + + it("As an Default user, When updating project group, Expect to return unauthorized request", async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(defaultUser); + //Act + const request = async () => { + await oraganizationApi.updateProjectGroup({}) + } + //Assert + expect(request()).rejects.toMatchObject({ response: { status: 403 } }) + }, 20000); }); describe("Functional", () => { - it("When updating new oraganization, Expect to return newly updated project group id", async () => { + it("As an Admin, When updating new oraganization, Expect to return newly updated project group id", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act let payload = seederData?.projectGroup!; const projectGroupResponse = await oraganizationApi.updateProjectGroup(payload); @@ -140,11 +179,11 @@ describe("Project Group service", () => { }); describe("Validation", () => { - it("When updating new oraganization with empty name, Expect to return HTTP Status 400", async () => { + it("As an Admin, When updating new oraganization with empty name, Expect to return bad request", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act - let payload = seederData?.projectGroup!; + let payload = Object.assign({}, seederData?.projectGroup!); payload.project_group_name = ''; const oraganizationResponse = oraganizationApi.updateProjectGroup(payload); @@ -153,24 +192,11 @@ describe("Project Group service", () => { await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it("When updating new oraganization with empty phone, Expect to return HTTP Status 400", async () => { - //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); - //Act - let payload = seederData?.projectGroup!; - payload.phone = ''; - - const oraganizationResponse = oraganizationApi.updateProjectGroup(payload); - - //Assert - await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); - }); - - it("When updating new oraganization with empty address, Expect to return HTTP Status 400", async () => { + it("As an Admin, When updating new oraganization with empty address, Expect to return bad request", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act - let payload = seederData?.projectGroup!; + let payload = Object.assign({}, seederData?.projectGroup!); payload.address = ''; const oraganizationResponse = oraganizationApi.updateProjectGroup(payload); @@ -179,11 +205,11 @@ describe("Project Group service", () => { await expect(oraganizationResponse).rejects.toMatchObject({ response: { status: 400 } }); }); - it('When updating newproject groupwith invalid polygon, Expect to return HTTP Status 400', async () => { + it('As an Admin, When updating new project group with invalid polygon, Expect to return bad request', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act - let payload = seederData?.projectGroup!; + let payload = Object.assign({}, seederData?.projectGroup!); payload.polygon = TdeiObjectFaker.getInvalidPolygon(); const oraganizationResponse = oraganizationApi.updateProjectGroup(payload); @@ -196,9 +222,9 @@ describe("Project Group service", () => { describe('Get Project Groups', () => { describe('Auth', () => { - it("When no auth token provided, Expect to return HTTP status 401", async () => { + it("When no auth token provided, Expect to return unauthorized request", async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithoutAuthHeader); + let oraganizationApi = new ProjectGroupApi(noAuthUser); //Act const projectGroupResponse = oraganizationApi.getProjectGroup(); @@ -208,9 +234,9 @@ describe("Project Group service", () => { }); describe('Functional', () => { - it('When searched without filters, Expect to return list of project groups of type ProjectGroupList', async () => { + it('As a Default user, When searched without filters, Expect to return list of project groups of type ProjectGroupList', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(defaultUser); //Act const oraganizationResponse = await oraganizationApi.getProjectGroup(); @@ -222,7 +248,7 @@ describe("Project Group service", () => { expectPolygon(projectGroup.polygon); expect(projectGroup).toMatchObject({ tdei_project_group_id: expect.any(String), - name: expect.any(String), + project_group_name: expect.any(String), phone: expect.any(String), url: expect.any(String), address: expect.any(String), @@ -232,15 +258,14 @@ describe("Project Group service", () => { }) }); - it('When searched with tdei_project_group_id filter, Expect to return list of project groups matching filter', async () => { + it('As a Default user, When searched with tdei_project_group_id filter, Expect to return list of project groups matching filter', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(defaultUser); //Act const oraganizationResponse = await oraganizationApi.getProjectGroup(seederData?.projectGroup?.tdei_project_group_id); const data = oraganizationResponse.data; - //Assert expect(oraganizationResponse.status).toBe(200); expect(Array.isArray(data)).toBe(true); @@ -248,22 +273,23 @@ describe("Project Group service", () => { expectPolygon(projectGroup.polygon); expect(projectGroup).toMatchObject({ tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - name: expect.any(String), + project_group_name: expect.any(String), phone: expect.any(String), url: expect.any(String), address: expect.any(String), polygon: expect.any(Object || null), - poc: expect.anything() as POC[] + poc: expect.any(Array) }) }) }); - it('When searched with project group name filter, Expect to return list of project groups matching fiter', async () => { + it('As a Default user, When searched with project group name filter, Expect to return list of project groups matching fiter', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); - + let oraganizationApi = new ProjectGroupApi(defaultUser); + let tdei_project_group_id = seederData?.projectGroup?.tdei_project_group_id; + let project_group_name = seederData?.projectGroup?.project_group_name; //Act - const oraganizationResponse = await oraganizationApi.getProjectGroup(seederData?.projectGroup?.tdei_project_group_id, seederData?.projectGroup?.project_group_name); + const oraganizationResponse = await oraganizationApi.getProjectGroup(undefined, project_group_name); const data = oraganizationResponse.data; @@ -273,8 +299,8 @@ describe("Project Group service", () => { oraganizationResponse.data.forEach(projectGroup => { expectPolygon(projectGroup.polygon); expect(projectGroup).toMatchObject({ - tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - name: seederData?.projectGroup?.project_group_name, + tdei_project_group_id: tdei_project_group_id, + project_group_name: project_group_name, phone: expect.any(String), url: expect.any(String), address: expect.any(String), @@ -283,40 +309,60 @@ describe("Project Group service", () => { }) }) }); + }); + }); - it('When searched with bbox name filter, Expect to return list of project groups matching fiter', async () => { + describe('Delete Project Group', () => { + describe('Auth', () => { + it('When no auth token provided, Expect to return unauthorized request', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(noAuthUser); //Act - const oraganizationResponse = await oraganizationApi.getProjectGroup(undefined, undefined, [121, 122, 124, 145]); + const projectGroupResponse = oraganizationApi.deleteProjectGroup(seederData?.projectGroup?.tdei_project_group_id!, true); - const data = oraganizationResponse.data; + //Assert + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a API key user, When requested, Expect to return unauthorized request', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(apikeyUser); + + //Act + const projectGroupResponse = oraganizationApi.deleteProjectGroup(seederData?.projectGroup?.tdei_project_group_id!, true); //Assert - expect(oraganizationResponse.status).toBe(200); - expect(Array.isArray(data)).toBe(true); + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); }); - }); - }); + it('As a Default user, When requested, Expect to return unauthorized request', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(defaultUser); - describe('Delete Project Group', () => { - describe('Auth', () => { - it('When no auth token provided, Expect to return HTTP status 401', async () => { + //Act + const projectGroupResponse = oraganizationApi.deleteProjectGroup(seederData?.projectGroup?.tdei_project_group_id!, true); + + //Assert + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a POC, When requested, Expect to return unauthorized request', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithoutAuthHeader); + let oraganizationApi = new ProjectGroupApi(pocUserConfiguration); //Act const projectGroupResponse = oraganizationApi.deleteProjectGroup(seederData?.projectGroup?.tdei_project_group_id!, true); //Assert - await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 401 } }); + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); }); + }); - it('When deleting project group id, Expect to return success', async () => { + describe('Functional', () => { + it('As an Admin, When deleting project group id, Expect to return success', async () => { //Arrange - let oraganizationApi = new ProjectGroupApi(configurationWithAuthHeader); + let oraganizationApi = new ProjectGroupApi(adminConfiguration); //Act const projectGroupResponse = await oraganizationApi.deleteProjectGroup(seederData?.projectGroup?.tdei_project_group_id!, true); @@ -324,7 +370,68 @@ describe("Project Group service", () => { //Assert expect(projectGroupResponse.status).toBe(200); }); - }) + }); + }); + + describe('Get Project Group Users', () => { + describe('Auth', () => { + it('When no auth token provided, Expect to return unauthorized request', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(noAuthUser); + + //Act + const projectGroupResponse = oraganizationApi.getProjectGroupUsers(seederData?.projectGroup?.tdei_project_group_id!); + + //Assert + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a API key user, When requested, Expect to return unauthorized request', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(apikeyUser); + + //Act + const projectGroupResponse = oraganizationApi.getProjectGroupUsers(seederData?.projectGroup?.tdei_project_group_id!); + + //Assert + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it('As a Default user, When requested, Expect to return unauthorized request', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(defaultUser); + + //Act + const projectGroupResponse = oraganizationApi.getProjectGroupUsers(seederData?.projectGroup?.tdei_project_group_id!); + + //Assert + await expect(projectGroupResponse).rejects.toMatchObject({ response: { status: 403 } }); + }); + }); + + describe('Functional', () => { + it('As an Admin, When requested, Expect to return success', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(adminConfiguration); + + //Act + const projectGroupResponse = await oraganizationApi.getProjectGroupUsers(seederData?.projectGroup?.tdei_project_group_id!); + + //Assert + expect(projectGroupResponse.status).toBe(200); + }); + + it('As a POC, When requested, Expect to return success', async () => { + //Arrange + let oraganizationApi = new ProjectGroupApi(pocUserConfiguration); + + //Act + const projectGroupResponse = await oraganizationApi.getProjectGroupUsers(seederData?.projectGroup?.tdei_project_group_id!); + + //Assert + expect(projectGroupResponse.status).toBe(200); + }); + }); }); }); diff --git a/src/__tests__/user-management.roles.test.ts b/src/__tests__/user-management.roles.test.ts deleted file mode 100644 index bbd7313..0000000 --- a/src/__tests__/user-management.roles.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { TDEIROLES, Utility } from "../utils"; -import { RoleDetails, UserManagementApi } from "tdei-management-client"; -import seed, { SeedDetails } from "../data.seed"; - -describe("User Management Service Role Testing - Data Generator User", () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let seederData: SeedDetails | undefined = undefined; - beforeAll(async () => { - seederData = await seed.generate(); - const loginResponse = await Utility.login(seederData.producer_user?.email!, "Tester01*"); - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; - }, 50000); - - describe("Get Roles", () => { - describe("Functional", () => { - it("When valid api token provided, expect to return HTTP status 403", async () => { - //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); - //Act - const rolesRequest = userManagementApi.roles(); - //Assert - await expect(rolesRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); - - describe("Assign Permission", () => { - describe("Functional", () => { - it("When assigning valid user permission, Expect to return HTTP status 403", async () => { - //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); - //Act - const permissionRequest = userManagementApi.permission( - { - roles: [TDEIROLES.FLEX_DATA_GENERATOR], - tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: seederData?.producer_user!.email - }); - - //Assert - await expect(permissionRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); - - describe("Revoke Permission", () => { - - describe("Functional", () => { - it("When assigning valid user permission, Expect to return true", async () => { - //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); - //Act - const permissionRequest = userManagementApi.revokePermission( - { - roles: [TDEIROLES.FLEX_DATA_GENERATOR], - tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: seederData?.producer_user?.email - }); - - //Assert - await expect(permissionRequest).rejects.toMatchObject({ response: { status: 403 } }); - }); - }); - }); -}); - - - diff --git a/src/__tests__/user-management.test.ts b/src/__tests__/user-management.test.ts index 7e22676..67dfffb 100644 --- a/src/__tests__/user-management.test.ts +++ b/src/__tests__/user-management.test.ts @@ -3,36 +3,65 @@ import { ProjectGroupRoles, Register, RoleDetails, Roles, User, UserManagementAp import { faker } from '@faker-js/faker'; import seed, { SeedDetails } from "../data.seed"; import { TdeiObjectFaker } from "../tdei-object-faker"; -import exp from "constants"; +import { jwtDecode } from "jwt-decode"; describe("User Management service", () => { - let configurationWithAuthHeader = Utility.getConfiguration(); - let configurationWithoutAuthHeader = Utility.getConfiguration(); + let adminConfiguration = Utility.getAdminConfiguration(); + let pocUserConfiguration = Utility.getPocConfiguration(); + let configurationWithoutAuthHeader = Utility.getAdminConfiguration(); + let defaultUser = Utility.getDefaultUserConfiguration(); + let apikeyUser = Utility.getApiKeyConfiguration(); let seederData: SeedDetails | undefined = undefined; beforeAll(async () => { seederData = await seed.generate(); - const loginResponse = await Utility.login(configurationWithAuthHeader.username!, configurationWithAuthHeader.password!); - configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; + await Utility.setAuthToken(adminConfiguration); + await Utility.setAuthToken(pocUserConfiguration); + await Utility.setAuthToken(defaultUser); }, 50000); describe("Get Roles", () => { describe("Auth", () => { - it("When no api token provided, expect to return HTTP status 401", async () => { + it("When no api token provided, expect to return forbidden error", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act const getRoles = userManagementApi.roles(); //Assert - await expect(getRoles).rejects.toMatchObject({ response: { status: 401 } }); + await expect(getRoles).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it("As a API key user, When requested, expect to return forbidden error", async () => { + //Arrange + let userManagementApi = new UserManagementApi(apikeyUser); + //Act + const getRoles = userManagementApi.roles(); + //Assert + await expect(getRoles).rejects.toMatchObject({ response: { status: 403 } }); + }); + + it("As a POC user, When requested, expect to return forbidden error", async () => { + //Arrange + let userManagementApi = new UserManagementApi(pocUserConfiguration); + //Act + const getRoles = userManagementApi.roles(); + //Assert + expect((await getRoles).status).toBe(200); + }); + + it("As a Default user, When requested, expect to return forbidden error", async () => { + //Arrange + let userManagementApi = new UserManagementApi(defaultUser); + //Act + const getRoles = userManagementApi.roles(); + //Assert + await expect(getRoles).rejects.toMatchObject({ response: { status: 403 } }); }); }); describe("Functional", () => { - it("When valid api token provided, expect to return HTTP status 200 with one or more tdei system roles", async () => { + it("As an Admin, When requested, expect to return HTTP status 200 with one or more tdei system roles", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(adminConfiguration); //Act const rolesResponse = await userManagementApi.roles(); //Assert @@ -40,9 +69,9 @@ describe("User Management service", () => { expect(rolesResponse.data.data?.length).toBeGreaterThan(0); }); - it("When valid api token provided, expect return response to be of type Array of Role object", async () => { + it("As an POC, When requested, expect return response to be of type Array of Role object", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(pocUserConfiguration); //Act const rolesResponse = await userManagementApi.roles(); //Assert @@ -60,16 +89,16 @@ describe("User Management service", () => { describe("Register User", () => { describe("Validation", () => { - it("When email not provided, expect to return HTTP status 400", async () => { + it("When email not provided, expect to return bad request", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act - const request = userManagementApi.registerUser({ password: 'Tester01*' }); + const request = userManagementApi.registerUser({ password: 'Pa$s1word' }); //Assert await expect(request).rejects.toMatchObject({ response: { status: 400 } }); }); - it("When password not provided, expect to return HTTP status 400", async () => { + it("When password not provided, expect to return bad request", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act @@ -77,7 +106,7 @@ describe("User Management service", () => { //Assert await expect(request).rejects.toMatchObject({ response: { status: 400 } }); }); - it("When no information provided, expect to return HTTP status 400", async () => { + it("When no information provided, expect to return bad request", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act @@ -85,15 +114,25 @@ describe("User Management service", () => { //Assert await expect(request).rejects.toMatchObject({ response: { status: 400 } }); }); - it("When invalid email provided, expect to return HTTP status 400", async () => { + it("When invalid email provided, expect to return bad request", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act - const request = userManagementApi.registerUser({ email: 'test_user', password: 'Tester01*' }); + const request = userManagementApi.registerUser({ email: 'test_user', password: 'Pa$s1word' }); //Assert await expect(request).rejects.toMatchObject({ response: { status: 400 } }); }); - it("When invalid password provided, expect to return HTTP status 400", async () => { + + it("When required first name is missing, expect to return bad request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); + //Act + const request = userManagementApi.registerUser({ email: 'test_user@test.com', password: 'Pa$s1word' }); + //Assert + await expect(request).rejects.toMatchObject({ response: { status: 400 } }); + }); + + it("When invalid password provided not satisfying password policy, expect to return bad request", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act @@ -124,7 +163,7 @@ describe("User Management service", () => { describe("Assign Permission", () => { describe("Auth", () => { - it("When no auth token provided, Expect to return HTTP status 401", async () => { + it("When no auth token provided, Expect to return forbidden error", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act @@ -132,16 +171,44 @@ describe("User Management service", () => { { roles: [TDEIROLES.FLEX_DATA_GENERATOR], tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: seederData?.producer_user?.email + user_name: seederData?.users?.poc.username + }) + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As a API key user, When no auth token provided, Expect to return forbidden error", async () => { + //Arrange + let userManagementApi = new UserManagementApi(apikeyUser); + //Act + const assignPermission = userManagementApi.permission( + { + roles: [TDEIROLES.FLEX_DATA_GENERATOR], + tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, + user_name: seederData?.users?.poc.username + }) + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As a Default user, When no auth token provided, Expect to return forbidden error", async () => { + //Arrange + let userManagementApi = new UserManagementApi(defaultUser); + //Act + const assignPermission = userManagementApi.permission( + { + roles: [TDEIROLES.FLEX_DATA_GENERATOR], + tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, + user_name: seederData?.users?.poc.username }) //Assert - await expect(assignPermission).rejects.toMatchObject({ response: { status: 401 } });; + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; }); }); describe("Validation", () => { - it("When invalid username provided, Expect to return HTTP status 404", async () => { + it("As a POC, When invalid username provided, Expect to return HTTP status 404", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(pocUserConfiguration); //Act const assignPermission = userManagementApi.permission( { @@ -153,15 +220,15 @@ describe("User Management service", () => { await expect(assignPermission).rejects.toMatchObject({ response: { status: 404 } });; }); - it("When managing own account permission, Expect to return HTTP status 400", async () => { + it("As a POC, When managing own account permission, Expect to return bad request", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(pocUserConfiguration); //Act const assignPermission = userManagementApi.permission( { roles: [TDEIROLES.FLEX_DATA_GENERATOR], tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: configurationWithAuthHeader.username //logged in user account + user_name: pocUserConfiguration.username //logged in user account }) //Assert await expect(assignPermission).rejects.toMatchObject({ response: { status: 400 } });; @@ -169,15 +236,15 @@ describe("User Management service", () => { }); describe("Functional", () => { - it("When assigning valid user permission, Expect to return true", async () => { + it("As a Admin, When assigning valid user permission, Expect to return true", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(adminConfiguration); //Act const response = await userManagementApi.permission( { - roles: [TDEIROLES.FLEX_DATA_GENERATOR], + roles: [TDEIROLES.POC, TDEIROLES.FLEX_DATA_GENERATOR], tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: seederData?.producer_user!.email + user_name: seederData?.users?.poc.username }); //Assert @@ -194,23 +261,38 @@ describe("User Management service", () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act - const projectGroupRoles = userManagementApi.projectGroupRoles(seederData?.producer_user?.email!); + const projectGroupRoles = userManagementApi.projectGroupRoles(seederData?.users?.poc.username!); //Assert await expect(projectGroupRoles).rejects.toMatchObject({ response: { status: 401 } });; }); }); describe("Functional", () => { - it("When fetching logged in user project group roles, Expect to return user project group roles of type ProjectGroupRoles", async () => { + it("As a POC, When fetching logged in user project group roles, Expect to return user project group roles of type ProjectGroupRoles", async () => { + //Arrange + let userManagementApi = new UserManagementApi(pocUserConfiguration); + let authToken = pocUserConfiguration.baseOptions.headers.Authorization.split(' ')[1]; + var decoded: any = authToken != null ? jwtDecode(authToken) : undefined; + + //Act + const response = await userManagementApi.projectGroupRoles(decoded.sub); + //Assert + expect(Array.isArray(response.data)).toBe(true); + expect(response.data![0]).toMatchObject({ + tdei_project_group_id: expect.any(String), + project_group_name: expect.any(String), + roles: expect.any(Array) + }); + }); + + it("As a Default user, When fetching logged in user project group roles, Expect to return user project group roles of type ProjectGroupRoles", async () => { //Arrange - let configuration = Utility.getConfiguration(); - const loginResponse = await Utility.login(seederData?.producer_user?.email!, "Tester01*"); - configuration.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; - let userManagementApi = new UserManagementApi(configuration); + let userManagementApi = new UserManagementApi(defaultUser); + let authToken = defaultUser.baseOptions.headers.Authorization.split(' ')[1]; + var decoded: any = authToken != null ? jwtDecode(authToken) : undefined; + //Act - const response = await userManagementApi.projectGroupRoles(seederData?.producer_user?.id!); + const response = await userManagementApi.projectGroupRoles(decoded.sub); //Assert expect(Array.isArray(response.data)).toBe(true); expect(response.data![0]).toMatchObject({ @@ -225,7 +307,37 @@ describe("User Management service", () => { describe("Revoke Permission", () => { describe("Auth", () => { - it("When no auth token provided, Expect to return HTTP status 401", async () => { + it("When no auth token provided, Expect to return forbidden request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); + //Act + const assignPermission = userManagementApi.revokePermission( + { + roles: [TDEIROLES.FLEX_DATA_GENERATOR], + tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, + user_name: seederData?.users?.poc.username + }) + + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As an API key user, When requested, Expect to return forbidden request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(apikeyUser); + //Act + const assignPermission = userManagementApi.revokePermission( + { + roles: [TDEIROLES.FLEX_DATA_GENERATOR], + tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, + user_name: seederData?.users?.poc.username + }) + + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As a Default user, When requested, Expect to return forbidden request", async () => { //Arrange let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); //Act @@ -233,17 +345,17 @@ describe("User Management service", () => { { roles: [TDEIROLES.FLEX_DATA_GENERATOR], tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: seederData?.producer_user?.email + user_name: seederData?.users?.poc.username }) //Assert - await expect(assignPermission).rejects.toMatchObject({ response: { status: 401 } });; + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; }); }); describe("Validation", () => { - it("When invalid username provided, Expect to return HTTP status 404", async () => { + it("As a POC, When invalid username provided, Expect to return HTTP status 404", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(pocUserConfiguration); //Act const assignPermission = userManagementApi.revokePermission( { @@ -256,15 +368,15 @@ describe("User Management service", () => { await expect(assignPermission).rejects.toMatchObject({ response: { status: 404 } });; }); - it("When managing own account permission, Expect to return HTTP status 400", async () => { + it("As a POC, When managing own account permission, Expect to return bad request", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(pocUserConfiguration); //Act const assignPermission = userManagementApi.revokePermission( { roles: [TDEIROLES.FLEX_DATA_GENERATOR], tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: configurationWithAuthHeader.username //logged in user account + user_name: pocUserConfiguration.username //logged in user account }) //Assert @@ -273,15 +385,15 @@ describe("User Management service", () => { }); describe("Functional", () => { - it("When assigning valid user permission, Expect to return true", async () => { + it("As a POC, When assigning valid user permission, Expect to return true", async () => { //Arrange - let userManagementApi = new UserManagementApi(configurationWithAuthHeader); + let userManagementApi = new UserManagementApi(pocUserConfiguration); //Act const response = await userManagementApi.revokePermission( { - roles: [TDEIROLES.FLEX_DATA_GENERATOR], + roles: [TDEIROLES.MEMBER], tdei_project_group_id: seederData?.projectGroup?.tdei_project_group_id, - user_name: seederData?.producer_user?.email + user_name: seederData?.users?.default_user.username }); //Assert @@ -290,7 +402,57 @@ describe("User Management service", () => { }); }); }); -}); + describe("Download users csv", () => { + + describe("Auth", () => { + it("When no auth token provided, Expect to return forbidden request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); + //Act + const assignPermission = userManagementApi.downloadUsers(); + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As an API key user, When requested, Expect to return forbidden request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(apikeyUser); + //Act + const assignPermission = userManagementApi.downloadUsers(); + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As a Default user, When requested, Expect to return forbidden request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(configurationWithoutAuthHeader); + //Act + const assignPermission = userManagementApi.downloadUsers(); + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + + it("As a POC, When requested, Expect to return forbidden request", async () => { + //Arrange + let userManagementApi = new UserManagementApi(pocUserConfiguration); + //Act + const assignPermission = userManagementApi.downloadUsers(); + //Assert + await expect(assignPermission).rejects.toMatchObject({ response: { status: 403 } });; + }); + }); + describe("Functional", () => { + it("As an Admin, When requested, Expect to stream user csv file", async () => { + //Arrange + let userManagementApi = new UserManagementApi(adminConfiguration); + //Act + const response = await userManagementApi.downloadUsers(); + //Assert + expect(response.status).toBe(200); + }); + }); + }); +}); diff --git a/src/data.seed.ts b/src/data.seed.ts index d9d5b1f..ff147f0 100644 --- a/src/data.seed.ts +++ b/src/data.seed.ts @@ -1,8 +1,9 @@ import { existsSync } from "fs"; import { readFile, writeFile } from "fs/promises"; -import { AuthApi, GTFSFlexServiceApi, GTFSPathwaysStationApi, ProjectGroup, ProjectGroupApi, RoleDetails, Service, ServiceUpdate, Station, StationUpdate, User, UserManagementApi } from "tdei-management-client"; +import { AuthApi, ServiceApi, ProjectGroup, ProjectGroupApi, RoleDetails, Service, ServiceUpdate, User, UserManagementApi, Configuration } from "tdei-management-client"; import { TdeiObjectFaker } from "./tdei-object-faker"; import { TDEIROLES, Utility } from "./utils"; +import { environment } from "./environment/environment"; export interface ServiceInterface { id: string, @@ -14,52 +15,64 @@ export interface StationInterface { name: string } +export interface Credentials { + username: string + password: string +} + +export interface Users { + poc: Credentials + flex_data_generator: Credentials + pathways_data_generator: Credentials + osw_data_generator: Credentials + api_key_tester: Credentials + default_user: Credentials +} + export class SeedDetails { projectGroup: ProjectGroup | undefined; - producer_user: User | undefined; - poc_user: User | undefined; - station: Station | undefined; - service: Service | undefined; - + services: Service[] | undefined; + users: Users | undefined; + api_key: string | undefined; constructor(init?: Partial) { Object.assign(this, init); } - get updateStationObject() { - return { - station_name: this.station?.station_name, - tdei_station_id: this.station?.tdei_station_id, - polygon: this.station?.polygon, + updateServiceObject(type: string): ServiceUpdate { + let tdei_service = this.services?.find(x => x.service_type == type); + return { + service_name: tdei_service?.service_name, + tdei_service_id: tdei_service?.tdei_service_id, + polygon: tdei_service?.polygon, } } - get updateServiceObject() { - return { - service_name: this.service?.service_name, - tdei_service_id: this.service?.tdei_service_id, - polygon: this.service?.polygon, - } + getService(type: string): Service { + let tdei_service = this.services?.find(x => x.service_type == type); + return tdei_service!; } } class SeedData { - private configurationWithAuthHeader = Utility.getConfiguration(); - private configurationWithoutAuthHeader = Utility.getConfiguration(); + private adminConfiguration = new Configuration({ + username: environment.seed.adminUser, + password: environment.seed.adminPassword, + basePath: environment.seed.baseUrl + }); + // private configurationWithoutAuthHeader = Utility.getAdminConfiguration(); + private readonly data_types: Array; + private readonly roles: Array; + private data: SeedDetails = new SeedDetails(); constructor() { + this.roles = ['poc'] + this.data_types = ['osw', 'flex', 'pathways'] } private async setAuthentication() { - let generalAPI = new AuthApi(this.configurationWithAuthHeader); - const loginResponse = await generalAPI.authenticate({ - username: this.configurationWithAuthHeader.username, - password: this.configurationWithAuthHeader.password - }); - this.configurationWithAuthHeader.baseOptions = { - headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } - }; + await Utility.setAuthToken(this.adminConfiguration); } /** @@ -76,20 +89,24 @@ class SeedData { if (data) { console.log("Serving from local seed data!"); this.data = JSON.parse(data); - return new SeedDetails(this.data); + this.data = new SeedDetails(this.data); + // return new SeedDetails(this.data); } } else { try { console.log("Generating seed data"); this.data.projectGroup = await this.createProjectGroup(); - this.data.service = await this.createService(this.data.projectGroup!.tdei_project_group_id!); - this.data.station = await this.createStation(this.data.projectGroup!.tdei_project_group_id!); - this.data.producer_user = await this.createUser(); - this.data.poc_user = await this.createUser(); - await this.assignProjectGroupRoleToUser(this.data.producer_user.email!, this.data.projectGroup!.tdei_project_group_id!, - [TDEIROLES.FLEX_DATA_GENERATOR, TDEIROLES.OSW_DATA_GENERATOR, TDEIROLES.PATHWAYS_DATA_GENERATOR]); - await this.assignProjectGroupRoleToUser(this.data.poc_user.email!, this.data.projectGroup!.tdei_project_group_id!, [TDEIROLES.POC]); - + this.data.services = await this.createService(this.data.projectGroup!.tdei_project_group_id!); + // this.data.producer_user = await this.createUser(); + // this.data.poc_user = await this.createUser(); + // await this.assignProjectGroupRoleToUser(Utility.getApiInput().user..email!, this.data.projectGroup!.tdei_project_group_id!, + // [TDEIROLES.FLEX_DATA_GENERATOR, TDEIROLES.OSW_DATA_GENERATOR, TDEIROLES.PATHWAYS_DATA_GENERATOR]); + // await this.assignProjectGroupRoleToUser(this.data.poc_user.email!, this.data.projectGroup!.tdei_project_group_id!, [TDEIROLES.POC]); + this.data.users = await this.assignUserRoles(this.data.projectGroup!.tdei_project_group_id!); + let userProfile = (await this.getUserProfile((this.data.users as Users).poc.username)); + this.data.api_key = userProfile.data.apiKey; + console.log("api_key", this.data.api_key); + console.log(userProfile); await this.writeFile(); return this.data; } catch (error) { @@ -103,55 +120,102 @@ class SeedData { await writeFile('./seed.data.json', JSON.stringify(this.data), 'utf8'); } + public async getUserProfile(user_name: string): Promise { + console.log('Getting user profile...'); + try { + let authAPI = new AuthApi(this.adminConfiguration); + // await this.client.login(); + const result = await authAPI.getUserProfile(user_name); + return result; + } catch (error) { + console.log(user_name) + console.error('getUserProfile', error); + throw error; + } + } + + private async assignUserRoles(project_group_id: string): Promise { + console.log('Assigning user roles...'); + let userManagementApi = new UserManagementApi(this.adminConfiguration); + + const users = Utility.getApiInput().users; + let usersDictionary = {} as Users; + try { + for await (const role of this.roles) { + + await userManagementApi.permission({ + roles: [role], + tdei_project_group_id: project_group_id, + user_name: users[role] + }) + + console.info(`Added ${role} permission to username: ${users[role]}`) + usersDictionary[role] = { + username: users[role], + password: 'Pa$s1word' + } + } + + //add default user + usersDictionary['default_user'] = { + username: users.default_user, + password: 'Pa$s1word' + } + return usersDictionary + } catch (error) { + console.error('assignUserRoles', error); + throw error; + } + } + private async createProjectGroup(): Promise { console.log("Creating Project Group"); - let projectGroupApi = new ProjectGroupApi(this.configurationWithAuthHeader); + let projectGroupApi = new ProjectGroupApi(this.adminConfiguration); const payload = TdeiObjectFaker.getProjectGroup(); const response = await projectGroupApi.createProjectGroup(payload); payload.tdei_project_group_id = response.data.data!; return payload; } - private async createUser(): Promise { - console.log("Creating user"); - let userManagementApi = new UserManagementApi(this.configurationWithoutAuthHeader); - const response = await userManagementApi.registerUser(TdeiObjectFaker.getUser()); - return response.data.data!; - } + // private async createUser(): Promise { + // console.log("Creating user"); + // let userManagementApi = new UserManagementApi(this.configurationWithoutAuthHeader); + // const response = await userManagementApi.registerUser(TdeiObjectFaker.getUser()); + // console.log("Creating user successful"); + // return response.data.data!; + // } - private async createStation(tdei_project_group_id: string): Promise { - console.log("Creating station"); - let stationApi = new GTFSPathwaysStationApi(this.configurationWithAuthHeader); - const payload = TdeiObjectFaker.getStation(tdei_project_group_id) - const response = await stationApi.createStation(payload); + private async createService(tdei_project_group_id: string): Promise { + console.log("Creating service"); + let list: Service[] = [] as any; + let userManagementApi = new ServiceApi(this.adminConfiguration); - payload.tdei_station_id = response.data.data!; - return payload; - } + for await (const data_type of this.data_types) { + const payload = TdeiObjectFaker.getService(tdei_project_group_id, data_type); - private async createService(tdei_project_group_id: string): Promise { - console.log("Creating service"); - let userManagementApi = new GTFSFlexServiceApi(this.configurationWithAuthHeader); - const payload = TdeiObjectFaker.getService(tdei_project_group_id) - const response = await userManagementApi.createService(payload); + const response = await userManagementApi.createService(payload); - payload.tdei_service_id = response.data.data!; - return payload; - } + payload.tdei_service_id = response.data.data!; + list.push(payload); - private async assignProjectGroupRoleToUser(username: string, tdei_project_group_id: string, roles: TDEIROLES[]): Promise { - console.log("Assigning user AUTH_HOST= role"); - let userManagementApi = new UserManagementApi(this.configurationWithAuthHeader); - let response = await userManagementApi.permission( - { - roles: roles, - tdei_project_group_id: tdei_project_group_id, - user_name: username - }) - return true; + } + return list; } + + // private async assignProjectGroupRoleToUser(username: string, tdei_project_group_id: string, roles: TDEIROLES[]): Promise { + // console.log("Assigning user AUTH_HOST= role"); + // let userManagementApi = new UserManagementApi(this.configurationWithAuthHeader); + // let response = await userManagementApi.permission( + // { + // roles: roles, + // tdei_project_group_id: tdei_project_group_id, + // user_name: username + // }) + // return true; + // } } const seed = new SeedData(); + export default seed; diff --git a/src/environment/environment.ts b/src/environment/environment.ts new file mode 100644 index 0000000..a819381 --- /dev/null +++ b/src/environment/environment.ts @@ -0,0 +1,17 @@ +import dotenv from 'dotenv'; +dotenv.config(); + +export const environment = { + appName: process.env.npm_package_name, + seed: { + baseUrl: process.env.SEED_BASE_URL, + adminUser: process.env.SEED_ADMIN_USER, + adminPassword: process.env.SEED_ADMIN_PASSWORD, + }, + system: { + baseUrl: process.env.SYSTEM_BASE_URL, + username: process.env.SYSTEM_USERNAME, + password: process.env.SYSTEM_PASSWORD + }, + environment: process.env.ENVIRONMENT ?? "dev", +} \ No newline at end of file diff --git a/src/tdei-object-faker.ts b/src/tdei-object-faker.ts index dd2e210..8679a19 100644 --- a/src/tdei-object-faker.ts +++ b/src/tdei-object-faker.ts @@ -1,19 +1,13 @@ import { faker } from "@faker-js/faker"; -import { GeoJSONFeatureTypeEnum, GeoJSONPolygonTypeEnum, ProjectGroup, Polygon, PolygonTypeEnum, Register, Service, Station, StationUpdate } from "tdei-management-client"; +import { GeoJSONFeatureTypeEnum, GeoJSONPolygonTypeEnum, ProjectGroup, Polygon, PolygonTypeEnum, Register, Service } from "tdei-management-client"; export class TdeiObjectFaker { - static getService(projectGroupId: string): Service { + static getService(projectGroupId: string, type: string): Service { return { service_name: faker.name.firstName() + "_Service", tdei_project_group_id: projectGroupId, - polygon: this.getPolygon() - }; - } - static getStation(projectGroupId: string | undefined): Station { - return { - station_name: faker.name.firstName() + "_Station", - tdei_project_group_id: projectGroupId, - polygon: this.getPolygon() + polygon: this.getPolygon(), + service_type: type }; } @@ -23,7 +17,7 @@ export class TdeiObjectFaker { password: "Tester01*", firstName: faker.name.firstName(), lastName: faker.name.lastName(), - phone: faker.phone.number() + phone: faker.phone.number("##########") }; } diff --git a/src/tdei_logo.png b/src/tdei_logo.png new file mode 100644 index 0000000..9369d69 Binary files /dev/null and b/src/tdei_logo.png differ diff --git a/src/test-harness.example.json b/src/test-harness.example.json deleted file mode 100644 index 425a8b1..0000000 --- a/src/test-harness.example.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "seed":{ - "baseUrl":"https://tdei-usermanagement-ts-stage.azurewebsites.net", - "adminUser":"<>", - "adminPassword":"" - }, - - "system":{ - "baseUrl":"https://tdei-gateway-stage.azurewebsites.net", - "username":"", - "password":"" - } -} \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index afd2f6c..ae1cc01 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,21 +1,70 @@ import { AuthApi, Configuration } from "tdei-management-client"; -import config from "./test-harness.json"; +import { environment } from "./environment/environment"; +import apiInput from "../api.input.json"; +import path from "path"; +import * as fs from "fs"; +import { SeedDetails } from "./data.seed"; /** * Utility class. */ export class Utility { - static getConfiguration(): Configuration { + static async setAuthToken(configuration: Configuration) { + let authAPI = new AuthApi(configuration); + const loginResponse = await authAPI.authenticate({ + username: configuration.username, + password: configuration.password + }); + configuration.baseOptions = { + headers: { ...Utility.addAuthZHeader(loginResponse.data.access_token) } + }; + } + + static get seedData() { + const seedData = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../seed.data.json'), 'utf-8')); + return new SeedDetails(seedData); + } + + static getApiInput() { + return apiInput[`${environment.environment}`]; + } + + static getAdminConfiguration(): Configuration { + return new Configuration({ + username: environment.seed.adminUser, + password: environment.seed.adminPassword, + basePath: environment.seed.baseUrl + }); + } + + static getApiKeyConfiguration() { + let configuration = new Configuration({ + basePath: environment.system.baseUrl, + apiKey: this.seedData.api_key + }); + return configuration; + } + + static getPocConfiguration(): Configuration { + return new Configuration({ + username: this.seedData?.users?.poc.username, + password: this.seedData?.users?.poc.password, + basePath: environment.system.baseUrl + }); + } + + static getDefaultUserConfiguration(): Configuration { return new Configuration({ - username: config.system.username, - password: config.system.password, - basePath: config.system.baseUrl + username: this.seedData?.users?.default_user.username, + password: this.seedData?.users?.default_user.password, + basePath: environment.system.baseUrl }); } public static async login(username: string, password: string) { - let configuration = Utility.getConfiguration(); - let generalAPI = new AuthApi(configuration); + let generalAPI = new AuthApi(new Configuration({ + basePath: environment.seed.baseUrl + })); return await generalAPI.authenticate({ username: username, password: password @@ -40,5 +89,6 @@ export enum TDEIROLES { POC = "poc", FLEX_DATA_GENERATOR = "flex_data_generator", PATHWAYS_DATA_GENERATOR = "pathways_data_generator", - OSW_DATA_GENERATOR = "osw_data_generator" + OSW_DATA_GENERATOR = "osw_data_generator", + MEMBER = "member" } \ No newline at end of file diff --git a/test-report-success.html b/test-report-success.html new file mode 100644 index 0000000..85b3e73 --- /dev/null +++ b/test-report-success.html @@ -0,0 +1,4 @@ +Report
\ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 60ecaf8..f1700eb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ - /* Projects */ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ @@ -9,13 +8,15 @@ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["es6","DOM"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "target": "es2017", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": [ + "es6", + "DOM" + ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ - "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ - "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ @@ -23,11 +24,10 @@ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - "rootDir": "src", /* Specify the root folder within your source files. */ - "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "module": "esnext", /* Specify what module code is generated. */ + "rootDir": "src", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": ".", /* Specify the base directory to resolve non-relative module names. */ // "paths": { // "@core/storage":["./src/core/storage"], @@ -38,21 +38,19 @@ // "types": [], /* Specify type package names to be included without being referenced in a source file. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - /* JavaScript Support */ - "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - /* Emit */ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ // "declarationMap": true, /* Create sourcemaps for d.ts files. */ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "build", /* Specify an output folder for all emitted files. */ + "outDir": "build", /* Specify an output folder for all emitted files. */ // "removeComments": true, /* Disable emitting comments. */ // "noEmit": true, /* Disable emitting files from a compilation. */ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ @@ -70,17 +68,15 @@ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - /* Interop Constraints */ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ @@ -98,14 +94,13 @@ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, "exclude": [ "*.config.ts", "build", "node_modules" ] -} +} \ No newline at end of file