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