From d5b847061b4a960730b8f4b7ff4a84c810b3788f Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:27:14 +0200 Subject: [PATCH 01/11] Merge Reality Data Client in Reality Capture --- .../publish_reality-data-client-dev.yml | 44 - .../workflows/publish_reality-data-client.yml | 44 - .../reality-data-client-build-and-test.yml | 130 - .github/workflows/typescript-ci.yaml | 23 - .gitignore | 1 + CONTRIBUTING.md | 1 - README.md | 3 +- template.env | 5 - typescript/examples/package.json | 1 - typescript/examples/pnpm-lock.yaml | 191 +- typescript/examples/src/example_modeling.ts | 29 +- .../src/example_upload_reality_data.ts | 32 +- .../packages/reality-capture/CHANGELOG.json | 155 + .../packages/reality-capture/CHANGELOG.md | 74 + typescript/packages/reality-capture/README.md | 1 + .../packages/reality-capture/package.json | 17 +- .../packages/reality-capture/pnpm-lock.yaml | 106 +- .../reality-capture/src/index.node.ts | 3 +- .../packages/reality-capture/src/index.web.ts | 1 + .../reality-capture/src/service/bucket.ts | 11 +- .../src/service/data_handler.ts | 48 +- .../reality-capture/src/service/job.ts | 2 +- .../src/service/reality_data.ts | 212 + .../reality-capture/src/service/service.ts | 123 + .../src/tests/service/bucket.test.ts | 3 +- .../src/tests/service/job.test.ts | 2 - .../src/tests/service/reality_data.test.ts | 692 ++ .../src/tests/service/service.test.ts | 342 + .../packages/reality-data-client/.gitignore | 6 - .../reality-data-client/CHANGELOG.json | 155 - .../packages/reality-data-client/CHANGELOG.md | 97 - .../packages/reality-data-client/LICENSE.md | 9 - .../packages/reality-data-client/README.md | 140 - .../beachball.config.dev.js | 14 - .../reality-data-client/beachball.config.js | 20 - .../packages/reality-data-client/certa.json | 24 - .../reality-data-client/eslint.config.js | 18 - .../packages/reality-data-client/package.json | 78 - .../reality-data-client/pnpm-lock.yaml | 6138 ----------------- .../reality-data-client/pnpm-workspace.yaml | 6 - .../reality-data-client/src/Projects.ts | 24 - .../reality-data-client/src/RealityData.ts | 242 - .../src/RealityDataClient.ts | 805 --- .../reality-data-client/src/RequestOptions.ts | 30 - .../reality-data-client/src/helper/Angle.ts | 36 - .../src/reality-data-client.ts | 16 - .../src/test/TestConfig.ts | 18 - .../integration/RealityDataClient.test.ts | 1415 ---- .../src/test/utils/webpack.config.js | 105 - .../reality-data-client/tsconfig.json | 10 - .../reality-data-client/tsconfig.tsbuildinfo | 1 - 51 files changed, 1795 insertions(+), 9908 deletions(-) delete mode 100644 .github/workflows/publish_reality-data-client-dev.yml delete mode 100644 .github/workflows/publish_reality-data-client.yml delete mode 100644 .github/workflows/reality-data-client-build-and-test.yml create mode 100644 typescript/packages/reality-capture/CHANGELOG.json create mode 100644 typescript/packages/reality-capture/CHANGELOG.md create mode 100644 typescript/packages/reality-capture/src/service/reality_data.ts create mode 100644 typescript/packages/reality-capture/src/tests/service/reality_data.test.ts delete mode 100644 typescript/packages/reality-data-client/.gitignore delete mode 100644 typescript/packages/reality-data-client/CHANGELOG.json delete mode 100644 typescript/packages/reality-data-client/CHANGELOG.md delete mode 100644 typescript/packages/reality-data-client/LICENSE.md delete mode 100644 typescript/packages/reality-data-client/README.md delete mode 100644 typescript/packages/reality-data-client/beachball.config.dev.js delete mode 100644 typescript/packages/reality-data-client/beachball.config.js delete mode 100644 typescript/packages/reality-data-client/certa.json delete mode 100644 typescript/packages/reality-data-client/eslint.config.js delete mode 100644 typescript/packages/reality-data-client/package.json delete mode 100644 typescript/packages/reality-data-client/pnpm-lock.yaml delete mode 100644 typescript/packages/reality-data-client/pnpm-workspace.yaml delete mode 100644 typescript/packages/reality-data-client/src/Projects.ts delete mode 100644 typescript/packages/reality-data-client/src/RealityData.ts delete mode 100644 typescript/packages/reality-data-client/src/RealityDataClient.ts delete mode 100644 typescript/packages/reality-data-client/src/RequestOptions.ts delete mode 100644 typescript/packages/reality-data-client/src/helper/Angle.ts delete mode 100644 typescript/packages/reality-data-client/src/reality-data-client.ts delete mode 100644 typescript/packages/reality-data-client/src/test/TestConfig.ts delete mode 100644 typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts delete mode 100644 typescript/packages/reality-data-client/src/test/utils/webpack.config.js delete mode 100644 typescript/packages/reality-data-client/tsconfig.json delete mode 100644 typescript/packages/reality-data-client/tsconfig.tsbuildinfo diff --git a/.github/workflows/publish_reality-data-client-dev.yml b/.github/workflows/publish_reality-data-client-dev.yml deleted file mode 100644 index 4ae2d8bf..00000000 --- a/.github/workflows/publish_reality-data-client-dev.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: (DevReleaseV1) Publish reality-data-client dev - -on: workflow_dispatch - -jobs: - publish: - runs-on: ${{ matrix.operating-system }} - strategy: - matrix: - operating-system: [windows-latest] - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - token: ${{ secrets.IMJS_ADMIN_GH_TOKEN }} - lfs: true - - - name: Use Node.js 22 - uses: actions/setup-node@v6 - with: - node-version: 22.14.0 - registry-url: https://registry.npmjs.org/ - - - name: Install pnpm - uses: pnpm/action-setup@v6 - with: - version: 9 - - - name: Install dependencies - working-directory: ./typescript/packages/reality-data-client - run: pnpm install --frozen-lockfile=true - - - name: Build - working-directory: ./typescript/packages/reality-data-client - run: pnpm build - - - name: Publish packages - working-directory: ./typescript/packages/reality-data-client - run: | - git config --local user.email imodeljs-admin@users.noreply.github.com - git config --local user.name imodeljs-admin - pnpm publish-packages-dev -y --branch origin/${{ github.ref_name }} --message "Version bump [skip actions]" - env: - NODE_AUTH_TOKEN: ${{ secrets.NPMJS_PUBLISH_ITWIN }} diff --git a/.github/workflows/publish_reality-data-client.yml b/.github/workflows/publish_reality-data-client.yml deleted file mode 100644 index 9b37e522..00000000 --- a/.github/workflows/publish_reality-data-client.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: (ReleaseV1) Publish reality-data-client - -on: workflow_dispatch - -jobs: - publish: - runs-on: ${{ matrix.operating-system }} - strategy: - matrix: - operating-system: [windows-latest] - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - token: ${{ secrets.IMJS_ADMIN_GH_TOKEN }} - lfs: true - - - name: Use Node.js 22 - uses: actions/setup-node@v6 - with: - node-version: 22.14.0 - registry-url: https://registry.npmjs.org/ - - - name: Install pnpm - uses: pnpm/action-setup@v6 - with: - version: 9 - - - name: Install dependencies - working-directory: ./typescript/packages/reality-data-client - run: pnpm install --frozen-lockfile=true - - - name: Build - working-directory: ./typescript/packages/reality-data-client - run: pnpm build - - - name: Publish packages - working-directory: ./typescript/packages/reality-data-client - run: | - git config --local user.email imodeljs-admin@users.noreply.github.com - git config --local user.name imodeljs-admin - pnpm publish-packages --new -y --branch origin/${{ github.ref_name }} --message "Version bump [skip actions]" - env: - NODE_AUTH_TOKEN: ${{ secrets.NPMJS_PUBLISH_ITWIN }} diff --git a/.github/workflows/reality-data-client-build-and-test.yml b/.github/workflows/reality-data-client-build-and-test.yml deleted file mode 100644 index 5ba2185b..00000000 --- a/.github/workflows/reality-data-client-build-and-test.yml +++ /dev/null @@ -1,130 +0,0 @@ -name: (RDCBuildTest) Build and test reality-data-client - -on: - workflow_call: - inputs: - node-version: - required: true - type: string - os: - required: true - type: string - secrets: - INTEGRATION_TESTS_PROJECT_ID: - required: true - INTEGRATION_TESTS_CLIENT_ID: - required: true - INTEGRATION_TESTS_SECRET: - required: true - IMJS_OIDC_BROWSER_TEST_CLIENT_ID: - required: true - IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: - required: true - IMJS_OIDC_BROWSER_TEST_SCOPES: - required: true - IMJS_TEST_REGULAR_USER_NAME: - required: true - IMJS_TEST_REGULAR_USER_PASSWORD: - required: true - IMJS_TEST_MANAGER_USER_NAME: - required: true - IMJS_TEST_MANAGER_USER_PASSWORD: - required: true - -jobs: - build_and_test_sdk: - runs-on: ${{ inputs.os }} - - steps: - - name: Checkout github repo (+ download lfs dependencies) - uses: actions/checkout@v5 - with: - lfs: true - - - name: Checkout LFS objects - run: git lfs checkout - - - name: Install pnpm - uses: pnpm/action-setup@v6 - with: - version: 9 - - - name: Setup Node.js ${{ inputs.node-version }} - uses: actions/setup-node@v6 - with: - node-version: ${{ inputs.node-version }} - - - name: Install dependencies - working-directory: ./typescript/packages/reality-data-client - env: - PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers-${{ inputs.node-version }} - run: pnpm install --frozen-lockfile=true --ignore-scripts - - - name: Build - working-directory: ./typescript/packages/reality-data-client - run: pnpm build - - - name: EsLint - working-directory: ./typescript/packages/reality-data-client - run: pnpm lint - - # Playwright's browser INSTALL (download + extract) is unreliable on very new Node versions: - # the extractor can hang at the end of the download (a known issue affecting Node >= 24). - # The browser binaries themselves are Node-agnostic, so we install them under Node 22 - # (known-good) and then restore the matrix Node for the actual test run below. - - name: Setup Node.js 22 (for Playwright browser install only) - uses: actions/setup-node@v6 - with: - node-version: 22.x - - # @itwin/oidc-signin-tool (via @playwright/test) and @itwin/certa (via playwright) both now - # resolve to Playwright 1.56.1 -> chromium build 1194 (incl. chromium_headless_shell). We - # resolve each tool's REAL playwright CLI via Node module resolution (starting from the - # package that uses it) and run that exact binary, so this stays correct regardless of pnpm's - # layout. `npx playwright` is avoided because it runs whichever `playwright` bin happens to be - # linked, not necessarily the one a given consumer depends on. - - name: Install Chromium for Playwright - working-directory: ./typescript/packages/reality-data-client - shell: bash - env: - PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers-${{ inputs.node-version }} - run: | - set -e - install_chromium() { - node -e ' - const path = require("path"); - const { execFileSync } = require("child_process"); - const consumer = process.argv[1]; - const pkg = process.argv[2]; - const pj = require.resolve(pkg + "/package.json", { paths: [require.resolve(consumer + "/package.json")] }); - const cli = path.join(path.dirname(pj), require(pj).bin.playwright); - console.log("Installing chromium via " + pkg + " (" + require(pj).version + ") resolved from " + consumer); - execFileSync(process.execPath, [cli, "install", "chromium"], { stdio: "inherit" }); - ' "$1" "$2" - } - install_chromium @itwin/oidc-signin-tool @playwright/test - install_chromium @itwin/certa playwright - - - name: Restore Node.js ${{ inputs.node-version }} - uses: actions/setup-node@v6 - with: - node-version: ${{ inputs.node-version }} - - - name: Run SDK Integration Tests - working-directory: ./typescript/packages/reality-data-client - env: - PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers-${{ inputs.node-version }} - # Needed on Windows: oidc-signin-tool only adds --no-sandbox on Linux; --disable-gpu prevents Chromium from hanging on Windows Server runners. - # Note: the env var name has a typo in the tool source ("ODIC" instead of "OIDC") — use it as-is. - ODIC_SIGNIN_TOOL_EXTRA_LAUNCH_OPTS: ${{ runner.os == 'Windows' && '{"args":["--disable-gpu"]}' || '' }} - IMJS_INTEGRATION_TESTS_PROJECT_ID: ${{ secrets.INTEGRATION_TESTS_PROJECT_ID }} - IMJS_INTEGRATION_TESTS_CLIENT_ID: ${{ secrets.INTEGRATION_TESTS_CLIENT_ID }} - IMJS_INTEGRATION_TESTS_SECRET: ${{ secrets.INTEGRATION_TESTS_SECRET }} - IMJS_OIDC_BROWSER_TEST_CLIENT_ID: ${{ secrets.IMJS_OIDC_BROWSER_TEST_CLIENT_ID }} - IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: ${{ vars.IMJS_OIDC_BROWSER_TEST_REDIRECT_URI }} - IMJS_OIDC_BROWSER_TEST_SCOPES: ${{ vars.IMJS_OIDC_BROWSER_TEST_SCOPES }} - IMJS_TEST_REGULAR_USER_NAME: ${{ vars.IMJS_TEST_REGULAR_USER_NAME }} - IMJS_TEST_REGULAR_USER_PASSWORD: ${{ secrets.IMJS_TEST_REGULAR_USER_PASSWORD }} - IMJS_TEST_MANAGER_USER_NAME: ${{ vars.IMJS_TEST_MANAGER_USER_NAME }} - IMJS_TEST_MANAGER_USER_PASSWORD: ${{ secrets.IMJS_TEST_MANAGER_USER_PASSWORD }} - run: pnpm test:integration diff --git a/.github/workflows/typescript-ci.yaml b/.github/workflows/typescript-ci.yaml index 8d3fddc3..967a1807 100644 --- a/.github/workflows/typescript-ci.yaml +++ b/.github/workflows/typescript-ci.yaml @@ -23,26 +23,3 @@ jobs: with: node-version: ${{ matrix.node-version }} os: ${{ matrix.os }} - - build_and_test_reality_data_client: - strategy: - matrix: - node-version: [22.x, 24.x, 26.x] - os: [windows-latest, ubuntu-latest, macos-latest] - fail-fast: false - - uses: ./.github/workflows/reality-data-client-build-and-test.yml - with: - node-version: ${{ matrix.node-version }} - os: ${{ matrix.os }} - secrets: - INTEGRATION_TESTS_PROJECT_ID: ${{ secrets.INTEGRATION_TESTS_PROJECT_ID }} - INTEGRATION_TESTS_CLIENT_ID: ${{ secrets.INTEGRATION_TESTS_CLIENT_ID }} - INTEGRATION_TESTS_SECRET: ${{ secrets.INTEGRATION_TESTS_SECRET }} - IMJS_OIDC_BROWSER_TEST_CLIENT_ID: ${{ secrets.IMJS_OIDC_BROWSER_TEST_CLIENT_ID }} - IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: ${{ secrets.IMJS_OIDC_BROWSER_TEST_REDIRECT_URI }} - IMJS_OIDC_BROWSER_TEST_SCOPES: ${{ secrets.IMJS_OIDC_BROWSER_TEST_SCOPES }} - IMJS_TEST_REGULAR_USER_NAME: ${{ secrets.IMJS_TEST_REGULAR_USER_NAME }} - IMJS_TEST_REGULAR_USER_PASSWORD: ${{ secrets.IMJS_TEST_REGULAR_USER_PASSWORD }} - IMJS_TEST_MANAGER_USER_NAME: ${{ secrets.IMJS_TEST_MANAGER_USER_NAME }} - IMJS_TEST_MANAGER_USER_PASSWORD: ${{ secrets.IMJS_TEST_MANAGER_USER_PASSWORD }} diff --git a/.gitignore b/.gitignore index d620c148..c07dc253 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ coverage/ .idea/ *.configStore/ dist/ +*.tsbuildinfo diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3759dad0..38fba7e0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,6 +71,5 @@ Example commands below to install, clean, build and test : - `pnpm clean` - `pnpm build` - `pnpm lint` -- `pnpm integration-tests` - `beachball change` to generate a changelog entry. - We use [beachball](https://github.com/microsoft/beachball) to manage versioning and changelogs. diff --git a/README.md b/README.md index 9341c161..1c9333de 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,8 @@ Copyright © Bentley Systems, Incorporated. All rights reserved. See ## About this Repository -This repository contains Reality Capture SDKs for Reality Modeling, Reality Analysis, Reality Conversion and Reality Management services. It provides classes, functions and examples to create reality data, upload local data to Reality Management, run Analysis/Conversion/Modeling jobs and download results. +This repository contains Reality Capture SDK for Reality Modeling, Reality Analysis, Reality Conversion and Reality Management services. It provides classes, functions and examples to create reality data, upload local data to Reality Management, run Analysis/Conversion/Modeling jobs and download results. -- [Reality Management](./typescript/packages/reality-data-client/README.md) - [Reality Capture](./typescript/packages/reality-capture/README.md) All the packages are also available in python diff --git a/template.env b/template.env index 85598676..fd3a4df9 100644 --- a/template.env +++ b/template.env @@ -5,8 +5,3 @@ IMJS_UNIT_TESTS_PROJECT_ID= IMJS_UNIT_TESTS_CLIENT_ID= IMJS_UNIT_TESTS_SECRET= - -# For integration tests -IMJS_INTEGRATION_TESTS_PROJECT_ID= -IMJS_INTEGRATION_TESTS_CLIENT_ID= -IMJS_INTEGRATION_TESTS_SECRET= \ No newline at end of file diff --git a/typescript/examples/package.json b/typescript/examples/package.json index 70273c1a..5d6597d8 100644 --- a/typescript/examples/package.json +++ b/typescript/examples/package.json @@ -17,7 +17,6 @@ "license": "MIT", "dependencies": { "@itwin/reality-capture": "file:../packages/reality-capture", - "@itwin/reality-data-client": "file:../packages/reality-data-client", "@itwin/service-authorization": "^2.0.0", "dotenv": "^16.0.3" }, diff --git a/typescript/examples/pnpm-lock.yaml b/typescript/examples/pnpm-lock.yaml index eb3510d1..bedd4a4d 100644 --- a/typescript/examples/pnpm-lock.yaml +++ b/typescript/examples/pnpm-lock.yaml @@ -10,20 +10,17 @@ importers: dependencies: '@itwin/reality-capture': specifier: file:../packages/reality-capture - version: file:../packages/reality-capture(@itwin/core-bentley@5.10.1) - '@itwin/reality-data-client': - specifier: file:../packages/reality-data-client - version: file:../packages/reality-data-client(@itwin/core-bentley@5.10.1) + version: file:../packages/reality-capture(@itwin/core-bentley@5.10.3) '@itwin/service-authorization': specifier: ^2.0.0 - version: 2.1.1(@itwin/core-bentley@5.10.1) + version: 2.1.2(@itwin/core-bentley@5.10.3) dotenv: specifier: ^16.0.3 version: 16.6.1 devDependencies: '@types/node': specifier: ^20.8.0 - version: 20.19.42 + version: 20.19.43 eslint: specifier: ^8.52.0 version: 8.57.1 @@ -83,12 +80,12 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/storage-blob@12.32.0': - resolution: {integrity: sha512-80LzSNnFQye2LCCBFghAJS6jJQJ7N4bfgZ6qDMgVGRtugZ7TLDKQZ2hczMigmZH3jAcMRdma/IygsC5+0gT7Tw==} - engines: {node: '>=20.0.0'} + '@azure/storage-blob@12.33.0': + resolution: {integrity: sha512-2SX8oP8PyblUcAFZSg39c8Ls+tFjavM6sBeV+qpw33mRzRhI/5hrFJmJ/x0H9xx5l6ECPvgSP8uPxqTeVbHNIA==} + engines: {node: '>=22.0.0'} - '@azure/storage-common@12.4.0': - resolution: {integrity: sha512-kNhJKMxQb374KOVt63CZnGIpDcrKNzJeyANLJymxE9mCJSdRGzb+Iv9oSIiCj6tNMLypr530b9ObOiA/5OvwOg==} + '@azure/storage-common@12.4.1': + resolution: {integrity: sha512-t14unw/WofGDUi7TKJrsyXyPsN+NLgRm7hMaq0llxNmTIzt7f257+6LE6FKIJPh88zLj6M7LPvzve0fEYg/L3A==} engines: {node: '>=20.0.0'} '@eslint-community/eslint-utils@4.9.1': @@ -122,31 +119,21 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@itwin/core-bentley@5.10.1': - resolution: {integrity: sha512-wJj+Zzcd3DamN1jVRNtM91PnI0lXbC8IrgpcNlUH9suwUp+91epHPTgJOYq6/VSanNfQRE4Nq7j5h9cfH+X7hg==} + '@itwin/core-bentley@5.10.3': + resolution: {integrity: sha512-kaPmDsI+VtqrCPujQ5FULpQFDqHBtQz5nFN01tAjTSAEsIGrE1OFnDjN+TMXRFfhO7huSy+hikhz8HZNsKKdog==} '@itwin/reality-capture@file:../packages/reality-capture': resolution: {directory: ../packages/reality-capture, type: directory} peerDependencies: '@itwin/core-bentley': ^5.0.0 - '@itwin/reality-data-client@1.4.0': - resolution: {integrity: sha512-0XUBiOz02TcXIdmSPfqKJCAiitdIYzlJxd1ZksvJLfxNBj7Dt9eM5l7RKR3kOv+m81tNIo+KFIKykZO8T/IAOw==} - peerDependencies: - '@itwin/core-bentley': ^4.0.0 || ^5.0.0 - - '@itwin/reality-data-client@file:../packages/reality-data-client': - resolution: {directory: ../packages/reality-data-client, type: directory} - peerDependencies: - '@itwin/core-bentley': ^4.0.0 || ^5.0.0 - - '@itwin/service-authorization@2.1.1': - resolution: {integrity: sha512-IqW/ALUccCHhQDM7HqRTNCHsoerioZsSPKf3AI054N2coEf59vYg5MqiSfaKGRMwkDM7C952kDC+M5BL4kA8qQ==} + '@itwin/service-authorization@2.1.2': + resolution: {integrity: sha512-ztwuLN3fBbzO2dXv1aOwUd6ghMLmnUuurZI9LZQ3EtSRqv0wt/muje6S+knF1Q93NirsrhikKorjjE8GqQg+wQ==} peerDependencies: '@itwin/core-bentley': ^5.0.0 - '@nodable/entities@2.1.1': - resolution: {integrity: sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==} + '@nodable/entities@2.2.0': + resolution: {integrity: sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -177,8 +164,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.42': - resolution: {integrity: sha512-5L7SUaFC1RyDraj2yRhyBzHTobyXHmohD100CChNtyPyleoq37Mqab5Gn8XEKI04dfN/oqPdpHk38MgcQWHbZg==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} '@types/validator@13.15.10': resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==} @@ -187,16 +174,16 @@ packages: resolution: {integrity: sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==} engines: {node: '>=20.0.0'} - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@ungap/structured-clone@1.3.2': + resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -219,14 +206,17 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.17.0: - resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -390,8 +380,8 @@ packages: fast-xml-builder@1.2.0: resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} - fast-xml-parser@5.8.0: - resolution: {integrity: sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==} + fast-xml-parser@5.9.3: + resolution: {integrity: sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g==} hasBin: true fastq@1.20.1: @@ -425,8 +415,8 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} fs.realpath@1.0.0: @@ -541,14 +531,17 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-unsafe@1.0.1: + resolution: {integrity: sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - js-yaml@4.2.0: - resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true json-buffer@3.0.1: @@ -581,8 +574,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.13.6: - resolution: {integrity: sha512-NdB6O6QvlGMCoG003m0YIKG2+Xw7DjmCZhmc1RH+K6HncADUbRf8TZeLegxBBN1VFyPHcNpPTKpIhYLXzJVy1Q==} + libphonenumber-js@1.13.7: + resolution: {integrity: sha512-rvr3HIMdOgzhz1RFGjftji+wjoAFlzhqCNqJOU/MKTZQ8d9NZxAR/tI+0weDicyoucqVR0U1GCniqHJ0f8aM2A==} limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} @@ -704,8 +697,8 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-expression-matcher@1.5.0: - resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} + path-expression-matcher@1.6.1: + resolution: {integrity: sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ==} engines: {node: '>=14.0.0'} path-is-absolute@1.0.1: @@ -770,8 +763,8 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - semver@7.8.3: - resolution: {integrity: sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -791,8 +784,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@2.3.0: - resolution: {integrity: sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q==} + strnum@2.4.1: + resolution: {integrity: sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -924,7 +917,7 @@ snapshots: '@azure/core-xml@1.5.1': dependencies: - fast-xml-parser: 5.8.0 + fast-xml-parser: 5.9.3 tslib: 2.8.1 '@azure/logger@1.3.0': @@ -934,7 +927,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/storage-blob@12.32.0': + '@azure/storage-blob@12.33.0': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 @@ -947,13 +940,13 @@ snapshots: '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.1 '@azure/logger': 1.3.0 - '@azure/storage-common': 12.4.0(@azure/core-client@1.10.2) + '@azure/storage-common': 12.4.1(@azure/core-client@1.10.2) events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/storage-common@12.4.0(@azure/core-client@1.10.2)': + '@azure/storage-common@12.4.1(@azure/core-client@1.10.2)': dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 @@ -983,7 +976,7 @@ snapshots: globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.2.0 + js-yaml: 4.3.0 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -1003,46 +996,29 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@itwin/core-bentley@5.10.1': {} + '@itwin/core-bentley@5.10.3': {} - '@itwin/reality-capture@file:../packages/reality-capture(@itwin/core-bentley@5.10.1)': + '@itwin/reality-capture@file:../packages/reality-capture(@itwin/core-bentley@5.10.3)': dependencies: - '@azure/storage-blob': 12.32.0 - '@itwin/core-bentley': 5.10.1 - '@itwin/reality-data-client': 1.4.0(@itwin/core-bentley@5.10.1) - axios: 1.17.0 + '@azure/storage-blob': 12.33.0 + '@itwin/core-bentley': 5.10.3 + axios: 1.18.1 class-validator: 0.14.4 zod: 3.25.76 transitivePeerDependencies: - debug - supports-color - '@itwin/reality-data-client@1.4.0(@itwin/core-bentley@5.10.1)': - dependencies: - '@itwin/core-bentley': 5.10.1 - axios: 1.17.0 - transitivePeerDependencies: - - debug - - supports-color - - '@itwin/reality-data-client@file:../packages/reality-data-client(@itwin/core-bentley@5.10.1)': - dependencies: - '@itwin/core-bentley': 5.10.1 - axios: 1.17.0 - transitivePeerDependencies: - - debug - - supports-color - - '@itwin/service-authorization@2.1.1(@itwin/core-bentley@5.10.1)': + '@itwin/service-authorization@2.1.2(@itwin/core-bentley@5.10.3)': dependencies: - '@itwin/core-bentley': 5.10.1 + '@itwin/core-bentley': 5.10.3 got: 12.6.1 jsonwebtoken: 9.0.3 jwks-rsa: 3.2.2 transitivePeerDependencies: - supports-color - '@nodable/entities@2.1.1': {} + '@nodable/entities@2.2.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -1067,11 +1043,11 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 20.19.42 + '@types/node': 20.19.43 '@types/ms@2.1.0': {} - '@types/node@20.19.42': + '@types/node@20.19.43': dependencies: undici-types: 6.21.0 @@ -1085,13 +1061,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@ungap/structured-clone@1.3.1': {} + '@ungap/structured-clone@1.3.2': {} - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} agent-base@6.0.2: dependencies: @@ -1114,14 +1090,16 @@ snapshots: dependencies: color-convert: 2.0.1 + anynum@1.0.1: {} + argparse@2.0.1: {} asynckit@0.4.0: {} - axios@1.17.0: + axios@1.18.1: dependencies: follow-redirects: 1.16.0 - form-data: 4.0.5 + form-data: 4.0.6 https-proxy-agent: 5.0.1 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -1168,7 +1146,7 @@ snapshots: class-validator@0.14.4: dependencies: '@types/validator': 13.15.10 - libphonenumber-js: 1.13.6 + libphonenumber-js: 1.13.7 validator: 13.15.35 color-convert@2.0.1: @@ -1252,7 +1230,7 @@ snapshots: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.1 + '@ungap/structured-clone': 1.3.2 ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -1274,7 +1252,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.2.0 + js-yaml: 4.3.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -1288,8 +1266,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 3.4.3 esquery@1.7.0: @@ -1314,15 +1292,16 @@ snapshots: fast-xml-builder@1.2.0: dependencies: - path-expression-matcher: 1.5.0 + path-expression-matcher: 1.6.1 xml-naming: 0.1.0 - fast-xml-parser@5.8.0: + fast-xml-parser@5.9.3: dependencies: - '@nodable/entities': 2.1.1 + '@nodable/entities': 2.2.0 fast-xml-builder: 1.2.0 - path-expression-matcher: 1.5.0 - strnum: 2.3.0 + is-unsafe: 1.0.1 + path-expression-matcher: 1.6.1 + strnum: 2.4.1 xml-naming: 0.1.0 fastq@1.20.1: @@ -1350,7 +1329,7 @@ snapshots: form-data-encoder@2.1.4: {} - form-data@4.0.5: + form-data@4.0.6: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -1488,11 +1467,13 @@ snapshots: is-path-inside@3.0.3: {} + is-unsafe@1.0.1: {} + isexe@2.0.0: {} jose@4.15.9: {} - js-yaml@4.2.0: + js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -1513,7 +1494,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.8.3 + semver: 7.8.5 jwa@2.0.1: dependencies: @@ -1545,7 +1526,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.13.6: {} + libphonenumber-js@1.13.7: {} limiter@1.1.5: {} @@ -1643,7 +1624,7 @@ snapshots: path-exists@4.0.0: {} - path-expression-matcher@1.5.0: {} + path-expression-matcher@1.6.1: {} path-is-absolute@1.0.1: {} @@ -1688,7 +1669,7 @@ snapshots: safe-buffer@5.2.1: {} - semver@7.8.3: {} + semver@7.8.5: {} shebang-command@2.0.0: dependencies: @@ -1702,7 +1683,9 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@2.3.0: {} + strnum@2.4.1: + dependencies: + anynum: 1.0.1 supports-color@7.2.0: dependencies: diff --git a/typescript/examples/src/example_modeling.ts b/typescript/examples/src/example_modeling.ts index e3c99fcd..4b404d51 100644 --- a/typescript/examples/src/example_modeling.ts +++ b/typescript/examples/src/example_modeling.ts @@ -13,10 +13,13 @@ import { ReconstructionOutputs, ExportCreate, Format, OptionsLAS, SamplingStrategy, TilingOptions, GeometricPrecision, JobCreate, JobType, JobState, Progress, getAppropriateService, RealityDataHandler, Options3DTiles, BucketDataHandler, AdjustmentConstraints, - LODScope + LODScope, + RealityDataCreate, + Type, + RealityData } from "@itwin/reality-capture"; -import { RealityDataClientOptions, RealityDataAccessClient, ITwinRealityData } from "@itwin/reality-data-client"; import path from "path"; +import * as fs from "fs"; export async function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -41,7 +44,7 @@ async function monitorJob(realityCaptureService: RealityCaptureService, jobId: s } } -async function runFillImageProperties(realityCaptureService: RealityCaptureService, imagesRealityData: ITwinRealityData, fipJobName: string, iTwinId: string): Promise { +async function runFillImageProperties(realityCaptureService: RealityCaptureService, imagesRealityData: RealityData, fipJobName: string, iTwinId: string): Promise { // Submit FillImageProperties job to get a context scene from the images let fipInputs: FillImagePropertiesInputs = { imageCollections: [imagesRealityData.id] }; let fipOutputs = [FillImagePropertiesOutputsCreate.SCENE]; @@ -179,19 +182,17 @@ async function runModelingExample() { const bucketDataHandler = new BucketDataHandler(authorizationClient); console.log("Bucket Data handler initialized"); - const realityDataClientOptions: RealityDataClientOptions = { - authorizationClient: authorizationClient, - baseUrl: "https://api.bentley.com/reality-management/reality-data", - }; - const realityDataClient = new RealityDataAccessClient(realityDataClientOptions); - console.log("Reality Data Client initialized"); - try { + if (!fs.existsSync(imagesPath)) { + throw new Error(imagesPath + " does not exist"); + } console.log("Upload images in ", iTwinId); - const realityData = new ITwinRealityData(realityDataClient, undefined, iTwinId); - realityData.displayName = imagesRealityDataName; - realityData.type = "CCImageCollection"; - const createdRealityData = await realityDataClient.createRealityData("", iTwinId, realityData); + const realityDataCreate: RealityDataCreate = { iTwinId: iTwinId, displayName: imagesRealityDataName, type: Type.CC_IMAGE_COLLECTION }; + const response = await realityCaptureService.createRealityData(realityDataCreate); + if(response.isError()) { + throw new Error("Failed to create reality data : " + response.error!.error.message); + } + const createdRealityData = response.value!; const uploadResponse = await realityDataHandler.uploadData(createdRealityData.id, imagesPath, "", iTwinId); if (uploadResponse.isError()) { throw new Error("Failed to upload reality data : " + uploadResponse.error!.error.message); diff --git a/typescript/examples/src/example_upload_reality_data.ts b/typescript/examples/src/example_upload_reality_data.ts index 571db76b..d4218069 100644 --- a/typescript/examples/src/example_upload_reality_data.ts +++ b/typescript/examples/src/example_upload_reality_data.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as dotenv from "dotenv"; +import * as fs from "fs"; import { ServiceAuthorizationClient } from "@itwin/service-authorization"; -import { RealityDataHandler } from "@itwin/reality-capture"; -import { RealityDataClientOptions, RealityDataAccessClient, ITwinRealityData } from "@itwin/reality-data-client"; +import { RealityCaptureService, RealityDataCreate, RealityDataHandler, Type } from "@itwin/reality-capture"; export async function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -39,31 +39,31 @@ async function runUploadExample() { const realityDataHandler = new RealityDataHandler(authorizationClient); console.log("Reality Data handler initialized"); - const realityDataClientOptions: RealityDataClientOptions = { - authorizationClient: authorizationClient, - baseUrl: "https://api.bentley.com/reality-management/reality-data", - }; - const realityDataClient = new RealityDataAccessClient(realityDataClientOptions); - console.log("Reality Data Client initialized"); + const realityCaptureService = new RealityCaptureService(authorizationClient); + console.log("Reality Capture service initialized"); try { + if(!fs.existsSync(imagesPath)) { + throw new Error(imagesPath + " does not exist"); + } + console.log("Upload images in ", iTwinId); - const realityData = new ITwinRealityData(realityDataClient, undefined, iTwinId); - realityData.displayName = imagesName; - realityData.type = "CCImageCollection"; - const createdRealityData = await realityDataClient.createRealityData("", iTwinId, realityData); + const realityDataCreate: RealityDataCreate = { iTwinId: iTwinId, displayName: imagesName, type: Type.CC_IMAGE_COLLECTION }; + const createdRealityDataResponse = await realityCaptureService.createRealityData(realityDataCreate); + if (createdRealityDataResponse.isError()) { + throw new Error("Failed to create reality data : " + createdRealityDataResponse.error!.error.message); + } + const createdRealityData = createdRealityDataResponse.value!; const response = await realityDataHandler.uploadData(createdRealityData.id, imagesPath, "", iTwinId); if (response.isError()) { - console.log("Failed to upload reality data : " + response.error!.error.message); - return; + throw new Error("Failed to upload reality data : " + response.error!.error.message); } console.log("Successfully uploaded images") console.log("Downloading images in ", outputPath); const responseDownload = await realityDataHandler.downloadData(createdRealityData.id, outputPath, "", iTwinId); if (responseDownload.isError()) { - console.log("Failed to download reality data : " + responseDownload.error!.error.message); - return; + throw new Error("Failed to download reality data : " + responseDownload.error!.error.message); } console.log("Successfully downloaded images"); } diff --git a/typescript/packages/reality-capture/CHANGELOG.json b/typescript/packages/reality-capture/CHANGELOG.json new file mode 100644 index 00000000..789cdd7a --- /dev/null +++ b/typescript/packages/reality-capture/CHANGELOG.json @@ -0,0 +1,155 @@ +{ + "name": "@itwin/reality-capture", + "entries": [ + { + "date": "Fri, 26 Jun 2026 11:34:21 GMT", + "version": "1.5.2", + "tag": "@itwin/reality-capture_v1.5.2", + "comments": { + "patch": [ + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "dafc2ce3626cfed7e9e2fca323c314091c85c325", + "comment": "Add ROI input in gaussian splats" + } + ] + } + }, + { + "date": "Thu, 18 Jun 2026 17:24:16 GMT", + "version": "1.5.1", + "tag": "@itwin/reality-capture_v1.5.1", + "comments": { + "patch": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "12c46cd59dcd9109f5bade79c0611f4c4107c764", + "comment": "Security fixes + upgrades for RDC/RC TS packages" + } + ] + } + }, + { + "date": "Fri, 12 Jun 2026 11:03:07 GMT", + "version": "1.5.0", + "tag": "@itwin/reality-capture_v1.5.0", + "comments": { + "minor": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "c4ac1c5ae40a0680d016a5be3d0cd4a4f12be6e3", + "comment": "Update reality data client" + }, + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "248facfc73948a880447beca75f20da503f4179f", + "comment": "Add detectors endpoints" + }, + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "aa4b54a50b7c84331bc1049a0639fde5c82028fe", + "comment": "Add new exports and options for Modeling" + } + ] + } + }, + { + "date": "Tue, 07 Apr 2026 16:18:12 GMT", + "version": "1.4.1", + "tag": "@itwin/reality-capture_v1.4.1", + "comments": { + "patch": [ + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "b8c779585763702b075a6ab192860c9ffab85e9e", + "comment": "Fix API calls" + }, + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "a8f582ff1c0a7bc14aecd8b8d336b7a05e6f39bf", + "comment": "Add checkerboards option" + } + ] + } + }, + { + "date": "Tue, 07 Apr 2026 11:47:07 GMT", + "version": "1.4.0", + "tag": "@itwin/reality-capture_v1.4.0", + "comments": { + "minor": [ + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "fb1ec03518461ee1412a2f7b5616bf57b91293c6", + "comment": "Add gaussian splats LOD support" + } + ] + } + }, + { + "date": "Mon, 02 Mar 2026 13:47:36 GMT", + "version": "1.3.0", + "tag": "@itwin/reality-capture_v1.3.0", + "comments": { + "minor": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "18ef4e6671ab1a5243d1615c00efa615cc4ff555", + "comment": "Add clearance job support" + }, + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "7b9adbd4a7de0183a76a460b926bf2a697e4bc52", + "comment": "Add Crs Data support for Modeling Jobs" + } + ] + } + }, + { + "date": "Thu, 22 Jan 2026 09:03:10 GMT", + "version": "1.1.0", + "tag": "@itwin/reality-capture_v1.1.0", + "comments": { + "minor": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "e10fe6e0351b8a7ea2e6c4391d2c5d729c915a27", + "comment": "Merge 2.1.0 in main for release" + }, + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "8637d6c2027d6a46fcb862195b0f281511546fbf", + "comment": "Add get jobs to SDK" + } + ] + } + }, + { + "date": "Wed, 26 Nov 2025 10:46:48 GMT", + "version": "1.0.0", + "tag": "@itwin/reality-capture_v1.0.0", + "comments": { + "major": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-capture", + "commit": "6d8b25b91b040cc23f648e48fa6d494a54673642", + "comment": "New SDKs for Modeling Service" + } + ] + } + } + ] +} diff --git a/typescript/packages/reality-capture/CHANGELOG.md b/typescript/packages/reality-capture/CHANGELOG.md new file mode 100644 index 00000000..d87985a1 --- /dev/null +++ b/typescript/packages/reality-capture/CHANGELOG.md @@ -0,0 +1,74 @@ +# Change Log - @itwin/reality-capture + + + + + +## 1.5.2 + +Fri, 26 Jun 2026 11:34:21 GMT + +### Patches + +- Add ROI input in gaussian splats (110406974+dbiguenet@users.noreply.github.com) + +## 1.5.1 + +Thu, 18 Jun 2026 17:24:16 GMT + +### Patches + +- Security fixes + upgrades for RDC/RC TS packages (5690282+cnovel@users.noreply.github.com) + +## 1.5.0 + +Fri, 12 Jun 2026 11:03:07 GMT + +### Minor changes + +- Update reality data client (5690282+cnovel@users.noreply.github.com) +- Add detectors endpoints (110406974+dbiguenet@users.noreply.github.com) +- Add new exports and options for Modeling (110406974+dbiguenet@users.noreply.github.com) + +## 1.4.1 + +Tue, 07 Apr 2026 16:18:12 GMT + +### Patches + +- Fix API calls (110406974+dbiguenet@users.noreply.github.com) +- Add checkerboards option (110406974+dbiguenet@users.noreply.github.com) + +## 1.4.0 + +Tue, 07 Apr 2026 11:47:07 GMT + +### Minor changes + +- Add gaussian splats LOD support (110406974+dbiguenet@users.noreply.github.com) + +## 1.3.0 + +Mon, 02 Mar 2026 13:47:36 GMT + +### Minor changes + +- Add clearance job support (5690282+cnovel@users.noreply.github.com) +- Add Crs Data support for Modeling Jobs (5690282+cnovel@users.noreply.github.com) + +## 1.1.0 + +Thu, 22 Jan 2026 09:03:10 GMT + +### Minor changes + +- Merge 2.1.0 in main for release (5690282+cnovel@users.noreply.github.com) +- Add get jobs to SDK (5690282+cnovel@users.noreply.github.com) + +## 1.0.0 + +Wed, 26 Nov 2025 10:46:48 GMT + +### Major changes + +- New SDKs for Modeling Service (5690282+cnovel@users.noreply.github.com) diff --git a/typescript/packages/reality-capture/README.md b/typescript/packages/reality-capture/README.md index 07279447..e21401c9 100644 --- a/typescript/packages/reality-capture/README.md +++ b/typescript/packages/reality-capture/README.md @@ -4,6 +4,7 @@ reality-capture is a typescript package that allows any user to interact with Be - [Reality Modeling](https://developer.bentley.com/apis/contextcapture/) - [Reality Analysis](https://developer.bentley.com/apis/realitydataanalysis/) +- [Reality Management](https://developer.bentley.com/apis/reality-management/) ## Building locally diff --git a/typescript/packages/reality-capture/package.json b/typescript/packages/reality-capture/package.json index e3e445cb..8a8dbb05 100644 --- a/typescript/packages/reality-capture/package.json +++ b/typescript/packages/reality-capture/package.json @@ -1,7 +1,7 @@ { "name": "@itwin/reality-capture", - "version": "1.5.2", - "description": "This package contains a SDK for Reality Modeling, Reality Analysis and Reality Conversion iTwin APIs as well as Reality Management API utils. It provides classes, functions and examples to upload local data to Reality Management, run jobs and download the results.", + "version": "2.0.0", + "description": "This package contains a SDK for Reality Modeling, Reality Analysis, Reality Conversion and Reality Management iTwin APIs as well as Reality Management API utils. It provides classes, functions and examples to upload local data to Reality Management, run jobs and download the results.", "main": "lib/cjs/index.node.js", "module": "lib/esm/index.web.js", "types": "lib/cjs/index.node.d.ts", @@ -36,11 +36,15 @@ "pack": "npm pack --pack-destination ./lib" }, "keywords": [ - "typescript", - "sdk", - "reality-capture", + "azure", "bentley", - "azure" + "reality-capture", + "reality management", + "reality modeling", + "reality analysis", + "reality conversion", + "sdk", + "typescript" ], "author": { "name": "Bentley Systems, Inc.", @@ -49,7 +53,6 @@ "license": "MIT", "dependencies": { "@azure/storage-blob": "^12.15.0", - "@itwin/reality-data-client": "^1.5.0", "axios": "^1.18.0", "class-validator": "^0.14.0", "zod": "^3.22.2" diff --git a/typescript/packages/reality-capture/pnpm-lock.yaml b/typescript/packages/reality-capture/pnpm-lock.yaml index eae97875..70518aee 100644 --- a/typescript/packages/reality-capture/pnpm-lock.yaml +++ b/typescript/packages/reality-capture/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@azure/storage-blob': specifier: ^12.15.0 version: 12.32.0 - '@itwin/reality-data-client': - specifier: ^1.5.0 - version: 1.5.0(@itwin/core-bentley@5.10.0) axios: specifier: ^1.18.0 version: 1.18.0 @@ -26,7 +23,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: ^5.0.0 - version: 5.10.0(@types/node@20.19.42)(supports-color@8.1.1) + version: 5.10.0(@types/node@20.19.42) '@itwin/core-bentley': specifier: ^5.0.0 version: 5.10.0 @@ -47,22 +44,22 @@ importers: version: 17.0.4 '@typescript-eslint/eslint-plugin': specifier: ^6.0.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^6.0.0 - version: 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) chai: specifier: ^6.0.0 version: 6.2.2 eslint: specifier: ^8.52.0 - version: 8.57.1(supports-color@8.1.1) + version: 8.57.1 mocha: specifier: ^11.0.0 version: 11.7.6 nyc: specifier: ^17.0.0 - version: 17.1.0(supports-color@8.1.1) + version: 17.1.0 rimraf: specifier: ^4.4.1 version: 4.4.1 @@ -266,11 +263,6 @@ packages: '@itwin/core-geometry@5.10.0': resolution: {integrity: sha512-T/lRcONx4QK3RxTatBGyLqXn+H9KGUKIynkZxkxiLFUV4/4q87V8wwBPq8ufuJU4Wnf/xX88RvNe7dLMlYzm+Q==} - '@itwin/reality-data-client@1.5.0': - resolution: {integrity: sha512-VSmUbVeU/xJvwZvYGRkLX4FCCiPZ1/UuJFKDeRAoBOmuOleXvXnLiF3LMoTWAO0a6UihfoRKlBa85TRXjRBESg==} - peerDependencies: - '@itwin/core-bentley': ^4.0.0 || ^5.0.0 - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1976,12 +1968,12 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7(supports-color@8.1.1)': + '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 @@ -2021,9 +2013,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 '@babel/traverse': 7.29.7 @@ -2072,14 +2064,14 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1(supports-color@8.1.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: - eslint: 8.57.1(supports-color@8.1.1) + eslint: 8.57.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.15.0 debug: 4.4.3(supports-color@8.1.1) @@ -2103,7 +2095,7 @@ snapshots: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@humanwhocodes/config-array@0.13.0(supports-color@8.1.1)': + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.3(supports-color@8.1.1) @@ -2134,7 +2126,7 @@ snapshots: '@istanbuljs/schema@0.1.6': {} - '@itwin/build-tools@5.10.0(@types/node@20.19.42)(supports-color@8.1.1)': + '@itwin/build-tools@5.10.0(@types/node@20.19.42)': dependencies: '@microsoft/api-extractor': 7.58.7(@types/node@20.19.42) chalk: 3.0.0 @@ -2143,11 +2135,11 @@ snapshots: fs-extra: 8.1.0 glob: 10.5.0 mocha: 11.7.6 - mocha-junit-reporter: 2.2.1(mocha@11.7.6)(supports-color@8.1.1) + mocha-junit-reporter: 2.2.1(mocha@11.7.6) rimraf: 6.1.3 tree-kill: 1.2.2 typedoc: 0.28.19(typescript@5.6.3) - typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.6.3)) + typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.9.3)) typescript: 5.6.3 wtfnode: 0.9.4 yargs: 17.7.2 @@ -2169,14 +2161,6 @@ snapshots: '@itwin/core-bentley': 5.10.0 flatbuffers: 1.12.0 - '@itwin/reality-data-client@1.5.0(@itwin/core-bentley@5.10.0)': - dependencies: - '@itwin/core-bentley': 5.10.0 - axios: 1.18.0 - transitivePeerDependencies: - - debug - - supports-color - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2366,16 +2350,16 @@ snapshots: '@types/validator@13.15.10': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1(supports-color@8.1.1) + eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -2386,14 +2370,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1(supports-color@8.1.1) + eslint: 8.57.1 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2404,12 +2388,12 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1(supports-color@8.1.1) + eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2418,7 +2402,7 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@6.21.0(supports-color@8.1.1)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -2433,15 +2417,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1(supports-color@8.1.1))(typescript@5.9.3)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.9.3) - eslint: 8.57.1(supports-color@8.1.1) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + eslint: 8.57.1 semver: 7.8.2 transitivePeerDependencies: - supports-color @@ -2756,13 +2740,13 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.1(supports-color@8.1.1): + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) + '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0(supports-color@8.1.1) + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.3.1 @@ -3116,9 +3100,9 @@ snapshots: dependencies: append-transform: 2.0.0 - istanbul-lib-instrument@6.0.3(supports-color@8.1.1): + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/core': 7.29.7 '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 @@ -3141,7 +3125,7 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1(supports-color@8.1.1): + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 @@ -3313,7 +3297,7 @@ snapshots: mkdirp@3.0.1: {} - mocha-junit-reporter@2.2.1(mocha@11.7.6)(supports-color@8.1.1): + mocha-junit-reporter@2.2.1(mocha@11.7.6): dependencies: debug: 4.4.3(supports-color@8.1.1) md5: 2.3.0 @@ -3358,7 +3342,7 @@ snapshots: node-releases@2.0.47: {} - nyc@17.1.0(supports-color@8.1.1): + nyc@17.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.6 @@ -3372,10 +3356,10 @@ snapshots: glob: 7.2.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) + istanbul-lib-instrument: 6.0.3 istanbul-lib-processinfo: 2.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1(supports-color@8.1.1) + istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.2.0 make-dir: 3.1.0 node-preload: 0.2.1 @@ -3674,7 +3658,7 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.6.3)): + typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.9.3)): dependencies: typedoc: 0.28.19(typescript@5.6.3) diff --git a/typescript/packages/reality-capture/src/index.node.ts b/typescript/packages/reality-capture/src/index.node.ts index c41ea8a8..67867ed7 100644 --- a/typescript/packages/reality-capture/src/index.node.ts +++ b/typescript/packages/reality-capture/src/index.node.ts @@ -9,6 +9,7 @@ export * from "./service/error"; export * from "./service/estimation"; export * from "./service/files"; export * from "./service/job"; +export * from "./service/reality_data"; export * from "./service/response"; export * from "./service/service"; @@ -33,4 +34,4 @@ export * from "./specifications/segmentation_orthophoto"; export * from "./specifications/tiling"; export * from "./specifications/training"; export * from "./specifications/touchup"; -export * from "./specifications/water_constraints"; +export * from "./specifications/water_constraints"; \ No newline at end of file diff --git a/typescript/packages/reality-capture/src/index.web.ts b/typescript/packages/reality-capture/src/index.web.ts index c539280a..c0f0dd62 100644 --- a/typescript/packages/reality-capture/src/index.web.ts +++ b/typescript/packages/reality-capture/src/index.web.ts @@ -9,6 +9,7 @@ export * from "./service/error"; export * from "./service/estimation"; export * from "./service/files"; export * from "./service/job"; +export * from "./service/reality_data"; export * from "./service/response"; export * from "./service/service"; diff --git a/typescript/packages/reality-capture/src/service/bucket.ts b/typescript/packages/reality-capture/src/service/bucket.ts index 6338ed57..16e32180 100644 --- a/typescript/packages/reality-capture/src/service/bucket.ts +++ b/typescript/packages/reality-capture/src/service/bucket.ts @@ -1,20 +1,11 @@ import { z } from "zod"; +import { ContainerLinksSchema } from "./reality_data"; export const BucketSchema = z.object({ iTwinId: z.string().describe("iTwin Id for the bucket.") }); export type Bucket = z.infer; -export const URLSchema = z.object({ - href: z.string().describe("URL."), -}); -export type URL = z.infer; - -export const ContainerLinksSchema = z.object({ - containerUrl: URLSchema.describe("The URL of the container"), -}); -export type ContainerLinks = z.infer; - export const BucketResponseSchema = z.object({ bucket: BucketSchema.describe("Bucket information"), _links: ContainerLinksSchema.describe("The link to the container.") diff --git a/typescript/packages/reality-capture/src/service/data_handler.ts b/typescript/packages/reality-capture/src/service/data_handler.ts index 84f7c742..080f8616 100644 --- a/typescript/packages/reality-capture/src/service/data_handler.ts +++ b/typescript/packages/reality-capture/src/service/data_handler.ts @@ -1,15 +1,15 @@ import * as fs from "fs"; import * as path from "path"; import { ContainerClient } from "@azure/storage-blob"; -import type { AuthorizationClient } from "@itwin/core-common"; +import type { AuthorizationClient, RealityData } from "@itwin/core-common"; import { BentleyError } from "@itwin/core-bentley"; //TODO : ThreadPool type does not have native Node.js equivalent. Multi-thread for IO must be readapted (here, ploads and downloads are sequential. //import { ThreadPool } from "some-threadpool-lib"; import { DetailedError } from "./error"; -import { ITwinRealityData, RealityDataAccessClient, type RealityDataClientOptions } from "@itwin/reality-data-client"; import { Response } from "./response"; import { RealityCaptureService } from "./service"; import { BucketResponse } from "./bucket"; +import { ContainerDetails } from "./reality_data"; type ProgressHook = ((percent: number) => boolean) | null; @@ -190,63 +190,45 @@ class _DataHandler { } export class RealityDataHandler { - private _realityDataClient: RealityDataAccessClient; + private _realityCaptureService: RealityCaptureService; private _progressHook: ProgressHook; constructor(authorizationClient: AuthorizationClient, kwargs?: any) { const env = kwargs?.env; - let url = ""; - if (env === "dev" || env === "qa") - url = "https://" + env + "-api.bentley.com/reality-management/reality-data"; - else - url = "https://api.bentley.com/reality-management/reality-data"; - const realityDataClientOptions: RealityDataClientOptions = { - authorizationClient: authorizationClient, - baseUrl: url, - }; - this._realityDataClient = new RealityDataAccessClient(realityDataClientOptions); + this._realityCaptureService = new RealityCaptureService(authorizationClient, { env }); this._progressHook = null; } - private async _getContainerUrlFromRealityDataId(realityDataId: string, iTwinId?: string, writeAccess: boolean = false): Promise> { - let realityData: ITwinRealityData; - try { - realityData = await this._realityDataClient.getRealityData("", iTwinId, realityDataId); - } - catch (error: any) { - console.log("Cannot find reality data id " + realityDataId + " in iTwin " + iTwinId); - if (error instanceof BentleyError) - return new Response(error.errorNumber, { error: { code: error.name, message: error.message } }, ""); - else - return new Response(520, { error: { code: "UnknownError", message: "Unknown error" } }, ""); + private async _getContainerUrlFromRealityDataId(realitydataId: string, iTwinId?: string, readOnly: boolean = true): Promise> { + if (!readOnly) { + return this._realityCaptureService.getRealityDataWriteAccess(realitydataId, iTwinId); } - const url = await realityData.getBlobUrl("", "", writeAccess); - return new Response(200, null, url.toString()); + return this._realityCaptureService.getRealityDataReadAccess(realitydataId, iTwinId); } async uploadData(realityDataId: string, src: string, realityDataDst = "", iTwinId?: string): Promise> { - const urlResponse = await this._getContainerUrlFromRealityDataId(realityDataId, iTwinId, true); + const urlResponse = await this._getContainerUrlFromRealityDataId(realityDataId, iTwinId, false); if (urlResponse.isError()) { return new Response(urlResponse.status_code, urlResponse.error); } - const resp = await _DataHandler.uploadData(urlResponse.value!, src, realityDataDst, this._progressHook); + const resp = await _DataHandler.uploadData(urlResponse.value!._links.containerUrl.href, src, realityDataDst, this._progressHook); return resp; } async downloadData(realityDataId: string, dst: string, realityDataSrc = "", iTwinId?: string): Promise> { - const urlResponse = await this._getContainerUrlFromRealityDataId(realityDataId, iTwinId, false); + const urlResponse = await this._getContainerUrlFromRealityDataId(realityDataId, iTwinId, true); if (urlResponse.isError()) { return new Response(urlResponse.status_code, urlResponse.error); } - return await _DataHandler.downloadData(urlResponse.value!, dst, realityDataSrc, this._progressHook); + return await _DataHandler.downloadData(urlResponse.value!._links.containerUrl.href, dst, realityDataSrc, this._progressHook); } async listData(realityDataId: string, iTwinId?: string): Promise> { - const urlResponse = await this._getContainerUrlFromRealityDataId(realityDataId, iTwinId, false); + const urlResponse = await this._getContainerUrlFromRealityDataId(realityDataId, iTwinId, true); if (urlResponse.isError()) { return new Response(urlResponse.status_code, urlResponse.error, []); } - return await _DataHandler.listData(urlResponse.value!); + return await _DataHandler.listData(urlResponse.value!._links.containerUrl.href); } async deleteData(realityDataId: string, filesToDelete: string[], iTwinId?: string): Promise> { @@ -254,7 +236,7 @@ export class RealityDataHandler { if (urlResponse.isError()) { return new Response(urlResponse.status_code, urlResponse.error); } - return await _DataHandler.deleteData(urlResponse.value!, filesToDelete); + return await _DataHandler.deleteData(urlResponse.value!._links.containerUrl.href, filesToDelete); } setProgressHook(hook: ProgressHook): void { diff --git a/typescript/packages/reality-capture/src/service/job.ts b/typescript/packages/reality-capture/src/service/job.ts index fe2929df..c135fc79 100644 --- a/typescript/packages/reality-capture/src/service/job.ts +++ b/typescript/packages/reality-capture/src/service/job.ts @@ -17,13 +17,13 @@ import { WaterConstraintsSpecificationsCreateSchema, WaterConstraintsSpecificati import { TrainingO2DSpecificationsCreateSchema, TrainingS3DSpecificationsCreateSchema, TrainingO2DSpecificationsSchema, TrainingS3DSpecificationsSchema } from "../specifications/training"; //import { PointCloudConversionSpecificationsCreateSchema, PointCloudConversionSpecificationsSchema } from '../specifications/point_cloud_conversion'; import { GaussianSplatsSpecificationsCreateSchema, GaussianSplatsSpecificationsSchema } from "../specifications/gaussian_splats"; -import { URLSchema } from "./bucket"; import { EvalO2DSpecificationsCreateSchema, EvalO2DSpecificationsSchema } from "../specifications/eval_o2d"; import { EvalO3DSpecificationsCreateSchema, EvalO3DSpecificationsSchema } from "../specifications/eval_o3d"; import { EvalS2DSpecificationsCreateSchema, EvalS2DSpecificationsSchema } from "../specifications/eval_s2d"; import { EvalS3DSpecificationsCreateSchema, EvalS3DSpecificationsSchema } from "../specifications/eval_s3d"; import { EvalSOrthoSpecificationsCreateSchema, EvalSOrthoSpecificationsSchema } from "../specifications/eval_sortho"; import { ClearanceSpecificationsCreateSchema, ClearanceSpecificationsSchema } from "../specifications/clearance"; +import { URLSchema } from "./reality_data"; export enum JobType { CALIBRATION = "Calibration", diff --git a/typescript/packages/reality-capture/src/service/reality_data.ts b/typescript/packages/reality-capture/src/service/reality_data.ts new file mode 100644 index 00000000..b6fffbc6 --- /dev/null +++ b/typescript/packages/reality-capture/src/service/reality_data.ts @@ -0,0 +1,212 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +import { z } from "zod"; + +export enum Classification { + TERRAIN = "Terrain", + IMAGERY = "Imagery", + PINNED = "Pinned", + MODEL = "Model", + UNDEFINED = "Undefined", +} + +export enum ContainerType { + AZURE_BLOB_SAS_URL = "AzureBlobSasUrl", +} + +export enum Access { + WRITE = "Write", + READ = "Read", +} + +export enum Prefer { + MINIMAL = "minimal", + REPRESENTATION = "representation", +} + +export enum Type { + CC_IMAGE_COLLECTION = "CCImageCollection", + THREED_TILES = "Cesium3DTiles", + COLLADA = "DAE", + CONTEXT_DETECTOR = "ContextDetector", + CONTEXT_SCENE = "ContextScene", + DGN = "DGN", + E57 = "E57", + FBX = "FBX", + GLB = "GLB", + GLTF = "GLTF", + KML = "KML", + LAS = "LAS", + LAZ = "LAZ", + LOD = "LOD", + LOD_TREE = "LODTree", + OBJ = "OBJ", + OMR = "OMR", + OPC = "OPC", + OSGB = "OSGB", + OVF = "OVF", + OVT = "OVT", + PLY = "PLY", + PNTS = "PNTS", + POD = "PointCloud", + REALITY_MESH_3D_Tiles = "RealityMesh3DTiles", + REFERENCE_MODEL = "ModelingReference", + SLPK = "SLPK", + SPACEYES = "SpaceEyes3D", + SUPER_MAP = "SuperMap", + S3C = "S3C", + TERRAIN_3D_TILES = "Terrain3DTiles", + TEXTURED_TIE_POINTS = "TexturedTiePoints", + THREE_SM = "3SM", + THREE_MX = "3MX", + UNSTRUCTURED_DATA = "Unstructured", + ORTHOPHOTO = "Orthophoto", + GS_PLY = "GS_PLY", + GS_SPZ = "GS_SPZ", + GS_3DT = "GS_3DT", + GEO_JSON = "GeoJSON", + SHP = "SHP" +} + +export const CoordinateSchema = z.object({ + latitude: z.number().min(-90).max(90).describe("Latitude. Latitude ranges between -90 and 90 degrees, inclusive."), + longitude: z.number().min(-180).max(180).describe("Longitude. Longitude ranges between -180 and 180 degrees, inclusive."), +}); +export type Coordinate = z.infer; + +export const ExtentSchema = z.object({ + southWest: CoordinateSchema.describe("Extent's southwest coordinate."), + northEast: CoordinateSchema.describe("Extent's northeast coordinate."), +}); +export type Extent = z.infer; + +export const CrsSchema = z.object({ + id: z.string().describe("Identifier of the coordinate reference system."), + verticalId: z.string().optional().describe("Optional identifier of the vertical coordinate reference system."), +}); +export type Crs = z.infer; + +export const AcquisitionSchema = z.object({ + startDateTime: z.coerce.date().optional().describe("ISO-8601 compliant time (UTC) that indicates when the data acquisition started. E.g. '2017-05-10T13:43:03Z'"), + endDateTime: z.coerce.date().optional().describe("ISO-8601 compliant time (UTC) that indicates when the data acquisition ended. E.g. '2017-05-10T13:43:03Z'"), + acquirer: z.string().optional().describe("Description of the acquirer."), +}); +export type Acquisition = z.infer; + +export const RealityDataBaseSchema = z.object({ + classification: z.nativeEnum(Classification).optional().describe("Specific value constrained field that indicates the nature of the reality data."), + description: z.string().optional().describe("Description of the reality data."), + tags: z.array(z.string()).optional().describe("Any strings identifier which you can assign to reality data to identify it."), + dataset: z.string().optional().describe("This field can be used to define a loose grouping of reality data. This property may not contain any control sequence such as a URL or code."), + group: z.string().optional().describe("The group can be used to define a second level of grouping. This property may not contain any control sequence such as a URL or code."), + rootDocument: z.string().optional().describe("Used to indicate the root document of the reality data."), + acquisition: AcquisitionSchema.optional().describe("Details about data acquisition."), + extent: ExtentSchema.optional().describe("The rectangular area on the Earth which encloses the reality data."), + authoring: z.boolean().optional().describe("A boolean value that is true if the data is being created. It is false if the data has been completely uploaded."), + ownerId: z.string().optional().describe("Identifier of the owner of the reality data."), + attribution: z.string().optional().describe("The attribution of the reality data."), + termsOfUse: z.string().optional().describe("Terms of use of the reality data."), + crs: CrsSchema.optional().describe("Details about the reality data's coordinate reference system.") +}); +export type RealityDataBase = z.infer; + +export const RealityDataCreateSchema = RealityDataBaseSchema.extend({ + iTwinId: z.string().describe("Id of associated iTwin."), + displayName: z.string().describe("Name of the reality data."), + type: z.nativeEnum(Type).describe("A key indicating the format of the data."), +}); +export type RealityDataCreate = z.infer; + +export const RealityDataSchema = RealityDataBaseSchema.extend({ + id: z.string().describe("Identifier of the reality data. This identifier is assigned by the service at the creation of the reality data. It is also unique."), + displayName: z.string().describe("Name of the reality data."), + createdDateTime: z.coerce.date().describe("ISO-8601 compliant time (UTC) of the creation of the reality data."), + modifiedDateTime: z.coerce.date().describe("ISO-8601 compliant time (UTC) of the last modification of the reality data."), + lastAccessedDateTime: z.coerce.date().describe("ISO-8601 compliant time (UTC) of the last access of the reality data."), + dataCenterLocation: z.string().describe("Identifies the data center location used to store the reality data."), + size: z.number().min(0).describe("The size of the reality data in Kilobytes."), + type: z.nativeEnum(Type).describe("A key indicating the format of the data."), +}); +export type RealityData = z.infer; + +export const RealityDataUpdateSchema = RealityDataBaseSchema.extend({ + itwinId: z.string().optional().describe("Id of associated iTwin."), + displayName: z.string().optional().describe("Name of the reality data."), + type: z.nativeEnum(Type).optional().describe("A key indicating the format of the data."), +}); +export type RealityDataUpdate = z.infer; + +export const RealityDataMinimalSchema = RealityDataBaseSchema.extend({ + id: z.string().describe("Identifier of the reality data. This identifier is assigned by the service at the creation of the reality data. It is also unique."), + displayName: z.string().describe("Name of the reality data."), + type: z.nativeEnum(Type).describe("A key indicating the format of the data. The type property should be a specific indication of the format of the reality data"), +}); +export type RealityDataMinimal = z.infer; + +export const URLSchema = z.object({ + href: z.string().describe("URL."), +}); +export type URL = z.infer; + +export const NextPageLinkSchema = z.object({ + next: URLSchema.describe("Link."), +}); +export type NextPageLink = z.infer; + +export const RealityDatasSchema = z.object({ + realityData: z.array(z.union([RealityDataMinimalSchema, RealityDataSchema])).describe("Identifier of the reality data. This identifier is assigned by the service at the creation of the reality data. It is also unique."), + links: NextPageLinkSchema.describe("Next page link."), +}); +export type RealityDatas = z.infer; + +export const ContainerLinksSchema = z.object({ + containerUrl: URLSchema.describe("The URL of the container."), +}); +export type ContainerLinks = z.infer; + +export const ContainerDetailsSchema = z.object({ + type: z.nativeEnum(ContainerType).describe("Type of container."), + access: z.nativeEnum(Access).describe("Type of access user have to container."), + _links: ContainerLinksSchema.describe("The link to the container."), +}); +export type ContainerDetails = z.infer; + +export const RealityDataFilterSchema = z.object({ + iTwinId: z.string().optional().describe("Id of iTwin. The operation gets all reality data in this iTwin."), + continuationToken: z.string().optional().describe("Parameter that enables continuing to the next page of the previous paged query. This must be passed exactly as it is in the response body's _links.next property. If this is specified and $top is omitted, the next page will be the same size as the previous page."), + $top: z.number().min(1).max(1000).optional().describe("The number of reality data to get in each page."), + extent: ExtentSchema.optional().describe("Extent of the area to search, delimited by southwest and northeast coordinates."), + $orderBy: z.string().optional().describe("Parameter that enable to order reality data in ascending or descending order. Default is ascending. Example: displayName desc"), + $search: z.string().optional().describe("Search reality data."), + types: z.array(z.nativeEnum(Type)).optional().describe("List of reality data types."), + acquisitionDateTime: z.tuple([z.string().datetime(), z.string().datetime()]).optional().describe("Acquisition datetime range (start, end) in ISO-8601 compliant time (UTC)."), + createdDateTime: z.tuple([z.string().datetime(), z.string().datetime()]).optional().describe("Created datetime range (start, end) in ISO-8601 compliant time (UTC)."), + modifiedDateTime: z.tuple([z.string().datetime(), z.string().datetime()]).optional().describe("Modified datetime range (start, end) in ISO-8601 compliant time (UTC)."), + lastAccessedDateTime: z.tuple([z.string().datetime(), z.string().datetime()]).optional().describe("Last accessed datetime range (start, end) in ISO-8601 compliant time (UTC)."), + ownerId: z.string().optional().describe("Guid identifier of the owner."), + dataCenter: z.string().optional().describe("Data center location."), + tag: z.string().optional().describe("Parameter to get reality data with exact matching tags."), +}); +export type RealityDataFilter = z.infer; +export namespace RealityDataFilter { + export function asParamsForServiceCall(filter: RealityDataFilter): Record { + const params: Record = Object.fromEntries( + Object.entries(filter).filter(([, v]) => v !== undefined) + ); + + for (const key of Object.keys(params).filter(k => k.endsWith("DateTime"))) { + const [start, end] = params[key] as [string, string]; + params[key] = `${start}/${end}`; + } + + return params; + } +} + +function getContinuationToken(rd: RealityDatas): string | undefined { + if (!rd.links) return undefined; + const url = new URL(rd.links.next.href); + return url.searchParams.get("continuationToken") ?? undefined; +} diff --git a/typescript/packages/reality-capture/src/service/service.ts b/typescript/packages/reality-capture/src/service/service.ts index d65673d3..1599ea09 100644 --- a/typescript/packages/reality-capture/src/service/service.ts +++ b/typescript/packages/reality-capture/src/service/service.ts @@ -7,6 +7,7 @@ import { Files } from "./files"; import { Response } from "./response"; import { JobCreate, Job, Progress, Messages, Service, getAppropriateService, Jobs } from "./job"; import { DetailedErrorResponse, DetailedError } from "./error"; +import { ContainerDetails, Prefer, RealityData, RealityDataCreate, RealityDataFilter, RealityDatas, RealityDataUpdate } from "./reality_data"; export class RealityCaptureService { private _authorizationClient: AuthorizationClient; @@ -49,6 +50,10 @@ export class RealityCaptureService { return this._serviceUrl + "reality-analysis/"; } + private _getManagementUrl() { + return this._serviceUrl + "reality-management/"; + } + private _getCorrectUrl(service: Service): string { switch (service) { case Service.MODELING: @@ -260,6 +265,124 @@ export class RealityCaptureService { } } + async dissociateRealityData(iTwinId: string, realityDataId: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/iTwins/${encodeURIComponent(iTwinId)}`; + try { + const resp = await this._axios.delete(url, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, null); + } catch (error: any) { + return this._handleError(error); + } + } + + async associateRealityData(iTwinId: string, realityDataId: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/iTwins/${encodeURIComponent(iTwinId)}`; + try { + const resp = await this._axios.post(url, undefined, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, null); + } catch (error: any) { + return this._handleError(error); + } + } + + async getRealityDataITwins(realityDataId: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/iTwins`; + try { + const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, resp.data.iTwins); + } catch (error: any) { + return this._handleError(error); + } + } + + async getRealityDataReadAccess(realityDataId: string, itwinId?: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/readaccess` + (itwinId ? `?iTwinId=${encodeURIComponent(itwinId)}` : ""); + try { + const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, resp.data); + } catch (error: any) { + return this._handleError(error); + } + } + + async getRealityDataWriteAccess(realityDataId: string, itwinId?: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/writeaccess` + (itwinId ? `?iTwinId=${encodeURIComponent(itwinId)}` : ""); + try { + const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, resp.data); + } catch (error: any) { + return this._handleError(error); + } + } + + async createRealityData(realityData: RealityDataCreate): Promise> { + let url = this._getManagementUrl() + `reality-data`; + try { + const resp = await this._axios.post(url, realityData, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, resp.data.realityData); + } catch (error: any) { + return this._handleError(error); + } + } + + async updateRealityData(realityData: RealityDataUpdate, realityDataId: string): Promise> { + let url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; + try { + const resp = await this._axios.patch(url, realityData, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, resp.data.realityData); + } catch (error: any) { + return this._handleError(error); + } + } + + async getRealityDataList(realityDataFilter?: RealityDataFilter, prefer?: Prefer): Promise> { + const url = this._getManagementUrl() + `reality-data/`; + const params = realityDataFilter ? RealityDataFilter.asParamsForServiceCall(realityDataFilter) : undefined; + const headers = { + ...await this._getHeader("v1"), + "Prefer": prefer === Prefer.REPRESENTATION ? "return=representation" : "return=minimal", + }; + try { + const resp = await this._axios.get(url, { params, headers }); + return new Response(resp.status, null, resp.data as RealityDatas); + } catch (error: any) { + return this._handleError(error); + } + } + + async getRealityData(realityDataId: string, iTwinId?: string): Promise> { + let url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; + if(iTwinId) { + url += `?iTwinId=${encodeURIComponent(iTwinId)}`; + } + try { + const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, resp.data.realityData); + } catch (error: any) { + return this._handleError(error); + } + } + + async moveRealityData(realityDataId: string, iTwinId: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/move`; + try { + const resp = await this._axios.patch(url, { iTwinId: iTwinId }, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, null); + } catch (error: any) { + return this._handleError(error); + } + } + + async deleteRealityData(realityDataId: string): Promise> { + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; + try { + const resp = await this._axios.delete(url, { headers: await this._getHeader("v1") }); + return new Response(resp.status, null, null); + } catch (error: any) { + return this._handleError(error); + } + } + private _handleError(error: any): Response { if (error.response) { const data = error.response.data; diff --git a/typescript/packages/reality-capture/src/tests/service/bucket.test.ts b/typescript/packages/reality-capture/src/tests/service/bucket.test.ts index a2c6e776..97bcb0be 100644 --- a/typescript/packages/reality-capture/src/tests/service/bucket.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/bucket.test.ts @@ -2,10 +2,9 @@ import { expect } from "chai"; import { z } from "zod"; import { BucketSchema, - URLSchema, - ContainerLinksSchema, BucketResponseSchema } from "../../service/bucket"; +import { ContainerLinksSchema, URLSchema } from "../../service/reality_data"; describe("BucketSchema", () => { it("should validate a correct bucket object", () => { diff --git a/typescript/packages/reality-capture/src/tests/service/job.test.ts b/typescript/packages/reality-capture/src/tests/service/job.test.ts index 00eed025..2d399a0e 100644 --- a/typescript/packages/reality-capture/src/tests/service/job.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/job.test.ts @@ -7,8 +7,6 @@ import { JobState, JobCreateSchema, ExecutionSchema, - JobSchema, - JobResponseSchema, ProgressSchema, ProgressResponseSchema, MessageSchema, diff --git a/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts b/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts new file mode 100644 index 00000000..beeaff77 --- /dev/null +++ b/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts @@ -0,0 +1,692 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +import { expect } from "chai"; +import { z } from "zod"; +import sinon from "sinon"; +import type { AuthorizationClient } from "@itwin/core-common"; +import { Response } from "../../service/response"; +import { RealityCaptureService } from "../../service/service"; +import { + Access, AcquisitionSchema, Classification, ContainerDetailsSchema, ContainerLinksSchema, + ContainerType, CoordinateSchema, CrsSchema, ExtentSchema, Prefer, RealityDataBaseSchema, + RealityDataCreateSchema, RealityDataFilter, RealityDataFilterSchema, RealityDataMinimalSchema, + RealityDatasSchema, RealityDataSchema, RealityDataUpdateSchema, Type, URLSchema, +} from "../../service/reality_data"; + +describe("CoordinateSchema", () => { + it("should validate a correct coordinate", () => { + expect(() => CoordinateSchema.parse({ latitude: 45.0, longitude: 90.0 })).to.not.throw(); + }); + + it("should throw for latitude out of range", () => { + expect(() => CoordinateSchema.parse({ latitude: 91, longitude: 0 })).to.throw(z.ZodError); + expect(() => CoordinateSchema.parse({ latitude: -91, longitude: 0 })).to.throw(z.ZodError); + }); + + it("should throw for longitude out of range", () => { + expect(() => CoordinateSchema.parse({ latitude: 0, longitude: 181 })).to.throw(z.ZodError); + expect(() => CoordinateSchema.parse({ latitude: 0, longitude: -181 })).to.throw(z.ZodError); + }); + + it("should throw for missing fields", () => { + expect(() => CoordinateSchema.parse({})).to.throw(z.ZodError); + expect(() => CoordinateSchema.parse({ latitude: 0 })).to.throw(z.ZodError); + }); +}); + +describe("ExtentSchema", () => { + const validExtent = { + southWest: { latitude: -10, longitude: -20 }, + northEast: { latitude: 10, longitude: 20 }, + }; + + it("should validate a correct extent", () => { + expect(() => ExtentSchema.parse(validExtent)).to.not.throw(); + }); + + it("should throw for missing southWest or northEast", () => { + expect(() => ExtentSchema.parse({ southWest: validExtent.southWest })).to.throw(z.ZodError); + expect(() => ExtentSchema.parse({ northEast: validExtent.northEast })).to.throw(z.ZodError); + }); + + it("should throw for invalid coordinate in extent", () => { + expect(() => ExtentSchema.parse({ + southWest: { latitude: -91, longitude: 0 }, + northEast: { latitude: 10, longitude: 20 }, + })).to.throw(z.ZodError); + }); +}); + +describe("CrsSchema", () => { + it("should validate a correct Crs with only id", () => { + expect(() => CrsSchema.parse({ id: "EPSG:4326" })).to.not.throw(); + }); + + it("should validate a correct Crs with id and verticalId", () => { + expect(() => CrsSchema.parse({ id: "EPSG:4326", verticalId: "EPSG:5773" })).to.not.throw(); + }); + + it("should throw for missing id", () => { + expect(() => CrsSchema.parse({})).to.throw(z.ZodError); + }); +}); + +describe("AcquisitionSchema", () => { + it("should validate an empty acquisition", () => { + expect(() => AcquisitionSchema.parse({})).to.not.throw(); + }); + + it("should validate a full acquisition", () => { + expect(() => AcquisitionSchema.parse({ + startDateTime: "2024-01-01T00:00:00Z", + endDateTime: "2024-01-02T00:00:00Z", + acquirer: "Some Company", + })).to.not.throw(); + }); + + it("should coerce date strings", () => { + const result = AcquisitionSchema.parse({ startDateTime: "2024-06-15T12:00:00Z" }); + expect(result.startDateTime).to.be.instanceOf(Date); + }); +}); + +describe("RealityDataBaseSchema", () => { + it("should validate an empty object (all fields optional)", () => { + expect(() => RealityDataBaseSchema.parse({})).to.not.throw(); + }); + + it("should validate a full base object", () => { + expect(() => RealityDataBaseSchema.parse({ + classification: Classification.IMAGERY, + description: "A test reality data", + tags: ["tag1", "tag2"], + authoring: false, + })).to.not.throw(); + }); + + it("should throw for invalid classification", () => { + expect(() => RealityDataBaseSchema.parse({ classification: "InvalidClass" })).to.throw(z.ZodError); + }); +}); + +describe("RealityDataCreateSchema", () => { + const valid = { + iTwinId: "itwin-001", + displayName: "My Reality Data", + type: Type.CC_IMAGE_COLLECTION, + }; + + it("should validate a minimal create payload", () => { + expect(() => RealityDataCreateSchema.parse(valid)).to.not.throw(); + }); + + it("should throw for missing iTwinId", () => { + expect(() => RealityDataCreateSchema.parse({ ...valid, iTwinId: undefined })).to.throw(z.ZodError); + }); + + it("should throw for missing displayName", () => { + expect(() => RealityDataCreateSchema.parse({ ...valid, displayName: undefined })).to.throw(z.ZodError); + }); + + it("should throw for invalid type", () => { + expect(() => RealityDataCreateSchema.parse({ ...valid, type: "BadType" })).to.throw(z.ZodError); + }); +}); + +describe("RealityDataSchema", () => { + const valid = { + id: "rd-001", + displayName: "My Reality Data", + type: Type.LAS, + createdDateTime: "2024-01-01T00:00:00Z", + modifiedDateTime: "2024-01-02T00:00:00Z", + lastAccessedDateTime: "2024-01-03T00:00:00Z", + dataCenterLocation: "East US", + size: 1024, + }; + + it("should validate a full reality data object", () => { + expect(() => RealityDataSchema.parse(valid)).to.not.throw(); + }); + + it("should coerce date strings to Date objects", () => { + const result = RealityDataSchema.parse(valid); + expect(result.createdDateTime).to.be.instanceOf(Date); + expect(result.modifiedDateTime).to.be.instanceOf(Date); + expect(result.lastAccessedDateTime).to.be.instanceOf(Date); + }); + + it("should throw for negative size", () => { + expect(() => RealityDataSchema.parse({ ...valid, size: -1 })).to.throw(z.ZodError); + }); + + it("should throw for missing required fields", () => { + expect(() => RealityDataSchema.parse({})).to.throw(z.ZodError); + }); +}); + +describe("RealityDataUpdateSchema", () => { + it("should validate an empty update (all fields optional)", () => { + expect(() => RealityDataUpdateSchema.parse({})).to.not.throw(); + }); + + it("should validate a partial update", () => { + expect(() => RealityDataUpdateSchema.parse({ displayName: "New Name", authoring: true })).to.not.throw(); + }); +}); + +describe("RealityDataMinimalSchema", () => { + it("should validate a minimal reality data", () => { + expect(() => RealityDataMinimalSchema.parse({ + id: "rd-001", + displayName: "Minimal RD", + type: Type.E57, + })).to.not.throw(); + }); + + it("should throw for missing id", () => { + expect(() => RealityDataMinimalSchema.parse({ displayName: "Minimal RD", type: Type.E57 })).to.throw(z.ZodError); + }); +}); + +describe("URLSchema", () => { + it("should validate a correct URL object", () => { + expect(() => URLSchema.parse({ href: "https://example.com" })).to.not.throw(); + }); + + it("should throw for missing href", () => { + expect(() => URLSchema.parse({})).to.throw(z.ZodError); + }); +}); + +describe("ContainerLinksSchema", () => { + it("should validate a correct ContainerLinks object", () => { + expect(() => ContainerLinksSchema.parse({ containerUrl: { href: "https://blob.example.com" } })).to.not.throw(); + }); + + it("should throw for missing containerUrl", () => { + expect(() => ContainerLinksSchema.parse({})).to.throw(z.ZodError); + }); +}); + +describe("ContainerDetailsSchema", () => { + const valid = { + type: ContainerType.AZURE_BLOB_SAS_URL, + access: Access.READ, + _links: { containerUrl: { href: "https://blob.example.com?sas=token" } }, + }; + + it("should validate a correct ContainerDetails object", () => { + expect(() => ContainerDetailsSchema.parse(valid)).to.not.throw(); + }); + + it("should validate with WRITE access", () => { + expect(() => ContainerDetailsSchema.parse({ ...valid, access: Access.WRITE })).to.not.throw(); + }); + + it("should throw for invalid access", () => { + expect(() => ContainerDetailsSchema.parse({ ...valid, access: "BadAccess" })).to.throw(z.ZodError); + }); + + it("should throw for missing _links", () => { + expect(() => ContainerDetailsSchema.parse({ type: ContainerType.AZURE_BLOB_SAS_URL, access: Access.READ })).to.throw(z.ZodError); + }); +}); + +describe("RealityDatasSchema", () => { + it("should validate a list with minimal reality data", () => { + expect(() => RealityDatasSchema.parse({ + realityData: [{ id: "rd-001", displayName: "RD1", type: Type.LAS }], + links: { next: { href: "https://api.bentley.com/reality-data?continuationToken=abc" } }, + })).to.not.throw(); + }); + + it("should validate an empty list", () => { + expect(() => RealityDatasSchema.parse({ + realityData: [], + links: { next: { href: "https://api.bentley.com/reality-data" } }, + })).to.not.throw(); + }); +}); + +describe("RealityDataFilterSchema", () => { + it("should validate an empty filter", () => { + expect(() => RealityDataFilterSchema.parse({})).to.not.throw(); + }); + + it("should validate a filter with all fields", () => { + expect(() => RealityDataFilterSchema.parse({ + iTwinId: "itwin-001", + $top: 50, + types: [Type.LAS, Type.E57], + ownerId: "owner-001", + })).to.not.throw(); + }); + + it("should throw for $top exceeding max", () => { + expect(() => RealityDataFilterSchema.parse({ $top: 1001 })).to.throw(z.ZodError); + }); + + it("should throw for $top below min", () => { + expect(() => RealityDataFilterSchema.parse({ $top: 0 })).to.throw(z.ZodError); + }); +}); + +describe("RealityDataFilter.asParamsForServiceCall", () => { + it("should exclude undefined fields", () => { + const filter: RealityDataFilter = { iTwinId: "itwin-001" }; + const params = RealityDataFilter.asParamsForServiceCall(filter); + expect(params).to.have.key("iTwinId"); + expect(Object.keys(params)).to.have.lengthOf(1); + }); + + it("should convert dateTime tuples to 'start/end' strings", () => { + const filter: RealityDataFilter = { + createdDateTime: ["2024-01-01T00:00:00Z", "2024-12-31T00:00:00Z"], + }; + const params = RealityDataFilter.asParamsForServiceCall(filter); + expect(params["createdDateTime"]).to.equal("2024-01-01T00:00:00Z/2024-12-31T00:00:00Z"); + }); + + it("should handle multiple datetime range fields", () => { + const filter: RealityDataFilter = { + createdDateTime: ["2024-01-01T00:00:00Z", "2024-06-01T00:00:00Z"], + modifiedDateTime: ["2024-02-01T00:00:00Z", "2024-07-01T00:00:00Z"], + }; + const params = RealityDataFilter.asParamsForServiceCall(filter); + expect(params["createdDateTime"]).to.equal("2024-01-01T00:00:00Z/2024-06-01T00:00:00Z"); + expect(params["modifiedDateTime"]).to.equal("2024-02-01T00:00:00Z/2024-07-01T00:00:00Z"); + }); + + it("should pass non-datetime fields through unchanged", () => { + const filter: RealityDataFilter = { iTwinId: "itwin-123", $top: 10 }; + const params = RealityDataFilter.asParamsForServiceCall(filter); + expect(params["iTwinId"]).to.equal("itwin-123"); + expect(params["$top"]).to.equal(10); + }); +}); + +describe("RealityCaptureService reality data API calls", function () { + let service: RealityCaptureService; + let axiosGetStub: sinon.SinonStub; + let axiosPostStub: sinon.SinonStub; + let axiosPatchStub: sinon.SinonStub; + let axiosDeleteStub: sinon.SinonStub; + + const rdId = "rd-uuid-001"; + const iTwinId = "itwin-uuid-001"; + + const sampleRealityData = { + id: rdId, + displayName: "Test RD", + type: "CCImageCollection", + createdDateTime: "2024-01-01T00:00:00Z", + modifiedDateTime: "2024-01-02T00:00:00Z", + lastAccessedDateTime: "2024-01-03T00:00:00Z", + dataCenterLocation: "East US", + size: 512, + }; + + const sampleContainerDetails = { + type: "AzureBlobSasUrl", + access: "Read", + _links: { containerUrl: { href: "https://blob.core.windows.net/container?sas=token" } }, + }; + + beforeEach(() => { + const getAccessTokenStub = sinon.stub().resolves("fake-token"); + const mockAuthClient = { getAccessToken: getAccessTokenStub } as AuthorizationClient; + service = new RealityCaptureService(mockAuthClient, { env: "dev" }); + + axiosGetStub = sinon.stub(); + axiosPostStub = sinon.stub(); + axiosPatchStub = sinon.stub(); + axiosDeleteStub = sinon.stub(); + (service as any)._axios = { + get: axiosGetStub, + post: axiosPostStub, + patch: axiosPatchStub, + delete: axiosDeleteStub, + }; + }); + + afterEach(() => { + sinon.restore(); + }); + + + it("getRealityData should return a Response on success", async () => { + axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + const result = await service.getRealityData(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(result).to.be.instanceOf(Response); + expect(result.isError()).to.be.false; + expect(result.value!.id).to.equal(rdId); + }); + + it("getRealityData with iTwinId should append query param", async () => { + axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + await service.getRealityData(rdId, iTwinId); + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}?iTwinId=${iTwinId}` + ); + }); + + it("getRealityData 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityData(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityData ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityData(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + + it("createRealityData should call axios.post and return a Response", async () => { + axiosPostStub.resolves({ status: 201, data: { realityData: sampleRealityData } }); + const create = { iTwinId, displayName: "Test RD", type: Type.CC_IMAGE_COLLECTION }; + const result = await service.createRealityData(create); + expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); + expect(axiosPostStub.firstCall.args[1]).to.deep.equal(create); + expect(result.isError()).to.be.false; + expect(result.value!.id).to.equal(rdId); + }); + + it("createRealityData 422 error", async () => { + axiosPostStub.rejects({ + response: { status: 422, data: { error: { code: "InvalidRealityData", message: "Invalid payload." } } } + }); + const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("InvalidRealityData"); + }); + + it("createRealityData ill formed error", async () => { + axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + + it("updateRealityData should call axios.patch and return a Response", async () => { + const updated = { ...sampleRealityData, displayName: "Updated RD" }; + axiosPatchStub.resolves({ status: 200, data: { realityData: updated } }); + const update = { displayName: "Updated RD" }; + const result = await service.updateRealityData(update, rdId); + expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(update); + expect(result.isError()).to.be.false; + expect(result.value!.displayName).to.equal("Updated RD"); + }); + + it("updateRealityData 401 error", async () => { + axiosPatchStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.updateRealityData({ displayName: "New" }, rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("updateRealityData ill formed error", async () => { + axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.updateRealityData({}, rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("deleteRealityData should call axios.delete and return a Response", async () => { + axiosDeleteStub.resolves({ status: 204, data: {} }); + const result = await service.deleteRealityData(rdId); + expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(result.isError()).to.be.false; + expect(result.value).to.be.null; + }); + + it("deleteRealityData 404 error", async () => { + axiosDeleteStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.deleteRealityData(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("deleteRealityData ill formed error", async () => { + axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.deleteRealityData(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataReadAccess should return a Response", async () => { + axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + const result = await service.getRealityDataReadAccess(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess` + ); + expect(result.isError()).to.be.false; + expect(result.value!.access).to.equal(Access.READ); + expect(result.value!._links.containerUrl.href).to.equal("https://blob.core.windows.net/container?sas=token"); + }); + + it("getRealityDataReadAccess with iTwinId should append query param only once", async () => { + axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + await service.getRealityDataReadAccess(rdId, iTwinId); + const calledUrl: string = axiosGetStub.firstCall.args[0]; + expect(calledUrl).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess?iTwinId=${iTwinId}` + ); + expect(calledUrl.split("iTwinId=").length - 1).to.equal(1); + }); + + it("getRealityDataReadAccess 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityDataReadAccess(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityDataReadAccess ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataReadAccess(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataWriteAccess should return a Response with WRITE access", async () => { + const writeDetails = { ...sampleContainerDetails, access: "Write" }; + axiosGetStub.resolves({ status: 200, data: writeDetails }); + const result = await service.getRealityDataWriteAccess(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess` + ); + expect(result.isError()).to.be.false; + expect(result.value!.access).to.equal(Access.WRITE); + }); + + it("getRealityDataWriteAccess with iTwinId should append query param only once", async () => { + axiosGetStub.resolves({ status: 200, data: { ...sampleContainerDetails, access: "Write" } }); + await service.getRealityDataWriteAccess(rdId, iTwinId); + const calledUrl: string = axiosGetStub.firstCall.args[0]; + expect(calledUrl).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess?iTwinId=${iTwinId}` + ); + expect(calledUrl.split("iTwinId=").length - 1).to.equal(1); + }); + + it("getRealityDataWriteAccess 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityDataWriteAccess(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityDataWriteAccess ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataWriteAccess(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataList should return a Response with minimal prefer", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [ + { id: "rd-001", displayName: "RD1", type: "CCImageCollection" }, + { id: "rd-002", displayName: "RD2", type: "LAS" }, + ], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/?continuationToken=token123" } }, + }, + }); + const result = await service.getRealityDataList(); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.false; + expect(result.value!.realityData).to.have.lengthOf(2); + }); + + it("getRealityDataList should send Prefer: return=representation when specified", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + }); + await service.getRealityDataList(undefined, Prefer.REPRESENTATION); + const callArgs = axiosGetStub.firstCall.args[1]; + expect(callArgs.headers["Prefer"]).to.equal("return=representation"); + }); + + it("getRealityDataList should send Prefer: return=minimal by default", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + }); + await service.getRealityDataList(); + const callArgs = axiosGetStub.firstCall.args[1]; + expect(callArgs.headers["Prefer"]).to.equal("return=minimal"); + }); + + it("getRealityDataList should pass filter as params", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + }); + await service.getRealityDataList({ iTwinId, $top: 10 }); + const callArgs = axiosGetStub.firstCall.args[1]; + expect(callArgs.params).to.deep.equal({ iTwinId, $top: 10 }); + }); + + it("getRealityDataList 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityDataList(); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityDataList ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataList(); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("moveRealityData should call axios.patch on the move endpoint", async () => { + axiosPatchStub.resolves({ status: 200, data: {} }); + const result = await service.moveRealityData(rdId, iTwinId); + expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/move` + ); + expect(axiosPatchStub.firstCall.args[1]).to.deep.equal({ iTwinId }); + expect(result.isError()).to.be.false; + expect(result.value).to.be.null; + }); + + it("moveRealityData 404 error", async () => { + axiosPatchStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.moveRealityData(rdId, iTwinId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("moveRealityData ill formed error", async () => { + axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.moveRealityData(rdId, iTwinId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataITwins should return a Response", async () => { + axiosGetStub.resolves({ status: 200, data: { iTwins: ["itwin-001", "itwin-002"] } }); + const result = await service.getRealityDataITwins(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins` + ); + expect(result.isError()).to.be.false; + expect(result.value).to.deep.equal(["itwin-001", "itwin-002"]); + }); + + it("getRealityDataITwins 404 error", async () => { + axiosGetStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.getRealityDataITwins(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("getRealityDataITwins ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataITwins(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityData should encode the realityDataId in the URL", async () => { + axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + const specialId = "rd/with special&chars"; + await service.getRealityData(specialId); + expect(axiosGetStub.firstCall.args[0]).to.include(encodeURIComponent(specialId)); + }); + + it("deleteRealityData should encode the realityDataId in the URL", async () => { + axiosDeleteStub.resolves({ status: 204, data: {} }); + const specialId = "rd/with special&chars"; + await service.deleteRealityData(specialId); + expect(axiosDeleteStub.firstCall.args[0]).to.include(encodeURIComponent(specialId)); + }); +}); diff --git a/typescript/packages/reality-capture/src/tests/service/service.test.ts b/typescript/packages/reality-capture/src/tests/service/service.test.ts index 1384f494..c3a4a566 100644 --- a/typescript/packages/reality-capture/src/tests/service/service.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/service.test.ts @@ -6,6 +6,7 @@ import { Response } from "../../service/response"; import { JobCreate, JobType, Service } from "../../service/job"; import { CostEstimationCreate } from "../../service/estimation"; import { DetectorBase, DetectorExport, DetectorType, DetectorUpdate, DetectorVersionCreate } from "../../service/detectors"; +import { Access, Prefer, RealityDataFilter, Type } from "../../service/reality_data"; describe("RealityCaptureService tests", function () { it("should validate RealityCaptureService urls based on environment", async () => { @@ -1030,4 +1031,345 @@ describe("RealityCaptureService API calls tests", function () { expect(result.isError()).to.be.true; expect(result.error!.error.code).to.equal("UnknownError"); }); + + const rdId = "rd-uuid-001"; + const sampleRealityData = { + id: rdId, + displayName: "Test RD", + type: "CCImageCollection", + createdDateTime: "2024-01-01T00:00:00Z", + modifiedDateTime: "2024-01-02T00:00:00Z", + lastAccessedDateTime: "2024-01-03T00:00:00Z", + dataCenterLocation: "East US", + size: 512, + }; + const sampleContainerDetails = { + type: "AzureBlobSasUrl", + access: "Read", + _links: { containerUrl: { href: "https://blob.core.windows.net/container?sas=token" } }, + }; + + it("getRealityData should return a Response on success", async () => { + axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + const result = await service.getRealityData(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(result).to.be.instanceOf(Response); + expect(result.isError()).to.be.false; + expect(result.value!.id).to.equal(rdId); + }); + + it("getRealityData with iTwinId should append query param", async () => { + axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + await service.getRealityData(rdId, iTwinId); + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}?iTwinId=${iTwinId}` + ); + }); + + it("getRealityData 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityData(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityData ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityData(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("createRealityData should call axios.post and return a Response", async () => { + axiosPostStub.resolves({ status: 201, data: { realityData: sampleRealityData } }); + const create = { iTwinId, displayName: "Test RD", type: Type.CC_IMAGE_COLLECTION }; + const result = await service.createRealityData(create); + expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); + expect(axiosPostStub.firstCall.args[1]).to.deep.equal(create); + expect(result.isError()).to.be.false; + expect(result.value!.id).to.equal(rdId); + }); + + it("createRealityData 422 error", async () => { + axiosPostStub.rejects({ + response: { status: 422, data: { error: { code: "InvalidRealityData", message: "Invalid payload." } } } + }); + const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); + expect(axiosPostStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("InvalidRealityData"); + }); + + it("createRealityData ill formed error", async () => { + axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("updateRealityData should call axios.patch and return a Response", async () => { + const updated = { ...sampleRealityData, displayName: "Updated RD" }; + axiosPatchStub.resolves({ status: 200, data: { realityData: updated } }); + const update = { displayName: "Updated RD" }; + const result = await service.updateRealityData(update, rdId); + expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(update); + expect(result.isError()).to.be.false; + expect(result.value!.displayName).to.equal("Updated RD"); + }); + + it("updateRealityData 401 error", async () => { + axiosPatchStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.updateRealityData({ displayName: "New" }, rdId); + expect(axiosPatchStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("updateRealityData ill formed error", async () => { + axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.updateRealityData({}, rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("deleteRealityData should call axios.delete and return a Response", async () => { + axiosDeleteStub.resolves({ status: 204, data: {} }); + const result = await service.deleteRealityData(rdId); + expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(result.isError()).to.be.false; + expect(result.value).to.be.null; + }); + + it("deleteRealityData 404 error", async () => { + axiosDeleteStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.deleteRealityData(rdId); + expect(axiosDeleteStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("deleteRealityData ill formed error", async () => { + axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.deleteRealityData(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataReadAccess should return a Response", async () => { + axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + const result = await service.getRealityDataReadAccess(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess` + ); + expect(result.isError()).to.be.false; + expect(result.value!.access).to.equal(Access.READ); + expect(result.value!._links.containerUrl.href).to.equal("https://blob.core.windows.net/container?sas=token"); + }); + + it("getRealityDataReadAccess with iTwinId should append query param only once", async () => { + axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + await service.getRealityDataReadAccess(rdId, iTwinId); + const calledUrl: string = axiosGetStub.firstCall.args[0]; + expect(calledUrl).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess?iTwinId=${iTwinId}` + ); + expect(calledUrl.split("iTwinId=").length - 1).to.equal(1); + }); + + it("getRealityDataReadAccess 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityDataReadAccess(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityDataReadAccess ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataReadAccess(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataWriteAccess should return a Response with WRITE access", async () => { + const writeDetails = { ...sampleContainerDetails, access: "Write" }; + axiosGetStub.resolves({ status: 200, data: writeDetails }); + const result = await service.getRealityDataWriteAccess(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess` + ); + expect(result.isError()).to.be.false; + expect(result.value!.access).to.equal(Access.WRITE); + }); + + it("getRealityDataWriteAccess with iTwinId should append query param only once", async () => { + axiosGetStub.resolves({ status: 200, data: { ...sampleContainerDetails, access: "Write" } }); + await service.getRealityDataWriteAccess(rdId, iTwinId); + const calledUrl: string = axiosGetStub.firstCall.args[0]; + expect(calledUrl).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess?iTwinId=${iTwinId}` + ); + expect(calledUrl.split("iTwinId=").length - 1).to.equal(1); + }); + + it("getRealityDataWriteAccess 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityDataWriteAccess(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityDataWriteAccess ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataWriteAccess(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataList should return a Response", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [ + { id: "rd-001", displayName: "RD1", type: "CCImageCollection" }, + { id: "rd-002", displayName: "RD2", type: "LAS" }, + ], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/?continuationToken=token123" } }, + }, + }); + const result = await service.getRealityDataList(); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.false; + expect(result.value!.realityData).to.have.lengthOf(2); + }); + + it("getRealityDataList should send Prefer: return=representation when specified", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + }); + await service.getRealityDataList(undefined, Prefer.REPRESENTATION); + expect(axiosGetStub.firstCall.args[1].headers["Prefer"]).to.equal("return=representation"); + }); + + it("getRealityDataList should send Prefer: return=minimal by default", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + }); + await service.getRealityDataList(); + expect(axiosGetStub.firstCall.args[1].headers["Prefer"]).to.equal("return=minimal"); + }); + + it("getRealityDataList should pass filter as params", async () => { + axiosGetStub.resolves({ + status: 200, + data: { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + }); + const filter: RealityDataFilter = { iTwinId, $top: 10 }; + await service.getRealityDataList(filter); + expect(axiosGetStub.firstCall.args[1].params).to.deep.equal({ iTwinId, $top: 10 }); + }); + + it("getRealityDataList 401 error", async () => { + axiosGetStub.rejects({ + response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } + }); + const result = await service.getRealityDataList(); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("HeaderNotFound"); + }); + + it("getRealityDataList ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataList(); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("moveRealityData should call axios.patch on the move endpoint", async () => { + axiosPatchStub.resolves({ status: 200, data: {} }); + const result = await service.moveRealityData(rdId, iTwinId); + expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/move` + ); + expect(axiosPatchStub.firstCall.args[1]).to.deep.equal({ iTwinId }); + expect(result.isError()).to.be.false; + expect(result.value).to.be.null; + }); + + it("moveRealityData 404 error", async () => { + axiosPatchStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.moveRealityData(rdId, iTwinId); + expect(axiosPatchStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("moveRealityData ill formed error", async () => { + axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.moveRealityData(rdId, iTwinId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + it("getRealityDataITwins should return a Response", async () => { + axiosGetStub.resolves({ status: 200, data: { iTwins: ["itwin-001", "itwin-002"] } }); + const result = await service.getRealityDataITwins(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins` + ); + expect(result.isError()).to.be.false; + expect(result.value).to.deep.equal(["itwin-001", "itwin-002"]); + }); + + it("getRealityDataITwins 404 error", async () => { + axiosGetStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.getRealityDataITwins(rdId); + expect(axiosGetStub.calledOnce).to.be.true; + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("getRealityDataITwins ill formed error", async () => { + axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.getRealityDataITwins(rdId); + expect(result.isError()).to.be.true; + expect(result.error!.error.code).to.equal("UnknownError"); + }); }); diff --git a/typescript/packages/reality-data-client/.gitignore b/typescript/packages/reality-data-client/.gitignore deleted file mode 100644 index 740f05fb..00000000 --- a/typescript/packages/reality-data-client/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules/ -lib/ -.env* -src/index.ts -.vscode/* -!.vscode/launch.json diff --git a/typescript/packages/reality-data-client/CHANGELOG.json b/typescript/packages/reality-data-client/CHANGELOG.json deleted file mode 100644 index 501aa9b7..00000000 --- a/typescript/packages/reality-data-client/CHANGELOG.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "name": "@itwin/reality-data-client", - "entries": [ - { - "date": "Thu, 18 Jun 2026 15:27:31 GMT", - "version": "1.5.1", - "tag": "@itwin/reality-data-client_v1.5.1", - "comments": { - "patch": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-data-client", - "commit": "12c46cd59dcd9109f5bade79c0611f4c4107c764", - "comment": "Update axios" - } - ] - } - }, - { - "date": "Mon, 15 Jun 2026 14:39:48 GMT", - "version": "1.5.0", - "tag": "@itwin/reality-data-client_v1.5.0", - "comments": { - "minor": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-data-client", - "commit": "5e5d4f37ebf10cb5a231a247f2ec34bfed8086f4", - "comment": "Update Reality Data models with latest API additions" - } - ] - } - }, - { - "date": "Thu, 20 Nov 2025 15:18:53 GMT", - "version": "1.4.0", - "tag": "@itwin/reality-data-client_v1.4.0", - "comments": { - "minor": [ - { - "author": "Marc-Andre.Cote@bentley.com", - "package": "@itwin/reality-data-client", - "commit": "fdca85c1e775c2d0bf54d901b764bd53b2c4eabd", - "comment": "Added moveRealityData method and new reality data properties : Crs, Attribution & termsOfUse" - } - ] - } - }, - { - "date": "Tue, 08 Jul 2025 14:00:52 GMT", - "version": "1.3.1", - "tag": "@itwin/reality-data-client_v1.3.1", - "comments": { - "patch": [ - { - "author": "bipin.pachhai@bentley.com", - "package": "@itwin/reality-data-client", - "commit": "26dade53226b941a3fad8261c510762d27c5bf85", - "comment": "Update core dev packages on devDependencies with released versions" - } - ] - } - }, - { - "date": "Thu, 12 Jun 2025 14:09:49 GMT", - "version": "1.3.0", - "tag": "@itwin/reality-data-client_v1.3.0", - "comments": { - "minor": [ - { - "author": "bipin.pachhai@bentley.com", - "package": "@itwin/reality-data-client", - "commit": "f447714f12be7c5782782697990eab6484ea55e6", - "comment": "Add support for iTwin.js Core 5.x" - } - ] - } - }, - { - "date": "Thu, 07 Nov 2024 14:16:10 GMT", - "version": "1.2.2", - "tag": "@itwin/reality-data-client_v1.2.2", - "comments": { - "patch": [ - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-data-client", - "commit": "5396b814e5640bf45929cf9bf6e99a1961eb7752", - "comment": "Update typescript version from v4 to v5" - } - ] - } - }, - { - "date": "Wed, 28 Feb 2024 14:48:34 GMT", - "version": "1.2.1", - "tag": "@itwin/reality-data-client_v1.2.1", - "comments": { - "patch": [ - { - "author": "Marc-Andre.Cote@bentley.com", - "package": "@itwin/reality-data-client", - "commit": "1db484be28fee97ae41be1ec197614332443aa95", - "comment": "Updated documentation in RealityData listing query parameters" - } - ] - } - }, - { - "date": "Mon, 26 Feb 2024 20:54:34 GMT", - "version": "1.2.0", - "tag": "@itwin/reality-data-client_v1.2.0", - "comments": { - "minor": [ - { - "author": "Marc-Andre.Cote@bentley.com", - "package": "@itwin/reality-data-client", - "commit": "85cee933611277f38c2c013e986765a8286b4939", - "comment": "Implemented Additional Request Parameters & RealityData Tags" - } - ] - } - }, - { - "date": "Tue, 11 Jul 2023 14:02:19 GMT", - "tag": "@itwin/reality-data-client_v1.1.0", - "version": "1.1.0", - "comments": { - "minor": [ - { - "author": "Marc-Andre.Cote@bentley.com", - "package": "@itwin/reality-data-client", - "commit": "a691cd835d2a447a2c6ad2187ba48818469d0b30", - "comment": "- Ported iTwin/reality-data-client to [Reality Management API](https://developer.bentley.com/apis/reality-management/) following deprecation of [Reality Data API](https://developer.bentley.com/apis/reality-data/) \n- No breaking changes should occur.\n- Interfaces with iTwin/core-common should still be respected\n- `getRealityDataProjects` method is now deprecated\n- `getRealityDataITwins` added to replace deprecated `getRealityDataProjects` method\n- `accessControl` property is now deprecated as it is not in Reality Management API. Still defined in `ITwinRealityData` object but does not do anything." - } - ] - } - }, - { - "date": "Wed, 31 May 2023 21:24:48 GMT", - "tag": "@itwin/reality-data-client_v1.0.0", - "version": "1.0.0", - "comments": { - "major": [ - { - "author": "aruniverse@users.noreply.github.com", - "package": "@itwin/reality-data-client", - "commit": "56c052e89c57a3862caf1c38dedef018792fee17", - "comment": "1.0 release of iTwin/reality-data-client" - } - ] - } - } - ] -} diff --git a/typescript/packages/reality-data-client/CHANGELOG.md b/typescript/packages/reality-data-client/CHANGELOG.md deleted file mode 100644 index e793a6ee..00000000 --- a/typescript/packages/reality-data-client/CHANGELOG.md +++ /dev/null @@ -1,97 +0,0 @@ -# Change Log - @itwin/reality-data-client - - - - - -## 1.5.1 - -Thu, 18 Jun 2026 15:27:31 GMT - -### Patches - -- Update axios (5690282+cnovel@users.noreply.github.com) - -## 1.5.0 - -Mon, 15 Jun 2026 14:39:48 GMT - -### Minor changes - -- Update Reality Data models with latest API additions (5690282+cnovel@users.noreply.github.com) - -## 1.4.0 - -Thu, 20 Nov 2025 15:18:53 GMT - -### Minor changes - -- Added moveRealityData method and new reality data properties : Crs, Attribution & termsOfUse (Marc-Andre.Cote@bentley.com) - -## 1.3.1 - -Tue, 08 Jul 2025 14:00:52 GMT - -### Patches - -- Update core dev packages on devDependencies with released versions (bipin.pachhai@bentley.com) - -## 1.3.0 - -Thu, 12 Jun 2025 14:09:49 GMT - -### Minor changes - -- Add support for iTwin.js Core 5.x (bipin.pachhai@bentley.com) - -## 1.2.2 - -Thu, 07 Nov 2024 14:16:10 GMT - -### Patches - -- Update typescript version from v4 to v5 (110406974+dbiguenet@users.noreply.github.com) - -## 1.2.1 - -Wed, 28 Feb 2024 14:48:34 GMT - -### Patches - -- Updated documentation in RealityData listing query parameters (Marc-Andre.Cote@bentley.com) - -## 1.2.0 - -Mon, 26 Feb 2024 20:54:34 GMT - -### Minor changes - -- Implemented Additional Request Parameters & RealityData Tags (Marc-Andre.Cote@bentley.com) - -## 1.1.0 - -Tue, 11 Jul 2023 14:02:19 GMT - -### Minor changes - -- - Ported iTwin/reality-data-client to [Reality Management API](https://developer.bentley.com/apis/reality-management/) following deprecation of [Reality Data API](https://developer.bentley.com/apis/reality-data/) -- No breaking changes should occur. -- Interfaces with iTwin/core-common should still be respected -- `getRealityDataProjects` method is now deprecated -- `getRealityDataITwins` added to replace deprecated `getRealityDataProjects` method -- `accessControl` property is now deprecated as it is not in Reality Management API. Still defined in `ITwinRealityData` object but does not do anything. (Marc-Andre.Cote@bentley.com) - -## 1.0.0 - -Wed, 31 May 2023 21:24:48 GMT - -### Major changes - -- 1.0 release of iTwin/reality-data-client (aruniverse@users.noreply.github.com) - -## 0.9.0 (2022-06-07) - -### - Added new option `authorizationClient` to `RealityDataClientOptions` - -Defines Authorization client to use to get access token to Context Share API (authority: ) -When defined it will ignore accessToken from API parameters and will get an access token from this client. diff --git a/typescript/packages/reality-data-client/LICENSE.md b/typescript/packages/reality-data-client/LICENSE.md deleted file mode 100644 index cb5ce049..00000000 --- a/typescript/packages/reality-data-client/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -# MIT License - -Copyright © 2017-2023 Bentley Systems, Incorporated. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/typescript/packages/reality-data-client/README.md b/typescript/packages/reality-data-client/README.md deleted file mode 100644 index d6da16bb..00000000 --- a/typescript/packages/reality-data-client/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# @iTwin/reality-data-client - -Copyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice. - -## Description - -The __@iTwin/reality-data-client__ package contains client wrappers for sending requests to the Reality Management API, part of the iTwin platform. - -You must use version `v1.1.0` or greater, as earlier versions uses the deprecated Reality Data API. - -[iTwin.js](http://www.itwinjs.org) is an open source platform for creating, querying, modifying, and displaying Infrastructure Digital Twins. To learn more about the iTwin Platform and its APIs, visit the [iTwin developer portal](https://developer.bentley.com/). - -## Documentation - -Visit the [iTwin developer portal](https://developer.bentley.com/apis/reality-management/) for more information and documentation about the Reality Management API. - -## Requirements - -A registered application in the iTwin Platform is needed for using the Reality Data Client. Documentation for registering an application can be found [here.](https://developer.bentley.com/tutorials/register-and-modify-application/) Make sure that your application has the `itwin-platform` scope enabled. - -To use the Reality Management API you will need to have an access to an iTwin. If you don't have one already, contact one of your Organization Administrators or take some time to go through the following tutorial: Create an [iTwin](https://developer.bentley.com/tutorials/create-and-query-itwins-guide/). - -To build and run the Reality Data Client, you will need [Node.js](https://nodejs.org/en/) v22 (must be greater than 22.14.x). - -## Authorization - -This client uses the `AccessToken` class from __@iTwin/core-bentley__ to represent the authorization token. It may be used as a string. The `AccessToken` may be passed into method parameters whenever called. - -## Key Types and Methods - -### ITwinRealityData - -Implements the `RealityData` interface from __@itwin/core-common__ and represents a single reality data. This class contains properties representing the descriptive data related to a reality data, as well as an access point to the data stored in a blob container. `ITwinRealityData` are bound to an `iTwinId`, which is the identifier of an iTwin. [More information about the iTwin API here.](https://developer.bentley.com/apis/itwins/) - -ITwinRealityData implements a `getBlobUrl()` method that returns the location of the reality data's blob content. This resource is also cached, as to limit the amount of API calls and SAS keys keys to generate. - -### RealityDataAccessClient - -Implements the `RealityDataAccess` interface from __@itwin/core-common__ and serves a client wrapper to the Reality Management API. It contains all the necessary methods to fulfill any workflow related to creating and consuming reality data. Key methods are listed below, and **keep in mind the terms Project and iTwin are used interchangeably.** - -- `getRealityData` : returns the specified reality data with all of its properties -- `getRealityDataUrl` : returns the URL to obtain the Reality Data details. -- `getRealityDatas` : returns all reality data associated with the iTwin. -- `getRealityDataITwins` : Retrieves the list of iTwins associated to the specified realityData. -- `createRealityData` : Creates a RealityData -- `modifyRealityData` : Modifies an existing RealityData -- `deleteRealityData` : Deletes a RealityData -- `associateRealityData` : Associates a RealityData from an iTwin -- `dissociateRealityData` : Dissociates a RealityData from an iTwin - -## Usage example - -The example below demonstrates a workflow where one could create a `RealityData` and upload a `Cesium3DTiles` model to it. - -```ts - -private async realityDataClient_examples(iTwinId: string) { - - var rdaClient = new RealityDataAccessClient(); - let token: string = "Access token value"; - - // Define some data for the reality data to create. - // We want to create a reality data representing a Cesium3DTiles model, so the type of the reality data must be "Cesium3DTiles" - // and the rootDocument must point to the root of the model, in this case "tileset.json". - // Thus, a client interpreting the reality data can find out which file format it handles, and what is the index (or root) of the data (tileset.json). - const realityData = new ITwinRealityData(rdaClient, null, iTwinId); - realityData.displayName = "RealityData Cesium 3DTiles model"; - realityData.dataset = "Test Dataset for iTwinjs"; - realityData.group = "Test group"; - realityData.description = "Reality data created using reality-data-client"; - realityData.rootDocument = "tileset.json"; - realityData.classification = "Model"; - realityData.type = "Cesium3DTiles"; - realityData.acquisition = { - startDateTime: new Date("2021-05-10T09:46:16Z"), - endDateTime: new Date("2021-05-10T12:46:16Z"), - acquirer: "John Doe Surveying using Leico model 123A Point Cloud Scanner", - }; - realityData.authoring = false; - - let realityDataId: string | undefined = undefined; - try { - // Create the reality data - const iTwinRealityData: ITwinRealityData = await rdaClient.createRealityData(token, iTwinId, realityData); - realityDataId = iTwinRealityData.id; - - // Get the reality data - const iTwinRealityData_get: ITwinRealityData = await rdaClient.getRealityData(token, iTwinId, iTwinRealityData.id); - - // Get the blob url to upload to it a Cesium 3DTiles model - const azureBlobUrl: URL = await iTwinRealityData.getBlobUrl(token, "", true); - - // Use Azure SDK's ContainerClient class to upload data to the Azure blob - const containerClient = new ContainerClient(azureBlobUrl.toString()); - - let filePath = "./data/cesium3DTiles/"; - - // The sample 3DTiles model is composed of a root document (tileset.json) and three b3dm files. - // Upload each file to its own blob - let blobName = "tileset.json"; - let blockBlobClient = containerClient.getBlockBlobClient(blobName); - let uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "tileset.json"); - console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); - - blobName = "dragon_high.b3dm"; - blockBlobClient = containerClient.getBlockBlobClient(blobName); - uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "dragon_high.b3dm"); - console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); - - blobName = "dragon_low.b3dm"; - blockBlobClient = containerClient.getBlockBlobClient(blobName); - uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "dragon_low.b3dm"); - console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); - - blobName = "dragon_medium.b3dm"; - blockBlobClient = containerClient.getBlockBlobClient(blobName); - uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "dragon_medium.b3dm"); - console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); - - // This shows how to create a sub-folder in your container, if you ever need to. - blobName = "readme/README.md"; - blockBlobClient = containerClient.getBlockBlobClient(blobName); - uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "readme/README.md"); - console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); - - // Delete the reality data that we just created - await rdaClient.deleteRealityData(token, iTwinRealityData.id); - - console.log("Successful requests using reality-data-client !\n"); - - } catch (error: any) { - // Try to clean up created reality data - if (realityDataId !== undefined) { - await rdaClient.deleteRealityData(token, realityDataId); - } - console.log("reality-data-client error: " + error + "\n"); - } - } - -``` diff --git a/typescript/packages/reality-data-client/beachball.config.dev.js b/typescript/packages/reality-data-client/beachball.config.dev.js deleted file mode 100644 index 700b7bba..00000000 --- a/typescript/packages/reality-data-client/beachball.config.dev.js +++ /dev/null @@ -1,14 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ -const base = require("./beachball.config.js"); - -/** @type {import("beachball").BeachballConfig } */ -module.exports = { - ...base, - tag: "nightly", - prereleasePrefix: "dev", - generateChangelog: false, - gitTags: false, -}; \ No newline at end of file diff --git a/typescript/packages/reality-data-client/beachball.config.js b/typescript/packages/reality-data-client/beachball.config.js deleted file mode 100644 index 946fefcb..00000000 --- a/typescript/packages/reality-data-client/beachball.config.js +++ /dev/null @@ -1,20 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ -/** @type {import("beachball").BeachballConfig } */ -module.exports = { - bumpDeps: false, - access: "public", - tag: "latest", - ignorePatterns: [ - ".nycrc", - ".eslintrc.json", - "tsconfig.*", - ".*ignore", - ".github/**", - ".vscode/**", - "pnpm-lock.yaml", - ], - changehint: "Run 'pnpm change' to generate a change file", - }; \ No newline at end of file diff --git a/typescript/packages/reality-data-client/certa.json b/typescript/packages/reality-data-client/certa.json deleted file mode 100644 index 46719abb..00000000 --- a/typescript/packages/reality-data-client/certa.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - // Comments are allowed here! - "testBundle": "./lib/cjs/test/webpack/bundled-tests.js", - // "instrumentedTestBundle": "./lib/cjs/test/webpack/bundled-tests.instrumented.js", - "backendInitModule": "./node_modules/@itwin/oidc-signin-tool/lib/cjs/certa/certaBackend.js", - "ports": { - "debugging": 5858, - "frontend": 3000, - "frontendDebugging": 9223 - }, - "mochaOptions": { - "timeout": 50000, - "reporter": "node_modules/@itwin/build-tools/mocha-reporter", - "reporterOptions": { - "mochaFile": "lib/test/junit_results.xml" - } - }, - "chromeOptions": { - "args": [ - "--disable-web-security", - "--no-sandbox" - ] - } -} \ No newline at end of file diff --git a/typescript/packages/reality-data-client/eslint.config.js b/typescript/packages/reality-data-client/eslint.config.js deleted file mode 100644 index 7aadba13..00000000 --- a/typescript/packages/reality-data-client/eslint.config.js +++ /dev/null @@ -1,18 +0,0 @@ -const iTwinPlugin = require("@itwin/eslint-plugin"); - -module.exports = [ - { - files: ["**/*.{ts,tsx}"], - ...iTwinPlugin.configs.iTwinjsRecommendedConfig, - }, - { - files: ["**/*.{ts,tsx}"], - ...iTwinPlugin.configs.jsdocConfig, - }, - { - rules: { - "no-duplicate-imports": "error", - "@typescript-eslint/consistent-type-imports": "error" - } - } - ]; \ No newline at end of file diff --git a/typescript/packages/reality-data-client/package.json b/typescript/packages/reality-data-client/package.json deleted file mode 100644 index a8b38e7c..00000000 --- a/typescript/packages/reality-data-client/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "@itwin/reality-data-client", - "version": "1.5.1", - "description": "HTTP Client for the iTwin Platform Reality Management APIs", - "main": "lib/cjs/reality-data-client.js", - "module": "lib/esm/reality-data-client.js", - "typings": "lib/cjs/reality-data-client", - "license": "MIT", - "keywords": [ - "Bentley", - "iTwin", - "BIM", - "iModel", - "Reality Data Client" - ], - "author": { - "name": "Bentley Systems, Inc.", - "url": "http://www.bentley.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/iTwin/reality-capture.git", - "directory": "typescript/packages/reality-data-client" - }, - "scripts": { - "compile": "npm run -s build", - "build": "npm run -s build:cjs && npm run -s build:esm", - "build:cjs": "tsc 1>&2 --outDir lib/cjs", - "build:esm": "tsc 1>&2 --module ES2020 --outDir lib/esm", - "clean": "rimraf lib", - "extract-api": "betools extract-api --entry=reality-data-client", - "docs": "betools docs --includes=../../generated-docs/extract --json=../../generated-docs/clients/reality-data-client/file.json --tsIndexFile=reality-data-client.ts --onlyJson", - "lint": "eslint -f visualstudio \"./src/**/*.ts\" 1>&2", - "lint:fix": "npm run lint -- --fix", - "webpackTests": "webpack --config ./src/test/utils/webpack.config.js 1>&2", - "test": "", - "test:integration": "npm run build && npm run -s webpackTests && npm run -s test:integration:chrome", - "test:integration:chrome": "certa -r chrome --grep \"#integration\"", - "test:integration:electron": "certa -r electron --grep \"#integration\"", - "change": "beachball change --no-commit", - "check": "beachball check", - "version-bump": "beachball bump", - "publish-packages": "beachball publish", - "version-bump-dev": "beachball bump --config beachball.config.dev.js --keep-change-files", - "publish-packages-dev": "beachball publish --config beachball.config.dev.js --keep-change-files" - }, - "dependencies": { - "axios": "^1.18.0" - }, - "devDependencies": { - "@itwin/build-tools": "^5.0.2", - "@itwin/certa": "^5.0.2", - "@itwin/core-bentley": "^5.0.2", - "@itwin/core-common": "^5.0.2", - "@itwin/core-geometry": "^5.0.2", - "@itwin/eslint-plugin": "^5.2.1", - "@itwin/oidc-signin-tool": "^5.1.3", - "@types/chai": "^4.3.0", - "@types/chai-as-promised": "^7.1.4", - "@types/mocha": "^9.1.0", - "beachball": "^2.31.12", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.1", - "dotenv": "^16.0.3", - "dotenv-expand": "^5.1.0", - "eslint": "^8.36.0", - "eslint-plugin-deprecation": "^1.3.3", - "@playwright/test": "~1.56.1", - "rimraf": "^4.4.1", - "source-map-loader": "^1.0.0", - "typescript": "~5.6.3", - "webpack": "^5.94.0", - "webpack-cli": "^5.0.2" - }, - "peerDependencies": { - "@itwin/core-bentley": "^4.0.0 || ^5.0.0" - } -} diff --git a/typescript/packages/reality-data-client/pnpm-lock.yaml b/typescript/packages/reality-data-client/pnpm-lock.yaml deleted file mode 100644 index 8ac6f720..00000000 --- a/typescript/packages/reality-data-client/pnpm-lock.yaml +++ /dev/null @@ -1,6138 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - axios: - specifier: ^1.18.0 - version: 1.18.0 - devDependencies: - '@itwin/build-tools': - specifier: ^5.0.2 - version: 5.10.0(@types/node@25.9.2)(supports-color@8.1.1) - '@itwin/certa': - specifier: ^5.0.2 - version: 5.10.0 - '@itwin/core-bentley': - specifier: ^5.0.2 - version: 5.10.0 - '@itwin/core-common': - specifier: ^5.0.2 - version: 5.10.0(@itwin/core-bentley@5.10.0)(@itwin/core-geometry@5.10.0) - '@itwin/core-geometry': - specifier: ^5.0.2 - version: 5.10.0 - '@itwin/eslint-plugin': - specifier: ^5.2.1 - version: 5.2.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - '@itwin/oidc-signin-tool': - specifier: ^5.1.3 - version: 5.1.3(@itwin/core-bentley@5.10.0)(supports-color@8.1.1) - '@playwright/test': - specifier: ~1.56.1 - version: 1.56.1 - '@types/chai': - specifier: ^4.3.0 - version: 4.3.20 - '@types/chai-as-promised': - specifier: ^7.1.4 - version: 7.1.8 - '@types/mocha': - specifier: ^9.1.0 - version: 9.1.1 - beachball: - specifier: ^2.31.12 - version: 2.65.5(typescript@5.6.3) - chai: - specifier: ^4.3.4 - version: 4.5.0 - chai-as-promised: - specifier: ^7.1.1 - version: 7.1.2(chai@4.5.0) - dotenv: - specifier: ^16.0.3 - version: 16.6.1 - dotenv-expand: - specifier: ^5.1.0 - version: 5.1.0 - eslint: - specifier: ^8.36.0 - version: 8.57.1(supports-color@8.1.1) - eslint-plugin-deprecation: - specifier: ^1.3.3 - version: 1.6.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - rimraf: - specifier: ^4.4.1 - version: 4.4.1 - source-map-loader: - specifier: ^1.0.0 - version: 1.1.3(webpack@5.107.2) - typescript: - specifier: ~5.6.3 - version: 5.6.3 - webpack: - specifier: ^5.94.0 - version: 5.107.2(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.0.2 - version: 5.1.4(webpack@5.107.2) - -packages: - - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@es-joy/jsdoccomment@0.50.2': - resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} - engines: {node: '>=18'} - - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@gerrit0/mini-shiki@3.23.0': - resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@itwin/build-tools@5.10.0': - resolution: {integrity: sha512-1EgakIHbJpLB2OMTMU1o1Hx2GwyJTxrbky9AgkKB7VPheQwpSGh7MlmwTbRTw+U0SLiRb1LeuMYH1DnryW1wBA==} - hasBin: true - - '@itwin/certa@5.10.0': - resolution: {integrity: sha512-LIbnl7uprikW/U971C/R/Lxl5lYsIXbOKe9SJgy+NgKKkCHzxPIBcgF8xya+uF3vgd9SIkqhiQXdtNm5VtHlHA==} - hasBin: true - peerDependencies: - electron: ^35.0.0 || ^36.0.0 || ^37.0.0 || ^38.0.0 || ^39.0.0 || ^40.0.0 || ^41.0.0 || ^42.0.0 - peerDependenciesMeta: - electron: - optional: true - - '@itwin/core-bentley@5.10.0': - resolution: {integrity: sha512-N+OPL3rAbI6zNmlqF/+K58XU9f4reirNWtvt3qUxRRgVV6HSA/DqvigApyPMLA9hQCrxfEPfsjFec/z05WnaBA==} - - '@itwin/core-common@5.10.0': - resolution: {integrity: sha512-GcMmlSgRSrFIgvMqz0Jk0W3Ri0KbPieqVwEMTF5CTDa/Llbz5syWfDk+gwG9L5R3V6zY5XszsSV6coTicxu84w==} - peerDependencies: - '@itwin/core-bentley': 5.10.0 - '@itwin/core-geometry': 5.10.0 - - '@itwin/core-geometry@5.10.0': - resolution: {integrity: sha512-T/lRcONx4QK3RxTatBGyLqXn+H9KGUKIynkZxkxiLFUV4/4q87V8wwBPq8ufuJU4Wnf/xX88RvNe7dLMlYzm+Q==} - - '@itwin/eslint-plugin@5.2.1': - resolution: {integrity: sha512-iFmxAXzBYUm/yHiyp37V8Qn2oZ9iqwB1HxWX1AAhewk77JUIhO1KLY2hrBNisHx49giy7hZmIOBEaXc357z+Uw==} - engines: {node: ^18.18.0 || ^20.0.0 || ^22.0.0} - hasBin: true - peerDependencies: - eslint: ^9.11.1 - typescript: ^3.7.0 || ^4.0.0 || ^5.0.0 - - '@itwin/oidc-signin-tool@5.1.3': - resolution: {integrity: sha512-cOl6cS/xd8hnM5T/EKK45V0voG1G5745MWJuUpy8838J+FU5TvOUMaECQlWy7uYP0BD9LBGULjgDu+i1/BhEmA==} - peerDependencies: - '@itwin/core-bentley': ^5.0.0 - - '@itwin/service-authorization@2.1.1': - resolution: {integrity: sha512-IqW/ALUccCHhQDM7HqRTNCHsoerioZsSPKf3AI054N2coEf59vYg5MqiSfaKGRMwkDM7C952kDC+M5BL4kA8qQ==} - peerDependencies: - '@itwin/core-bentley': ^5.0.0 - - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@microsoft/api-extractor-model@7.33.8': - resolution: {integrity: sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==} - - '@microsoft/api-extractor@7.58.7': - resolution: {integrity: sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==} - hasBin: true - - '@microsoft/tsdoc-config@0.18.1': - resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} - - '@microsoft/tsdoc@0.16.0': - resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@playwright/test@1.56.1': - resolution: {integrity: sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==} - engines: {node: '>=18'} - hasBin: true - - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/node-core-library@5.23.1': - resolution: {integrity: sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - '@rushstack/problem-matcher@0.2.1': - resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - '@rushstack/rig-package@0.7.3': - resolution: {integrity: sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==} - - '@rushstack/terminal@0.24.0': - resolution: {integrity: sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - '@rushstack/ts-command-line@5.3.9': - resolution: {integrity: sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==} - - '@shikijs/engine-oniguruma@3.23.0': - resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} - - '@shikijs/langs@3.23.0': - resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} - - '@shikijs/themes@3.23.0': - resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} - - '@shikijs/types@3.23.0': - resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} - - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - - '@types/argparse@1.0.38': - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - - '@types/chai-as-promised@7.1.8': - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/http-cache-semantics@4.2.0': - resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/jsonwebtoken@9.0.10': - resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node@25.9.2': - resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} - - '@types/parse-path@7.1.0': - resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} - deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. - - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@typescript-eslint/eslint-plugin@8.60.1': - resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.60.1 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.60.1': - resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.60.1': - resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@8.60.1': - resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.60.1': - resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.60.1': - resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@8.60.1': - resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@8.60.1': - resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@8.60.1': - resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@8.60.1': - resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} - - '@vercel/detect-agent@1.2.3': - resolution: {integrity: sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==} - engines: {node: '>=14'} - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - ajv-draft-04@1.0.0: - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.12.0: - resolution: {integrity: sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==} - engines: {node: '>=4'} - - axios@1.18.0: - resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - - baseline-browser-mapping@2.10.34: - resolution: {integrity: sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==} - engines: {node: '>=6.0.0'} - hasBin: true - - beachball@2.65.5: - resolution: {integrity: sha512-nAsYfIQ5co1gn718OmLLsYtJSt+oZYkMMQ9k6Yel372sPwMETHgzqAcmxdZb2Bs/XTvy2/Xnm7qz7pashweFZg==} - engines: {node: '>=14.0.0'} - hasBin: true - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - body-parser@1.20.5: - resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - brace-expansion@1.1.15: - resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - - brace-expansion@2.1.1: - resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} - - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} - engines: {node: 18 || 20 || >=22} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001797: - resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} - - canonical-path@1.0.0: - resolution: {integrity: sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==} - - chai-as-promised@7.1.2: - resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} - peerDependencies: - chai: '>= 2.1.2 < 6' - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cosmiconfig@9.0.2: - resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cpx2@8.0.2: - resolution: {integrity: sha512-exLFEIh8XgWthEtrEq8hs+S6jxM5ZHpjQnRH6D7VU+2uAYS3amLSVOUSuirfx3HeN7WBCq+xFygHpt7l+gQtUA==} - engines: {node: ^20.0.0 || >=22.0.0, npm: '>=10'} - hasBin: true - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - debounce@3.0.0: - resolution: {integrity: sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==} - engines: {node: '>=20'} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-port@1.3.0: - resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} - engines: {node: '>= 4.2.1'} - hasBin: true - - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} - engines: {node: '>=0.3.1'} - - diff@8.0.4: - resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dotenv-expand@12.0.3: - resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} - engines: {node: '>=12'} - - dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - - dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.368: - resolution: {integrity: sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - enhanced-resolve@5.23.0: - resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} - engines: {node: '>=10.13.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - envinfo@7.21.0: - resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} - engines: {node: '>=4'} - hasBin: true - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - - es-abstract@1.24.2: - resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} - engines: {node: '>= 0.4'} - - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-formatter-visualstudio@8.40.0: - resolution: {integrity: sha512-TsbZJpvu0wclOoy5MEhETzxrVWMPDg5sejowvQfbqw9e0ooozbnX/1STGiGaO/fH1JWLQvqQ4qAmai2u/Kep1g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-import-resolver-node@0.3.10: - resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - - eslint-module-utils@2.13.0: - resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-deprecation@1.6.0: - resolution: {integrity: sha512-rld+Vrneh/NXRtDB0vQifOvgUy0HJYoejaxWlVnsk/LK7iij2tCWQIFcCKG4uzQb+Ef86bDke39w1lh4wnon4Q==} - deprecated: this package has been deprecated, please use v2.0.0 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: ^4.2.4 || ^5.0.0 - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jam3@0.2.3: - resolution: {integrity: sha512-aW1L8C96fsRji0c8ZAgqtJVIu5p2IaNbeT2kuHNS6p5tontAVK1yP1W4ECjq3BHOv/GgAWvBVIx7kQI0kG2Rew==} - engines: {node: '>=4'} - - eslint-plugin-jsdoc@50.8.0: - resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-prefer-arrow@1.2.3: - resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} - peerDependencies: - eslint: '>=2.0.0' - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - express@4.22.2: - resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} - engines: {node: '>= 0.10.0'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} - - fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - - find-index@0.1.1: - resolution: {integrity: sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - flatbuffers@1.12.0: - resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} - - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - - follow-redirects@1.16.0: - resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} - engines: {node: '>=14.14'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} - - git-up@8.1.1: - resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} - - git-url-parse@13.1.1: - resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} - - git-url-parse@16.1.0: - resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob2base@0.0.12: - resolution: {integrity: sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==} - engines: {node: '>= 0.10'} - - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - - glob@13.0.6: - resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} - engines: {node: 18 || 20 || >=22} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - - hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-ssh@1.4.1: - resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.2.0: - resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} - hasBin: true - - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@2.0.3: - resolution: {integrity: sha512-WJi9y9ABL01C8CxTKxRRQkkSpY/x2bo4Gy0WuiZGrInxQqgxQpvkBCLNcDYcHOSdhx4ODgbFcgAvfL49C+PHgQ==} - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} - - jsonwebtoken@9.0.3: - resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} - engines: {node: '>=12', npm: '>=6'} - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} - - jwks-rsa@3.2.2: - resolution: {integrity: sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w==} - engines: {node: '>=14'} - - jws@4.0.1: - resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - linkify-it@5.0.1: - resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} - - loader-runner@4.3.2: - resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} - engines: {node: '>=6.11.5'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.5.1: - resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} - engines: {node: 20 || >=22} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} - - lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - - markdown-it@14.2.0: - resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} - hasBin: true - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - minimatch@10.2.3: - resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} - engines: {node: 18 || 20 || >=22} - - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} - - minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - - minimatch@8.0.7: - resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - - minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} - - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - mocha-junit-reporter@2.2.1: - resolution: {integrity: sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==} - peerDependencies: - mocha: '>=2.2.5' - - mocha@11.7.6: - resolution: {integrity: sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} - - node-releases@2.0.47: - resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} - engines: {node: '>=18'} - - normalize-url@8.1.1: - resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} - engines: {node: '>=14.16'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - oidc-client-ts@3.5.0: - resolution: {integrity: sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A==} - engines: {node: '>=18'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - - p-graph@1.3.0: - resolution: {integrity: sha512-QL8xXlJl/oWWbzQK0de3KMFDzCXF8SQ2medloXxRFI1GUjNFBHiOtNv7X1azGBzF1SolIhm+gZ5XshBo6+3sdw==} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-imports-exports@0.2.4: - resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-path@7.1.0: - resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} - - parse-statements@1.0.11: - resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - - parse-url@9.2.0: - resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} - engines: {node: '>=14.13.0'} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.2: - resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} - engines: {node: 18 || 20 || >=22} - - path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} - - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - playwright-core@1.56.1: - resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.56.1: - resolution: {integrity: sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==} - engines: {node: '>=18'} - hasBin: true - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - protocols@2.0.2: - resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - requireindex@1.1.0: - resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} - engines: {node: '>=0.10.5'} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} - hasBin: true - - resolve@2.0.0-next.7: - resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} - engines: {node: '>= 0.4'} - hasBin: true - - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true - - rimraf@6.1.3: - resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} - engines: {node: 20 || >=22} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} - engines: {node: '>=0.4'} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.8.2: - resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.4: - resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} - engines: {node: '>= 0.4'} - - side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - source-map-loader@1.1.3: - resolution: {integrity: sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - - spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.11: - resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.10: - resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - subarg@1.0.0: - resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - - terser-webpack-plugin@5.6.1: - resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@minify-html/node': '*' - '@swc/core': '*' - '@swc/css': '*' - '@swc/html': '*' - clean-css: '*' - cssnano: '*' - csso: '*' - esbuild: '*' - html-minifier-terser: '*' - lightningcss: '*' - postcss: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@minify-html/node': - optional: true - '@swc/core': - optional: true - '@swc/css': - optional: true - '@swc/html': - optional: true - clean-css: - optional: true - cssnano: - optional: true - csso: - optional: true - esbuild: - optional: true - html-minifier-terser: - optional: true - lightningcss: - optional: true - postcss: - optional: true - uglify-js: - optional: true - - terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} - engines: {node: '>=10'} - hasBin: true - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.8: - resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} - engines: {node: '>= 0.4'} - - typedoc-plugin-merge-modules@7.0.0: - resolution: {integrity: sha512-DQyfbbPNBElhpdpGrlkS+CrhGD3iooDjp/PHT8O1D/jumLCB+7XAY3jHiqob7d01o25EfwEOJWVwJK+9J6WlBg==} - peerDependencies: - typedoc: 0.28.x - - typedoc@0.28.19: - resolution: {integrity: sha512-wKh+lhdmMFivMlc6vRRcMGXeGEHGU2g8a2CkPTJjJlwRf1iXbimWIPcFolCqe4E0d/FRtGszpIrsp3WLpDB8Pw==} - engines: {node: '>= 18', pnpm: '>= 10'} - hasBin: true - peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x - - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} - engines: {node: '>=10.13.0'} - - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - - webpack-sources@3.5.0: - resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} - engines: {node: '>=10.13.0'} - - webpack@5.107.2: - resolution: {integrity: sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.22: - resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - workerpool@9.3.4: - resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - - workspace-tools@0.36.4: - resolution: {integrity: sha512-v0UFVvw9BjHtRu2Dau5PEJKkuG8u4jPlpXZQWjSz9XgbSutpPURqtO2P0hp3cVmQVATh8lkMFCewFgJuDnyC/w==} - - workspace-tools@0.41.7: - resolution: {integrity: sha512-krsae4CHOG+jBRj76xtiFeQ35BEJC1Yb4601a3dLoZm1oeswSRiEvgcHJel2JXZESiKT/pXiISOodpLsIKWf+Q==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - wtfnode@0.9.4: - resolution: {integrity: sha512-5xgeLjIxZ8DVHU4ty3kOdd9QfHDxf89tmSy0+yN8n59S3wx6LBJh8XhEg61OPOGE65jEYGAtLq0GMzLKrsjfPQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/helper-validator-identifier@7.29.7': {} - - '@discoveryjs/json-ext@0.5.7': {} - - '@es-joy/jsdoccomment@0.50.2': - dependencies: - '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.60.1 - comment-parser: 1.4.1 - esquery: 1.7.0 - jsdoc-type-pratt-parser: 4.1.0 - - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1(supports-color@8.1.1))': - dependencies: - eslint: 8.57.1(supports-color@8.1.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': - dependencies: - ajv: 6.15.0 - debug: 4.4.3(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.2.0 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@gerrit0/mini-shiki@3.23.0': - dependencies: - '@shikijs/engine-oniguruma': 3.23.0 - '@shikijs/langs': 3.23.0 - '@shikijs/themes': 3.23.0 - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - - '@humanwhocodes/config-array@0.13.0(supports-color@8.1.1)': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@itwin/build-tools@5.10.0(@types/node@25.9.2)(supports-color@8.1.1)': - dependencies: - '@microsoft/api-extractor': 7.58.7(@types/node@25.9.2) - chalk: 3.0.0 - cpx2: 8.0.2 - cross-spawn: 7.0.6 - fs-extra: 8.1.0 - glob: 10.5.0 - mocha: 11.7.6 - mocha-junit-reporter: 2.2.1(mocha@11.7.6)(supports-color@8.1.1) - rimraf: 6.1.3 - tree-kill: 1.2.2 - typedoc: 0.28.19(typescript@5.6.3) - typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.6.3)) - typescript: 5.6.3 - wtfnode: 0.9.4 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - '@itwin/certa@5.10.0': - dependencies: - canonical-path: 1.0.0 - detect-port: 1.3.0 - express: 4.22.2 - jsonc-parser: 2.0.3 - lodash: 4.18.1 - mocha: 11.7.6 - playwright: 1.56.1 - source-map-support: 0.5.21 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - - '@itwin/core-bentley@5.10.0': {} - - '@itwin/core-common@5.10.0(@itwin/core-bentley@5.10.0)(@itwin/core-geometry@5.10.0)': - dependencies: - '@itwin/core-bentley': 5.10.0 - '@itwin/core-geometry': 5.10.0 - flatbuffers: 1.12.0 - js-base64: 3.7.8 - - '@itwin/core-geometry@5.10.0': - dependencies: - '@itwin/core-bentley': 5.10.0 - flatbuffers: 1.12.0 - - '@itwin/eslint-plugin@5.2.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - eslint: 8.57.1(supports-color@8.1.1) - eslint-formatter-visualstudio: 8.40.0 - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1)) - eslint-plugin-jam3: 0.2.3 - eslint-plugin-jsdoc: 50.8.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1(supports-color@8.1.1)) - eslint-plugin-prefer-arrow: 1.2.3(eslint@8.57.1(supports-color@8.1.1)) - eslint-plugin-react: 7.37.5(eslint@8.57.1(supports-color@8.1.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1(supports-color@8.1.1)) - typescript: 5.6.3 - workspace-tools: 0.36.4 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - '@itwin/oidc-signin-tool@5.1.3(@itwin/core-bentley@5.10.0)(supports-color@8.1.1)': - dependencies: - '@itwin/certa': 5.10.0 - '@itwin/core-bentley': 5.10.0 - '@itwin/service-authorization': 2.1.1(@itwin/core-bentley@5.10.0)(supports-color@8.1.1) - '@playwright/test': 1.56.1 - dotenv: 10.0.0 - dotenv-expand: 12.0.3 - oidc-client-ts: 3.5.0 - transitivePeerDependencies: - - electron - - supports-color - - '@itwin/service-authorization@2.1.1(@itwin/core-bentley@5.10.0)(supports-color@8.1.1)': - dependencies: - '@itwin/core-bentley': 5.10.0 - got: 12.6.1 - jsonwebtoken: 9.0.3 - jwks-rsa: 3.2.2(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@microsoft/api-extractor-model@7.33.8(@types/node@25.9.2)': - dependencies: - '@microsoft/tsdoc': 0.16.0 - '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.2) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.58.7(@types/node@25.9.2)': - dependencies: - '@microsoft/api-extractor-model': 7.33.8(@types/node@25.9.2) - '@microsoft/tsdoc': 0.16.0 - '@microsoft/tsdoc-config': 0.18.1 - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.2) - '@rushstack/rig-package': 0.7.3 - '@rushstack/terminal': 0.24.0(@types/node@25.9.2) - '@rushstack/ts-command-line': 5.3.9(@types/node@25.9.2) - diff: 8.0.4 - minimatch: 10.2.3 - resolve: 1.22.12 - semver: 7.7.4 - source-map: 0.6.1 - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/tsdoc-config@0.18.1': - dependencies: - '@microsoft/tsdoc': 0.16.0 - ajv: 8.18.0 - jju: 1.4.0 - resolve: 1.22.12 - - '@microsoft/tsdoc@0.16.0': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@playwright/test@1.56.1': - dependencies: - playwright: 1.56.1 - - '@rtsao/scc@1.1.0': {} - - '@rushstack/node-core-library@5.23.1(@types/node@25.9.2)': - dependencies: - ajv: 8.18.0 - ajv-draft-04: 1.0.0(ajv@8.18.0) - ajv-formats: 3.0.1(ajv@8.18.0) - fs-extra: 11.3.5 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.12 - semver: 7.7.4 - optionalDependencies: - '@types/node': 25.9.2 - - '@rushstack/problem-matcher@0.2.1(@types/node@25.9.2)': - optionalDependencies: - '@types/node': 25.9.2 - - '@rushstack/rig-package@0.7.3': - dependencies: - jju: 1.4.0 - resolve: 1.22.12 - - '@rushstack/terminal@0.24.0(@types/node@25.9.2)': - dependencies: - '@rushstack/node-core-library': 5.23.1(@types/node@25.9.2) - '@rushstack/problem-matcher': 0.2.1(@types/node@25.9.2) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 25.9.2 - - '@rushstack/ts-command-line@5.3.9(@types/node@25.9.2)': - dependencies: - '@rushstack/terminal': 0.24.0(@types/node@25.9.2) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - - '@shikijs/engine-oniguruma@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - - '@shikijs/themes@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - - '@shikijs/types@3.23.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.2': {} - - '@sindresorhus/is@5.6.0': {} - - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - - '@types/argparse@1.0.38': {} - - '@types/chai-as-promised@7.1.8': - dependencies: - '@types/chai': 4.3.20 - - '@types/chai@4.3.20': {} - - '@types/estree@1.0.9': {} - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/http-cache-semantics@4.2.0': {} - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/jsonwebtoken@9.0.10': - dependencies: - '@types/ms': 2.1.0 - '@types/node': 25.9.2 - - '@types/mocha@9.1.1': {} - - '@types/ms@2.1.0': {} - - '@types/node@25.9.2': - dependencies: - undici-types: 7.24.6 - - '@types/parse-path@7.1.0': - dependencies: - parse-path: 7.1.0 - - '@types/semver@7.7.1': {} - - '@types/unist@3.0.3': {} - - '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.60.1 - '@typescript-eslint/type-utils': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - '@typescript-eslint/utils': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.60.1 - eslint: 8.57.1(supports-color@8.1.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.60.1 - '@typescript-eslint/types': 8.60.1 - '@typescript-eslint/typescript-estree': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.60.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1(supports-color@8.1.1) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.60.1(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.6.3) - '@typescript-eslint/types': 8.60.1 - debug: 4.4.3(supports-color@8.1.1) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@8.60.1': - dependencies: - '@typescript-eslint/types': 8.60.1 - '@typescript-eslint/visitor-keys': 8.60.1 - - '@typescript-eslint/tsconfig-utils@8.60.1(typescript@5.6.3)': - dependencies: - typescript: 5.6.3 - - '@typescript-eslint/type-utils@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 8.60.1 - '@typescript-eslint/typescript-estree': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) - '@typescript-eslint/utils': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(typescript@5.6.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1(supports-color@8.1.1) - ts-api-utils: 2.5.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@8.60.1': {} - - '@typescript-eslint/typescript-estree@6.21.0(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.8.2 - ts-api-utils: 1.4.3(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.60.1(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/project-service': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) - '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.6.3) - '@typescript-eslint/types': 8.60.1 - '@typescript-eslint/visitor-keys': 8.60.1 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.5 - semver: 7.8.2 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.6.3) - eslint: 8.57.1(supports-color@8.1.1) - semver: 7.8.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.60.1(eslint@8.57.1(supports-color@8.1.1))(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) - '@typescript-eslint/scope-manager': 8.60.1 - '@typescript-eslint/types': 8.60.1 - '@typescript-eslint/typescript-estree': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) - eslint: 8.57.1(supports-color@8.1.1) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@8.60.1': - dependencies: - '@typescript-eslint/types': 8.60.1 - eslint-visitor-keys: 5.0.1 - - '@ungap/structured-clone@1.3.1': {} - - '@vercel/detect-agent@1.2.3': {} - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.107.2)': - dependencies: - webpack: 5.107.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.107.2) - - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.107.2)': - dependencies: - webpack: 5.107.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.107.2) - - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.107.2)': - dependencies: - webpack: 5.107.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.107.2) - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - '@yarnpkg/lockfile@1.1.0': {} - - abab@2.0.6: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-import-phases@1.0.4(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - - acorn-jsx@5.3.2(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} - - address@1.2.2: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - ajv-draft-04@1.0.0(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - - ajv-formats@2.1.1(ajv@8.20.0): - optionalDependencies: - ajv: 8.20.0 - - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - - ajv-keywords@3.5.2(ajv@6.15.0): - dependencies: - ajv: 6.15.0 - - ajv-keywords@5.1.0(ajv@8.20.0): - dependencies: - ajv: 8.20.0 - fast-deep-equal: 3.1.3 - - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.18.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - - are-docs-informative@0.0.2: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-flatten@1.1.1: {} - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.2 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - - assertion-error@1.1.0: {} - - ast-types-flow@0.0.8: {} - - async-function@1.0.0: {} - - asynckit@0.4.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - axe-core@4.12.0: {} - - axios@1.18.0: - dependencies: - follow-redirects: 1.16.0 - form-data: 4.0.5 - https-proxy-agent: 5.0.1 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - - supports-color - - axobject-query@4.1.0: {} - - balanced-match@1.0.2: {} - - balanced-match@4.0.4: {} - - baseline-browser-mapping@2.10.34: {} - - beachball@2.65.5(typescript@5.6.3): - dependencies: - '@vercel/detect-agent': 1.2.3 - cosmiconfig: 9.0.2(typescript@5.6.3) - execa: 5.1.1 - minimatch: 3.1.5 - p-graph: 1.3.0 - p-limit: 3.1.0 - prompts: 2.4.2 - semver: 7.8.2 - workspace-tools: 0.41.7 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - typescript - - big.js@5.2.2: {} - - body-parser@1.20.5: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.15.2 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - brace-expansion@1.1.15: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.1.1: - dependencies: - balanced-match: 1.0.2 - - brace-expansion@5.0.6: - dependencies: - balanced-match: 4.0.4 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-stdout@1.3.1: {} - - browserslist@4.28.2: - dependencies: - baseline-browser-mapping: 2.10.34 - caniuse-lite: 1.0.30001797 - electron-to-chromium: 1.5.368 - node-releases: 2.0.47 - update-browserslist-db: 1.2.3(browserslist@4.28.2) - - buffer-equal-constant-time@1.0.1: {} - - buffer-from@1.1.2: {} - - bytes@3.1.2: {} - - cacheable-lookup@7.0.0: {} - - cacheable-request@10.2.14: - dependencies: - '@types/http-cache-semantics': 4.2.0 - get-stream: 6.0.1 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.1.1 - responselike: 3.0.0 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.9: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001797: {} - - canonical-path@1.0.0: {} - - chai-as-promised@7.1.2(chai@4.5.0): - dependencies: - chai: 4.5.0 - check-error: 1.0.3 - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - charenc@0.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - chrome-trace-event@1.0.4: {} - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - colorette@2.0.20: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@10.0.1: {} - - commander@2.20.3: {} - - comment-parser@1.4.1: {} - - concat-map@0.0.1: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - cookie-signature@1.0.7: {} - - cookie@0.7.2: {} - - cosmiconfig@9.0.2(typescript@5.6.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.2.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.6.3 - - cpx2@8.0.2: - dependencies: - debounce: 3.0.0 - glob: 13.0.6 - glob2base: 0.0.12 - ignore: 7.0.5 - minimatch: 10.2.5 - p-map: 7.0.4 - resolve: 1.22.12 - shell-quote: 1.8.4 - subarg: 1.0.0 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypt@0.0.2: {} - - damerau-levenshtein@1.0.8: {} - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - debounce@3.0.0: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.4.3(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-is@0.1.4: {} - - defer-to-connect@2.0.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - destroy@1.2.0: {} - - detect-port@1.3.0: - dependencies: - address: 1.2.2 - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - - diff@7.0.0: {} - - diff@8.0.4: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dotenv-expand@12.0.3: - dependencies: - dotenv: 16.6.1 - - dotenv-expand@5.1.0: {} - - dotenv@10.0.0: {} - - dotenv@16.6.1: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.368: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojis-list@3.0.0: {} - - encodeurl@2.0.0: {} - - enhanced-resolve@5.23.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - - entities@4.5.0: {} - - env-paths@2.2.1: {} - - envinfo@7.21.0: {} - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.24.2: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.9 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.4 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.11 - string.prototype.trimend: 1.0.10 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.8 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.22 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-iterator-helpers@1.3.2: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - math-intrinsics: 1.1.0 - - es-module-lexer@2.1.0: {} - - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.4 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@4.0.0: {} - - eslint-formatter-visualstudio@8.40.0: {} - - eslint-import-resolver-node@0.3.10: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.2 - resolve: 2.0.0-next.7 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1(supports-color@8.1.1)): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - eslint: 8.57.1(supports-color@8.1.1) - eslint-import-resolver-node: 0.3.10 - transitivePeerDependencies: - - supports-color - - eslint-plugin-deprecation@1.6.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3): - dependencies: - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - eslint: 8.57.1(supports-color@8.1.1) - tslib: 2.8.1 - tsutils: 3.21.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1)): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1(supports-color@8.1.1) - eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1(supports-color@8.1.1)) - hasown: 2.0.4 - is-core-module: 2.16.2 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.10 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jam3@0.2.3: - dependencies: - doctrine: 2.1.0 - has: 1.0.4 - requireindex: 1.1.0 - - eslint-plugin-jsdoc@50.8.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1): - dependencies: - '@es-joy/jsdoccomment': 0.50.2 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.4.3(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint: 8.57.1(supports-color@8.1.1) - espree: 10.4.0 - esquery: 1.7.0 - parse-imports-exports: 0.2.4 - semver: 7.8.2 - spdx-expression-parse: 4.0.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1(supports-color@8.1.1)): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.9 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.12.0 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1(supports-color@8.1.1) - hasown: 2.0.4 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - - eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.1(supports-color@8.1.1)): - dependencies: - eslint: 8.57.1(supports-color@8.1.1) - - eslint-plugin-react-hooks@5.2.0(eslint@8.57.1(supports-color@8.1.1)): - dependencies: - eslint: 8.57.1(supports-color@8.1.1) - - eslint-plugin-react@7.37.5(eslint@8.57.1(supports-color@8.1.1)): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 - eslint: 8.57.1(supports-color@8.1.1) - estraverse: 5.3.0 - hasown: 2.0.4 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.5 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.7 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.1: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@8.57.1(supports-color@8.1.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0(supports-color@8.1.1) - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.1 - ajv: 6.15.0 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.2.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@10.4.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 - - espree@9.6.1: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 3.4.3 - - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - events@3.3.0: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - express@4.22.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.5 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.13 - proxy-addr: 2.0.7 - qs: 6.15.2 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.1.2: {} - - fastest-levenshtein@1.0.16: {} - - fastq@1.20.1: - dependencies: - reusify: 1.1.0 - - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-index@0.1.1: {} - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.4.2 - keyv: 4.5.4 - rimraf: 3.0.2 - - flat@5.0.2: {} - - flatbuffers@1.12.0: {} - - flatted@3.4.2: {} - - follow-redirects@1.16.0: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data-encoder@2.1.4: {} - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.4 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fresh@0.5.2: {} - - fs-extra@11.3.5: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs.realpath@1.0.0: {} - - fsevents@2.3.2: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.4 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - generator-function@2.0.1: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - - get-stream@6.0.1: {} - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - git-up@7.0.0: - dependencies: - is-ssh: 1.4.1 - parse-url: 8.1.0 - - git-up@8.1.1: - dependencies: - is-ssh: 1.4.1 - parse-url: 9.2.0 - - git-url-parse@13.1.1: - dependencies: - git-up: 7.0.0 - - git-url-parse@16.1.0: - dependencies: - git-up: 8.1.1 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - glob2base@0.0.12: - dependencies: - find-index: 0.1.1 - - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@13.0.6: - dependencies: - minimatch: 10.2.5 - minipass: 7.1.3 - path-scurry: 2.0.2 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.7 - minipass: 4.2.8 - path-scurry: 1.11.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.2.0: {} - - got@12.6.1: - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - has-bigints@1.1.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - has@1.0.4: {} - - hasown@2.0.4: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - http-cache-semantics@4.2.0: {} - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - - http2-wrapper@2.2.1: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - ignore@5.3.2: {} - - ignore@7.0.5: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-lazy@4.0.0: {} - - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.4 - side-channel: 1.1.0 - - interpret@3.1.1: {} - - ipaddr.js@1.9.1: {} - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-buffer@1.1.6: {} - - is-callable@1.2.7: {} - - is-core-module@2.16.2: - dependencies: - hasown: 2.0.4 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.1.2: - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@2.1.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-ssh@1.4.1: - dependencies: - protocols: 2.0.2 - - is-stream@2.0.1: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.22 - - is-unicode-supported@0.1.0: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - isobject@3.0.1: {} - - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.2 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jest-worker@27.5.1: - dependencies: - '@types/node': 25.9.2 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jju@1.4.0: {} - - jose@4.15.9: {} - - js-base64@3.7.8: {} - - js-tokens@4.0.0: {} - - js-yaml@4.2.0: - dependencies: - argparse: 2.0.1 - - jsdoc-type-pratt-parser@4.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonc-parser@2.0.3: {} - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.2.1: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonwebtoken@9.0.3: - dependencies: - jws: 4.0.1 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.8.2 - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - - jwa@2.0.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jwks-rsa@3.2.2(supports-color@8.1.1): - dependencies: - '@types/jsonwebtoken': 9.0.10 - debug: 4.4.3(supports-color@8.1.1) - jose: 4.15.9 - limiter: 1.1.5 - lru-memoizer: 2.3.0 - transitivePeerDependencies: - - supports-color - - jws@4.0.1: - dependencies: - jwa: 2.0.1 - safe-buffer: 5.2.1 - - jwt-decode@4.0.0: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - limiter@1.1.5: {} - - lines-and-columns@1.2.4: {} - - linkify-it@5.0.1: - dependencies: - uc.micro: 2.1.0 - - loader-runner@4.3.2: {} - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.clonedeep@4.5.0: {} - - lodash.includes@4.3.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - - lodash.merge@4.6.2: {} - - lodash.once@4.1.1: {} - - lodash@4.18.1: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lowercase-keys@3.0.0: {} - - lru-cache@10.4.3: {} - - lru-cache@11.5.1: {} - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-memoizer@2.3.0: - dependencies: - lodash.clonedeep: 4.5.0 - lru-cache: 6.0.0 - - lunr@2.3.9: {} - - markdown-it@14.2.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.1 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - - math-intrinsics@1.1.0: {} - - md5@2.3.0: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - - mdurl@2.0.0: {} - - media-typer@0.3.0: {} - - merge-descriptors@1.0.3: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.2 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mimic-fn@2.1.0: {} - - mimic-response@3.1.0: {} - - mimic-response@4.0.0: {} - - minimatch@10.2.3: - dependencies: - brace-expansion: 5.0.6 - - minimatch@10.2.5: - dependencies: - brace-expansion: 5.0.6 - - minimatch@3.1.5: - dependencies: - brace-expansion: 1.1.15 - - minimatch@8.0.7: - dependencies: - brace-expansion: 2.1.1 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.1.1 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.1 - - minimist@1.2.8: {} - - minipass@4.2.8: {} - - minipass@7.1.3: {} - - mkdirp@3.0.1: {} - - mocha-junit-reporter@2.2.1(mocha@11.7.6)(supports-color@8.1.1): - dependencies: - debug: 4.4.3(supports-color@8.1.1) - md5: 2.3.0 - mkdirp: 3.0.1 - mocha: 11.7.6 - strip-ansi: 6.0.1 - xml: 1.0.1 - transitivePeerDependencies: - - supports-color - - mocha@11.7.6: - dependencies: - browser-stdout: 1.3.1 - chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 10.5.0 - he: 1.2.0 - is-path-inside: 3.0.3 - js-yaml: 4.2.0 - log-symbols: 4.1.0 - minimatch: 9.0.9 - ms: 2.1.3 - picocolors: 1.1.1 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 9.3.4 - yargs: 17.7.2 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 - - ms@2.0.0: {} - - ms@2.1.3: {} - - natural-compare@1.4.0: {} - - negotiator@0.6.3: {} - - neo-async@2.6.2: {} - - node-exports-info@1.6.0: - dependencies: - array.prototype.flatmap: 1.3.3 - es-errors: 1.3.0 - object.entries: 1.1.9 - semver: 6.3.1 - - node-releases@2.0.47: {} - - normalize-url@8.1.1: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - object-assign@4.1.1: {} - - object-inspect@1.13.4: {} - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.2 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.2 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.2 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.2 - - oidc-client-ts@3.5.0: - dependencies: - jwt-decode: 4.0.0 - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-cancelable@3.0.0: {} - - p-graph@1.3.0: {} - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-map@7.0.4: {} - - p-try@2.2.0: {} - - package-json-from-dist@1.0.1: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-imports-exports@0.2.4: - dependencies: - parse-statements: 1.0.11 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.7 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-path@7.1.0: - dependencies: - protocols: 2.0.2 - - parse-statements@1.0.11: {} - - parse-url@8.1.0: - dependencies: - parse-path: 7.1.0 - - parse-url@9.2.0: - dependencies: - '@types/parse-path': 7.1.0 - parse-path: 7.1.0 - - parseurl@1.3.3: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - - path-scurry@2.0.2: - dependencies: - lru-cache: 11.5.1 - minipass: 7.1.3 - - path-to-regexp@0.1.13: {} - - path-type@4.0.0: {} - - pathval@1.1.1: {} - - picocolors@1.1.1: {} - - picomatch@2.3.2: {} - - picomatch@4.0.4: {} - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - playwright-core@1.56.1: {} - - playwright@1.56.1: - dependencies: - playwright-core: 1.56.1 - optionalDependencies: - fsevents: 2.3.2 - - possible-typed-array-names@1.1.0: {} - - prelude-ls@1.2.1: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - protocols@2.0.2: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@2.1.0: {} - - punycode.js@2.3.1: {} - - punycode@2.3.1: {} - - qs@6.15.2: - dependencies: - side-channel: 1.1.0 - - queue-microtask@1.2.3: {} - - quick-lru@5.1.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - react-is@16.13.1: {} - - readdirp@4.1.2: {} - - rechoir@0.8.0: - dependencies: - resolve: 1.22.12 - - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - requireindex@1.1.0: {} - - resolve-alpn@1.2.1: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve@1.22.12: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.2 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.7: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.2 - node-exports-info: 1.6.0 - object-keys: 1.1.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - responselike@3.0.0: - dependencies: - lowercase-keys: 3.0.0 - - reusify@1.1.0: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@4.4.1: - dependencies: - glob: 9.3.5 - - rimraf@6.1.3: - dependencies: - glob: 13.0.6 - package-json-from-dist: 1.0.1 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.4: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-buffer@5.2.1: {} - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - safer-buffer@2.1.2: {} - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.15.0 - ajv-keywords: 3.5.2(ajv@6.15.0) - - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) - ajv-keywords: 5.1.0(ajv@8.20.0) - - semver@6.3.1: {} - - semver@7.7.4: {} - - semver@7.8.2: {} - - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - - setprototypeof@1.2.0: {} - - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shell-quote@1.8.4: {} - - side-channel-list@1.0.1: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - sisteransi@1.0.5: {} - - slash@3.0.0: {} - - source-map-loader@1.1.3(webpack@5.107.2): - dependencies: - abab: 2.0.6 - iconv-lite: 0.6.3 - loader-utils: 2.0.4 - schema-utils: 3.3.0 - source-map: 0.6.1 - webpack: 5.107.2(webpack-cli@5.1.4) - whatwg-mimetype: 2.3.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@4.0.0: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.23 - - spdx-license-ids@3.0.23: {} - - sprintf-js@1.0.3: {} - - statuses@2.0.2: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - string-argv@0.3.2: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-abstract: 1.24.2 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.2 - - string.prototype.trim@1.2.11: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.2 - es-object-atoms: 1.1.2 - has-property-descriptors: 1.0.2 - safe-regex-test: 1.1.0 - - string.prototype.trimend@1.0.10: - dependencies: - call-bind: 1.0.9 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.2 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.9 - define-properties: 1.2.1 - es-object-atoms: 1.1.2 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - - strip-bom@3.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-json-comments@3.1.1: {} - - subarg@1.0.0: - dependencies: - minimist: 1.2.8 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - tapable@2.3.3: {} - - terser-webpack-plugin@5.6.1(webpack@5.107.2): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - terser: 5.48.0 - webpack: 5.107.2(webpack-cli@5.1.4) - - terser@5.48.0: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - text-table@0.2.0: {} - - tinyglobby@0.2.17: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tree-kill@1.2.2: {} - - ts-api-utils@1.4.3(typescript@5.6.3): - dependencies: - typescript: 5.6.3 - - ts-api-utils@2.5.0(typescript@5.6.3): - dependencies: - typescript: 5.6.3 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - - tslib@2.8.1: {} - - tsutils@3.21.0(typescript@5.6.3): - dependencies: - tslib: 1.14.1 - typescript: 5.6.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.1.0: {} - - type-fest@0.20.2: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.9 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.9 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.8: - dependencies: - call-bind: 1.0.9 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.6.3)): - dependencies: - typedoc: 0.28.19(typescript@5.6.3) - - typedoc@0.28.19(typescript@5.6.3): - dependencies: - '@gerrit0/mini-shiki': 3.23.0 - lunr: 2.3.9 - markdown-it: 14.2.0 - minimatch: 10.2.5 - typescript: 5.6.3 - yaml: 2.9.0 - - typescript@5.6.3: {} - - typescript@5.9.3: {} - - uc.micro@2.1.0: {} - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - undici-types@7.24.6: {} - - universalify@0.1.2: {} - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - update-browserslist-db@1.2.3(browserslist@4.28.2): - dependencies: - browserslist: 4.28.2 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - utils-merge@1.0.1: {} - - vary@1.1.2: {} - - watchpack@2.5.1: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - webpack-cli@5.1.4(webpack@5.107.2): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.107.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.107.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.107.2) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.6 - envinfo: 7.21.0 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.107.2(webpack-cli@5.1.4) - webpack-merge: 5.10.0 - - webpack-merge@5.10.0: - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - webpack-sources@3.5.0: {} - - webpack@5.107.2(webpack-cli@5.1.4): - dependencies: - '@types/estree': 1.0.9 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.23.0 - es-module-lexer: 2.1.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - loader-runner: 4.3.2 - mime-db: 1.54.0 - neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(webpack@5.107.2) - watchpack: 2.5.1 - webpack-sources: 3.5.0 - optionalDependencies: - webpack-cli: 5.1.4(webpack@5.107.2) - transitivePeerDependencies: - - '@minify-html/node' - - '@swc/core' - - '@swc/css' - - '@swc/html' - - clean-css - - cssnano - - csso - - esbuild - - html-minifier-terser - - lightningcss - - postcss - - uglify-js - - whatwg-mimetype@2.3.0: {} - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.2 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.22 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.22: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.9 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - wildcard@2.0.1: {} - - word-wrap@1.2.5: {} - - workerpool@9.3.4: {} - - workspace-tools@0.36.4: - dependencies: - '@yarnpkg/lockfile': 1.1.0 - fast-glob: 3.3.3 - git-url-parse: 13.1.1 - globby: 11.1.0 - jju: 1.4.0 - js-yaml: 4.2.0 - micromatch: 4.0.8 - - workspace-tools@0.41.7: - dependencies: - '@yarnpkg/lockfile': 1.1.0 - fast-glob: 3.3.3 - git-url-parse: 16.1.0 - jju: 1.4.0 - js-yaml: 4.2.0 - micromatch: 4.0.8 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - wrappy@1.0.2: {} - - wtfnode@0.9.4: {} - - xml@1.0.1: {} - - y18n@5.0.8: {} - - yallist@4.0.0: {} - - yaml@2.9.0: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yocto-queue@0.1.0: {} diff --git a/typescript/packages/reality-data-client/pnpm-workspace.yaml b/typescript/packages/reality-data-client/pnpm-workspace.yaml deleted file mode 100644 index 0db12ee0..00000000 --- a/typescript/packages/reality-data-client/pnpm-workspace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -packages: - - . - -allowBuilds: - "@itwin/certa": true - "@itwin/oidc-signin-tool": true diff --git a/typescript/packages/reality-data-client/src/Projects.ts b/typescript/packages/reality-data-client/src/Projects.ts deleted file mode 100644 index 7b4a549b..00000000 --- a/typescript/packages/reality-data-client/src/Projects.ts +++ /dev/null @@ -1,24 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ - -import type { GuidString } from "@itwin/core-bentley"; - -/** - * Contains information on a project that is associated to a RealityData. More details about a project can be requested from the Projects API. - */ -export class Project { - - /** Project identifier */ - public id: GuidString; - - /** Project URL in the Projects API, for more information about the project */ - public projectDetailsLink: URL; - - public constructor(project: any){ - this.id = project.id; - this.projectDetailsLink = project._links.self.href; - } -} - diff --git a/typescript/packages/reality-data-client/src/RealityData.ts b/typescript/packages/reality-data-client/src/RealityData.ts deleted file mode 100644 index e4403905..00000000 --- a/typescript/packages/reality-data-client/src/RealityData.ts +++ /dev/null @@ -1,242 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ -import type { RealityData } from "@itwin/core-common"; -import {type AccessToken, BentleyError, type GuidString } from "@itwin/core-bentley"; -import type { RealityDataAccessClient } from "./RealityDataClient"; - -import { getRequestConfig } from "./RequestOptions"; -import axios from "axios"; - -/** - * Extent of a reality data, delimited by southwest and northeast coordinates. - */ -export interface Extent { - southWest: Point; - northEast: Point; -} - -/** - * Point used to define an extent. - */ -export interface Point { - latitude: number; - longitude: number; -} - -/** - * Coordinate Reference System (CRS) used for the reality data. - * It is restricted to specific reality data types, read documentation here: - * https://developer.bentley.com/apis/reality-management/rm-rd-details/#crs - */ -export interface Crs { - id: string; - verticalId?: string; -} - -/** - * Provides information regarding the acquisition, such as dates and acquirer used. - */ -export interface Acquisition { - startDateTime: Date; - endDateTime?: Date; - acquirer?: string; -} - -/** - * Cache parameters for reality data access. Contains the blob url, the timestamp to refresh (every 50 minutes) the url and the root document path. - * Cache contains one value for the read permission url, and one of the write permission. - * */ -class ContainerCache { - - private _containerRead?: ContainerCacheValue; - private _containerWrite?: ContainerCacheValue; - - public getCache(access: string): ContainerCacheValue | undefined { - if (access === "Read") - return this._containerRead; - else - return this._containerWrite; - } - - public setCache(containerCacheValue: ContainerCacheValue, access: string) { - if (access === "Read") - this._containerRead = containerCacheValue; - else - this._containerWrite = containerCacheValue; - } -} - -interface ContainerCacheValue { - url: URL; - timeStamp: Date; -} - -/** RealityData - * This class implements a Reality Data instance. - * Data is accessed directly through methods of the reality data instance. - * Access to the data required a properly entitled token though the access to the blob is controlled through - * an Azure blob URL, the token may be required to obtain this Azure blob URL or refresh it. - * The Azure blob URL is considered valid for an hour and is refreshed after 50 minutes. - * In addition to the reality data properties, and Azure blob URL and internal states, a reality data also contains - * the identification of the iTwin to be used for access permissions and - * may contain a RealityDataClient to obtain the specialization to communicate with Reality Management API (to obtain the Azure blob URL). - * @beta - */ -export class ITwinRealityData implements RealityData { - - public id: GuidString; - public displayName?: string; - public dataset?: string; - public group?: string; - public attribution?: string; - public termsOfUse?: string; - public dataCenterLocation?: string; - public description?: string; - public rootDocument?: string; - public tags?: string[]; - public acquisition?: Acquisition; - public size?: number; - public authoring?: boolean; - public classification?: string; - public type?: string; - public extent?: Extent; - public crs?: Crs; - /** @deprecated in 1.0.1 not used in Reality Management API. Will be removed in next major update.*/ - public accessControl?: string; // TODO: remove in next major update - public modifiedDateTime?: Date; - public lastAccessedDateTime?: Date; - public createdDateTime?: Date; - public ownerId?: string; - - /** Link to client to fetch the blob url */ - public client: undefined | RealityDataAccessClient; - - /** The GUID identifier of the iTwin used when using the client. */ - public iTwinId: GuidString; - - /** Cache parameters for reality data access. Contains the blob url, the timestamp to refresh (every 50 minutes) the url and the root document path. */ - private _containerCache: ContainerCache; - - /** - * Creates an instance of RealityData. - * @beta - */ - public constructor(client: RealityDataAccessClient, realityData?: any, iTwinId?: GuidString) { - - this.client = client; - this._containerCache = new ContainerCache(); - - if (realityData) { - this.id = realityData.id; - this.displayName = realityData.displayName; - this.dataset = realityData.dataset; - this.group = realityData.group; - this.attribution = realityData.attribution; - this.termsOfUse = realityData.termsOfUse; - this.dataCenterLocation = realityData.dataCenterLocation; - this.description = realityData.description; - this.rootDocument = realityData.rootDocument; - this.tags = realityData.tags; - if (realityData.acquisition) { - this.acquisition = (realityData.acquisition as Acquisition); - this.acquisition.startDateTime = new Date(realityData.acquisition.startDateTime); - this.acquisition.endDateTime = realityData.acquisition.endDateTime ? new Date(realityData.acquisition.endDateTime) : undefined; - this.acquisition.acquirer = realityData.acquisition.acquirer ? realityData.acquisition.acquirer : undefined; - } - this.size = realityData.size; - this.authoring = realityData.authoring; - this.classification = realityData.classification; - this.type = realityData.type; - this.extent = realityData.extent; - this.crs = realityData.crs; - // eslint-disable-next-line @typescript-eslint/no-deprecated - this.accessControl = realityData.accessControl; - this.modifiedDateTime = new Date(realityData.modifiedDateTime); - this.lastAccessedDateTime = new Date(realityData.lastAccessedDateTime); - this.createdDateTime = new Date(realityData.createdDateTime); - this.ownerId = realityData.ownerId; - } - - if (iTwinId) - this.iTwinId = iTwinId; - } - - /** - * Gets string url to fetch blob data from. Access is read-only. - * @param accessToken The client request context. - * @param blobPath name or path of tile - * @param writeAccess Optional boolean indicating if write access is requested. Default is false for read-only access. The realitydata:modify scope is required to grant the "write" access. - * @returns string url for blob data - * @beta - */ - public async getBlobUrl(accessToken: AccessToken, blobPath: string, writeAccess = false): Promise { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = await this.getContainerUrl(accessTokenResolved, writeAccess); - if (blobPath === undefined) - return url; - - const host = `${url.origin + url.pathname}/`; - const query = url.search; - return new URL(`${host}${blobPath}${query}`); - } - /** - * Try to use authorizationClient in RealityDataClientOptions to get the access token - * otherwise, will return the input token - * This is a workaround to support different authorization client for the reality data client and iTwin-core. - */ - private async resolveAccessToken(accessToken: AccessToken): Promise { - return this.client?.authorizationClient ? this.client.authorizationClient.getAccessToken() : accessToken; - } - - /** - * Gets a tile access url URL object - * @param accessToken The client request context. - * @param writeAccess Optional boolean indicating if write access is requested. Default is false for read-only access. - * @returns app URL object for blob url - * @beta - */ - private async getContainerUrl(accessToken: AccessToken, writeAccess = false): Promise { - - if (!this.client) - throw new BentleyError(422, "Invalid container request (RealityDataAccessClient is not set)."); - - const access = (writeAccess === true ? "Write" : "Read"); - const accessTokenResolved = await this.resolveAccessToken(accessToken); - - try { - - const containerCache = this._containerCache.getCache(access); - const blobUrlRequiresRefresh = !containerCache?.timeStamp || (Date.now() - containerCache?.timeStamp.getTime()) > 3000000; // 3 million milliseconds or 50 minutes - - if (undefined === containerCache?.url || blobUrlRequiresRefresh) { - - const url = new URL(`${this.client.baseUrl}/${this.id}/${ writeAccess === true ? "writeAccess" : "readAccess"}`); - - if(this.iTwinId) - url.searchParams.append("iTwinId", this.iTwinId); - - const requestOptions = getRequestConfig(accessTokenResolved, "GET", url.href, this.client.apiVersion); - - const response = await axios.get(url.href, requestOptions); - - if (!response.data) { - throw new BentleyError(422, "Invalid container request (API returned an unexpected response)."); - } - - // update cache - const newContainerCacheValue: ContainerCacheValue = { - url: new URL(response.data._links.containerUrl.href), - timeStamp: new Date(Date.now()), - }; - - this._containerCache.setCache(newContainerCacheValue, access); - } - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this._containerCache.getCache(access)!.url; - } catch { - throw new BentleyError(422, "Invalid container request."); - } - } -} \ No newline at end of file diff --git a/typescript/packages/reality-data-client/src/RealityDataClient.ts b/typescript/packages/reality-data-client/src/RealityDataClient.ts deleted file mode 100644 index 18db666a..00000000 --- a/typescript/packages/reality-data-client/src/RealityDataClient.ts +++ /dev/null @@ -1,805 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ - -/** @packageDocumentation - * @module RealityDataClient - */ - -import { type AccessToken, BentleyError } from "@itwin/core-bentley"; -import type { - AuthorizationClient, - CartographicRange, - RealityDataAccess, -} from "@itwin/core-common"; -import axios, { type AxiosResponse } from "axios"; -import { ITwinRealityData } from "./RealityData"; -import { getRequestConfig } from "./RequestOptions"; -import { Project } from "./Projects"; -import { Angle } from "./helper/Angle"; - -/** Options for initializing Reality Data Client - * @beta - */ -export interface RealityDataClientOptions { - /** The authorization client to use to get access token to Context Share API (authority: https://ims.bentley.com ) - * When define it will ignore accessToken from API parameters and will get an access token from this client. - */ - authorizationClient?: AuthorizationClient; - /** API Version. v1 by default */ - version?: ApiVersion; - /** API Url. Used to select environment. Defaults to "https://api.bentley.com/reality-management" */ - baseUrl?: string; -} - -/** Available Reality Management API Versions */ -export enum ApiVersion { - v1, -} - -/** Criteria used to query for reality data associated with an iTwin context. - * @see getRealityDatas - * @beta - */ -export interface RealityDataQueryCriteria { - /** If supplied, only reality data overlapping this range will be included. */ - extent?: CartographicRange; - - /** If true, return all properties for every reality data found in query. - * If false or undefined, return a minimal representation containing id, displayName and type, along with a url to get full reality data details. */ - getFullRepresentation?: boolean; - - /** If supplied, queries a maximum number of first results Found. Max 500. If not supplied, the query should return the first 100 RealityData found.*/ - top?: number; - - /** Continuation token to get current query's next results.*/ - continuationToken?: string; - - /** Parameter that orders reality data in ascending or descending order. Default is ascending (asc). Can be used on any simple text, date or number property. Example : size desc */ - orderBy?: string; - - /** Searches the given text (case insensitive) in reality data's text properties, such as in Group, DisplayName, Description, RootDocument, Acquirer, Tags. */ - search?: string; - - /** Queries for reality data of specified types.*/ - types?: string[]; - - /** Queries for reality data in which the acquisition is in given date range.*/ - acquisitionDates?: DateRange; - - /** Queries for reality data where the creation date is in given date range.*/ - createdDateTime?: DateRange; - - /** Queries for reality data where the modification date is in given date range.*/ - modifiedDateTime?: DateRange; - - /** Queries for reality data where the last accessed date is in given date range.*/ - lastAccessedDateTime?: DateRange; - - /** Queries for reality data owned by a specific user.*/ - ownerId?: string; - - /** Queries for reality data stored in a specific data center.*/ - dataCenter?: string; - - /** Queries for reality data with exact matching tag.*/ - tag?: string; -} - -/** Date range*/ -export interface DateRange { - startDateTime: Date; - endDateTime: Date; -} - -/** - * Response object containing RealityData and continuation token - */ -export interface RealityDataResponse { - realityDatas: ITwinRealityData[]; - continuationToken?: string; -} - -/** - * Client wrapper to Reality Management API. - * An instance of this class is used to extract reality data from the Reality Management API. - * Most important methods enable to obtain a specific reality data, fetch all reality data associated with an iTwin and - * all reality data of an iTwin within a provided spatial extent. - * This class also implements extraction of the Azure blob address. - * @beta - */ -export class RealityDataAccessClient implements RealityDataAccess { - public readonly baseUrl: string = - "https://api.bentley.com/reality-management/reality-data"; - public readonly apiVersion: ApiVersion = ApiVersion.v1; - public readonly authorizationClient: AuthorizationClient | undefined = - undefined; - - /** - * Creates an instance of RealityDataAccessClient. - */ - public constructor(realityDataClientOptions?: RealityDataClientOptions) { - // runtime config - if (realityDataClientOptions) { - if (realityDataClientOptions.version) - this.apiVersion = realityDataClientOptions.version; - if (realityDataClientOptions.baseUrl) - this.baseUrl = this.setBaseUrl(realityDataClientOptions.baseUrl); - if (realityDataClientOptions.authorizationClient) - this.authorizationClient = realityDataClientOptions.authorizationClient; - } - } - - /** - * Ensures the reality data client points to Reality Management API, as many users hardcode the url to the deprecated Reality Data API. - * @param baseUrl base url given by users of this client - * @returns base url to Reality Management API - */ - private setBaseUrl(baseUrl: string): string { - const url = new URL(baseUrl); - switch (url.host) { - case "dev-api.bentley.com": - return "https://dev-api.bentley.com/reality-management/reality-data"; - case "qa-api.bentley.com": - return "https://qa-api.bentley.com/reality-management/reality-data"; - case "api.bentley.com": - return "https://api.bentley.com/reality-management/reality-data"; - default: - throw new Error("invalid host"); - } - } - - /** - * Try to use authorizationClient in RealityDataClientOptions to get the access token - * otherwise, will return the input token - * This is a workaround to support different authorization client for the reality data client and iTwin-core. - */ - private async resolveAccessToken(accessToken: AccessToken): Promise { - return this.authorizationClient - ? this.authorizationClient.getAccessToken() - : accessToken; - } - - /** - * This method returns the URL to obtain the Reality Data details. - * Technically it should never be required as the RealityData object returned should have all the information to obtain the - * data. - * @param iTwinId the iTwin identifier - * @param realityDataId realityData identifier - * @returns string containing the URL to reality data for indicated tile. - * @beta - */ - public async getRealityDataUrl( - iTwinId: string | undefined, - realityDataId: string, - ): Promise { - if (iTwinId) { - return `${this.baseUrl}/${realityDataId}?iTwinId=${iTwinId}`; - } - return `${this.baseUrl}/${realityDataId}`; - } - - /** - * Gets reality data with all of its properties - * @param accessToken The client request context. - * @param iTwinId id of associated iTwin (or project) - * @param realityDataId realityData identifier - * @returns The requested reality data. - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 404 when the specified reality data is not found - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async getRealityData( - accessToken: AccessToken, - iTwinId: string | undefined, - realityDataId: string, - ): Promise { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${await this.getRealityDataUrl(iTwinId, realityDataId)}`; - try { - const realityDataResponse = await axios.get( - url, - getRequestConfig(accessTokenResolved, "GET", url, this.apiVersion), - ); - - // Axios throws on 4XX and 5XX; we make sure the response here is 200 - if (realityDataResponse.status !== 200) - throw new BentleyError( - 422, - iTwinId - ? `Could not fetch reality data: ${realityDataId} with iTwinId ${iTwinId}` - : `Could not fetch reality data: ${realityDataId}`, - ); - - const realityData = new ITwinRealityData( - this, - realityDataResponse.data.realityData, - iTwinId, - ); - return realityData; - } catch (error) { - return this.handleError(error); - } - } - - /** - * Gets all reality data associated with the iTwin. - * @param accessToken The client request context. - * @param iTwinId id of associated iTwin - * @param criteria Criteria by which to query. - * @returns an array of RealityData that are associated to the iTwin. - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async getRealityDatas( - accessToken: AccessToken, - iTwinId: string | undefined, - criteria: RealityDataQueryCriteria | undefined, - ): Promise { - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = new URL(this.baseUrl); - - if (iTwinId) url.searchParams.append("iTwinId", iTwinId); - - if (criteria) { - if (criteria.continuationToken) { - url.searchParams.append( - "continuationToken", - criteria.continuationToken, - ); - } - - if (criteria.top) { - const top = criteria.top; - if (top > 500) { - throw new BentleyError( - 422, - "Maximum value for top parameter is 500.", - ); - } - url.searchParams.append("$top", top.toString()); - } - - if (criteria.extent) { - const iModelRange = criteria.extent.getLongitudeLatitudeBoundingBox(); - const extent = `${Angle.radiansToDegrees(iModelRange.low.x)},${Angle.radiansToDegrees(iModelRange.low.y)},${Angle.radiansToDegrees(iModelRange.high.x)},${Angle.radiansToDegrees(iModelRange.high.y)}`; - url.searchParams.append("extent", extent); - } - - if (criteria.orderBy) { - url.searchParams.append("$orderBy", criteria.orderBy); - } - - if (criteria.search) { - url.searchParams.append("$search", criteria.search); - } - - if (criteria.types) { - url.searchParams.append("types", criteria.types.join(",")); - } - - if (criteria.acquisitionDates) { - const startDateTime = this.formatIsoString( - criteria.acquisitionDates.startDateTime, - ); - const endDateTime = this.formatIsoString( - criteria.acquisitionDates.endDateTime, - ); - url.searchParams.append( - "acquisitionDateTime", - `${startDateTime}/${endDateTime}`, - ); - } - - if (criteria.createdDateTime) { - const startDateTime = this.formatIsoString( - criteria.createdDateTime.startDateTime, - ); - const endDateTime = this.formatIsoString( - criteria.createdDateTime.endDateTime, - ); - url.searchParams.append( - "createdDateTime", - `${startDateTime}/${endDateTime}`, - ); - } - - if (criteria.modifiedDateTime) { - const startDateTime = this.formatIsoString( - criteria.modifiedDateTime.startDateTime, - ); - const endDateTime = this.formatIsoString( - criteria.modifiedDateTime.endDateTime, - ); - url.searchParams.append( - "modifiedDateTime", - `${startDateTime}/${endDateTime}`, - ); - } - - if (criteria.lastAccessedDateTime) { - const startDateTime = this.formatIsoString( - criteria.lastAccessedDateTime.startDateTime, - ); - const endDateTime = this.formatIsoString( - criteria.lastAccessedDateTime.endDateTime, - ); - url.searchParams.append( - "lastAccessedDateTime", - `${startDateTime}/${endDateTime}`, - ); - } - - if (criteria.ownerId) { - url.searchParams.append("ownerId", criteria.ownerId); - } - - if (criteria.dataCenter) { - url.searchParams.append("dataCenter", criteria.dataCenter); - } - - if (criteria.tag) { - url.searchParams.append("tag", criteria.tag); - } - } - const response = await axios.get( - url.href, - getRequestConfig( - accessTokenResolved, - "GET", - url.href, - this.apiVersion, - criteria?.getFullRepresentation === true ? true : false, - ), - ); - // Axios throws on 4XX and 5XX; we make sure the response here is 200 - if (response.status !== 200) - throw new BentleyError( - 422, - iTwinId - ? `Could not fetch reality data with iTwinId ${iTwinId}` - : "Could not fetch reality data", - ); - - const realityDatasResponseBody = response.data; - - const realityDataResponse: RealityDataResponse = { - realityDatas: [], - continuationToken: this.extractContinuationToken( - response.data._links?.next?.href, - ), - }; - - realityDatasResponseBody.realityData.forEach((realityData: any) => { - realityDataResponse.realityDatas.push( - new ITwinRealityData(this, realityData, iTwinId), - ); - }); - - return realityDataResponse; - } catch (error) { - return this.handleError(error); - } - } - - /** - * trims milliseconds from date.toISOString() method to conform to for date parameters in the API. - * See https://developer.bentley.com/apis/reality-management/operations/get-all-reality-data/#request-parameters - * @param date date to format - * @returns dateTime string in format YYYY-MM-DDTHH:mm:ssZ e.g. 2021-08-01T00:00:00Z - */ - private formatIsoString(date: Date): string { - return `${date.toISOString().slice(0, -5)}Z`; - } - - private extractContinuationToken( - url: string | undefined, - ): string | undefined { - if (url) { - // API returns some case sensitive parameters e.g. "ContinuationToken". Therefore first, set parameters to lowercase - const searchParams = new URLSearchParams(url); - const newParams = new URLSearchParams(); - - for (const [name, value] of searchParams) { - newParams.append(name.toLowerCase(), value); - } - - // Then get continuation token value in case insensitive manner. - const token = newParams.get("continuationtoken"); - - return token ? token : undefined; - } - return undefined; - } - - /** - * Retrieves the list of Projects associated to the specified realityData. - * @deprecated in 1.0.1, getRealityDataProjects is deprecated and no longer used as Projects API is deprecated. Use getRealityDatasITwins method. - * @param accessToken The client request context. - * @param realityDataId realityData identifier - * @returns an array of Projects that are associated to the realityData. - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @beta - */ - public async getRealityDataProjects( - accessToken: AccessToken, - realityDataId: string, - ): Promise { - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${this.baseUrl}/${realityDataId}/itwins`; - const options = getRequestConfig( - accessTokenResolved, - "GET", - url, - this.apiVersion, - ); - - // execute query - const response = await axios.get(url, options); - - const projectsResponseBody = response.data; - - const projectsResponse: Project[] = []; - - // make up projects details link manually - const projectsBaseUrl = this.baseUrl.replace( - "/reality-management/reality-data", - "/projects", - ); - - projectsResponseBody.iTwins.forEach((itwinValue: any) => { - // build Project object with _links.self.href structure - const href = new URL(`${projectsBaseUrl}/${itwinValue}`); - const self = { - href, - }; - - const newProject = new Project({ - id: itwinValue, - // eslint-disable-next-line @typescript-eslint/naming-convention - _links: { - self, - }, - }); - - projectsResponse.push(newProject); - }); - - return projectsResponse; - } catch (error) { - return this.handleError(error); - } - } - - /** - * Retrieves the list of iTwins associated to the specified realityData. - * @param accessToken The client request context. - * @param realityDataId realityData identifier - * @returns an array of iTwin identifiers that are associated to the realityData. - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @beta - */ - public async getRealityDataITwins( - accessToken: AccessToken, - realityDataId: string, - ): Promise { - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${this.baseUrl}/${realityDataId}/itwins`; - const options = getRequestConfig( - accessTokenResolved, - "GET", - url, - this.apiVersion, - ); - - // execute query - const response = await axios.get(url, options); - - const iTwinsResponseBody = response.data; - - const iTwinsResponse: string[] = []; - - iTwinsResponseBody.iTwins.forEach((itwinValue: any) => { - iTwinsResponse.push(itwinValue); - }); - - return iTwinsResponse; - } catch (error) { - return this.handleError(error); - } - } - - /** - * Creates a RealityData - * @param accessToken The client request context. - * @param iTwinId id of associated iTwin - * @param iTwinRealityData the realityData to create - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 403 when user does not have required permissions to create a reality data - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async createRealityData( - accessToken: AccessToken, - iTwinId: string | undefined, - iTwinRealityData: ITwinRealityData, - ): Promise { - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = this.baseUrl; - const options = getRequestConfig( - accessTokenResolved, - "POST", - url, - this.apiVersion, - ); - - // creation payload - - const realityDataToCreate = { - displayName: iTwinRealityData.displayName, - classification: iTwinRealityData.classification, - type: iTwinRealityData.type, - iTwinId, - dataset: iTwinRealityData.dataset, - group: iTwinRealityData.group, - description: iTwinRealityData.description, - rootDocument: iTwinRealityData.rootDocument, - tags: iTwinRealityData.tags, - acquisition: iTwinRealityData.acquisition, - authoring: iTwinRealityData.authoring, - extent: iTwinRealityData.extent, - crs: iTwinRealityData.crs, - attribution: iTwinRealityData.attribution, - termsOfUse: iTwinRealityData.termsOfUse, - }; - - const response = await axios.post(url, realityDataToCreate, options); - iTwinRealityData = new ITwinRealityData( - this, - response.data.realityData, - iTwinId, - ); - } catch (error) { - return this.handleError(error); - } - - return iTwinRealityData; - } - - /** - * Modifies an existing RealityData - * @param accessToken The client request context. - * @param iTwinId id of associated iTwin - * @param iTwinRealityData the realityData to modify - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 404 when the specified reality data was not found - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async modifyRealityData( - accessToken: AccessToken, - iTwinId: string | undefined, - iTwinRealityData: ITwinRealityData, - ): Promise { - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = new URL(`${this.baseUrl}/${iTwinRealityData.id}`); - - const options = getRequestConfig( - accessTokenResolved, - "PATCH", - url.href, - this.apiVersion, - ); - - // payload - - const realityDataToModify = { - id: iTwinRealityData.id, - displayName: iTwinRealityData.displayName, - classification: iTwinRealityData.classification, - type: iTwinRealityData.type, - iTwinId, - dataset: iTwinRealityData.dataset, - group: iTwinRealityData.group, - description: iTwinRealityData.description, - rootDocument: iTwinRealityData.rootDocument, - tags: iTwinRealityData.tags, - acquisition: iTwinRealityData.acquisition, - authoring: iTwinRealityData.authoring, - extent: iTwinRealityData.extent, - crs: iTwinRealityData.crs, - attribution: iTwinRealityData.attribution, - termsOfUse: iTwinRealityData.termsOfUse, - }; - - const response = await axios.patch( - url.href, - realityDataToModify, - options, - ); - - iTwinRealityData = new ITwinRealityData( - this, - response.data.realityData, - iTwinId, - ); - } catch (error) { - return this.handleError(error); - } - - return iTwinRealityData; - } - - /** - * Deletes a RealityData - * @param accessToken The client request context. - * @param realityDataId the realityData to delete - * @returns true if successful (204 response), false if not - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 404 when the specified reality data was not found - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async deleteRealityData( - accessToken: AccessToken, - realityDataId: string, - ): Promise { - let response: AxiosResponse; - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${this.baseUrl}/${realityDataId}`; - const options = getRequestConfig( - accessTokenResolved, - "POST", - url, - this.apiVersion, - ); - - response = await axios.delete(url, options); - } catch (error) { - return this.handleError(error); - } - - if (response.status === 204) return true; - else return false; - } - - /** - * Associates a RealityData to an iTwin - * @param accessToken The client request context. - * @param iTwinId id of iTwin to associate the realityData to. - * @param realityDataId id of the RealityData. - * @returns true if successful (200 response) or false if not - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 404 when the specified reality data or iTwin was not found - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async associateRealityData( - accessToken: AccessToken, - iTwinId: string, - realityDataId: string, - ): Promise { - let response: AxiosResponse; - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${this.baseUrl}/${realityDataId}/iTwins/${iTwinId}`; - const options = getRequestConfig( - accessTokenResolved, - "POST", - url, - this.apiVersion, - ); - - response = await axios.post(url, undefined, options); - } catch (error) { - return this.handleError(error); - } - if (response.status === 200) return true; - else return false; - } - - /** - * Dissociates a RealityData from an iTwin - * @param accessToken The client request context. - * @param iTwinId id of iTwin to dissociate the realityData from. - * @param realityDataId id of the RealityData. - * @returns true if successful (204 response) or false if not - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 404 when the association between the reality data and iTwin was not found - * @throws [[BentleyError]] with code 422 when the request is invalid - * @beta - */ - public async dissociateRealityData( - accessToken: AccessToken, - iTwinId: string, - realityDataId: string, - ): Promise { - let response: AxiosResponse; - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${this.baseUrl}/${realityDataId}/iTwins/${iTwinId}`; - const options = getRequestConfig( - accessTokenResolved, - "DELETE", - url, - this.apiVersion, - ); - - response = await axios.delete(url, options); - } catch (error) { - return this.handleError(error); - } - if (response.status === 204) return true; - else return false; - } - - /** - * Moves a RealityData to a different iTwin - * @param accessToken The client request context. - * @param realityDataId The id of the RealityData to move. - * @param iTwinId The id of the iTwin to move the RealityData to. - * @returns true if successful (204 response) or false if not - * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials - * @throws [[BentleyError]] with code 404 when the specified reality data or iTwin was not found - * @throws [[BentleyError]] with code 422 when the request is invalid - * @throws [[BentleyError]] with code 409 when the reality data is already associated with the specified iTwin - * @beta - */ - public async moveRealityData( - accessToken: AccessToken, - realityDataId: string, - iTwinId: string, - ): Promise { - let response: AxiosResponse; - try { - const accessTokenResolved = await this.resolveAccessToken(accessToken); - const url = `${this.baseUrl}/${realityDataId}/move`; - const options = getRequestConfig( - accessTokenResolved, - "PATCH", - url, - this.apiVersion, - ); - const payload = { iTwinId }; - - response = await axios.patch(url, payload, options); - } catch (error) { - return this.handleError(error); - } - if (response.status === 204) return true; - else return false; - } - - /** - * Handle errors thrown. - * Handled errors can be of AxiosError type or BentleyError. - * @beta - */ - private handleError(error: any): any { - // Default error - let status = 422; - let message = "Unknown error. Please ensure that the request is valid."; - - if (axios.isAxiosError(error) && error.response) { - const axiosResponse = error.response; - status = axiosResponse.status; - message = axiosResponse.data?.error?.message; - } else { - const bentleyError = error as BentleyError; - if (bentleyError !== undefined) { - status = bentleyError.errorNumber; - message = bentleyError.message; - } - } - return Promise.reject(new BentleyError(status, message)); - } -} diff --git a/typescript/packages/reality-data-client/src/RequestOptions.ts b/typescript/packages/reality-data-client/src/RequestOptions.ts deleted file mode 100644 index 916ddb8b..00000000 --- a/typescript/packages/reality-data-client/src/RequestOptions.ts +++ /dev/null @@ -1,30 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ -import type { AxiosRequestConfig, Method } from "axios"; -import { ApiVersion } from "./RealityDataClient"; - -/** - * Build the request methods, headers, and other options - * @param accessTokenString The client access token string - */ -export function getRequestConfig(accessTokenString: string, method: Method, url: string, apiVersion: ApiVersion, returnFullRepresentation: boolean = false): AxiosRequestConfig { - return { - url, - method, - headers: { - "authorization": accessTokenString, - "content-type": "application/json", - "accept": getApiVersionHeader(apiVersion), - "prefer": returnFullRepresentation === true ? "return=representation" : "return=minimal", - }, - }; -} - -function getApiVersionHeader(apiVersion: ApiVersion): string { - switch (apiVersion) { - case ApiVersion.v1: - default: return "application/vnd.bentley.itwin-platform.v1+json"; - } -} diff --git a/typescript/packages/reality-data-client/src/helper/Angle.ts b/typescript/packages/reality-data-client/src/helper/Angle.ts deleted file mode 100644 index a4f8ff7c..00000000 --- a/typescript/packages/reality-data-client/src/helper/Angle.ts +++ /dev/null @@ -1,36 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ -/** - * Helper class for angle conversions. - * Copied from https://github.com/iTwin/itwinjs-core/blob/39a5daf889326f1dcf9d2c3d6149b517898960e7/core/geometry/src/geometry3d/Angle.ts - */ -export class Angle { - /** - * Convert an angle in radians to degrees. - * @param radians angle - */ - public static radiansToDegrees(radians: number): number { - if (radians < 0) - return -Angle.radiansToDegrees(-radians); - // Now radians is positive ... - const pi = Math.PI; - const factor = 180.0 / pi; - /* the following if statements are for round-off reasons. The problem is that no IEEE number is - * an exact hit for any primary multiple of pi (90, 180, etc). The following is supposed to have - * a better chance that if the input was computed by direct assignment from 90, 180, etc degrees - * it will return exactly 90,180 etc. - */ - if (radians <= 0.25 * pi) - return factor * radians; - if (radians < 0.75 * pi) - return 90.0 + 180 * ((radians - 0.5 * pi) / pi); - if (radians <= 1.25 * pi) - return 180.0 + 180 * ((radians - pi) / pi); - if (radians <= 1.75 * pi) - return 270.0 + 180 * ((radians - 1.5 * pi) / pi); - // all larger radians reference from 360 degrees (2PI) - return 360.0 + 180 * ((radians - 2.0 * pi) / pi); - } -} \ No newline at end of file diff --git a/typescript/packages/reality-data-client/src/reality-data-client.ts b/typescript/packages/reality-data-client/src/reality-data-client.ts deleted file mode 100644 index 703cd6d6..00000000 --- a/typescript/packages/reality-data-client/src/reality-data-client.ts +++ /dev/null @@ -1,16 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ -export * from "./RealityDataClient"; -export * from "./RealityData"; -export * from "./Projects"; - -/** @docs-package-description - * The reality-data-client package contains client wrappers for sending requests to the Reality Management API. - */ - -/** - * @docs-group-description RealityData - * Classes for interacting with reality data. - */ diff --git a/typescript/packages/reality-data-client/src/test/TestConfig.ts b/typescript/packages/reality-data-client/src/test/TestConfig.ts deleted file mode 100644 index da63621f..00000000 --- a/typescript/packages/reality-data-client/src/test/TestConfig.ts +++ /dev/null @@ -1,18 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ -import type { AccessToken } from "@itwin/core-bentley"; -import { getAccessTokenFromBackend, type TestUserCredentials, TestUsers } from "@itwin/oidc-signin-tool/lib/cjs/frontend"; - -/** Basic configuration used by all tests - */ -export class TestConfig { - // iTwin id used by tests - public static readonly integrationTestsITwinId: string = "614a3c70-cc9f-4de9-af87-f834002ca19e"; // iTwin name = "Integration tests for reality-data-client" - public static readonly integrationTestsITwinIdProjects: string = "84856374-51ed-4f13-a386-6721e01f87a3"; // iTwin name = "Integration tests for Reality Data Client 2" - /** Login the specified user and return the AuthorizationToken */ - public static async getAccessToken(user: TestUserCredentials = TestUsers.regular): Promise { - return getAccessTokenFromBackend(user); - } -} diff --git a/typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts b/typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts deleted file mode 100644 index 5fd3f2e3..00000000 --- a/typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts +++ /dev/null @@ -1,1415 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ -import * as chai from "chai"; -import chaiAsPromised from "chai-as-promised"; - -import { - type AccessToken, - type GuidString, - Logger, - LogLevel, -} from "@itwin/core-bentley"; -import { CartographicRange, type RealityData } from "@itwin/core-common"; -import { Point3d, Range3d, Transform } from "@itwin/core-geometry"; - -import { - ApiVersion, - RealityDataAccessClient, - type RealityDataClientOptions, - type RealityDataQueryCriteria, -} from "../../RealityDataClient"; -import { TestConfig } from "../TestConfig"; -import { ITwinRealityData } from "../../RealityData"; - -async function delay(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -chai.config.showDiff = true; - -chai.should(); -chai.use(chaiAsPromised); - -const LOG_CATEGORY: string = "RealityDataClient.Test"; - -Logger.initializeToConsole(); -Logger.setLevel(LOG_CATEGORY, LogLevel.Info); - -const realityDataClientConfig: RealityDataClientOptions = { - version: ApiVersion.v1, - baseUrl: "https://api.bentley.com/reality-management/reality-data", -}; - -const realityDataAccessClientForTest = new RealityDataAccessClient( - realityDataClientConfig, -); - -describe("RealityServicesClient Normal (#integration)", () => { - const iTwinId: GuidString = TestConfig.integrationTestsITwinId; - const iTwinId2: GuidString = TestConfig.integrationTestsITwinIdProjects; - - const realityDataAccessClient = new RealityDataAccessClient(); - - let realityDataId: string; - let realityDataIdProjects: string; - - // test RealityData for listing tests. - const realityDataList: ITwinRealityData[] = []; - - let accessToken: AccessToken; - - before(async () => { - // get token - accessToken = await TestConfig.getAccessToken(); - - chai.assert.isDefined(iTwinId); - chai.assert.isDefined(iTwinId2); - - // create a test reality data - let rdTest = new ITwinRealityData( - realityDataAccessClient, - { - displayName: "iTwinjs reality-data-client test, can be deleted", - type: "3MX", - }, - iTwinId, - ); - rdTest = await realityDataAccessClient.createRealityData( - accessToken, - iTwinId, - rdTest, - ); - chai.assert(rdTest, "Failed to create test reality data"); - realityDataId = rdTest.id; - - // create a test reality data associated to both iTwins - let rdTestProjects = new ITwinRealityData( - realityDataAccessClient, - { - displayName: "iTwinjs reality-data-client projects, can be deleted", - type: "3MX", - }, - iTwinId, - ); - rdTestProjects = await realityDataAccessClient.createRealityData( - accessToken, - iTwinId, - rdTestProjects, - ); - await realityDataAccessClient.associateRealityData( - accessToken, - iTwinId2, - rdTestProjects.id, - ); - chai.assert(rdTestProjects, "Failed to create test reality data"); - - // create 10 reality data for listing tests - for (let i = 0; i < 10; i++) { - let rd = new ITwinRealityData( - realityDataAccessClient, - { - displayName: `iTwinjs reality-data-client listing test ${i}, can be deleted`, - type: "3MX", - }, - iTwinId, - ); - rd = await realityDataAccessClient.createRealityData( - accessToken, - iTwinId, - rd, - ); - chai.assert(rd, `Failed to create test reality data ${i}`); - realityDataList.push(rd); - } - - realityDataIdProjects = rdTestProjects.id; - }); - - after(async () => { - // delete the test reality data - const deleteResult1 = await realityDataAccessClient.deleteRealityData( - accessToken, - realityDataId, - ); - chai.assert(deleteResult1, "Failed to delete test reality data"); - - const dissociateResult = - await realityDataAccessClient.dissociateRealityData( - accessToken, - iTwinId2, - realityDataIdProjects, - ); - chai.assert(dissociateResult, "Failed to dissociate test reality data"); - const deleteResult2 = await realityDataAccessClient.deleteRealityData( - accessToken, - realityDataIdProjects, - ); - chai.assert(deleteResult2, "Failed to delete test reality data"); - - // delete the test reality data for listing tests - for (let i = 0; i < 10; i++) { - const deleteResult = await realityDataAccessClient.deleteRealityData( - accessToken, - realityDataList[i].id, - ); - chai.assert(deleteResult, `Failed to delete test reality data ${i}`); - } - }); - - it("should properly redirect configured URL to proper Reality Management API URL", async () => { - // dev - const realityDataClientConfigDev: RealityDataClientOptions = { - version: ApiVersion.v1, - baseUrl: "https://dev-api.bentley.com/realitydata", - }; - - const realityDataAccessClientDev = new RealityDataAccessClient( - realityDataClientConfigDev, - ); - chai.assert( - realityDataAccessClientDev.baseUrl === - "https://dev-api.bentley.com/reality-management/reality-data", - ); - - // qa - const realityDataClientConfigQa: RealityDataClientOptions = { - version: ApiVersion.v1, - baseUrl: "https://qa-api.bentley.com/www.someotherfakehost.com/", - }; - - const realityDataAccessClientQa = new RealityDataAccessClient( - realityDataClientConfigQa, - ); - chai.assert( - realityDataAccessClientQa.baseUrl === - "https://qa-api.bentley.com/reality-management/reality-data", - ); - - // prod - const realityDataClientConfigProd: RealityDataClientOptions = { - version: ApiVersion.v1, - baseUrl: "https://api.bentley.com/realitydata", - }; - - const realityDataAccessClientProd = new RealityDataAccessClient( - realityDataClientConfigProd, - ); - chai.assert( - realityDataAccessClientProd.baseUrl === - "https://api.bentley.com/reality-management/reality-data", - ); - - // error test - const realityDataClientConfigError: RealityDataClientOptions = { - version: ApiVersion.v1, - baseUrl: "https://evilwebsite.net", - }; - - try { - const _realityDataAccessClientError = new RealityDataAccessClient( - realityDataClientConfigError, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.message === "invalid host", - `Error message should be 'invalid host'. It is '${errorResponse.errorNumber}.`, - ); - return; - } - }); - - it("should return a RealityData URL properly from a given ID", async () => { - try { - // test with iTwinId - let realityDataUrl = await realityDataAccessClient.getRealityDataUrl( - iTwinId, - realityDataId, - ); - const expectedUrl = `${realityDataClientConfig.baseUrl}/${realityDataId}?iTwinId=${iTwinId}`; - chai.assert(realityDataUrl === expectedUrl); - - // test without iTwinId - realityDataUrl = await realityDataAccessClient.getRealityDataUrl( - undefined, - realityDataId, - ); - chai.assert( - realityDataUrl === - `${realityDataClientConfig.baseUrl}/${realityDataId}`, - ); - } catch (errorResponse: any) { - throw Error(`Test error: ${errorResponse}`); - } - }); - - it("should return a RealityData from a given ID", async () => { - try { - let realityData = await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - realityDataId, - ); - chai.assert(realityData); - chai.assert(realityData.id === realityDataId); - - // test without iTwinId - await delay(1000); - realityData = await realityDataAccessClientForTest.getRealityData( - accessToken, - undefined, - realityDataId, - ); - chai.assert(realityData); - chai.assert(realityData.id === realityDataId); - } catch (errorResponse: any) { - throw Error(`Test error: ${errorResponse}`); - } - }); - - it("should return a RealityData from a given ID and respect RealityDataAccessProps interfaces", async () => { - try { - const realityData: RealityData = - await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - realityDataId, - ); - chai.assert(realityData); - chai.assert(realityData.id === realityDataId); - } catch (errorResponse: any) { - throw Error(`Test error: ${errorResponse}`); - } - }); - - // TODO: remove once getRealityDataProjects method is removed in next major release - it("should be able to get project information from a RealityData", async () => { - // displayName: iTwinjs RealityData Client get projects test, id: d344d5ec-5068-4752-9432-ff1c8f087111 - const realityData = await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - realityDataIdProjects, - ); - - chai.assert(realityData); - // get all projects information - /* eslint-disable @typescript-eslint/no-deprecated */ - const projects = - await realityDataAccessClientForTest.getRealityDataProjects( - accessToken, - realityData.id, - ); - /* eslint-enable @typescript-eslint/no-deprecated */ - chai.assert(projects); - chai.assert(projects.length === 2); - projects.forEach((value) => { - chai.assert(value.id); - chai.assert(value.projectDetailsLink); - }); - }); - - it("should be able to get iTwin information from a RealityData", async () => { - // displayName: iTwinjs RealityData Client get projects test, id: d344d5ec-5068-4752-9432-ff1c8f087111 - const realityData = await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - realityDataIdProjects, - ); - - chai.assert(realityData); - // get all projects information - const projects = await realityDataAccessClientForTest.getRealityDataITwins( - accessToken, - realityData.id, - ); - chai.assert(projects); - chai.assert(projects.length === 2); - projects.forEach((value) => { - chai.assert(value); - }); - }); - - it("should be able to retrieve the azure blob url", async () => { - const realityData = await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - realityDataId, - ); - const url: URL = await realityData.getBlobUrl(accessToken, "test"); - chai.assert(url); - chai.assert(url.toString().includes("test")); - - // cache test, wait 1 second and make the same call again, url should be the same. - await delay(1000); - const fakeAccessToken = "fake"; // this ensures that we are not executing a request to the API for a new SAS url, otherwise it would fail - const url2: URL = await realityData.getBlobUrl(fakeAccessToken, "test"); - chai.assert(url.href === url2.href); - - // cache test, wait 1 second and request the same reality data with WRITE access, url should be different. - await delay(1000); - const url2Write: URL = await realityData.getBlobUrl( - accessToken, - "test", - true, - ); - chai.assert(url2.href !== url2Write.href); - - // test without iTwinId - await delay(1000); - - const realityData2 = await realityDataAccessClientForTest.getRealityData( - accessToken, - undefined, - realityDataId, - ); - const url3: URL = await realityData2.getBlobUrl(accessToken, "test"); - chai.assert(url3); - chai.assert(url3.toString().includes("test")); - }); - - it("should be able to retrieve reality data properties for every reality data associated with iTwin", async () => { - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - undefined, - ); - const realityDatas = realityDataResponse.realityDatas; - chai.assert(realityDatas); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - }); - }); - - it("should be able to retrieve reality data properties for every available realitydata", async () => { - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - undefined, - undefined, - ); - const realityDatas = realityDataResponse.realityDatas; - - chai.assert(realityDatas); - - realityDatas.forEach((value) => { - chai.assert(value.id); - chai.assert(value.type); - chai.assert(value.displayName); - }); - }); - - it("should query the first 10 reality data using the $top=10 parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - top: 10, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - const realityDatas = realityDataResponse.realityDatas; - chai.assert(realityDatas); - - chai.assert(realityDatas.length === 10); - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - }); - - // max results > 500 should fail. - const badRealityDataQueryCriteria: RealityDataQueryCriteria = { - top: 501, - }; - await chai - .expect( - realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - badRealityDataQueryCriteria, - ), - ) - .to.eventually.be.rejectedWith(Error); - }); - - it("should be able to query using continuationToken", async () => { - // get the first 5 - const realityDataQueryCriteria: RealityDataQueryCriteria = { - top: 5, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert(realityDatas); - - chai.assert(realityDatas.length === 5); - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - }); - - chai.assert(realityDataResponse.continuationToken); - - // get another 5 with continuation token - const realityDataQueryCriteriaContinuationToken: RealityDataQueryCriteria = - { - top: 5, - continuationToken: realityDataResponse.continuationToken, - }; - - const realityDataResponseContinuation = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteriaContinuationToken, - ); - - const realityDatasContinued = realityDataResponseContinuation.realityDatas; - chai.assert(realityDatasContinued); - - chai.assert(realityDatasContinued.length === 5); - realityDatasContinued.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - }); - - // test until no more continuation - const realityDataQueryUntilTheEnd: RealityDataQueryCriteria = { - top: 5, - continuationToken: realityDataResponseContinuation.continuationToken, - }; - - while (realityDataQueryUntilTheEnd.continuationToken) { - const realityDataResponseUntilTheEnd = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryUntilTheEnd, - ); - realityDataQueryUntilTheEnd.continuationToken = - realityDataResponseUntilTheEnd.continuationToken; - } - }); - - it("should query reality data using the $orderby parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - orderBy: "createdDateTime desc", - }; - - const realityDataResponse = await realityDataAccessClient.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert(realityDatas); - chai.assert( - realityDatas.length > 1, - "Expected at least two reality data results", - ); - - let lastCreatedTime = Number.MAX_SAFE_INTEGER; - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value?.createdDateTime); - chai.assert(value.createdDateTime.getTime() <= lastCreatedTime); - lastCreatedTime = value.createdDateTime.getTime(); - }); - }); - - it("should query reality data using the $search parameter with the search term: This is a fairly simple description.", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - search: "This is a fairly simple description.", - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with description 'This is a fairly simple description.'.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert( - value.description?.includes("This is a fairly simple description."), - ); - }); - }); - - it("should query reality data using the types parameter", async () => { - const types = ["3MX", "3SM"]; - const realityDataQueryCriteria: RealityDataQueryCriteria = { - top: 10, - types, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with types 3MX and 3SM.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value.type === "3MX" || value.type === "3SM"); - }); - }); - - it("should query reality data using the acquisitionDateTime parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - acquisitionDates: { - startDateTime: new Date(2017, 5, 12), - endDateTime: new Date(2023, 5, 12), - }, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with acquisition dates between 2017-05-12 and 2023-05-12.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value.acquisition); - chai.assert(value.acquisition?.startDateTime); - chai.assert( - value.acquisition?.startDateTime.getTime() >= - new Date(2017, 5, 12).getTime(), - ); - chai.assert( - value.acquisition?.startDateTime.getTime() <= - new Date(2023, 5, 12).getTime(), - ); - }); - }); - - it("should query reality data using the createdDateTime parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - createdDateTime: { - startDateTime: new Date(2021, 5, 12), - endDateTime: new Date(2022, 5, 12), - }, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with creation dates between 2021-05-12 and 2022-05-12.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value.createdDateTime); - chai.assert( - value.createdDateTime.getTime() >= new Date(2021, 5, 12).getTime(), - ); - chai.assert( - value.createdDateTime.getTime() <= new Date(2022, 5, 12).getTime(), - ); - }); - }); - - it("should query reality data using the modifiedDateTime parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - modifiedDateTime: { - startDateTime: new Date(2021, 0, 1), - endDateTime: new Date(2030, 0, 1), - }, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with modification dates between 2021-01-01 and 2030-01-01.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value.modifiedDateTime); - chai.assert( - value.modifiedDateTime.getTime() >= new Date(2021, 0, 1).getTime(), - ); - chai.assert( - value.modifiedDateTime.getTime() <= new Date(2030, 0, 1).getTime(), - ); - }); - }); - - it("should query reality data using the lastAccessedDateTime parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - lastAccessedDateTime: { - startDateTime: new Date(2021, 0, 1), - endDateTime: new Date(2030, 0, 1), - }, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with last accessed dates between 2021-01-01 and 2030-01-01.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value.lastAccessedDateTime); - chai.assert( - value.lastAccessedDateTime.getTime() >= new Date(2021, 0, 1).getTime(), - ); - chai.assert( - value.lastAccessedDateTime.getTime() <= new Date(2030, 0, 1).getTime(), - ); - }); - }); - - it("should query reality data using the ownerId parameter", async () => { - // Fetch one reality data to get its ownerId, then query by that ownerId - const referenceRd = await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - realityDataId, - ); - chai.assert( - referenceRd.ownerId, - "ownerId must be populated on a fetched reality data", - ); - - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - ownerId: referenceRd.ownerId, - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found when filtering by ownerId.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.id); - chai.assert(value.type); - chai.assert(value.ownerId === referenceRd.ownerId); - }); - }); - - it("should query reality data using the dataCenter parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - dataCenter: "East US", - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found in 'East US' data center. Please verify test reality data exists in that data center.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.id); - chai.assert(value.type); - chai.assert(value.dataCenterLocation === "East US"); - }); - }); - - it("should query reality data using the tag parameter", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - getFullRepresentation: true, - top: 10, - tag: "tag1", - }; - - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - const realityDatas = realityDataResponse.realityDatas; - chai.assert( - realityDatas && realityDatas.length > 0, - "No reality data found. Please verify test reality data exists with tag 'tag1'.", - ); - - realityDatas.forEach((value) => { - chai.assert(value.iTwinId === iTwinId); - chai.assert(value.type); - chai.assert(value.id); - chai.assert(value.tags); - chai.assert(value.tags.includes("tag1")); - }); - }); - - it("should be able to retrieve reality data properties for every reality data associated with iTwin within an extent", async () => { - // arrange - let rdWithExtent = new ITwinRealityData( - realityDataAccessClientForTest, - { - displayName: - "iTwinjs reality-data-client test with extent, can be deleted", - type: "3SM", - extent: { - southWest: { latitude: 40.6706, longitude: -80.3455 }, - northEast: { latitude: 40.6716, longitude: -80.3359 }, - }, - }, - iTwinId, - ); - rdWithExtent = await realityDataAccessClientForTest.createRealityData( - accessToken, - iTwinId, - rdWithExtent, - ); - chai.assert(rdWithExtent, "Failed to create test reality data"); - const rdWithExtentId = rdWithExtent.id; - - // act - const cornerSpatial = new Array(); - cornerSpatial.push(new Point3d(813907, -4775048, 4135438)); - cornerSpatial.push(new Point3d(814123, -4776318, 4135438)); - cornerSpatial.push(new Point3d(812222, -4776642, 4135438)); - cornerSpatial.push(new Point3d(812007, -4775372, 4135438)); - - const rdRange = Range3d.createArray(cornerSpatial); - const rdCartographicRange = new CartographicRange( - rdRange, - Transform.createIdentity(), - ); - - const realityDataQueryCriteria: RealityDataQueryCriteria = { - top: 10, - extent: rdCartographicRange, - }; - const realityDataResponse = - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - - // assert - chai.assert(realityDataResponse); - chai.assert( - realityDataResponse.realityDatas.length > 0, - "No reality data found. Please verify test reality data exists within the given extent.", - ); - chai.assert( - realityDataResponse.realityDatas.filter((rd) => rd.id === rdWithExtentId) - .length > 0, - ); - - // delete the test reality data - const deleteResult = await realityDataAccessClientForTest.deleteRealityData( - accessToken, - rdWithExtentId, - ); - chai.assert(deleteResult, "Failed to delete test reality data"); - }); - - it("should be able to create, modify, then delete a Reality Data", async () => { - // this test also serves as a property test. - const realityData = new ITwinRealityData(realityDataAccessClientForTest); - realityData.displayName = - "iTwinjs RealityData Client create and delete test"; - realityData.dataset = "Test Dataset for iTwinjs"; - realityData.group = "Test group"; - realityData.description = "Dummy description for a test reality data"; - realityData.attribution = "Attribution text"; - realityData.termsOfUse = "Terms of use text"; - realityData.rootDocument = "RootDocumentFile.txt"; - realityData.classification = "Undefined"; - realityData.type = "LAS"; - realityData.acquisition = { - startDateTime: new Date("2019-05-10T09:46:16Z"), - endDateTime: new Date("2019-05-10T09:46:16Z"), - acquirer: "John Doe Surveying using Leico model 123A Point Cloud Scanner", - }; - realityData.extent = { - southWest: { - latitude: 1.0, - longitude: 2.0, - }, - northEast: { - latitude: 1.1, - longitude: 2.1, - }, - }; - realityData.crs = { - id: "EPSG:4326", - verticalId: "EPSG:5773", - }; - realityData.tags = ["tag1", "tag2"]; - realityData.authoring = false; - - const realityDataAdded = - await realityDataAccessClientForTest.createRealityData( - accessToken, - iTwinId, - realityData, - ); - chai.assert(realityDataAdded.id); - chai.assert(realityDataAdded.displayName === realityData.displayName); - chai.assert(realityDataAdded.group === realityData.group); - chai.assert(realityDataAdded.dataset === realityData.dataset); - chai.assert(realityDataAdded.description === realityData.description); - chai.assert(realityDataAdded.attribution === realityData.attribution); - chai.assert(realityDataAdded.termsOfUse === realityData.termsOfUse); - chai.assert(realityDataAdded.rootDocument === realityData.rootDocument); - chai.assert(realityDataAdded.classification === realityData.classification); - chai.assert( - realityDataAdded.type?.toLowerCase() === realityData.type.toLowerCase(), - ); - - chai.assert( - realityDataAdded.acquisition?.acquirer === - realityData.acquisition.acquirer, - ); - chai.assert( - realityDataAdded.acquisition?.startDateTime.getTime() === - realityData.acquisition.startDateTime.getTime(), - ); - chai.assert(realityData.acquisition?.endDateTime); - chai.assert(realityDataAdded.acquisition?.endDateTime); - chai.assert( - realityDataAdded.acquisition.endDateTime.getTime() === - realityData.acquisition.endDateTime.getTime(), - ); - chai.assert(realityDataAdded.extent); - chai.assert(realityDataAdded.extent.southWest.latitude === 1.0); - chai.assert(realityDataAdded.extent.southWest.longitude === 2.0); - chai.assert(realityDataAdded.extent.northEast.latitude === 1.1); - chai.assert(realityDataAdded.extent.northEast.longitude === 2.1); - chai.assert(realityDataAdded.crs); - chai.assert(realityDataAdded.crs.id === "EPSG:4326"); - chai.assert(realityDataAdded.crs.verticalId === "EPSG:5773"); - - chai.assert(realityDataAdded.tags); - chai.assert(realityDataAdded.tags.includes("tag1")); - chai.assert(realityDataAdded.tags.includes("tag2")); - chai.assert(realityDataAdded.authoring === false); - chai.assert(realityDataAdded.dataCenterLocation === "East US"); - chai.assert(realityDataAdded.modifiedDateTime); - chai.assert(realityDataAdded.modifiedDateTime.getTime()); - chai.assert(realityDataAdded.lastAccessedDateTime); - chai.assert(realityDataAdded.lastAccessedDateTime.getTime()); - chai.assert(realityDataAdded.createdDateTime); - chai.assert(realityDataAdded.createdDateTime.getTime()); - chai.assert(realityDataAdded.ownerId); - - realityDataAdded.displayName = - "MODIFIED iTwinjs RealityData Client create and delete test"; - realityDataAdded.group = "MODIFIED Test group"; - realityDataAdded.dataset = "MODIFIED Test Dataset for iTwinjs"; - realityDataAdded.description = - "MODIFIED Dummy description for a test reality data"; - realityDataAdded.rootDocument = "MODIFIED RootDocumentFile.txt"; - realityDataAdded.classification = "Model"; - realityDataAdded.type = "LAZ"; - realityDataAdded.acquisition = { - startDateTime: new Date("2021-05-10T09:46:16Z"), - endDateTime: new Date("2021-05-10T10:46:16Z"), - acquirer: - "MODIFIED John Doe Surveying using Leico model 123A Point Cloud Scanner", - }; - realityDataAdded.extent = { - southWest: { latitude: 1.1, longitude: 2.0 }, - northEast: { latitude: 1.2, longitude: 2.1 }, - }; - realityDataAdded.tags = ["tag1", "tag2", "tag3"]; - realityDataAdded.crs = { - id: "EPSG:3857", - verticalId: "EPSG:5703", - }; - realityDataAdded.attribution = "MODIFIED Attribution text"; - realityDataAdded.termsOfUse = "MODIFIED Terms of use text"; - - const realityDataModified = - await realityDataAccessClientForTest.modifyRealityData( - accessToken, - iTwinId, - realityDataAdded, - ); - - chai.assert( - realityDataModified.displayName === realityDataAdded.displayName, - ); - chai.assert(realityDataModified.group === realityDataAdded.group); - chai.assert(realityDataModified.dataset === realityDataAdded.dataset); - chai.assert( - realityDataModified.description === realityDataAdded.description, - ); - chai.assert( - realityDataModified.rootDocument === realityDataAdded.rootDocument, - ); - chai.assert( - realityDataModified.classification === realityDataAdded.classification, - ); - chai.assert( - realityDataModified.type?.toLowerCase() === - realityDataAdded.type.toLowerCase(), - ); - chai.assert( - realityDataModified.acquisition?.acquirer === - realityDataAdded.acquisition.acquirer, - ); - chai.assert( - realityDataModified.acquisition?.startDateTime.getTime() === - realityDataAdded.acquisition.startDateTime.getTime(), - ); - chai.assert(realityDataModified.acquisition?.endDateTime); - chai.assert(realityDataAdded.acquisition?.endDateTime); - chai.assert( - realityDataModified.acquisition.endDateTime.getTime() === - realityDataAdded.acquisition.endDateTime.getTime(), - ); - chai.assert(realityDataModified.extent); - chai.assert(realityDataModified.extent.southWest.latitude === 1.1); - chai.assert(realityDataModified.extent.southWest.longitude === 2.0); - chai.assert(realityDataModified.extent.northEast.latitude === 1.2); - chai.assert(realityDataModified.extent.northEast.longitude === 2.1); - chai.assert(realityDataModified.crs); - chai.assert(realityDataModified.crs.id === realityDataAdded.crs.id); - chai.assert( - realityDataModified.crs.verticalId === realityDataAdded.crs.verticalId, - ); - chai.assert( - realityDataModified.attribution === realityDataAdded.attribution, - ); - chai.assert(realityDataModified.termsOfUse === realityDataAdded.termsOfUse); - chai.assert(realityDataModified.tags); - chai.assert(realityDataModified.tags.includes("tag1")); - chai.assert(realityDataModified.tags.includes("tag2")); - chai.assert(realityDataModified.tags.includes("tag3")); - - chai.assert( - await realityDataAccessClientForTest.deleteRealityData( - accessToken, - realityDataAdded.id, - ), - ); - }); - - it("should be able to create, associate, dissociate, and delete RealityData", async () => { - const realityData = new ITwinRealityData(realityDataAccessClientForTest); - realityData.displayName = - "iTwinjs RealityData Client associate and dissociate test"; - realityData.classification = "Undefined"; - realityData.type = "3MX"; - - const realityDataAdded = - await realityDataAccessClientForTest.createRealityData( - accessToken, - iTwinId, - realityData, - ); - - chai.assert( - await realityDataAccessClientForTest.associateRealityData( - accessToken, - iTwinId2, - realityDataAdded.id, - ), - ); - - chai.assert( - await realityDataAccessClientForTest.dissociateRealityData( - accessToken, - iTwinId2, - realityDataAdded.id, - ), - ); - - chai.assert( - await realityDataAccessClientForTest.deleteRealityData( - accessToken, - realityDataAdded.id, - ), - ); - }); - - it("should be able to create modify, and delete Reality Data, (Without iTwinId)", async () => { - const realityData = new ITwinRealityData(realityDataAccessClientForTest); - realityData.displayName = - "iTwinjs RealityData Client CRUD test without iTwinId"; - realityData.classification = "Undefined"; - realityData.type = "3MX"; - - // current test user belongs to no organization and needs a iTwin to create realityData. However, the modify without iTwinId can be tested. - const realityDataAdded = - await realityDataAccessClientForTest.createRealityData( - accessToken, - iTwinId, - realityData, - ); - - realityDataAdded.displayName = - "MODIFIED iTwinjs RealityData Client CRUD test without iTwinId"; - - const realityDataModified = - await realityDataAccessClientForTest.modifyRealityData( - accessToken, - undefined, - realityDataAdded, - ); - - chai.assert( - realityDataModified.displayName === realityDataAdded.displayName, - ); - - chai.assert( - await realityDataAccessClientForTest.deleteRealityData( - accessToken, - realityDataAdded.id, - ), - ); - }); - - it("should be able to move Reality Data", async () => { - const realityData = new ITwinRealityData(realityDataAccessClientForTest); - realityData.displayName = "iTwinjs RealityData Client move test"; - realityData.classification = "Undefined"; - realityData.type = "3MX"; - const realityDataAdded = - await realityDataAccessClientForTest.createRealityData( - accessToken, - iTwinId, - realityData, - ); - chai.assert(realityDataAdded.id); - try { - // move the reality data to another iTwin - const movedRealityData = - await realityDataAccessClientForTest.moveRealityData( - accessToken, - realityDataAdded.id, - iTwinId2, - ); - chai.assert(movedRealityData); - - // get itwins - const itwins = await realityDataAccessClientForTest.getRealityDataITwins( - accessToken, - realityDataAdded.id, - ); - chai.assert(itwins.length === 1); - chai.assert(itwins[0] === iTwinId2); - } finally { - // delete the moved reality data - chai.assert( - await realityDataAccessClientForTest.deleteRealityData( - accessToken, - realityDataAdded.id, - ), - ); - } - }); -}); - -describe("RealityServicesClient Errors (#integration)", () => { - let iTwinId: GuidString; - - const nonExistentRealityDataId: string = - "f2065aea-5dcd-49e2-9077-000000000000"; - - let accessToken: AccessToken; - - before(async () => { - accessToken = await TestConfig.getAccessToken(); - iTwinId = TestConfig.integrationTestsITwinId; - chai.assert.isDefined(iTwinId); - }); - - it("should throw a 422 error when Reality Data ID is not a valid Guid", async () => { - const rdId = "f2065aea-5dcd-49e2-9077-xxxxxxxxxxxx"; - try { - await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - rdId, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 422, - `Error code should be 422. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "getRealityData should throw an error."); - }); - - it("should throw a 404 error when Reality Data ID does not exist.", async () => { - try { - await realityDataAccessClientForTest.getRealityData( - accessToken, - iTwinId, - nonExistentRealityDataId, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 404, - `Error code should be 404. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "getRealityData should throw an error."); - }); - - it("should throw a 422 error when the iTwinId is invalid (getting all reality data in a iTwin)", async () => { - const invalidITwinId = "xxxxxxxx-cc9f-4de9-af87-f834002ca19e"; - try { - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - invalidITwinId, - undefined, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 422, - `Error message should be 422. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "getRealityDatas should throw an error."); - }); - - it("should throw a 422 error when the top parameter is > 500 (getting all reality data in a iTwin)", async () => { - const realityDataQueryCriteria: RealityDataQueryCriteria = { - top: 501, - }; - - try { - await realityDataAccessClientForTest.getRealityDatas( - accessToken, - iTwinId, - realityDataQueryCriteria, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 422, - `Error code should be 422. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert( - false, - "getRealityDatas should throw an error when top parameter is > 500.", - ); - }); - - it("should throw a 422 error when required properties are missing (creating a reality data)", async () => { - // displayName is missing - const realityData = new ITwinRealityData(realityDataAccessClientForTest); - realityData.dataset = "Test Dataset for iTwinjs"; - realityData.description = "Dummy description for a test reality data"; - realityData.type = "3MX"; - realityData.classification = "Undefined"; - try { - await realityDataAccessClientForTest.createRealityData( - accessToken, - iTwinId, - realityData, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 422, - `Error code should be 422. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "createRealityData should throw an error."); - }); - - it("should throw a 404 error when reality data id does not exist (modifying a reality data)", async () => { - const realityData = new ITwinRealityData(realityDataAccessClientForTest); - realityData.id = nonExistentRealityDataId; - realityData.displayName = "MODIFIED iTwinjs RealityData"; - realityData.dataset = "Test Dataset for iTwinjs"; - realityData.description = "Dummy description for a test reality data"; - realityData.type = "3MX"; - realityData.classification = "Undefined"; - try { - await realityDataAccessClientForTest.modifyRealityData( - accessToken, - iTwinId, - realityData, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 404, - `Error code should be 404. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "createRealityData should throw an error."); - }); - - it("should throw a 404 error when reality data id does not exist (deleting a reality data)", async () => { - try { - await realityDataAccessClientForTest.deleteRealityData( - accessToken, - nonExistentRealityDataId, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 404, - `Error code should be 404. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "deleteRealityData should throw an error."); - }); - - it("should throw a 404 error when reality data id does not exist (associate a reality data)", async () => { - try { - await realityDataAccessClientForTest.associateRealityData( - accessToken, - iTwinId, - nonExistentRealityDataId, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 404, - `Error code should be 404. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "associateRealityData should throw an error."); - }); - - it("should throw a 404 error when reality data id does not exist (dissociate a reality data)", async () => { - try { - await realityDataAccessClientForTest.dissociateRealityData( - accessToken, - iTwinId, - nonExistentRealityDataId, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 404, - `Error code should be 404. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "dissociateRealityData should throw an error."); - }); - - it("should throw a 404 error when reality data id does not exist (moving a reality data)", async () => { - try { - await realityDataAccessClientForTest.moveRealityData( - accessToken, - nonExistentRealityDataId, - iTwinId, - ); - } catch (errorResponse: any) { - chai.assert( - errorResponse.errorNumber === 404, - `Error code should be 404. It is ${errorResponse.errorNumber}.`, - ); - return; - } - chai.assert(false, "moveRealityData should throw an error."); - }); -}); diff --git a/typescript/packages/reality-data-client/src/test/utils/webpack.config.js b/typescript/packages/reality-data-client/src/test/utils/webpack.config.js deleted file mode 100644 index c81e8015..00000000 --- a/typescript/packages/reality-data-client/src/test/utils/webpack.config.js +++ /dev/null @@ -1,105 +0,0 @@ -/*--------------------------------------------------------------------------------------------- -* Copyright (c) Bentley Systems, Incorporated. All rights reserved. -* See LICENSE.md in the project root for license terms and full copyright notice. -*--------------------------------------------------------------------------------------------*/ - -const path = require("path"); -const glob = require("glob"); -const webpack = require("webpack"); -const fs = require("fs"); - -/** Loads the provided `.env` file into process.env */ -function loadEnv(envFile) { - if (!fs.existsSync(envFile)) - return; - - const dotenv = require("dotenv"); - const dotenvExpand = require("dotenv-expand"); - const envResult = dotenv.config({ path: envFile }); - if (envResult.error) { - throw envResult.error; - } - - dotenvExpand(envResult); -} - -loadEnv(path.join(__dirname, "..", "..", "..", ".env")); - -const clientsLib = path.resolve(__dirname, "../../../lib/cjs"); - -function createConfig(shouldInstrument) { - const config = { - mode: "development", - entry: glob.sync(path.resolve(clientsLib, "test/**/*.test.js").replace(/\\/g, '/')), - output: { - path: path.resolve(clientsLib, "test/webpack/"), - filename: "bundled-tests.js", - devtoolModuleFilenameTemplate: "file:///[absolute-resource-path]" - }, - devtool: "nosources-source-map", - module: { - noParse: [ - // Don't parse draco_*_nodejs.js modules for `require` calls. There are - // requires for fs that cause it to fail even though the fs dependency - // is not used. - /draco_decoder_nodejs.js$/, - /draco_encoder_nodejs.js$/ - ], - rules: [ - { - test: /\.js$/, - use: "source-map-loader", - enforce: "pre" - }, - { - test: /azure-storage|AzureFileHandler|UrlFileHandler/, - use: "null-loader" - }, - ] - }, - stats: "errors-only", - optimization: { - nodeEnv: "production" - }, - externals: { - electron: "commonjs electron", - }, - plugins: [ - // Makes some environment variables available to the JS code, for example: - // if (process.env.NODE_ENV === "development") { ... }. See `./env.js`. - new webpack.DefinePlugin({ - "process.env": Object.keys(process.env) - .filter((key) => { - return key.match(/^imjs_/i); - }) - .reduce((env, key) => { - env[key] = JSON.stringify(process.env[key]); - return env; - }, {}), - }) - ], - target: 'web' - }; - - if (shouldInstrument) { - config.output.filename = "bundled-tests.instrumented.js"; - config.module.rules.push({ - test: /\.(jsx?|tsx?)$/, - include: clientsLib, - exclude: path.join(clientsLib, "test"), - loader: require.resolve("istanbul-instrumenter-loader"), - options: { - debug: true - }, - enforce: "post", - }); - } - - return config; -} - -// Exporting two configs in a array like this actually tells webpack to run twice - once for each config. -module.exports = [ - // createConfig(true), - createConfig(false) -] diff --git a/typescript/packages/reality-data-client/tsconfig.json b/typescript/packages/reality-data-client/tsconfig.json deleted file mode 100644 index bb9af442..00000000 --- a/typescript/packages/reality-data-client/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./node_modules/@itwin/build-tools/tsconfig-base.json", - "compilerOptions": { - "strictPropertyInitialization": false, - "moduleResolution": "node", - "esModuleInterop": true, - "sourceMap": true, - }, - "include": ["./src/**/*.ts"], -} diff --git a/typescript/packages/reality-data-client/tsconfig.tsbuildinfo b/typescript/packages/reality-data-client/tsconfig.tsbuildinfo deleted file mode 100644 index 7396dabc..00000000 --- a/typescript/packages/reality-data-client/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.6.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/accesstoken.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/assert.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/beevent.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/bentleyerror.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/bentleyloggercategory.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/statuscategory.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/besqlite.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/id.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/bytestream.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/classutils.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/compare.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/orderedid64iterable.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/sortedarray.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/compressedid64set.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/dictionary.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/disposable.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/expect.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/indexmap.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/jsonschema.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/jsonutils.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/logger.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/lrumap.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/observableset.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/oneatatimeaction.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/orderedset.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/partitionarray.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/priorityqueue.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/processdetector.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/stringutils.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/time.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/tracing.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/tuplekeyedmap.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/utilitytypes.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/typedarraybuilder.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/unexpectederrors.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/yieldmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/internal/repositorystatus.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/internal/besqliteinternal.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/internal/cross-package.d.ts","../../../node_modules/.pnpm/@itwin+core-bentley@5.3.1/node_modules/@itwin/core-bentley/lib/cjs/core-bentley.d.ts","./src/projects.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ambientocclusion.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/growablefloat64array.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/anglesweep.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/xyzprops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/point2dvector2d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/plane3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/matrix3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/indexedxyzcollection.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry4d/matrix4d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/growablexyzarray.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/range.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/transform.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/plane3dbyoriginandunitnormal.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/query/strokecountmap.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/longitudelatitudealtitude.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/polynomials.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curveextendmode.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/strokeoptions.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/loop.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/path.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/parityregion.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/unionregion.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curvetypes.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curveprocessor.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curvecollection.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/indexedxycollection.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/growablexyarray.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/offsetoptions.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/linestring3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/linesegment3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/arc3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/reusableobjectcache.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/clipplane.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/facetfacedata.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/auxdata.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/taggednumericdata.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/polyfacedata.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/indexedpolyfacevisitor.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/polyface.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/convexclipplaneset.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/segment1d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/unionofconvexclipplanesets.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/clipprimitive.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/clipvector.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/cliputils.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/proxycurve.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/akimacurve3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/bezierpolynomials.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/knotvector.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/bezier1dnd.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/beziercurvebase.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/beziercurve3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/beziercurve3dh.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/bspline1dnd.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/interpolationcurve3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/bsplinecurve.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/bsplinecurve3dh.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/coordinatexyz.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curvechainwithdistanceindex.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/pointstring3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/spiral/transitionconditionalproperties.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/spiral/transitionspiral3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/cone.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/rotationalsweep.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/ruledsweep.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/sphere.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/toruspipe.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/topology/graph.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/polyfacebuilder.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/sweepcontour.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/linearsweep.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/solidprimitive.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/solid/box.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/geometryhandler.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/bsplinesurface.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/geometryquery.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/spiral/xycurveevaluator.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/spiral/directspiral3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/spiral/integratedspiral3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curveprimitive.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curvelocationdetail.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/ray3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/plane3dbyoriginandvectors.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry4d/point4d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/point3dvector3d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/angle.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/barycentrictriangle.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/surfacelocationdetail.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/bilinearpatch.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/ellipsoid.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/framebuilder.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/frustumanimation.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/growableblockedarray.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/indexedcollectioninterval.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/orderedrotationangles.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/point2darraycarrier.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/pointhelpers.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/point3darraycarrier.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/polylineops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/polygonops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/ray2d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/uvsurfaceops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry3d/yawpitchrollangles.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/constant.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/clipping/booleanclipfactory.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/convexpolygon2d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry4d/planebyoriginandvectors4d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry4d/map4d.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/geometry4d/momentdata.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/clusterablearray.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/complex.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/pascalcoefficients.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/quadrature.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/range1darray.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/smallsystem.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/tridiagonalsystem.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/constructcurvebetweencurves.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curvecurve.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curvefactory.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/curveops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/regionmomentsxy.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/curve/regionops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/bspline/bsplinecurveops.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/boxtopology.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/facetlocationdetail.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/indexededgematcher.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/indexedpolyfacewalker.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/multiclip/range2dsearchinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/multiclip/griddedraggedrange2dset.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/multiclip/griddedraggedrange2dsetwithoverflow.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/numerics/usagesums.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/rangelengthdata.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/polyfacequery.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/polyfaceclip.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/rangetree/point3darrayrangetreecontext.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/rangetree/linestring3drangetreecontext.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/polyface/rangetree/polyfacerangetreecontext.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/topology/spacetriangulation.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/serialization/imodeljsonschema.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/serialization/deepcompare.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/serialization/geometrysamples.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/serialization/serializationhelpers.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/serialization/bentleygeometryflatbuffer.d.ts","../../../node_modules/.pnpm/@itwin+core-geometry@5.3.1/node_modules/@itwin/core-geometry/lib/cjs/core-geometry.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hslcolor.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hsvcolor.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/colordef.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/image.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/gradient.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/changesetprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/cartographic.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/geodeticellipsoid.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/geodeticdatum.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/projection.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/additionaltransform.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/coordinatereferencesystem.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/frustum.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/placement.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/thumbnail.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/imodel.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/code.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/entityprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/fonts.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/textstring.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/areapattern.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/linestyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometryparams.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/imagegraphic.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/base64encodedstring.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textstyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textblockgeometryprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/geometrystream.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/elementgeometry.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/subcategoryappearance.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/elementprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/textureprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/thematicdisplay.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/analysisstyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textfield.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textblock.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textannotation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textblocklayoutresult.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/atmosphere.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/authorizationclient.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/planarclipmask.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/terrainsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/backgroundmapsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/backgroundmapprovider.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/imodelversion.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/briefcasetypes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/camera.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/catalogimodel.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/changedelements.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/changedentities.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/viewflags.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rgbcolor.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/linepixels.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hiddenline.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/featuretable.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/subcategoryoverride.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/featuresymbology.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/clipstyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/colorbyname.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/commonloggercategory.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/maplayersettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/spatialclassification.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/realitymodeldisplaysettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/contextrealitymodel.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/lightsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/mapimagerysettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/planprojectionsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/entityreference.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/renderschedule.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/groundplane.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rendertexture.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/skybox.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/environment.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/solarshadows.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/whiteonwhitereversalsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/contourdisplay.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/displaystylesettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/domains/functionalelementprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/domains/genericelementprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ecschemaprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ecsqltypes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/elementmesh.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/emphasizeelementsprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/featureindex.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/genericinstancefilter.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geocoordinateservices.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/boundingsphere.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/frustumplanes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometrycontainment.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometrysummary.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/texturemapping.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rendermaterial.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/graphicparams.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hilite.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/imodelerror.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/itwincoreerrors.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcsocket.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcwebsockettransport.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcwebsocket.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcsession.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/modelgeometrychanges.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipcappprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/localization.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/massproperties.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/materialprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/modelclipgroup.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/modelprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/nativeappprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/octencodednormal.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/concurrentquery.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ecsqlreader.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/qpoint.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/realitydataaccessprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/renderpolyline.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/sessionprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcconstants.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/backendtypes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcprotocol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcmarshaling.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcrequest.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcoperation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcinvocation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpccontrol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcrequestcontext.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcroutingtoken.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcconfiguration.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpcmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/solarcalculate.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/cesiumionassets.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tileprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tween.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/txnaction.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/viewdetails.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/viewprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcsessioninvocation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcpendingqueue.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcregistry.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcpush.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/devtoolsrpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/snapping.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/imodelreadrpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/tilemetadata.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/elementgraphics.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/imodeltilerpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/snapshotimodelrpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/testrpcmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/webapprpcrequest.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/webapprpcprotocol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/openapi.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/bentleycloudrpcprotocol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/bentleycloudrpcmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/rpcmultipart.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/webapprpclogging.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/tileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/b3dmtileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/compositetileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/gltftileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/i3dmtileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/imodeltileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/pntstileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/tileset3dschema.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/rendermesh.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/packedfeaturetable.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/rendermaterialparams.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/rendertextureparams.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/annotations/fieldformatter.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/cross-package.d.ts","../../../node_modules/.pnpm/@itwin+core-common@5.3.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/core-common.d.ts","../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/index.d.ts","./src/requestoptions.ts","./src/helper/angle.ts","./src/realitydataclient.ts","./src/realitydata.ts","./src/reality-data-client.ts","../../../node_modules/.pnpm/@itwin+oidc-signin-tool@4.4.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/oidc-signin-tool/lib/cjs/testusers.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ambientocclusion.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hslcolor.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hsvcolor.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/colordef.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/image.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/gradient.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/changesetprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/cartographic.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/geodeticellipsoid.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/geodeticdatum.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/projection.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/additionaltransform.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/coordinatereferencesystem.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/frustum.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/placement.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/thumbnail.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/imodel.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/code.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/entityprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/fonts.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/textstring.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/areapattern.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/linestyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometryparams.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/imagegraphic.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/base64encodedstring.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textstyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textblockgeometryprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/geometrystream.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/elementgeometry.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/subcategoryappearance.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textblock.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textannotation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/elementprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/textureprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/thematicdisplay.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/analysisstyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/annotation/textblocklayoutresult.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/atmosphere.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/authorizationclient.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/planarclipmask.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/terrainsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/backgroundmapsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/backgroundmapprovider.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/imodelversion.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/briefcasetypes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/camera.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/changedelements.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/changedentities.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/viewflags.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rgbcolor.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/linepixels.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hiddenline.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/featuretable.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/subcategoryoverride.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/featuresymbology.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/clipstyle.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/colorbyname.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/commonloggercategory.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/maplayersettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/spatialclassification.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/realitymodeldisplaysettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/contextrealitymodel.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/lightsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/mapimagerysettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/planprojectionsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/entityreference.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/renderschedule.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/groundplane.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rendertexture.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/skybox.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/environment.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/solarshadows.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/whiteonwhitereversalsettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/contourdisplay.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/displaystylesettings.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/domains/functionalelementprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/domains/genericelementprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ecsqltypes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ecschemaprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/elementmesh.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/emphasizeelementsprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/featureindex.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/genericinstancefilter.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geocoordinateservices.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/boundingsphere.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometry/frustumplanes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometrycontainment.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/geometrysummary.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/texturemapping.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rendermaterial.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/graphicparams.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/hilite.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/imodelerror.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/itwinerror.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcsocket.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcwebsockettransport.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcwebsocket.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipc/ipcsession.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/modelgeometrychanges.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ipcappprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/localization.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/massproperties.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/materialprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/modelclipgroup.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/modelprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/nativeappprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/octencodednormal.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/concurrentquery.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/ecsqlreader.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/backendtypes.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/qpoint.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/realitydataaccessprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/render.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/sessionprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcconstants.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcprotocol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcmarshaling.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcrequest.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcoperation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcinvocation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpccontrol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcrequestcontext.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcroutingtoken.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcconfiguration.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpcmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/solarcalculate.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tileprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tween.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/txnaction.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/viewdetails.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/viewprops.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcsessioninvocation.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcpendingqueue.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcregistry.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/core/rpcpush.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/devtoolsrpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/snapping.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/imodelreadrpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/tilemetadata.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/elementgraphics.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/imodeltilerpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/snapshotimodelrpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/testrpcmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/wiprpcinterface.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/webapprpcrequest.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/webapprpcprotocol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/openapi.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/bentleycloudrpcprotocol.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/bentleycloudrpcmanager.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/rpcmultipart.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/rpc/web/webapprpclogging.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/tileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/b3dmtileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/compositetileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/gltftileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/i3dmtileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/imodeltileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/pntstileio.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/tile/tileset3dschema.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/internal/cross-package.d.ts","../../../node_modules/.pnpm/@itwin+core-common@4.11.6_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/core-common/lib/cjs/core-common.d.ts","../../../node_modules/.pnpm/@itwin+oidc-signin-tool@4.4.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/oidc-signin-tool/lib/cjs/testfrontendauthorizationclient.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/serviceauthorizationclientconfiguration.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/serviceauthorizationclient.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/serviceclientloggercategory.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/oidcdiscoveryclient.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/introspection/introspectionresponse.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/introspection/introspectionclient.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/introspection/imsintrospectionresponse.d.ts","../../../node_modules/.pnpm/@itwin+service-authorization@1.2.3_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/service-authorization/lib/cjs/index.d.ts","../../../node_modules/.pnpm/@itwin+oidc-signin-tool@4.4.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/oidc-signin-tool/lib/cjs/certa/certacommon.d.ts","../../../node_modules/.pnpm/@itwin+oidc-signin-tool@4.4.1_@itwin+core-bentley@5.3.1_@itwin+core-geometry@5.3.1/node_modules/@itwin/oidc-signin-tool/lib/cjs/frontend.d.ts","./src/test/testconfig.ts","../../../node_modules/.pnpm/@types+chai@4.3.20/node_modules/@types/chai/index.d.ts","../../../node_modules/.pnpm/@types+chai-as-promised@7.1.8/node_modules/@types/chai-as-promised/index.d.ts","./src/test/integration/realitydataclient.test.ts","../../../node_modules/.pnpm/@types+mocha@9.1.1/node_modules/@types/mocha/index.d.ts","../../../node_modules/.pnpm/@types+estree@1.0.8/node_modules/@types/estree/index.d.ts","../../../node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts","../../../node_modules/.pnpm/@types+eslint@9.6.1/node_modules/@types/eslint/use-at-your-own-risk.d.ts","../../../node_modules/.pnpm/@types+eslint@9.6.1/node_modules/@types/eslint/index.d.ts","../../../node_modules/.pnpm/@types+eslint-scope@3.7.7/node_modules/@types/eslint-scope/index.d.ts"],"fileIdsList":[[72],[72,76,77],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,103],[75,77],[101,102],[67,68],[75],[67],[72,78],[97],[250,432,462],[250,458],[453],[250,447,453],[250,446,453],[430],[104],[469],[467,468,470],[104,433,443,471],[250],[104,441],[476,477,479,482],[104,443],[428,429],[104,250],[104,467,482,487,488],[104,477,478],[427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588],[104,250,427,430,434,443,457,460,462,463,467,469,476,479,481,482,483,488,489,490,491,492,494,498,499,500,501],[460],[535],[104,250,444,445,455,456,457,459],[104,430,482],[104,465,495,497],[104,430,450,477,478,480,481],[104,450],[104,250,439],[104,250,430],[435,436,437,438],[104,250,441,447,450,451,454,455,460],[250,440,512],[250,435],[104,250,430,432,447,448,449,450,451,452,454,460],[250,440,460],[250,446],[104,250,476],[104,430,432,448,449],[250,430,431,462],[430,432,478,517],[104,430],[430,478],[104,250,433,434,439,441,442],[433],[565],[104,250,450,455,476],[522,523],[524],[104,250,433,439,443,472,475,526],[104,520],[250,477],[430,469,486],[104,469,470],[104,460,516],[104,250,444,445,460],[104,472],[534],[430,516],[104,250,477,480,482,493],[543,544,545,548,549,550,552],[547,551,553],[104,541,542,543,546,552],[537,543],[443,542,545,552],[104,443,542,544,545,546,547,548,551,552],[550,552,553],[104,443,542,543,544,546,548,551,552],[545,547],[525,547],[104,443,552],[104,250,443,444,445,446,460,461,507,511,514,515,529,532,535,548,550,552,559,565],[104,443,552,555,568],[443,550,552],[552],[545,550,551,552,553,575,576],[443,543,545,546,547,574,575],[574],[537,544,574],[542,543,545,546,547,552,573],[537,542,543,546,551,573,575],[542,543,544,545,552,574],[443,474,552],[550,551],[104,430,496],[250,434],[430,477],[104,486],[104,430,457],[250,496],[104,431,452,460],[250,430,432,461],[104,580],[104,250,455,456,460,567],[104,441,580],[104,250,480,555],[104,250,531],[104,250,442,445,457,460,473,494,502,532,558],[250,255,283],[250,276,286],[276,285],[250,270,276],[250,269,276],[104,253,269],[293],[291,292,294],[104,256,266,295],[104,256,266],[104,264],[301,302,304,307],[104,266],[251,252],[104,291,307,312,313],[104,302,303],[106,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,418],[104,106,250,253,257,266,280,281,283,284,291,293,301,304,306,307,308,313,314,315,316,317,319,323,324,325,326],[281],[360],[104,250,267,268,278,279,280],[104,253,307],[104,289,320,322],[253],[104,253,273,302,303,305,306],[104,273],[104,250,262],[104,250,253],[258,259,260,261],[104,250,264,270,273,274,277,278,281],[250,263,337],[250,258],[104,250,253,255,270,271,272,273,274,275,277,281],[250,263,281],[250,269],[104,250,301],[104,253,255,271,272],[250,253,254,283],[253,255,303,342],[104,253],[253,303],[104,250,256,257,262,264,265],[256],[250,285],[367,391,413,414,415,416,417],[104,305],[253,341],[253,303,359,364],[321],[104,250,273,278,301],[347,348],[349],[104,250,256,262,266,296,300,351],[250,302],[253,293,311],[104,293,294],[104,281,341],[104,250,267,268,281],[104,296],[341],[104,250,302,305,307,318],[368,369,370,373,374,375,377],[372,376,378],[104,365,366,368,371,377],[367,368],[266,366,370,377],[104,266,366,369,370,371,372,373,376,377],[375,377,378],[104,266,366,368,369,371,373,376,377],[370,372],[350,372],[104,266,377],[104,250,266,267,268,269,281,282,332,336,339,340,354,357,360,373,375,377,385,391],[104,266,377,381,394],[266,375,377],[377],[370,375,376,377,378,400,401],[266,368,370,371,372,399,400],[399],[367,369,399],[366,368,370,371,372,377,398],[366,367,368,371,376,398,400],[366,368,369,370,377,399],[375,376],[104,253,321],[250,257],[253,302],[104,311],[104,253,280],[250,321],[104,254,275,281],[250,253,255,282],[104,405],[104,250,278,279,281,393],[104,264,405],[104,250,305,381],[104,250,356],[104,250,265,268,280,281,297,319,327,357,384],[109,117,150,151,179,181,185,190],[110,146,154,189,190],[110,116,117,134,156,179,187,188,189,190],[110,114,116,117,156,179,186,187,188,189,190],[116,117,118,123,133,134,153,154,155,179,185,187,189,190],[154,190],[115,116,117,118,119,122,123,133,134,152,154,156,157,158,159,160,179,185,186,187,188,189,190,191],[116,117,118,119,123,134,156,161,179,187,188,189,190],[113,160,161,190],[116,117,118,154,179,181,188,189,190],[110,179,186,190],[150],[107,109,111,113,114,115,116,117,118,136,137,150,185,189,190,192],[109,114,116,117,136,145,147,150,185,190],[107,109,113,115,116,117,118,123,128,130,136,137,138,145,147,148,149,181,185,190],[113,114,115,116,117,136,137,146,148,150,185,190],[113,114,115,116,117,118,136,137,138,144,150,185,187,190,192],[113,114,115,116,117,135,136,137,138,145,146,150,185,187,190],[107,108,109,110,111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,167,168,169,170,171,172,174,175,176,177,178,179,180,181,183,184,185,186,187,188,189,190,191,192,193,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,235,236,239,240,241,242,243,244,245,246,247,248,249],[108,109,112,114,116,117,118,121,122,123,130,133,134,135,150,179,181,185,186,187,188,189,190,191,192],[134,135,136,179,181],[116,117,179,181,190],[116,117,118,119,122,123,125,130,133,134,179,181,185,186,187,188,190],[115,116,117,122,123,124,125,128,129,179,181,185,186,187,190],[114,128,185,186],[108],[108,109,113,118,123,124,125,128,130,134,136,144,167,170,181,185,187,190,191,192,196],[109,117,185,187,190],[113,116,117,123,124,125,128,130,133,134,185,187],[116,117,118,119,122,123,133,134,135,136,150,152,157,160,161,164,179,181,183,184,186,187,188,190,191],[124,125,126,127,128,130,185],[124,125,126,127,130,185],[116,117,130,144,163,165,177,179,180,185],[116,117,122,123,133,134,150,179,181,185,186,187,188,190,191],[107,109,113,115,116,117,118,119,122,123,132,133,135,150,179,181,185,186,187,188,190,191],[113,123,129,130,179,181,185,190],[123,192],[123,124,128,129,130,179,181],[122,123,129,130,179,181,185,186,190],[109,116,117,118,179,181,190,191],[116,117,118,123,133,134,179,185,187,188,190],[185],[124,126,127,134,135,136,161,162,167,179,185,215],[113,115,116,117,123,124,125,128,130,133,144,173,185,187,190,215],[117,118,123,134,146,166,167,179,182,187,188,190,192],[108,117,118,123,134,146,167,179,181,187,188,190,192],[192],[112,116,117,133,134,146,161,166,185,187,190],[187,188,190],[123,124,126,128,129,130,179,181],[104,108,109,110,189,190],[191],[107,191,192],[117,187,190,191],[116,117,179,187,188,190,194],[108,109,112,116,117,118,120,136,150,179,185,187,188,189,190,192,194],[109,116,117,190,191],[117,190],[110,124,125,126,127,130,134,135,136,144,152,156,157,158,160,161,162,163,164,165,167,168,169,170,171,172,176,178,180,181,185,188,190],[107],[109,110,112,113,115,116,117,131,190],[109,110,112,113,114,116,117,118,190,191],[113],[109,110],[109,116,117,190],[191,192],[109,110,117,189,190,191,192],[112,191,192],[189,190,191],[109,111,117,189,190,191,192],[109,111,117,187,189,190,191],[109,110,131],[109,191,192],[109,113,190],[109,189,191,192],[109,110,113,117,118,189,190],[109,110,111,113,114,115,116,187,190,191],[113,116,118,122,186,190],[109,110,113,115,117,190,191],[109,110,116],[109,116,117,118,186,190,191],[113,115],[109,110,112,116,189,190,191],[116,123,134,179,196],[112,117,190,191,192],[114,117,190,191],[109,112,117,189,190,191],[109,112,114,115,117,190],[189,190],[109,111,118,187,188,190,191],[107,121],[110,115,132,190,199],[110,116,207],[107,108,109,110,116,120,187,190],[107,116],[109,110,189,190],[190],[116],[116,117],[110,116,144],[110,113,131,144,190,191,193,206],[110,142,144,190,192],[143,144],[109,116,234],[109,116],[110,116,117,139,142,143,179,181,190],[109,110,113,115,116,117,123,124,126,127,128,132,134,136,144,146,168,169,170,171,172,173,176,178,179,181,185,190],[123,128,134,138,144,145,147,174,190,191],[110,115,116,117,132,139,140,141,190],[111,113,114,115,124,128,130,134,135,144,173,185,187,190,192,215,231,232,234,238],[115,116,237],[134,186,190],[109,186],[109,144,231],[181],[107,108,109,110,112,114,115,116,117,118,123,124,125,126,127,130,134,135,136,138,140,142,144,146,147,161,162,164,165,167,168,169,170,171,172,176,177,178,180,181,185,187,189,190,192,214],[109,124,125,126,127,130,134,135,136,140,141,144,152,157,158,160,161,162,163,165,167,168,169,170,171,172,176,178,179,180,181,190,191,209],[154],[112,116,117,130,134,177,179,181,190],[110,116,117,123,130,134,177,179,181,188,190],[109,116,117,128,130,175,177,179,181,190],[116,117,128,130,175,177,179,181,187,192],[116,117,128,130,175,177,179,181,185],[117,130,168,169,170,171,172,176,178,181],[108,110,112,116,117,123,124,134,136,177,179,181,188,190],[113,117,123,128,130,144,147,174,187,190],[110,116,117,130,136,177,179,181,188,190,192],[109,110,117,135,190],[134,190],[426,598],[426,590,599],[104,589],[591,592,593,594,595,596,597],[595],[589,591],[602],[606,609],[606,607,608],[609],[105,423,424],[104,419,420,421,423],[104,105,419,420,421,422,424],[420,423],[104,250,419,423,424,601,602,603],[104,600]],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"9e8ca8ed051c2697578c023d9c29d6df689a083561feba5c14aedee895853999","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"45d8ccb3dfd57355eb29749919142d4321a0aa4df6acdfc54e30433d7176600a","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1a94697425a99354df73d9c8291e2ecd4dddd370aed4023c2d6dee6cccb32666","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3f9fc0ec0b96a9e642f11eda09c0be83a61c7b336977f8b9fdb1e9788e925fe","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true,"impliedFormat":1},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true,"impliedFormat":1},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true,"impliedFormat":1},{"version":"15c1c3d7b2e46e0025417ed6d5f03f419e57e6751f87925ca19dc88297053fe6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0c84cfc9e188a537e7587d955f39c76a83d3afaec2ab24015798edba01f2db25","impliedFormat":1},{"version":"b1bc2ae81b0dad9055308a38c854d36896dd46c40172af76b33cef1fffca97b8","impliedFormat":1},{"version":"ccfa24d9ac456358f8223405cb4c43e080238259eb4608c21211aac663393b4e","impliedFormat":1},{"version":"68ce5bf206d1f99dfaf2cff0c1c1e4e7da0800cc1d155daebd12794144455cc8","impliedFormat":1},{"version":"47bf565cb66f6746d881ff1bc86cde3c483467a35e5025699a625e608334a35e","impliedFormat":1},{"version":"7b4d51dc076974910885c1e0b95ecede0d0f598aead100c3ba86ccdfee8b51eb","impliedFormat":1},{"version":"28e1aad947ec11f04ce973cbb245c7c4d666eff4f587a440e477171d38026af4","impliedFormat":1},{"version":"843b0122572d3e64c52a88b958a9d5b28f8969b96a6beecd7e329ddaf46425ce","impliedFormat":1},{"version":"f51ceeeb5ba474ecb26c36f3d34171dd7edf91b3c35061dae34f626e48b3dadb","impliedFormat":1},{"version":"51390d4c9171737e9bec8bdc5c2413b6e7708f48a5ae5e3d132dcd8d9f235e9d","impliedFormat":1},{"version":"6cb8c19e8e4e38e9e9495fa425978643fd314fc9ce03ea4d832af436ce1ab473","impliedFormat":1},{"version":"a5ed69440ede594132c813a8c6d621244c64aa842a2138bbadc34cf2a92d7c75","impliedFormat":1},{"version":"50abdb460cc00d7e0ef09e2d09576cb059572bfe96f437ca48e46b6b42781ab6","impliedFormat":1},{"version":"6a4140b50955aecf3a0d9e08f4d884c0552799ebcdf73f0d19af6b84429cbd09","impliedFormat":1},{"version":"85aabb086e4cde390cd6e6377b4ec4dd0a426ad5e4e0b325b2cf664c14009b08","impliedFormat":1},{"version":"2f8bcbda9eb84bc7187c05f18850ec77731eddf667756d462bc6353b36d18495","impliedFormat":1},{"version":"4a1ab9215fce72fa6e7c9bdc850c9730df7268b8a8c7bc1c85feef2ade94b1f2","impliedFormat":1},{"version":"2caef0a3071d11f8e267eda30c782bc959eb25867fdb11fc88655b9b93569cf4","impliedFormat":1},{"version":"3d1e8238dc367b4f5c8c8ffb84fe1e366586255ee87d86511b647e603c2d376d","impliedFormat":1},{"version":"6ae6f488b83ac044c46b30e3856e3505d591e70f28f78bfed1628326d89ea4ba","impliedFormat":1},{"version":"07ba1714e8fb2a30f13502011889d32ffd78f7b54de159d763fdfd9f1dfb2b56","impliedFormat":1},{"version":"423ba34fbcbd124e05af000a5e3e2ddd5b660535a36768dde77121e53b47cb4b","impliedFormat":1},{"version":"b587802f1225754f7829c7e3e9cf183446f6711279f92745d7e05a2284ab1860","impliedFormat":1},{"version":"ad75bace30d5439562e9579f702772982b19739f22e155e58d8c627c9f1d3d46","impliedFormat":1},{"version":"63026680f748552c0010a2abb99f91b009ec5f579d589699cf97d71fd08bac57","impliedFormat":1},{"version":"4c600ed15412f57184cefb23fc39fd6eab2d85c4b23b66c1bd731588ff37590f","impliedFormat":1},{"version":"9a1e73cc2813ac3dae8ad28e2862e8c4a5397a3452baab43e7aeec9bb9c251da","impliedFormat":1},{"version":"d82ae0da23fe903aab28da7a5c08db073f6c5c68c760893fd0b60ba44e448961","impliedFormat":1},{"version":"bb48dc37288bfe124b7e65282e3d3f9afacbeffdbb0e5361eb355c6ad2a92be8","impliedFormat":1},{"version":"65c46ff6773c25abd2d20fce440eecc1925dc8cf9e4b17d19118345db4396db3","impliedFormat":1},{"version":"73b234e0d5316166e63e25cef9a32ad6ac53c4016c58722d6b989829dc1ad3d0","impliedFormat":1},{"version":"92bab51d5da2bbbbf6d57f68b5f72b54415a2ad8841fc23b86f89548d0f2247c","impliedFormat":1},{"version":"f35c14e9b2384fd0a9225d0c045e2af20235881e15ae3fd2529a9daae71279df","impliedFormat":1},{"version":"ca8761f52e553465e57890678e6182e98dee01eb48c180fcd81009fdbf47b16e","impliedFormat":1},{"version":"3a865d516031dcd4f96646ba62de455202d4c1212cb0122bd98fc394d8959972","impliedFormat":1},{"version":"150df1ebcd60cfc081591ecf1e5556abd07b408c75970646c60b125e99c834e6","impliedFormat":1},{"version":"001e6fcb68ab8bf6e39840cdd9320dd5a85ac55c0280af340816fa7edd26850b","impliedFormat":1},{"version":"f6df34c8788f1d8b7a182df2a117518e0a1bc1666633424ed31a8242bef971b9","impliedFormat":1},{"version":"e9d88f18add87b17b4e3472de9a4b49709d0caabfc4b5af84338f9fe8a8aa2de","impliedFormat":1},{"version":"9bb85895e372854c0070595862cbce9581fa5baf0fa41d479731d7244c51a5ec","impliedFormat":1},"480750ad6a39d26767ba9b6c383b318c9ded7447093990777a52296420d0c80f",{"version":"8adf39b75996ee76992cae1326db26186e80b9d5671f842f550565830f33b4f6","impliedFormat":1},{"version":"1178e3d79cf20db7b4c32410cd3e8ab6e8d4cd5b84870cc41d139eaf895e3f89","impliedFormat":1},{"version":"369c4030c5113a216a95fac3b02911bad3a991afaa929ce12997e37e4a6d4d8f","impliedFormat":1},{"version":"6be5b07c57246d3b7aeca3881183e814b11ea2e95150adbad7ef5f99570d6ffa","impliedFormat":1},{"version":"456610f88c8a663ebf8192da12dec13efcc29b5ebb16b1c47ecca1c9cbc82b43","impliedFormat":1},{"version":"916cdfc640b81467695aa0f497b9ab8efa3f294141a95c5f94796d4636c07df1","impliedFormat":1},{"version":"8196522643a965d9feb7e19120652496816bebd3b6b16963af5a955837b5bfe3","impliedFormat":1},{"version":"98c36b0c101b1bb720e54bdff8bb63575cd7780dbdb53854d234f5fec3cad61b","impliedFormat":1},{"version":"0502613e346ec8478d9ed092769c50d4850a4bac06db486e3fa7d14eca67fcf6","impliedFormat":1},{"version":"00b631b145388a214ae1d6cdd5f76f8475dcd4c51f2b24ceb42decf8459b8ae5","impliedFormat":1},{"version":"a5ebebda314c554c8f9db6a6d32dfc772254000c88eaccfb51a9f438671b9de6","impliedFormat":1},{"version":"b91a0b05256917c13f251e8d117cd6c474247e01300edc1f5a75fd8bc9dea893","impliedFormat":1},{"version":"d2ba47a36d56706e8418cd6ea94e16a4ef21b578bc46d71468fa0893d847b472","impliedFormat":1},{"version":"067411e9f90a06d75f3c0fbaa8eae46bda95390b32bb7d35a2e9c7b99f35c511","impliedFormat":1},{"version":"582713d8bf414f6b4660e542dfc5e6217a0281bc8a1e0f41a7cdb2f972ef3dbb","impliedFormat":1},{"version":"55f8f15eaa662d1c0843f018f72f28e4738ad2b95b6f6bb2c36d8db863926936","impliedFormat":1},{"version":"69cc24f0fb2043a549bb9e2e053302bd77c9f498198a1c0afe94726606e414a1","impliedFormat":1},{"version":"1bcf66392e2f84b40a88d661adcfc759c1b08b4c5d5de820ae31aad14df167b4","impliedFormat":1},{"version":"7e4ac38015cff0fcd38e5580183c516b2dd62c3ec35e5efa98adbd37fe62cb12","impliedFormat":1},{"version":"6a2c5a9ae506172b076cdc9d2126b1c3f29d783079f6c184b2e981bb8fb4db31","impliedFormat":1},{"version":"faa26147fd21f56347ce2bed4ba972da0958cb7e8a1a71cc1e8a8f56a2a5fa87","impliedFormat":1},{"version":"c8b1d99e48aa5b16dddcd2d2d6163d90cb9f52fb3539b360a316e4b7b0984b57","impliedFormat":1},{"version":"de9f57985f000e7ab0a5c94ef8081b185aca75ab964e88b0a1ef781b65e388fa","impliedFormat":1},{"version":"1d3ea35544be3877c4383a996ec416e7719a90bd3241372441734f706b7f8863","impliedFormat":1},{"version":"e3bdf1784572dc9787cbc47242689f355a4d6c1e8101ddfb965154e83d491791","impliedFormat":1},{"version":"a84cadc18f1c745b4afe98f454b6f08dc43f7e6ae1883884e286f634c5605817","impliedFormat":1},{"version":"64aff1f7a3d748d1c7c99a6da907f9c85ffc7648df930b20ee701c5436ebdc54","impliedFormat":1},{"version":"b6cc5341f9242cd1ec23cd7c7e4056b1b6600c02caa12f0eb35b4e726f03ac53","impliedFormat":1},{"version":"d7d02d7a9f80c984e7619c9b0474a10444abe3e74e09ed58ae1265f749ec281f","impliedFormat":1},{"version":"28baa134f527d152743052f0b91c90e2c24370f3d4884c39cc4b3daaba57c61d","impliedFormat":1},{"version":"d770244bdd2f41ff21d9de4cf3aad386fa62074654e05b7d105ee4507ec536e5","impliedFormat":1},{"version":"71a3fa7f966bae6ed84dec78f4fb8ad49def15a057cd967881619ec6caf17194","impliedFormat":1},{"version":"8c47344c0558c16b382d94e8bd2acb0045a335d99f88681da250f26bab5d559a","impliedFormat":1},{"version":"ad1d1c7ec425f600506cc497534d811b1699312ced75a4159f66dc96bb1af233","impliedFormat":1},{"version":"1ae648fde9d64c1644a5e8ddf1bed0fedc401fc63c1969f4dbb4298ebea7187b","impliedFormat":1},{"version":"1c6ec00a40838deb32ece1f81bb13e89b6b4b8779e6e85a5ab3c38598aede223","impliedFormat":1},{"version":"0b3af85ca88f52d9b6d4a991c48936aca57a39dbcff23a495dbc9acbee159202","impliedFormat":1},{"version":"02311eb99bc5d5812dac2381e9f2c15a4c92c9351d32f592d526704a3961e8a6","impliedFormat":1},{"version":"50cc707d01c6ecfe18bcca56f9ef4edae4324a8f2ea984ed7210b5c5edd0dc3a","impliedFormat":1},{"version":"1576bacb0d8a7cb3fc6f66b17190a7cc8ce30dd9e04c3fb35c3c92073e13e57e","impliedFormat":1},{"version":"17b9a89162bcef683416431868878233a17037e40d017eb62d3ad1d854d32116","impliedFormat":1},{"version":"64e255d381c223f0d8aa5faf2977fb2871d8bc229bac72566f7dd1554f5e40b5","impliedFormat":1},{"version":"11e8652850439a06f1665186017e7d09d683fbd299af4e50d93ec0443126c575","impliedFormat":1},{"version":"2dfdbdce602136b8b53f63759eb46237f095195935735a2a27d98bde989b7e58","impliedFormat":1},{"version":"396c87b020c1f95f75595a35a14ba3ab4dc766eb720a9cd624ae834ebe1b51c9","impliedFormat":1},{"version":"d614d18d6f5544594d86c88f7ec8569585592f1bbb72e75de5d177c39b47a2d5","impliedFormat":1},{"version":"3f0ba7bf70637c81323921ac35ad415a873321a7954a5b961a8666afcc0cf15b","impliedFormat":1},{"version":"c46a172b51e42e9966b3e44cc5326eb6e92e3206252b6a6b9654a695282ecf0b","impliedFormat":1},{"version":"a0877ca90a5b202380d7cf528fce0cbe1c34af9d3b1d7f3f348dda5f1f4a1358","impliedFormat":1},{"version":"42335ea867ea62a0f691fe4adde4c60a7df00806cefcefea7a79c3be0b9acb44","impliedFormat":1},{"version":"b33a46c9f1d193bb0cb6d6d4744f161a8c0e437abe7b51011e7296a2b94ccdf4","impliedFormat":1},{"version":"139b56c9c0a5730219351545eca7691e303f9bb7706ed5420a35666896347ef1","impliedFormat":1},{"version":"93bf237b78177f95399956b9b38d85464b11b3e7e5b5273dfd6593d41a8a2e59","impliedFormat":1},{"version":"2c7e9bd310955ba9c9d857b3510a13e4ac601e276ed4870b9eb40c6130bc3b8b","impliedFormat":1},{"version":"8bbb8637831058d7ec1e6554f16255466cf3bcd7cf99298bccb0233ccbc89759","impliedFormat":1},{"version":"b04dbbdd6def6f7a662ba5064edce039ae0411344490d4d5ee344f041b00d7a3","impliedFormat":1},{"version":"6cce6c3e23ec1f6708024a8b3cfaf5edb0c13fbdca679daa609db1db9b4a9a6f","impliedFormat":1},{"version":"a0dddf821ca62998b5d01a698c9a5ce7670972dfb5ed227485b575310f510cc5","impliedFormat":1},{"version":"c41e21f6336bda2e3ab9ab22d5bc42f4ea4c3c0aa1b56ee326a3acd617acd8db","impliedFormat":1},{"version":"e3fd8f0125d0d8118fc23c2d8a9bfdd69dd3622b2897e3b62c62096538e7b597","impliedFormat":1},{"version":"543344be390b6db9d586acfcf660c4c191180cdcef29e146053cd41ff417b00f","impliedFormat":1},{"version":"ab152fb5dc93f5e79eca5a2153ec4cff2c1f45a0c0c87d74b37308bd5b28533d","impliedFormat":1},{"version":"25d0d435f5e8c823c5c67e8ef2becceda6f2bcf1a0c84df9db27946defbb1daa","impliedFormat":1},{"version":"8cefcfbf962778937365a2d193612cb37f4ec4ff215a922c9f26ebe575aaa51e","impliedFormat":1},{"version":"419fea73db2d510c81566b7a8a1f376f197f1467b6d4184669bf25d6ec7c9368","impliedFormat":1},{"version":"afdb5dfb7e8127705a2b78e1be06dd945b748f40b5a4d70030d335b2ff0f237d","impliedFormat":1},{"version":"22ed1c61749af74d9920bb306b53ea66253d8b582906fa18911b168d0d8ea9ec","impliedFormat":1},{"version":"a5bef66e967c7584b2d5d8fcdf9425525a4dd3c8b954bb19ff8cf7c127e19993","impliedFormat":1},{"version":"60554dd6d55341be3cadea7176dee65c01646b94d46b1c692197dd02108d2bb1","impliedFormat":1},{"version":"3d0ef8d429d95fed1a4020a427d03f8c2b53e066d252fc37cee3ac71043bfdf1","impliedFormat":1},{"version":"84991cfe19ad60b92ca3dc08f93953cd5573a71e10e6e5e53e7f2b323546694d","impliedFormat":1},{"version":"ec7d65dda91630d8411b7d11d787197eada35bf750b4663ee9876a6902ab0301","impliedFormat":1},{"version":"2b5f44d1012c3881641abc51e2b360ddacb43bbe6e61092602643b4f355a21e2","impliedFormat":1},{"version":"d1c854600f3240c48eb0bb7190aac22b35ab7d3af33b570cf98376bdcf083e20","impliedFormat":1},{"version":"6d3b2546bb32c9a4685ecf98bbde89b6ce90f2b5e5abcd9e9d5380ef00a9b866","impliedFormat":1},{"version":"68b2d185a0c76ad15fefffeb64c9b2ca72e4c8c3c13da41f3af4754508c9da9a","impliedFormat":1},{"version":"2b93b51efd38945813801756863b4f1d0b8d11008f503f6c6287949b59149467","impliedFormat":1},{"version":"63785c420c6ca50108ffd6ed8e8fac38e8e5c5a777d8ebfbe7cc27f58b1de9ea","impliedFormat":1},{"version":"9e5ed85a0af6b39c21bcea7a6c3f7b742979a80d864db7b280bf15ab64bd63e1","impliedFormat":1},{"version":"a5d456d8d0243ec40c647710bee1534f1fc338771d6699632d2fba09fdfb0157","impliedFormat":1},{"version":"7e6d8fb55a9d347c19609a370e3a280d1a03dc0eeaeb910b8efa020c00765601","impliedFormat":1},{"version":"a5c7fdc9b1f635dd05ffbad8578e3af3420fc9fc0da4d3164126d77dba2d103c","impliedFormat":1},{"version":"6c8165101abd95a166bcc6d1344b515c65b503ee8f6d1752a93c7390497c54fd","impliedFormat":1},{"version":"618ad9b0cac704096ab18c5d12ae64df8222809e45520acdac99c5efb13b16d5","impliedFormat":1},{"version":"6bb00db44eec11e8faec412a9eabe3ec76664859e9fad1d430bb5667bf27c727","impliedFormat":1},{"version":"b806393f4fa78fb5f2eb6b159b26b5f5183605f6f7dfd261174651f95a4b4502","impliedFormat":1},{"version":"d8c22e9ea6c928dca12a04d68fd7d849708a3c77b272b788abace439e11e2f9b","impliedFormat":1},{"version":"b20d0347e16e301a67bc71173b90fe5a19065b677b59915a7819efbbc42ae595","impliedFormat":1},{"version":"b2e8c86798f7dc8b6a7a62c990dd308190514da15bafd2e7c6698610b67b23a0","impliedFormat":1},{"version":"8378f16254fd06430be6ad6fd47dd390accb1c5278c222e23a3f1c3fc5bb694d","impliedFormat":1},{"version":"0d4c162bbc781e69f61d4292ed9ece30e4c1255f4640f77ab744e082fdd1ee7e","impliedFormat":1},{"version":"ff9e83f781b2150a66a0244bcb54c4c91dcf752df94b5c1e809eeb61f3746d01","impliedFormat":1},{"version":"98ee3b45fd7599bd9bc452642f110f29b9549253f33c1dbc76b22a5039f933dc","impliedFormat":1},{"version":"8e0a8e5703ab5c9a7b9b994e039ad4141ee66c767fefddb766f3ad31aeed8fba","impliedFormat":1},{"version":"883b5ced33452d437c03e777c7d11c1c1de88a333ccaff49e92343a96b53183f","impliedFormat":1},{"version":"1cfc4bd2caad9b1ad09943009d8f94be08ea4bb88c94dcdb67e45f98ec4e2450","impliedFormat":1},{"version":"a61418b55e9714cc7ec8c4c4b89baf12ba5036873dd3c8ddb7a087a4ca7997d3","impliedFormat":1},{"version":"ce0b19e4e6b290ad0ed687b7851f5411f8051bc0469085a6b28953ccb35a08b7","impliedFormat":1},{"version":"acdde7135112a09d2418d04d4aeff7b80bcd32d6be30e9a3e70b4b11b9ee9cbd","impliedFormat":1},{"version":"6122db0a5456728209d885638b81c3237f436016d737ed8564e513deb21aeda2","impliedFormat":1},{"version":"f6047fe34d1062ab7b6c9927cbf5f748e072c11177a8718737387a5b213e7f14","impliedFormat":1},{"version":"1ad5dbf1acb9db9c17b359e9915e94775f2aba0969ee0cbf6e501fbe7f856c65","impliedFormat":1},{"version":"60dfb0693579d61c0aff2cc3844e442e638ec713e971a7c258f73e2557d83981","impliedFormat":1},{"version":"1c5cf312102c1ec30b8f614fe17fac922b58e53e5918b42c3cd746c87ea96b01","impliedFormat":1},{"version":"34d8e31a9b0ea88c00c5fab1ed13e25fcb9df57821d00696e484e2cd72a7386b","impliedFormat":1},{"version":"a499e79a220e05d0107705b87a293235cf25bea83871cd939b7790f8f63193cf","impliedFormat":1},{"version":"246f5749897c326aefd3651c0a63bde2022bff7749a0fb3c87b77fd50f6ef038","impliedFormat":1},{"version":"1da47a790828233e3b03c308af0a16c328fa3c21768bf6e78659246ac0de3250","impliedFormat":1},{"version":"d07a0005ce5b46815c6b1554c4b12113716f417d0b6898c32e806df8800c6913","impliedFormat":1},{"version":"733a281e06278ca9146de9aef3e189fc4f502dcc8e43dad19d7e0b85bc3c7c38","impliedFormat":1},{"version":"d016855cc6ce7b92321a663f68cae212207b130237d245ff02f8340754d368c7","impliedFormat":1},{"version":"25de6fd6692cd1914edb9337729f70211e70292754b350f0ff5443a88bcc3d3e","impliedFormat":1},{"version":"fdb8554ed3ec7946a2128bfdd351484a7a89f9038996432a454f87043fa3fa2d","impliedFormat":1},{"version":"9b910aaeb74156ce668d14a07759bdd235dbb168458c20476396703978ed5893","impliedFormat":1},{"version":"5edab762fb7106d69861761aa935a455bbb2a840b752204e14bb8e52c3d74813","impliedFormat":1},{"version":"17955a14fefeb1a6948ddd93145beceedc741cde3a6ed715522691ac7d85e2fa","impliedFormat":1},{"version":"5601d5842362c9e567dd8dc42b92999fc48b5078baecd1c956ee2325d330cda2","impliedFormat":1},{"version":"e8e461e6d967b9d49fbfbf41927007a14ad18a4974c6c7ba3d4af4a552d160b4","impliedFormat":1},{"version":"060c674e4ce775f14f4da65032032be2d9161032bf1505a0df24e829942bd0d1","impliedFormat":1},{"version":"e169c8d7896508b168cd0963a819b5c5d5a19462b57192c856dc0f37c18694d7","impliedFormat":1},{"version":"b7da89d98a22fa8ec43bf1cb0d77ac9b301ca7f0cbae50c9af9b65d47eef86f9","impliedFormat":1},{"version":"dd1817b824c49e7e20709362caa64ae4d1ecb4fec4b78f708e28a8f2e227cb54","impliedFormat":1},{"version":"1c4cb01cf281a0203c585db99a1bd2eb2ea6e2ea6a07cff24c1ba536d985ab1c","impliedFormat":1},{"version":"2e0a1db3c4a99df316143639cb6531d7a9a7963917800550c3be05871da74d58","impliedFormat":1},{"version":"db21b44d182326eef0fcec0f7ec3d1f150de34f59e752d996931406557fc3d8d","impliedFormat":1},{"version":"147102191a91931da00f6e4818fe664c57826defc56991a55622ec7444724804","impliedFormat":1},{"version":"bfdef1d4f8c04e68f1a29d83ea3a4ba9fbb9a1898602b2653c0a80c76564fa6a","impliedFormat":1},{"version":"b6192f34f335d9a469d2537e1a9d57ad7103f2a5651cc3a39d028dce21a902dd","impliedFormat":1},{"version":"8de5de7b11798400bb87b7aaf75fca389a45e9a1c2be2a4eeddd02ebca42ba28","impliedFormat":1},{"version":"fc8e91b2f63736d8e7e66b64da4ef94e51a76742d1d105e6f910f5efc0c7e342","impliedFormat":1},{"version":"336b45ce269616bfc8c46957d3a104faad7d9d4d18a985a51cca23cb19b3edcf","impliedFormat":1},{"version":"d7fca0137296fb9e9cecf458f861e041c38d0dee009fb354cf13ec1a5f5a4dc2","impliedFormat":1},{"version":"1ef742e7e980f49ac15e47793158ec9010b742d85d53e34092c9734fbc158bc7","impliedFormat":1},{"version":"45cf60ecc05a835a2e3c069f8e4dce3df1d2bc0525e3cebe3f5defa759b2b097","impliedFormat":1},{"version":"b34b09dfddce0a97f257d0d7a0d4352ccff972ca86ae1aeb1c3a397aec1f9c75","impliedFormat":1},{"version":"bb599e9ff7f90a8c315d5dcc9a0345afe0da27eef496651ac721e368ceb2f8ab","impliedFormat":1},{"version":"2b063d5f33e899eaf95715841317c4e3a958cd422f27a2761234eb0efa525dd6","impliedFormat":1},{"version":"561a7797475571e49102f75453d14e53ec1adde810aa0272398a2be6d9b6e675","impliedFormat":1},{"version":"09134279af2dc944e9e634a7e37c1fa409538e1b7df369f4afdda1f1b3a04945","impliedFormat":1},{"version":"0c5ed31d81fb7d72d01be928100a6f9020f098a6c96fef35d841bb89c537318b","impliedFormat":1},{"version":"23f1b2b2ca405a86c0ee55111fd2433b41c51ad70b536dd7f1dff9dcd6f423a7","impliedFormat":1},{"version":"c01607a443c37e487b5ffe6436f2743473aef23c322688c60393df3a1ee33b8c","impliedFormat":1},{"version":"fa9425ba065a2fce00d99a344d7ffe283fe9831f2b002bc7feef1a0fde2c6b95","impliedFormat":1},{"version":"8baa5de4323a9071f59b09d2006c3f7ed1b55df7f819d84481f5363367bae4b4","impliedFormat":1},{"version":"2651c15e337d11e498a2302419efed80850a1399032c73f334c638b569ec0424","impliedFormat":1},{"version":"4c780f28af9c74d9d2feb8f296ce16ea08e7105856da4c00414d4683bc15a172","impliedFormat":1},{"version":"4e187114c33f9f7b0226b7a2b67a1f52f0667da0c15fafa87af701918b899765","impliedFormat":1},{"version":"5f7ec4a13efafc821e3afbe3947eeaa1e64e39a9dc7af296fe8270e3b6254dd6","impliedFormat":1},{"version":"5d6068c02ce0d398272936de1ca44550f253c9237eca4986e1a029d6539e015e","impliedFormat":1},{"version":"a03a2920e649f65b2c0f782139ce3f87fae1fe8bb74a05be26adab33244992e1","impliedFormat":1},{"version":"8c54bba7055d3f92469c8bc82d897295ed876d684c07be7806c675d284512010","impliedFormat":1},{"version":"0543261bae710950d4aa2f20c622a630b1e48cf64ccf9049919482119a6a418d","impliedFormat":1},{"version":"1e09a546409b008425a77322975fd4fc8fa5b25fd77cc893265584777d2e40b8","impliedFormat":1},{"version":"d1e41b5e7eb390edf80daefbbd715ea0635a53c6609f67cef24a3c27c3ef8ac4","impliedFormat":1},{"version":"662d8be18aa6ef1c463ff5130d996cb9594a79e6a5a0a73a78e6eb58c0e7119e","impliedFormat":1},{"version":"a45f7378534b37fb613f43a9ca39f9abbe7e97ab181e36949b06dae19a22127f","impliedFormat":1},{"version":"e9e86a79d55fa4c09cd3314fe33a8a9b9ac2e158d051ffe4e6bd19c0b84082ee","impliedFormat":1},{"version":"1075cb3d1b1f5b7cabe98d4015a7cb56054fa6f594b6e50d1e2a8ef2373a9140","impliedFormat":1},{"version":"1d87498c8b22eed2d4bed0243df4ba9807d8d26e8833d859cbceefaa69d33aea","impliedFormat":1},{"version":"71509956f22e8ce2e77ad8119c3d26f461a7cee582a62d496b69e59d8ac57e30","impliedFormat":1},{"version":"6a5e01506ff3013b13363f8d605bd8d85b088d650dee6569d2c62af266182ef5","impliedFormat":1},{"version":"9d594decd11cbd856152d090f50b0b64b40d3185f2f2de7d0ec50dc94e367da3","impliedFormat":1},{"version":"ca4c6a71225fe8aa2d7fd78df2ac15240a90111aaca31e57bf1bd7a9cf839839","impliedFormat":1},{"version":"dcb44402a8dbb979508dc1c21b292ef050d96616089ba6af47aeeaa154caf95c","impliedFormat":1},{"version":"58caa97171d4f8a8caeb43817d4a6fb76f74270ee27a0448724c303bc925c324","impliedFormat":1},{"version":"f634a6ede00a283133ba631eacc8c9e91b750e59c8185709f17743526dffe0fd","impliedFormat":1},{"version":"dc7a0968d53a9c69335a850e7c1661e75a59b8bf3944859727b6e6c986ebb91a","impliedFormat":1},{"version":"c47e33fde8d14e66d1ca3d334731cc057154a8cf611789a834f91988bef58027","impliedFormat":1},{"version":"b17a37eeb7449541ee9e9d397cd40d6636a038790a6cfe58aec0d6ca86d7a615","impliedFormat":1},{"version":"ab073fd0f72cf813cdbab65ff3d4b228163c7e4a2bc05005729cf9829201db4d","impliedFormat":1},{"version":"56d204458f7859dfb74222acfb4e3ee2b809853ea078f7b0b467ad07390c40a6","impliedFormat":1},{"version":"3389d6e8cf972b15a4c967c0cce22cda6bc6432c25d39737c1f6293ab7e0434a","impliedFormat":1},{"version":"4ace97237738968c48d31badd7c5b157130eb0809993cb32d2aa833ff3d0fe11","impliedFormat":1},{"version":"01880fc9d097cb63446a1c3ebd6ff5b1c881012e9fc1b380bfd9ebede24ca97b","impliedFormat":1},{"version":"7d9adb5abccc66a15d024e0db3b836416107725a0100d6aeffc1e23ea6354b9b","impliedFormat":1},{"version":"8549e454f84a8b476bd53ae3a62739b5faa9e6ffce568e8558ccc4b38e315f00","impliedFormat":1},{"version":"7c9e3eb8c05d04e7c4e57891b5e1b573504fd90cdae9b632dd4a65fc7bc675c3","impliedFormat":1},{"version":"72a9c7654b1b34cf90d4e5432e8ebd0d4d9c60611dc35ecf6bedc4a05cc341f8","impliedFormat":1},{"version":"99ed22973d93200f6bb59224a44f93bcef2f39cfe834e6e1d3efd9ef575c9e92","impliedFormat":1},{"version":"a79d8b37e7e2f0106f57c4d3c3afdb7519ac3397ed7b19b7b3d2c9e2caa38025","impliedFormat":1},{"version":"5601ab8b92fc268efbd79815346279f6d90e447ce7264ae4b2f2c826a012606e","impliedFormat":1},{"version":"d9c02626ce3fa6322527462b33f16232a52858902dcdf0ae2b1847bacaba6ced","impliedFormat":1},{"version":"fa3738d60edb11b64b0103eb02ab925c3301adcd5a12dedad4c2cbe305b9b8d9","impliedFormat":1},{"version":"ffda5b61aadaac78799befb98c81f774685c5f6df08550d2ba8a23ea6cd82f2f","impliedFormat":1},{"version":"9c124dd51574bd8976fc6b4b7e4a7113c08222bfb1529aa3ae7cce15796f3d3f","impliedFormat":1},{"version":"7ed88c8574b057610bd29091bb867468a75e95c6ab82c702972614705aa9f075","impliedFormat":1},{"version":"0d4a49098aab93508ef17d4d2c12cb5caf0c7c36c2f3782411430e56add33f13","impliedFormat":1},{"version":"d16a2359570c636f99285edb748abbac7c5124b002d27c0ed9419da16fc94966","impliedFormat":1},{"version":"7c013a39f01334eaa8bee4d391abb112d1934cc3f6d5f83a6b7449ab96dfda9e","impliedFormat":1},{"version":"46347d9ba6d355004fc13b01a8b5556eaa6a9680a5292bacabfe3cf9c3ed7261","impliedFormat":1},{"version":"ab8310f36396431111c93e9ca1a9a037e48c22d8dce313c78de13adbabf2cd0b","impliedFormat":1},{"version":"982171b404cd228cd1cd0a9a2ee810f5f08f7fb20ca018bb84592e78fcc68152","impliedFormat":1},{"version":"539fef261dccc907204c70e69ad6bdef79ec5b01bfb701b4c48b7c735bead103","impliedFormat":1},{"version":"24b7c3d2cf7dbd731806203c55b9fd48efd2a91e61363159bdc6f5e7522a1ade","impliedFormat":1},{"version":"fb9e1fdcc158b2fc49a6ab93cc6cd8f16c37b9ecdaca0bc22d6927383ed864b5","impliedFormat":1},{"version":"1b5a974ad593388bbaeab00b2dd867128b46203cbb8bf78278a8e7d977930f4b","impliedFormat":1},{"version":"7d8de31d358e2a44b87a2814fcad24fdc6fb538fa370866937031801add88d01","impliedFormat":1},{"version":"f826e81501f8147244d8861dc31af3b052778ef7133d9d95bbe1300e8ce41582","impliedFormat":1},{"version":"7a7a7ae4d5e1a26c4c6b3e0bbd8fb1b5257283faef447ccf127955a73790e023","impliedFormat":1},{"version":"b74a39386f80a71e606ac6b45942c0254a9f4178147c8a2979c25161c1795c49","impliedFormat":1},{"version":"0feab15c5935c8589f6d6e507d8318b2fd2f8c36ed2340a67232958a6cba8367","impliedFormat":1},{"version":"5e3af66007762d5710a94a87988024091893a887169f48198eed109e41b4a134","impliedFormat":1},{"version":"878322c54b2527f8d55b393d6a0d9e5db7872023073ec83305ae93ca64204599","impliedFormat":1},{"version":"c56805cb4622dd6728215b15030285920846ed77e12be0e6ebce0ade4bfecb0d","impliedFormat":1},{"version":"a3542e6fcda2cbb7ef26ea4547b9a413987b9682879bfe9b6d62bd3e1ea5c4bc","impliedFormat":1},{"version":"d6208d5ff9b5b02ca80eb77c053b18c85b449bd2dc71faeb144ce3baecd4acbb","impliedFormat":1},{"version":"a7cb1d01fc96c17b548cbe67b4d5391d901f2052abfc7642e5e5365710a4ff20","impliedFormat":1},{"version":"2a13b2c9a552bd0401e1f855acbb3f5dafec36f36c88bd187ec004ae18bca1f0","impliedFormat":1},{"version":"b5cce958440239e1f803a667308d7036f3234e7c0a3de893f32c9ab6452ee4fc","impliedFormat":1},{"version":"f8063d002ba29841795a07a5339df9df4c54971980a26747aed9026a1568a647","impliedFormat":1},{"version":"9534178ddefa237057f177f2034e20c308c42c88dd61bc072eddc0a644f8a860","impliedFormat":1},{"version":"d333cb68cda06f938758d6f20e3c6b60e639e59927c5415619af17c091da1b62","impliedFormat":1},{"version":"f24f31d0b3ca006ed05b7a4b5fda23a4fac5d9c32a3bfdc5929cf7de7420ab52","impliedFormat":1},{"version":"17d39cc706199fe96d85c5bcb4a1dac3693b595a9c5ec1bb3f05d048a663898b","impliedFormat":1},{"version":"f1ee4104cff885b1ae022353d1f6ea66ad91f4b534c1a6210795d7ea9c71fba3","impliedFormat":1},{"version":"c3921a47463d80f1b5200bdd4c7f0247fba04cc9c89404ce082d5e57dcb445da","impliedFormat":1},{"version":"8fdabe79cf609194031cb0c60fc15426b283ea38cd66db436ddc41ea9a2ba732","impliedFormat":1},{"version":"c86e1bd0879ad4dd4821d2e1c706dda396cdcd9d6dc999ece7d84760080d5740","impliedFormat":1},{"version":"04193e2169cfe772966359fb4607b9bfc8f8ba014fe16e85c4c636c10635a85a","impliedFormat":1},{"version":"9abc4d7a0ed1382e6bcd7b33fe2ef6110c1ffe30967490509d8754e9422fc2d7","impliedFormat":1},{"version":"341fe3082677dac17aabd97f6ba7cee1d59bccc01dbd83245243d9ec83fc6756","impliedFormat":1},{"version":"1b19137641615d983ea2bc1335860a8937c39ed717ea2d35c86c131bc55ec236","impliedFormat":1},{"version":"819d063bbf46bd0adbcfc8d795ec3d39936990b966e62b0c340587e82aa2c78a","impliedFormat":1},{"version":"79eeba68c2948729dd40077460c12f620c4c55c378df91e45c5cf253a317d2b7","impliedFormat":1},{"version":"6f518d3297f921f939432263025b4177ae84ce4421035e3f02f3d00b5cf86002","impliedFormat":1},{"version":"d938df6182337389213b5e0f75d20d06c6b03776a7f3a104065a658579fec44e","impliedFormat":1},{"version":"eb12f4189dc522d96b93d8bd3f3e5bf467833b9029d39c71a2a4a253cf51c81c","impliedFormat":1},{"version":"6f185664efa82bfc56eb17682aa451c501749174e072fa6ee348521449e28435","impliedFormat":1},{"version":"94693d2177f946556d6fb97fd1cf2a341cfdc72feddfb6468c074ef70d9171bd","impliedFormat":1},{"version":"f18b32b868dbc9a52023e0426f061e97ba9ba74c36ec24af0999ff273db5c177","impliedFormat":1},{"version":"767862fceb5400cbd6db5bf19ec95359e39cf818befd2f627ac9ee833b434c25","impliedFormat":1},{"version":"eca1abe8ca2e6c1a7262bfde9e42485bb692504f94c7496aa5683ac4b854eacc","impliedFormat":1},{"version":"08baeeb4dcac00f6a9699d14b41cfce976438271d07bea3db68a55b8bf5b816c","impliedFormat":1},{"version":"d374cc3b7dc1cfb1727e3da450bcc71fdac928f86ec1a05f17bf05786927a40d","impliedFormat":1},{"version":"03c48897915b6c629a075b21dee9e8fd438a72fac365ffeed6083de0f1c5149f","impliedFormat":1},{"version":"fa087840010925cc098ab796516a3cc01c753cd90d3929dab33ba29c33e7d187","impliedFormat":1},{"version":"d488b1d4534f154c2d36433ec775660e03afdb354b305be30f65706ce9cc661c","impliedFormat":1},{"version":"f32106278811900db04f2c617276a6602ff74175a7a2324432d9de4b8d540d20","impliedFormat":1},{"version":"c5ff7d90f09b2cac0a8d7d6efdd39283edf076945b88d7af5314e987fefe0e2c","impliedFormat":1},{"version":"68c912481dbddcba54b58103a23075bdad3deced6ed644d563ec1b4c5f8287be","impliedFormat":1},{"version":"e8aa915e9463e9c39eb20e3d4a7355d52e08ef89524cd662b3a5b1c94db3cf50","impliedFormat":1},{"version":"c7ef7fb1ab026d38913ec21e633b6b21497adb662298abd7acda2c8ec7cf3f61","impliedFormat":1},{"version":"4bc6818d3e7685e9cdd2040a9a418e6e8e1f379c867654aa567ecd99d379f5cc","impliedFormat":1},{"version":"8f252eb4b53f283cf4152974a596d2d5c0367e009270224bf532126ca16715bb","impliedFormat":1},{"version":"1493a2605b11f8cd17d56c5af04ef4b4a67004930dec9de884c232fffe5e98ea","impliedFormat":1},{"version":"505cd8eb686ed801bbfdc432dd00bb1f164f5db27551e4149195dd35c5c8a03b","impliedFormat":1},{"version":"d0d3cec49f4183bee63ac5367b23a34929c458a56b8ce7a18d4a3c70b6ec3912","impliedFormat":1},{"version":"f55acb56b508344172c556ed93663c652442d2cd64da1456d822fee4b86203ac","impliedFormat":1},{"version":"31b97cbfc7f107c1d6ba90c44aeef032a2f2ea185b8d50973819d052b701ebaf","impliedFormat":1},{"version":"9bbfa044c37c78bb1d54bfa9aa07f8d4f04a4260d3a2caaee1f501a036fcfa25","impliedFormat":1},{"version":"649486b764db0718d3dee5d03fd223cdf38e4cadfe6a1465bf9ea477ead7707a","impliedFormat":1},{"version":"cf2da3c5c6a5fae27b36170f6a634b7a0f0b9fbe33de00a6e0225e2b9ac7ff9b","impliedFormat":1},{"version":"c02009914536657bbcf20ebe306cd60ed51e7328bc1a7aa2f2fde5b3d30ba1d7","impliedFormat":1},{"version":"516fb530789b19d06f444e8078c35daa800df6d076b3f797e7859fd12170660e","impliedFormat":1},{"version":"9bb1b43c3f31b6a7ad93e64fcca09c156b257f86be47a74fc233b32cee5fa9cf","impliedFormat":1},{"version":"aac9db78dba65ce930e65812cf427d15eb85d9a29b5f1e7364ec66c801ce062d","impliedFormat":1},{"version":"59b24f8181952f4060d8c83e2c082692d1f203d2a1f80a042ceb310c743c8acb","impliedFormat":1},{"version":"cd54895f60787ec5a0eed77b68b43c4f3086c41fc5b92344e95c4a48ebe457d9","impliedFormat":1},{"version":"33baa9c8c8f934de93b134219e8cc71fd5c060c5926d30b4e27bc7970cb4c306","impliedFormat":1},{"version":"b4a5831d04bec3b759b1531e983ac237abb6084aa8c7ad1757896cbff8d4a739","impliedFormat":1},{"version":"0f62654e144a243209deb93ccd592fb37155b930c090d3f15cf0f336f1fb09ee","impliedFormat":1},{"version":"fa6c156ed3b8cb663270be3cb4dbc68ab0020b66fd452e114c73adedb8e94571","impliedFormat":1},{"version":"d572c7dc04ce69763dceb61a9390caba5676e8b5fad3ba884a295c13fcc1e9a2","impliedFormat":1},{"version":"4391270928e45f2feb6de2cb0699b36b0582e3e88857bd0973531afcf6f53820","impliedFormat":1},{"version":"7dd9edf209b702f571398dd10a4ac1ede0ccf6438ff7f6fd51b6d7d90b3dd079","impliedFormat":1},{"version":"3963681c3857ffd2fea3631a5f60fdba5995200cbd38e21b9fabe482711ed198","impliedFormat":1},{"version":"0f495ff07adcc35c67d97e2f83c684b77d443d1d104caac907e6b0ba6237eb82","impliedFormat":1},{"version":"27d4092b619b0d740fa198cb45fb96358aa624c29de2ca10680aec14790596f4","impliedFormat":1},{"version":"c4bd7c069cb452647726c40cbe523b0275323ceea7e75d255943ca59a11a0c09","impliedFormat":1},{"version":"fc6f9741dd9a0aacea6e8454e972b192c77e84301ccd8620e07099112f3dfdef","impliedFormat":1},{"version":"a13cead416d8d53b5ea6bc736a70b4469c8b203c96b9e93203238026f8456ee9","impliedFormat":1},{"version":"60e253772cf9af065357fd804a2bd4411c9f61c0a51d9151d4d0eec65cfb0a85","impliedFormat":1},{"version":"e5269c6b3ac4e799a7446a50f602debd6cb325cceb134d2183fc0bd228dd66fa","impliedFormat":1},{"version":"0b6501d93f4b0777dccbef3dafc900a3b6d38d24ebb5f41adc1db44a6e78513d","impliedFormat":1},{"version":"c0aab0e4877df025407ca3553fd497096a657d4b30e488b22634aef58b0eb5ca","impliedFormat":1},{"version":"1872d3d97b04ced11e71993e0e6225ce57dd6397859b782401be7e32b671e6f6","impliedFormat":1},{"version":"918dedf9a2916fe8f390ddd0acd4367ed7f462bc3367e9093ef22497e8eba55a","impliedFormat":1},{"version":"bd27f573899bfd477ed699de7028529454b32e89b440fbccca14df63629658da","impliedFormat":1},{"version":"8615cb0aa12a2c555019f18a8ae3e36bee1d39a7b62df819885dc5ea642eb140","impliedFormat":1},{"version":"5c96feafb4b881c9bd8fa62475b85f7fbedf17ffa13df758d8eb0173205db8d2","impliedFormat":1},{"version":"d983fec7743a79b5d4e763057509374afaae270e6ff91ad4d4855bcc19077c20","impliedFormat":1},{"version":"7522ac46eac42ff0b50a9353454b460c5117147e262941e2ad87a520d464de4b","impliedFormat":1},{"version":"9a7e2e46e97f89a00cbc911a313446282e0411dd9a00b8707c9b78dc2b461dd1","impliedFormat":1},{"version":"c904d220f7feacf62ffadd65879d946621884bd8d95f94373cfa786f895f6781","impliedFormat":1},{"version":"477b91db1745a2f5db085f1c373dca2a5075b727c1b3e5eea1438def8931fc45","impliedFormat":1},{"version":"e0498f3451a1c80899e23f9b4b8901aa9c63985a2fecce9dc6c9574ae30c693f","impliedFormat":1},{"version":"4bb91ff66a2566cf69c8eafec2cf4c4b3146d76f250a86c17803bc35cb64f521","impliedFormat":1},{"version":"43936740dbf4de443ba6055ac312413424e8f51d51d86c4b068c69e973de0380","impliedFormat":1},{"version":"70c29353974cf728526fc8a2e75a51b87823909e22f7ec7a4af4efcaae368f37","impliedFormat":1},{"version":"57a03784368af2e08a9c3f07aedfcc6d9c599b8b13ea1aefd91da3de817394c2","impliedFormat":1},{"version":"4f01a3f0f78d2f9026e1a949d6ea96663acd994251b06a06c076b9e10ff6fdda","impliedFormat":1},{"version":"1540deb4cc5e382c297d7b030a9aca0f867190d6a5826fdcf5661124ae3bf786","impliedFormat":1},{"version":"f622d7a53990ab687257e046d7dee7c71cd55963a54f4ed461fe5b69226a058e","impliedFormat":1},{"version":"cb9f3037e1718cdcf4ab52df0c1a3c53a352b235a29a6c5fcbaaff6e966c1d52","impliedFormat":1},{"version":"956aa2ef77f706bc8159cab12646f9fbdad0cd7029d2e7d1cf9f6015f573148d","impliedFormat":1},{"version":"ceb7698ecad7695f6dbe2b5993ae58fe2976cb060ec09e107afccf692ccd41c1","impliedFormat":1},{"version":"3bba3c4034e7a2c7234ded8f03930e36d01ba5287bc04472744c881034d2f734","impliedFormat":1},{"version":"09ee4dbf6e4080ddc997a457a59f07895165866bf3c79cdab2d4e3dac87b8fc2","impliedFormat":1},{"version":"be6d2e0d07a97a8f679d9a59d0e6b99ecff903d70521748ab22519cec3a1a8e7","affectsGlobalScope":true,"impliedFormat":1},{"version":"a5356d2e07840011f4b5d5f41875e579442d4ee69dfa7087b8d4f54d4139ad7e","impliedFormat":1},{"version":"35c3ccf717cedea34f667b6332abcc3da98dc3759d76e235a3d7abfe6102152c","impliedFormat":1},{"version":"53cdd1eefd57fa58e402732489db4e2a118599edb7e2105bdcf1bb60d27dfbbd","impliedFormat":1},{"version":"d1c12d3457839f32681cff9650748ba7531dca3154fab2c449ea995031414eda","impliedFormat":1},{"version":"2f660700594abc586d02c7ccfba70de09dbf27c1a9ea63f8a79476335e5770d8","impliedFormat":1},{"version":"fae5e3a1e3bb6ebfd3a97782c2cc7367c974e84760c608ae9af533ac7dbfa638","impliedFormat":1},{"version":"639d0290cf42ae43046121ef45900f7d915de2b384fcc002c0e0f71753f8ce72","impliedFormat":1},{"version":"926f7ce9ac0e3cf28f88c5a629ce0cd41c35f1b0ca70d0f595888eecc347e08f","impliedFormat":1},{"version":"fece822c8e72f084892e851ff99be8b7b3ae186390f7ba2763591f05962b7ca5","impliedFormat":1},{"version":"f0d396d00241d875cf79ba28da7b1cb96772b179a0f5b003233c702ce85e7aaf","impliedFormat":1},{"version":"884b482f935d6b76268eee347d590c349994de1bc4edf0d6ed8987ffd7e33fa6","impliedFormat":1},{"version":"e3be2c87fec8c254856c8fbfd49cbdb09f5f1d9f8d54304dd614fe458130f650","impliedFormat":1},{"version":"2bb7dd685d6c1671525371869d339ad33f866c65dcda8166d3db2f2a4be56859","impliedFormat":1},{"version":"bf74f8c9e942c0323b590ec01bf399fa007d36150ec385523f8f0094f88c5ca7","impliedFormat":1},{"version":"7a6e5535a7876dabb7300d02d25a01c694d74f2f38588d3fe4ff5289c306dd6a","impliedFormat":1},{"version":"1c9800fbae1b443d77672e6d3e715df7280479b7c41f08cb790e750f01b50d90","impliedFormat":99},"d073ea9de1292be47c5bae3e67f4fdb213b1e703af2592eba76f7fbe28d922e8","e33ed5ce675b0011e0353782b5fdd56a3f7d35db5ad1d2330b19d34e946e3f8d","5ae2d0512126121ad669a81cf1da17007c1c9b6fcab25f72d7f9f0e7a6944c64","c0c92e4e224992929bbe76eea3075ca428545ff2d6c531b682bfe1e89522e57a","9a94f28cbd026c2d2f0331e6041ecd18eb850a27b80bb6b86146dcd1e32cba3f",{"version":"644e42dffff36077d369921d00afc94afcb10d9c81d067d5c906f1ce11ef55ad","impliedFormat":1},{"version":"8adf39b75996ee76992cae1326db26186e80b9d5671f842f550565830f33b4f6","impliedFormat":1},{"version":"4c780f28af9c74d9d2feb8f296ce16ea08e7105856da4c00414d4683bc15a172","impliedFormat":1},{"version":"4e187114c33f9f7b0226b7a2b67a1f52f0667da0c15fafa87af701918b899765","impliedFormat":1},{"version":"5f7ec4a13efafc821e3afbe3947eeaa1e64e39a9dc7af296fe8270e3b6254dd6","impliedFormat":1},{"version":"88d23cfe9cca143a5b34cb7813c4c6b1919ee5f772e8c69b2db26c210556e2fd","impliedFormat":1},{"version":"35d2f436b02d50acb4c2902c388d70255cd3080a9683f3cfdb08eec90df0c418","impliedFormat":1},{"version":"9b140f38453b5eaca316cfb80a9e506bbf598a3adad48094234af8611679fa4c","impliedFormat":1},{"version":"0543261bae710950d4aa2f20c622a630b1e48cf64ccf9049919482119a6a418d","impliedFormat":1},{"version":"1e09a546409b008425a77322975fd4fc8fa5b25fd77cc893265584777d2e40b8","impliedFormat":1},{"version":"d1e41b5e7eb390edf80daefbbd715ea0635a53c6609f67cef24a3c27c3ef8ac4","impliedFormat":1},{"version":"662d8be18aa6ef1c463ff5130d996cb9594a79e6a5a0a73a78e6eb58c0e7119e","impliedFormat":1},{"version":"7279aabe0c1f3af7fc7d6d9ed95935780305ffff1c61c30356c920461da02def","impliedFormat":1},{"version":"e9e86a79d55fa4c09cd3314fe33a8a9b9ac2e158d051ffe4e6bd19c0b84082ee","impliedFormat":1},{"version":"1075cb3d1b1f5b7cabe98d4015a7cb56054fa6f594b6e50d1e2a8ef2373a9140","impliedFormat":1},{"version":"1d87498c8b22eed2d4bed0243df4ba9807d8d26e8833d859cbceefaa69d33aea","impliedFormat":1},{"version":"f984300c99f739fe5950949dd628dcd7fb23938bd790714c0e3e436d3df75445","impliedFormat":1},{"version":"2ad43c6ed3bd733d3ba162691019fa734af02d1cf3d3885bfe62cb54607e8408","impliedFormat":1},{"version":"09e71426c1fb3dcb4a205f57540f02c8b81b0a5aea9a6d50e3e5438aac3de7dc","impliedFormat":1},{"version":"68d1ccaaea896c7416e41d6222f1d422aa3a169c428a57b7a6b3b6636aa90683","impliedFormat":1},{"version":"547d2ed75a7e879e039ec475b6119ce3151b2d1ef8610d3659f4b5d74dcb9786","impliedFormat":1},{"version":"58caa97171d4f8a8caeb43817d4a6fb76f74270ee27a0448724c303bc925c324","impliedFormat":1},{"version":"f634a6ede00a283133ba631eacc8c9e91b750e59c8185709f17743526dffe0fd","impliedFormat":1},{"version":"dc7a0968d53a9c69335a850e7c1661e75a59b8bf3944859727b6e6c986ebb91a","impliedFormat":1},{"version":"84efb6677865b03ef14a4cfcd8c37fb36921b1c0a97611bc31200db58d5b8ff2","impliedFormat":1},{"version":"b17a37eeb7449541ee9e9d397cd40d6636a038790a6cfe58aec0d6ca86d7a615","impliedFormat":1},{"version":"ab073fd0f72cf813cdbab65ff3d4b228163c7e4a2bc05005729cf9829201db4d","impliedFormat":1},{"version":"0262c21c122648a088d7c0e88c048aa12ac35f25c39f72829d87595dc69c038f","impliedFormat":1},{"version":"58c2ba8fe72c512f5c55780c0a5372cc6c00a7b29b810895efef836611f66048","impliedFormat":1},{"version":"4ace97237738968c48d31badd7c5b157130eb0809993cb32d2aa833ff3d0fe11","impliedFormat":1},{"version":"a60e0206d2aded926c9550613dd7a87c8d1126af68df093e4c78210938b6939a","impliedFormat":1},{"version":"7d9adb5abccc66a15d024e0db3b836416107725a0100d6aeffc1e23ea6354b9b","impliedFormat":1},{"version":"e71a06b8e1bf89b385bbcee2425ad51c32b188f7b3fa7869d993c8b79888c3ac","impliedFormat":1},{"version":"7a8edeaac6c297f9fba5b3193c75e727a1551e1d7d1c8971b56a3645054ddbe1","impliedFormat":1},{"version":"1bbb21a76b9fda4738b4288beef9cf0c8f9ea4533133ba8bfb85541b9f0a2441","impliedFormat":1},{"version":"7c9e3eb8c05d04e7c4e57891b5e1b573504fd90cdae9b632dd4a65fc7bc675c3","impliedFormat":1},{"version":"72a9c7654b1b34cf90d4e5432e8ebd0d4d9c60611dc35ecf6bedc4a05cc341f8","impliedFormat":1},{"version":"f38d603c018434e89e163e88e92b07564c301ccf70c0271d4bc76fc4c74aae6d","impliedFormat":1},{"version":"d2752672ae69717d9e074bc3d3524261028f26cf3269462b98bdaac675f150d1","impliedFormat":1},{"version":"ffda5b61aadaac78799befb98c81f774685c5f6df08550d2ba8a23ea6cd82f2f","impliedFormat":1},{"version":"9c124dd51574bd8976fc6b4b7e4a7113c08222bfb1529aa3ae7cce15796f3d3f","impliedFormat":1},{"version":"1cd1f47f037ae81aca1ed163f57ca114276035a1e5f1bd0063ab8b1df10163a3","impliedFormat":1},{"version":"bfed6b7ec77ced5a9960f40d8474989ba6dca081df5621c1da6b0a81f943bc75","impliedFormat":1},{"version":"ad6412353e9b906f39317ecbc91d62478668c906c2d7c503eb3f00528d16b6d8","impliedFormat":1},{"version":"7c013a39f01334eaa8bee4d391abb112d1934cc3f6d5f83a6b7449ab96dfda9e","impliedFormat":1},{"version":"46347d9ba6d355004fc13b01a8b5556eaa6a9680a5292bacabfe3cf9c3ed7261","impliedFormat":1},{"version":"035f3acf225c848e1efc71ca2a62869f57a79e4e7ee0b9b46f5e134ea5cf5796","impliedFormat":1},{"version":"982171b404cd228cd1cd0a9a2ee810f5f08f7fb20ca018bb84592e78fcc68152","impliedFormat":1},{"version":"24b7c3d2cf7dbd731806203c55b9fd48efd2a91e61363159bdc6f5e7522a1ade","impliedFormat":1},{"version":"fb9e1fdcc158b2fc49a6ab93cc6cd8f16c37b9ecdaca0bc22d6927383ed864b5","impliedFormat":1},{"version":"4447d254d93dd213acc9c813e8310760243018a309c26dd737debd9403cc578f","impliedFormat":1},{"version":"7d8de31d358e2a44b87a2814fcad24fdc6fb538fa370866937031801add88d01","impliedFormat":1},{"version":"f826e81501f8147244d8861dc31af3b052778ef7133d9d95bbe1300e8ce41582","impliedFormat":1},{"version":"d40846d867051e21651243d7d7b738fb13e85d37696bb0f0fdc2228808efe241","impliedFormat":1},{"version":"f774b5bfbff417a6bdfaeba8aef20d229bbc47feb140274c2ee8a4e1856f23e1","impliedFormat":1},{"version":"0feab15c5935c8589f6d6e507d8318b2fd2f8c36ed2340a67232958a6cba8367","impliedFormat":1},{"version":"3638df938473eb962a1f7dfde9af212ef4b7ca4c64a0190ca976849309324b14","impliedFormat":1},{"version":"724cd0d5584e98f77367b37ec547abab64a36e1d1f8f115a215d4720e22ac4af","impliedFormat":1},{"version":"c56805cb4622dd6728215b15030285920846ed77e12be0e6ebce0ade4bfecb0d","impliedFormat":1},{"version":"12f3f2c6192eb7b569c262302a188312bcfc126d7e55be6de628bb7d5d376a94","impliedFormat":1},{"version":"dd275c8c6b9260ec326505fa16b3cfe8e8c2d4c870df87c3cc788a4eb3baccdc","impliedFormat":1},{"version":"a7cb1d01fc96c17b548cbe67b4d5391d901f2052abfc7642e5e5365710a4ff20","impliedFormat":1},{"version":"2a13b2c9a552bd0401e1f855acbb3f5dafec36f36c88bd187ec004ae18bca1f0","impliedFormat":1},{"version":"5ae6c86bade3cfbde19883ab0c26533279a87032e171132b764790968b284bcd","impliedFormat":1},{"version":"f8063d002ba29841795a07a5339df9df4c54971980a26747aed9026a1568a647","impliedFormat":1},{"version":"9534178ddefa237057f177f2034e20c308c42c88dd61bc072eddc0a644f8a860","impliedFormat":1},{"version":"f9b7fe2aa2cf3d7a555e268ff03ae6891515b319505c2f7d72ddf5350d0ba6ca","impliedFormat":1},{"version":"f24f31d0b3ca006ed05b7a4b5fda23a4fac5d9c32a3bfdc5929cf7de7420ab52","impliedFormat":1},{"version":"0a7bf32b64d70e0fcfe4cd27da2e0ffd4d6d0a39aaa3edcbfe9c358172fa27a5","impliedFormat":1},{"version":"f1ee4104cff885b1ae022353d1f6ea66ad91f4b534c1a6210795d7ea9c71fba3","impliedFormat":1},{"version":"0bbee49a83394c4d0ce01d6525b59e6c93d29cf2e7f8b80ee6b86bf1e0f54718","impliedFormat":1},{"version":"8fdabe79cf609194031cb0c60fc15426b283ea38cd66db436ddc41ea9a2ba732","impliedFormat":1},{"version":"c86e1bd0879ad4dd4821d2e1c706dda396cdcd9d6dc999ece7d84760080d5740","impliedFormat":1},{"version":"04193e2169cfe772966359fb4607b9bfc8f8ba014fe16e85c4c636c10635a85a","impliedFormat":1},{"version":"9abc4d7a0ed1382e6bcd7b33fe2ef6110c1ffe30967490509d8754e9422fc2d7","impliedFormat":1},{"version":"5eb029da7570b9402bb91aa7d1bc770297cbfa95ddf2d435601228369756f274","impliedFormat":1},{"version":"1b19137641615d983ea2bc1335860a8937c39ed717ea2d35c86c131bc55ec236","impliedFormat":1},{"version":"819d063bbf46bd0adbcfc8d795ec3d39936990b966e62b0c340587e82aa2c78a","impliedFormat":1},{"version":"79eeba68c2948729dd40077460c12f620c4c55c378df91e45c5cf253a317d2b7","impliedFormat":1},{"version":"d938df6182337389213b5e0f75d20d06c6b03776a7f3a104065a658579fec44e","impliedFormat":1},{"version":"6f518d3297f921f939432263025b4177ae84ce4421035e3f02f3d00b5cf86002","impliedFormat":1},{"version":"eb12f4189dc522d96b93d8bd3f3e5bf467833b9029d39c71a2a4a253cf51c81c","impliedFormat":1},{"version":"6f185664efa82bfc56eb17682aa451c501749174e072fa6ee348521449e28435","impliedFormat":1},{"version":"94693d2177f946556d6fb97fd1cf2a341cfdc72feddfb6468c074ef70d9171bd","impliedFormat":1},{"version":"f18b32b868dbc9a52023e0426f061e97ba9ba74c36ec24af0999ff273db5c177","impliedFormat":1},{"version":"caa6da083c5601eabdc0c6e5b089f1669cb18aa7268fa0087693060758136791","impliedFormat":1},{"version":"eca1abe8ca2e6c1a7262bfde9e42485bb692504f94c7496aa5683ac4b854eacc","impliedFormat":1},{"version":"08baeeb4dcac00f6a9699d14b41cfce976438271d07bea3db68a55b8bf5b816c","impliedFormat":1},{"version":"d374cc3b7dc1cfb1727e3da450bcc71fdac928f86ec1a05f17bf05786927a40d","impliedFormat":1},{"version":"03c48897915b6c629a075b21dee9e8fd438a72fac365ffeed6083de0f1c5149f","impliedFormat":1},{"version":"1ad4adf3fd36a30feb7fe81ee1f58a8553b6d726d9ca112b8a6c1dfd8c98fd7b","impliedFormat":1},{"version":"1915bc4c614eea44bc63708dd1e18927880bea4335753537799f0876f8cbeda7","impliedFormat":1},{"version":"c34f1a73e9a2739ac14d15ecf90b6200e5fc4949a560ad8cbe05e5c380230a15","impliedFormat":1},{"version":"c5ff7d90f09b2cac0a8d7d6efdd39283edf076945b88d7af5314e987fefe0e2c","impliedFormat":1},{"version":"3b0aeaa1e5626a7e6f0f35a7f91975c2fd4b9e0f505a3fae7fdd2b2e6c0a5591","impliedFormat":1},{"version":"dba588175f52782ca25ae231ef4035a410a0665ebce8e4d78f0d58fa6e3ed7e4","impliedFormat":1},{"version":"029ae4649325e9fb5c9acdb9302b9f7689747024f90e5a42108c5c33339a2869","impliedFormat":1},{"version":"4bc6818d3e7685e9cdd2040a9a418e6e8e1f379c867654aa567ecd99d379f5cc","impliedFormat":1},{"version":"8f252eb4b53f283cf4152974a596d2d5c0367e009270224bf532126ca16715bb","impliedFormat":1},{"version":"1493a2605b11f8cd17d56c5af04ef4b4a67004930dec9de884c232fffe5e98ea","impliedFormat":1},{"version":"505cd8eb686ed801bbfdc432dd00bb1f164f5db27551e4149195dd35c5c8a03b","impliedFormat":1},{"version":"f4175fbecc0e45d4034a33e6f814a5efab03bc8d5c971a9c20592e68a5c00955","impliedFormat":1},{"version":"b93ad1bdbd0eb3fdb7a39e8e85d9c0d63fa839730f3d0a835084fffbc9c54e23","impliedFormat":1},{"version":"c3077608436ec03a81097991ea725c5b3fa35bc66639f4542ca4ed31fd2299c6","impliedFormat":1},{"version":"3b5d8ae86ac229a03f266d4fc5208c4e44f1ba5486bea5a6e071b4231b35f10c","impliedFormat":1},{"version":"649486b764db0718d3dee5d03fd223cdf38e4cadfe6a1465bf9ea477ead7707a","impliedFormat":1},{"version":"cf2da3c5c6a5fae27b36170f6a634b7a0f0b9fbe33de00a6e0225e2b9ac7ff9b","impliedFormat":1},{"version":"c02009914536657bbcf20ebe306cd60ed51e7328bc1a7aa2f2fde5b3d30ba1d7","impliedFormat":1},{"version":"516fb530789b19d06f444e8078c35daa800df6d076b3f797e7859fd12170660e","impliedFormat":1},{"version":"429e3cea2c9348810bc21fc220732349a3b7ef916e8592df06930af68c834bcb","impliedFormat":1},{"version":"aac9db78dba65ce930e65812cf427d15eb85d9a29b5f1e7364ec66c801ce062d","impliedFormat":1},{"version":"cf37598fcf06849d7c38250d94bf9a78ba1f3319c18bb3fbe997ad022cc6880f","impliedFormat":1},{"version":"185f01c0128844c7de7fe0896cbc5b036f534edd02487860cc65db4a37263438","impliedFormat":1},{"version":"cd54895f60787ec5a0eed77b68b43c4f3086c41fc5b92344e95c4a48ebe457d9","impliedFormat":1},{"version":"3cad4b56c78cbfef3042e20c81b30c107dc5fa5e4e9e354beb8692e003e2dcdd","impliedFormat":1},{"version":"b4a5831d04bec3b759b1531e983ac237abb6084aa8c7ad1757896cbff8d4a739","impliedFormat":1},{"version":"27c9b85c9aeddc8bc2f81bbb595a2430810133b462fe5a503f18f992e0151dda","impliedFormat":1},{"version":"d572c7dc04ce69763dceb61a9390caba5676e8b5fad3ba884a295c13fcc1e9a2","impliedFormat":1},{"version":"7f4d3686b860f4ac3b44b0f31eedbf951d9062bed506be02e26f3a1c29855f7b","impliedFormat":1},{"version":"4f09be806cae47a0e2eb8c024f7c34a0d8c34194b4ff4ac58cbd2bd8a3fb1627","impliedFormat":1},{"version":"3963681c3857ffd2fea3631a5f60fdba5995200cbd38e21b9fabe482711ed198","impliedFormat":1},{"version":"0f495ff07adcc35c67d97e2f83c684b77d443d1d104caac907e6b0ba6237eb82","impliedFormat":1},{"version":"27d4092b619b0d740fa198cb45fb96358aa624c29de2ca10680aec14790596f4","impliedFormat":1},{"version":"c4bd7c069cb452647726c40cbe523b0275323ceea7e75d255943ca59a11a0c09","impliedFormat":1},{"version":"fc6f9741dd9a0aacea6e8454e972b192c77e84301ccd8620e07099112f3dfdef","impliedFormat":1},{"version":"5839c6854ed56b6a4b3f16272dc4a7a875ea3daf012bb13aaa9a7a3e0cfad4b9","impliedFormat":1},{"version":"60e253772cf9af065357fd804a2bd4411c9f61c0a51d9151d4d0eec65cfb0a85","impliedFormat":1},{"version":"e5269c6b3ac4e799a7446a50f602debd6cb325cceb134d2183fc0bd228dd66fa","impliedFormat":1},{"version":"0b6501d93f4b0777dccbef3dafc900a3b6d38d24ebb5f41adc1db44a6e78513d","impliedFormat":1},{"version":"1872d3d97b04ced11e71993e0e6225ce57dd6397859b782401be7e32b671e6f6","impliedFormat":1},{"version":"9538db963fdb2d8a4d1273c53cf34f4dbdaf7d1aefec53337b88f2509192cf18","impliedFormat":1},{"version":"bd27f573899bfd477ed699de7028529454b32e89b440fbccca14df63629658da","impliedFormat":1},{"version":"8615cb0aa12a2c555019f18a8ae3e36bee1d39a7b62df819885dc5ea642eb140","impliedFormat":1},{"version":"baf980878016439ecb34e0940350d9c5abe069ba8061b7ef440d3b11e0d95f1f","impliedFormat":1},{"version":"d983fec7743a79b5d4e763057509374afaae270e6ff91ad4d4855bcc19077c20","impliedFormat":1},{"version":"7522ac46eac42ff0b50a9353454b460c5117147e262941e2ad87a520d464de4b","impliedFormat":1},{"version":"9a7e2e46e97f89a00cbc911a313446282e0411dd9a00b8707c9b78dc2b461dd1","impliedFormat":1},{"version":"c904d220f7feacf62ffadd65879d946621884bd8d95f94373cfa786f895f6781","impliedFormat":1},{"version":"477b91db1745a2f5db085f1c373dca2a5075b727c1b3e5eea1438def8931fc45","impliedFormat":1},{"version":"e0498f3451a1c80899e23f9b4b8901aa9c63985a2fecce9dc6c9574ae30c693f","impliedFormat":1},{"version":"0d4659fd8566c98e0f82dea27868767863555e847b025f469978349f3220b7ff","impliedFormat":1},{"version":"de2fd0ebd0d8e9f23171b0e22f5937ba76c0cd8e351737f588e99515f57d8bd4","impliedFormat":1},{"version":"70c29353974cf728526fc8a2e75a51b87823909e22f7ec7a4af4efcaae368f37","impliedFormat":1},{"version":"57a03784368af2e08a9c3f07aedfcc6d9c599b8b13ea1aefd91da3de817394c2","impliedFormat":1},{"version":"52c235f901c00269fc458367de9a5d85ce18c72a28c122d0c4f429e4a484273b","impliedFormat":1},{"version":"1540deb4cc5e382c297d7b030a9aca0f867190d6a5826fdcf5661124ae3bf786","impliedFormat":1},{"version":"1ed27f07365ef77e83372438deabf9db6413e3665946240742d252040b33acb0","impliedFormat":1},{"version":"f622d7a53990ab687257e046d7dee7c71cd55963a54f4ed461fe5b69226a058e","impliedFormat":1},{"version":"e06028e8683f113dc7e402fbf33ae7e0dc59f53cc3a1837ee3f63db05f0c074b","impliedFormat":1},{"version":"5da8f0bc22406720347fca89c0f3b8027f8fd2dbf957bd4f562d135101973ef2","impliedFormat":1},{"version":"ceb7698ecad7695f6dbe2b5993ae58fe2976cb060ec09e107afccf692ccd41c1","impliedFormat":1},{"version":"3bba3c4034e7a2c7234ded8f03930e36d01ba5287bc04472744c881034d2f734","impliedFormat":1},{"version":"9bd7b527fbf5ac5bd8802639e47d5e9c74728e791d8da1ad318d327eb08f9c0d","impliedFormat":1},{"version":"866e38913d52800e6a3e974eb8dd586c3dcf7a76d15d6f8d6f5f1c6c25018cf5","impliedFormat":1},{"version":"a5356d2e07840011f4b5d5f41875e579442d4ee69dfa7087b8d4f54d4139ad7e","impliedFormat":1},{"version":"35c3ccf717cedea34f667b6332abcc3da98dc3759d76e235a3d7abfe6102152c","impliedFormat":1},{"version":"53cdd1eefd57fa58e402732489db4e2a118599edb7e2105bdcf1bb60d27dfbbd","impliedFormat":1},{"version":"f8e3729f37aa0179ffa02fefdc1d3a281a42e5f667ef652bfdd1e028aabf73f7","impliedFormat":1},{"version":"2f660700594abc586d02c7ccfba70de09dbf27c1a9ea63f8a79476335e5770d8","impliedFormat":1},{"version":"7b1da0ea878bb7bc91fd4234f87852180bb34157c8f5dd20840ca89775fab55c","impliedFormat":1},{"version":"639d0290cf42ae43046121ef45900f7d915de2b384fcc002c0e0f71753f8ce72","impliedFormat":1},{"version":"926f7ce9ac0e3cf28f88c5a629ce0cd41c35f1b0ca70d0f595888eecc347e08f","impliedFormat":1},{"version":"eda88de3222d2b828deb12d7987117f0d7359b968b71177bee533bdd3082bfc1","impliedFormat":1},{"version":"6671c799e14deab88983034d7ed767370009c89115a6ce7c39a4fe6df4b27824","impliedFormat":1},{"version":"c33d9bb9dd1ad84c01d1e1c6d46bf4c5d2d4ef0f3c2e046977e38e145cb43377","impliedFormat":1},{"version":"6ba7d600d00a5aa44379548cc91772ba8d9880c95897d3851d81857c0126938f","impliedFormat":1},{"version":"ade7d090512796863a2ed49a32d9cb4c4c30a079063f1bf8442023836b6399ea","impliedFormat":1},{"version":"a5d8e323d1a1e27545e1b4506adf48c29698a7b8a1b2c618f364463b67fd247d","impliedFormat":1},{"version":"44f79b48dc4abcd71f75d297c0c70071aeb22cd7c090d962ef960a486d5e844b","impliedFormat":1},{"version":"57fe680e36ea98f50b8461c8c6d94df8c70f2e3122a680b13d92690ec11cb59a","impliedFormat":1},{"version":"c6ca41cecfe0d4bcc7ad91cff42e80df461b5389b2ba68c08b49d80b13dc9f53","impliedFormat":1},{"version":"add8e1c1a6417e45929892f4947b3fcc9bd0330972ac4450a2cabd49de756e23","impliedFormat":1},{"version":"ccfdb275a518764fe7dbf3eb7dc5a4bb4bccadf95596bfd7b4a2d82ba5e31750","impliedFormat":1},{"version":"f4108dd0e05b0576c5741cfbbc8397ad672293e4770accdbee613d3fe869c96e","impliedFormat":1},{"version":"4289c52598e69a96f3d220ce2388f9e159578273626f2b84a9066d77d8a9805e","impliedFormat":1},"fe035307fd7f8c8f26c7678131827c425ab734d06b3f44d124f5773f2f559ae5",{"version":"eef204f061321360559bd19235ea32a9d55b3ec22a362cc78d14ef50d4db4490","affectsGlobalScope":true,"impliedFormat":1},{"version":"86e56d97b13ef0a58bc9c59aee782ae7d47d63802b5b32129ec5e5d62c20dbfa","affectsGlobalScope":true,"impliedFormat":1},"a6a226e26576cadd9430d15f5ff173fb3dd5ab3c6010c8abab787aee50e1aa74",{"version":"3f6d6465811321abc30a1e5f667feed63e5b3917b3d6c8d6645daf96c75f97ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","impliedFormat":1},{"version":"bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","impliedFormat":1},{"version":"1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","impliedFormat":1}],"root":[105,[421,425],601,604],"options":{"alwaysStrict":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"experimentalDecorators":true,"inlineSources":true,"jsx":2,"module":1,"noFallthroughCasesInSwitch":false,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noUnusedLocals":false,"noUnusedParameters":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictNullChecks":true,"strictPropertyInitialization":false,"stripInternal":false,"target":10},"referencedMap":[[73,1],[78,2],[104,3],[79,4],[82,4],[103,5],[85,6],[86,7],[87,8],[76,9],[89,4],[91,4],[77,7],[98,10],[463,11],[459,12],[458,13],[454,14],[464,15],[453,16],[466,17],[470,18],[469,19],[472,20],[473,21],[474,22],[475,17],[483,23],[444,24],[430,25],[535,26],[489,27],[501,28],[589,29],[502,30],[503,31],[504,31],[536,32],[505,17],[507,26],[460,33],[508,34],[445,17],[493,17],[498,35],[509,16],[482,36],[480,37],[440,21],[511,38],[448,39],[512,21],[434,21],[439,40],[456,41],[513,42],[436,43],[455,44],[451,26],[449,26],[441,45],[447,46],[514,47],[450,48],[515,17],[432,49],[518,50],[495,51],[479,52],[519,16],[428,16],[429,16],[443,53],[520,17],[471,54],[588,55],[565,56],[524,57],[523,58],[527,59],[521,60],[490,61],[491,62],[486,63],[529,26],[530,64],[531,26],[526,26],[532,65],[533,66],[534,21],[467,17],[538,26],[539,17],[540,67],[517,68],[494,69],[496,17],[477,16],[551,70],[548,71],[547,72],[544,73],[546,74],[543,75],[563,17],[562,76],[545,77],[549,78],[560,79],[564,80],[566,81],[569,82],[570,83],[571,84],[577,85],[576,86],[575,87],[578,88],[579,89],[574,90],[573,91],[572,92],[552,93],[553,83],[541,17],[497,94],[554,95],[499,96],[487,97],[457,51],[481,98],[468,18],[516,99],[461,100],[462,101],[581,102],[582,102],[568,103],[583,102],[584,102],[585,104],[586,102],[580,26],[567,105],[587,17],[555,26],[558,106],[476,17],[559,107],[284,108],[287,109],[286,110],[277,111],[288,112],[285,17],[276,113],[290,17],[294,114],[293,115],[296,116],[297,21],[298,117],[299,118],[300,17],[308,119],[267,120],[253,121],[360,26],[314,122],[326,123],[419,124],[327,125],[328,126],[329,126],[361,127],[331,17],[332,26],[281,128],[333,129],[268,17],[318,17],[323,130],[334,131],[307,132],[305,133],[263,21],[336,134],[261,21],[271,135],[337,21],[257,21],[262,136],[279,137],[338,138],[259,139],[278,140],[274,26],[272,26],[264,141],[270,142],[339,143],[273,144],[340,17],[255,145],[343,146],[320,147],[304,148],[344,131],[251,131],[252,131],[266,149],[345,17],[295,150],[417,151],[418,152],[414,153],[415,154],[413,155],[416,156],[391,157],[349,158],[348,159],[352,160],[346,17],[315,161],[316,162],[311,163],[354,26],[355,164],[356,26],[351,26],[357,165],[358,166],[359,21],[291,17],[362,26],[363,17],[342,167],[319,168],[321,17],[302,131],[376,169],[373,170],[372,171],[369,172],[371,173],[368,174],[389,17],[388,175],[370,176],[374,177],[386,178],[390,179],[392,180],[395,181],[396,182],[397,183],[402,184],[401,185],[400,186],[403,187],[404,188],[399,189],[398,190],[377,191],[378,182],[365,17],[322,192],[379,193],[324,194],[312,195],[280,147],[306,196],[292,114],[341,197],[282,198],[283,199],[406,200],[407,200],[394,201],[408,200],[409,200],[410,202],[411,200],[405,26],[393,203],[412,17],[381,26],[384,204],[301,17],[385,205],[152,206],[155,207],[157,208],[158,209],[156,210],[159,211],[161,212],[162,213],[229,214],[180,215],[160,206],[194,216],[211,217],[138,218],[148,219],[150,220],[149,221],[145,222],[147,223],[250,224],[136,225],[223,226],[163,227],[164,228],[130,229],[224,230],[122,231],[225,232],[186,233],[226,234],[185,235],[129,236],[128,237],[181,238],[135,239],[134,240],[124,241],[133,242],[126,243],[125,244],[165,245],[151,246],[119,247],[227,248],[228,249],[183,250],[184,251],[166,252],[167,253],[182,254],[123,252],[127,255],[191,256],[192,257],[108,258],[193,259],[195,260],[196,261],[197,262],[198,263],[179,264],[199,265],[132,266],[115,267],[200,268],[131,269],[113,270],[120,271],[112,272],[201,273],[111,274],[118,275],[188,276],[202,277],[110,278],[204,279],[190,280],[203,281],[206,282],[205,283],[116,284],[207,285],[187,286],[137,287],[117,288],[208,289],[209,290],[214,291],[114,292],[215,293],[213,294],[189,295],[153,296],[216,297],[217,271],[212,298],[121,299],[220,300],[221,301],[222,302],[237,303],[140,304],[230,302],[139,305],[231,306],[143,307],[233,308],[235,309],[236,309],[234,310],[144,311],[174,312],[240,313],[142,314],[239,315],[238,316],[242,317],[241,318],[243,319],[249,320],[247,321],[245,322],[248,323],[178,324],[168,325],[176,326],[169,327],[170,328],[177,329],[171,330],[175,331],[172,332],[173,333],[244,334],[599,335],[600,336],[590,337],[598,338],[597,339],[596,339],[592,340],[603,341],[610,342],[609,343],[608,344],[105,17],[425,345],[424,346],[423,347],[421,348],[604,349],[601,350]],"affectedFilesPendingEmit":[[422,51],[105,51],[425,51],[424,51],[423,51],[421,51],[604,51],[601,51]],"version":"5.6.3"} \ No newline at end of file From 49dd7173fb79dd5b784121071674ca3c0fe1b43a Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:47:45 +0200 Subject: [PATCH 02/11] Fix ci warnings and errors --- .../src/service/data_handler.ts | 3 +-- .../reality-capture/src/service/job.ts | 4 ++-- .../reality-capture/src/service/service.ts | 8 +++---- .../src/tests/service/job.test.ts | 21 ------------------- 4 files changed, 7 insertions(+), 29 deletions(-) diff --git a/typescript/packages/reality-capture/src/service/data_handler.ts b/typescript/packages/reality-capture/src/service/data_handler.ts index 080f8616..29fe6e4c 100644 --- a/typescript/packages/reality-capture/src/service/data_handler.ts +++ b/typescript/packages/reality-capture/src/service/data_handler.ts @@ -1,8 +1,7 @@ import * as fs from "fs"; import * as path from "path"; import { ContainerClient } from "@azure/storage-blob"; -import type { AuthorizationClient, RealityData } from "@itwin/core-common"; -import { BentleyError } from "@itwin/core-bentley"; +import type { AuthorizationClient } from "@itwin/core-common"; //TODO : ThreadPool type does not have native Node.js equivalent. Multi-thread for IO must be readapted (here, ploads and downloads are sequential. //import { ThreadPool } from "some-threadpool-lib"; import { DetailedError } from "./error"; diff --git a/typescript/packages/reality-capture/src/service/job.ts b/typescript/packages/reality-capture/src/service/job.ts index c135fc79..09003122 100644 --- a/typescript/packages/reality-capture/src/service/job.ts +++ b/typescript/packages/reality-capture/src/service/job.ts @@ -193,11 +193,11 @@ export const JobSchema = z.discriminatedUnion("type", [ type: z.literal("GaussianSplats"), specifications: GaussianSplatsSpecificationsSchema, }), - /*z.object({ + z.object({ ...CommonFields, type: z.literal("ImportPointCloud"), specifications: ImportPCSpecificationsSchema, - }),*/ + }), z.object({ ...CommonFields, type: z.literal("Objects2D"), diff --git a/typescript/packages/reality-capture/src/service/service.ts b/typescript/packages/reality-capture/src/service/service.ts index 1599ea09..d247f29a 100644 --- a/typescript/packages/reality-capture/src/service/service.ts +++ b/typescript/packages/reality-capture/src/service/service.ts @@ -1,4 +1,4 @@ -import axios, { AxiosInstance, AxiosResponse } from "axios"; +import axios, { AxiosInstance } from "axios"; import type { AuthorizationClient } from "@itwin/core-common"; import { BucketResponse } from "./bucket"; import { DetectorBase, DetectorResponse, DetectorsMinimalResponse, DetectorUpdate, DetectorVersionCreate } from "./detectors"; @@ -316,7 +316,7 @@ export class RealityCaptureService { } async createRealityData(realityData: RealityDataCreate): Promise> { - let url = this._getManagementUrl() + `reality-data`; + const url = this._getManagementUrl() + "reality-data"; try { const resp = await this._axios.post(url, realityData, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data.realityData); @@ -326,7 +326,7 @@ export class RealityCaptureService { } async updateRealityData(realityData: RealityDataUpdate, realityDataId: string): Promise> { - let url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; + const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; try { const resp = await this._axios.patch(url, realityData, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data.realityData); @@ -336,7 +336,7 @@ export class RealityCaptureService { } async getRealityDataList(realityDataFilter?: RealityDataFilter, prefer?: Prefer): Promise> { - const url = this._getManagementUrl() + `reality-data/`; + const url = this._getManagementUrl() + "reality-data"; const params = realityDataFilter ? RealityDataFilter.asParamsForServiceCall(realityDataFilter) : undefined; const headers = { ...await this._getHeader("v1"), diff --git a/typescript/packages/reality-capture/src/tests/service/job.test.ts b/typescript/packages/reality-capture/src/tests/service/job.test.ts index 2d399a0e..a522447f 100644 --- a/typescript/packages/reality-capture/src/tests/service/job.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/job.test.ts @@ -16,27 +16,6 @@ import { } from "../../service/job"; import { ImportPCOutputsCreate } from "../../specifications/import_point_cloud"; // TODO : mock? -function getCommonFields(type: JobType) { - return { - id: "job1", - name: "MyJob", - itwinId: "itwin123", - state: JobState.QUEUED, - executionInfo: { - createdDateTime: new Date(), - startedDateTime: new Date(), - endedDateTime: new Date(), - processingUnits: 5 - }, - userId: "user42", - type, - specifications: { - inputs: { scene: "scene" }, - outputs: [ImportPCOutputsCreate.SCAN_COLLECTION] - } - }; -} - describe("getAppropriateService", () => { it("should return Service.MODELING for PRODUCTION", () => { expect(getAppropriateService(JobType.PRODUCTION)).to.equal(Service.MODELING); From 80a216076351f2ceed231fafffa6cdd3d8e87ed1 Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:57:50 +0200 Subject: [PATCH 03/11] Fix eslint warnings and errors --- .../src/service/data_handler.ts | 1 - .../src/service/reality_data.ts | 27 +- .../reality-capture/src/service/service.ts | 4 +- .../src/tests/service/reality_data.test.ts | 88 +++--- .../src/tests/service/response.test.ts | 30 +- .../src/tests/service/service.test.ts | 272 +++++++++--------- .../specifications/test_production.test.ts | 9 - 7 files changed, 207 insertions(+), 224 deletions(-) diff --git a/typescript/packages/reality-capture/src/service/data_handler.ts b/typescript/packages/reality-capture/src/service/data_handler.ts index 29fe6e4c..a45f6d63 100644 --- a/typescript/packages/reality-capture/src/service/data_handler.ts +++ b/typescript/packages/reality-capture/src/service/data_handler.ts @@ -103,7 +103,6 @@ class _DataHandler { static async uploadData(containerUrl: string, src: string, realityDataDst: string, progressHook: ProgressHook): Promise> { const files = _DataHandler._getFilesAndSizes(src); - const nbThreads = _DataHandler._getNbThreads(files); const totalSize = files.reduce((acc, [, size]) => acc + size, 0); let proceed = true; const uploadedValues: { [k: string]: number } = {}; diff --git a/typescript/packages/reality-capture/src/service/reality_data.ts b/typescript/packages/reality-capture/src/service/reality_data.ts index b6fffbc6..704646e2 100644 --- a/typescript/packages/reality-capture/src/service/reality_data.ts +++ b/typescript/packages/reality-capture/src/service/reality_data.ts @@ -190,23 +190,16 @@ export const RealityDataFilterSchema = z.object({ tag: z.string().optional().describe("Parameter to get reality data with exact matching tags."), }); export type RealityDataFilter = z.infer; -export namespace RealityDataFilter { - export function asParamsForServiceCall(filter: RealityDataFilter): Record { - const params: Record = Object.fromEntries( - Object.entries(filter).filter(([, v]) => v !== undefined) - ); - - for (const key of Object.keys(params).filter(k => k.endsWith("DateTime"))) { - const [start, end] = params[key] as [string, string]; - params[key] = `${start}/${end}`; - } - - return params; + +export function realityDataFilterAsParams(filter: RealityDataFilter): Record { + const params: Record = Object.fromEntries( + Object.entries(filter).filter(([, v]) => v !== undefined) + ); + + for (const key of Object.keys(params).filter(k => k.endsWith("DateTime"))) { + const [start, end] = params[key] as [string, string]; + params[key] = `${start}/${end}`; } -} -function getContinuationToken(rd: RealityDatas): string | undefined { - if (!rd.links) return undefined; - const url = new URL(rd.links.next.href); - return url.searchParams.get("continuationToken") ?? undefined; + return params; } diff --git a/typescript/packages/reality-capture/src/service/service.ts b/typescript/packages/reality-capture/src/service/service.ts index d247f29a..045cbef2 100644 --- a/typescript/packages/reality-capture/src/service/service.ts +++ b/typescript/packages/reality-capture/src/service/service.ts @@ -7,7 +7,7 @@ import { Files } from "./files"; import { Response } from "./response"; import { JobCreate, Job, Progress, Messages, Service, getAppropriateService, Jobs } from "./job"; import { DetailedErrorResponse, DetailedError } from "./error"; -import { ContainerDetails, Prefer, RealityData, RealityDataCreate, RealityDataFilter, RealityDatas, RealityDataUpdate } from "./reality_data"; +import { ContainerDetails, Prefer, RealityData, RealityDataCreate, RealityDataFilter, realityDataFilterAsParams, RealityDatas, RealityDataUpdate } from "./reality_data"; export class RealityCaptureService { private _authorizationClient: AuthorizationClient; @@ -337,7 +337,7 @@ export class RealityCaptureService { async getRealityDataList(realityDataFilter?: RealityDataFilter, prefer?: Prefer): Promise> { const url = this._getManagementUrl() + "reality-data"; - const params = realityDataFilter ? RealityDataFilter.asParamsForServiceCall(realityDataFilter) : undefined; + const params = realityDataFilter ? realityDataFilterAsParams(realityDataFilter) : undefined; const headers = { ...await this._getHeader("v1"), "Prefer": prefer === Prefer.REPRESENTATION ? "return=representation" : "return=minimal", diff --git a/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts b/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts index beeaff77..373401cf 100644 --- a/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts @@ -11,8 +11,8 @@ import { RealityCaptureService } from "../../service/service"; import { Access, AcquisitionSchema, Classification, ContainerDetailsSchema, ContainerLinksSchema, ContainerType, CoordinateSchema, CrsSchema, ExtentSchema, Prefer, RealityDataBaseSchema, - RealityDataCreateSchema, RealityDataFilter, RealityDataFilterSchema, RealityDataMinimalSchema, - RealityDatasSchema, RealityDataSchema, RealityDataUpdateSchema, Type, URLSchema, + RealityDataCreateSchema, RealityDataFilter, RealityDataFilterSchema, realityDataFilterAsParams, + RealityDataMinimalSchema, RealityDatasSchema, RealityDataSchema, RealityDataUpdateSchema, Type, URLSchema, } from "../../service/reality_data"; describe("CoordinateSchema", () => { @@ -277,7 +277,7 @@ describe("RealityDataFilterSchema", () => { describe("RealityDataFilter.asParamsForServiceCall", () => { it("should exclude undefined fields", () => { const filter: RealityDataFilter = { iTwinId: "itwin-001" }; - const params = RealityDataFilter.asParamsForServiceCall(filter); + const params = realityDataFilterAsParams(filter); expect(params).to.have.key("iTwinId"); expect(Object.keys(params)).to.have.lengthOf(1); }); @@ -286,7 +286,7 @@ describe("RealityDataFilter.asParamsForServiceCall", () => { const filter: RealityDataFilter = { createdDateTime: ["2024-01-01T00:00:00Z", "2024-12-31T00:00:00Z"], }; - const params = RealityDataFilter.asParamsForServiceCall(filter); + const params = realityDataFilterAsParams(filter); expect(params["createdDateTime"]).to.equal("2024-01-01T00:00:00Z/2024-12-31T00:00:00Z"); }); @@ -295,14 +295,14 @@ describe("RealityDataFilter.asParamsForServiceCall", () => { createdDateTime: ["2024-01-01T00:00:00Z", "2024-06-01T00:00:00Z"], modifiedDateTime: ["2024-02-01T00:00:00Z", "2024-07-01T00:00:00Z"], }; - const params = RealityDataFilter.asParamsForServiceCall(filter); + const params = realityDataFilterAsParams(filter); expect(params["createdDateTime"]).to.equal("2024-01-01T00:00:00Z/2024-06-01T00:00:00Z"); expect(params["modifiedDateTime"]).to.equal("2024-02-01T00:00:00Z/2024-07-01T00:00:00Z"); }); it("should pass non-datetime fields through unchanged", () => { const filter: RealityDataFilter = { iTwinId: "itwin-123", $top: 10 }; - const params = RealityDataFilter.asParamsForServiceCall(filter); + const params = realityDataFilterAsParams(filter); expect(params["iTwinId"]).to.equal("itwin-123"); expect(params["$top"]).to.equal(10); }); @@ -360,10 +360,10 @@ describe("RealityCaptureService reality data API calls", function () { it("getRealityData should return a Response on success", async () => { axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); const result = await service.getRealityData(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); @@ -380,14 +380,14 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityData(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityData ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityData(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -396,10 +396,10 @@ describe("RealityCaptureService reality data API calls", function () { axiosPostStub.resolves({ status: 201, data: { realityData: sampleRealityData } }); const create = { iTwinId, displayName: "Test RD", type: Type.CC_IMAGE_COLLECTION }; const result = await service.createRealityData(create); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); expect(axiosPostStub.firstCall.args[1]).to.deep.equal(create); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); @@ -408,14 +408,14 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 422, data: { error: { code: "InvalidRealityData", message: "Invalid payload." } } } }); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("InvalidRealityData"); }); it("createRealityData ill formed error", async () => { axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -425,10 +425,10 @@ describe("RealityCaptureService reality data API calls", function () { axiosPatchStub.resolves({ status: 200, data: { realityData: updated } }); const update = { displayName: "Updated RD" }; const result = await service.updateRealityData(update, rdId); - expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); expect(axiosPatchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(update); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.displayName).to.equal("Updated RD"); }); @@ -437,24 +437,24 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.updateRealityData({ displayName: "New" }, rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("updateRealityData ill formed error", async () => { axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.updateRealityData({}, rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("deleteRealityData should call axios.delete and return a Response", async () => { axiosDeleteStub.resolves({ status: 204, data: {} }); const result = await service.deleteRealityData(rdId); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(axiosDeleteStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); - expect(result.isError()).to.be.false; - expect(result.value).to.be.null; + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); }); it("deleteRealityData 404 error", async () => { @@ -462,25 +462,25 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } }); const result = await service.deleteRealityData(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("deleteRealityData ill formed error", async () => { axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.deleteRealityData(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataReadAccess should return a Response", async () => { axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); const result = await service.getRealityDataReadAccess(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess` ); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.access).to.equal(Access.READ); expect(result.value!._links.containerUrl.href).to.equal("https://blob.core.windows.net/container?sas=token"); }); @@ -500,14 +500,14 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityDataReadAccess(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataReadAccess ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataReadAccess(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -515,11 +515,11 @@ describe("RealityCaptureService reality data API calls", function () { const writeDetails = { ...sampleContainerDetails, access: "Write" }; axiosGetStub.resolves({ status: 200, data: writeDetails }); const result = await service.getRealityDataWriteAccess(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess` ); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.access).to.equal(Access.WRITE); }); @@ -538,14 +538,14 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityDataWriteAccess(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataWriteAccess ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataWriteAccess(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -561,8 +561,8 @@ describe("RealityCaptureService reality data API calls", function () { }, }); const result = await service.getRealityDataList(); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.false; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(false); expect(result.value!.realityData).to.have.lengthOf(2); }); @@ -610,27 +610,27 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityDataList(); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataList ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataList(); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("moveRealityData should call axios.patch on the move endpoint", async () => { axiosPatchStub.resolves({ status: 200, data: {} }); const result = await service.moveRealityData(rdId, iTwinId); - expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); expect(axiosPatchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/move` ); expect(axiosPatchStub.firstCall.args[1]).to.deep.equal({ iTwinId }); - expect(result.isError()).to.be.false; - expect(result.value).to.be.null; + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); }); it("moveRealityData 404 error", async () => { @@ -638,25 +638,25 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } }); const result = await service.moveRealityData(rdId, iTwinId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("moveRealityData ill formed error", async () => { axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.moveRealityData(rdId, iTwinId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataITwins should return a Response", async () => { axiosGetStub.resolves({ status: 200, data: { iTwins: ["itwin-001", "itwin-002"] } }); const result = await service.getRealityDataITwins(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins` ); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value).to.deep.equal(["itwin-001", "itwin-002"]); }); @@ -665,14 +665,14 @@ describe("RealityCaptureService reality data API calls", function () { response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } }); const result = await service.getRealityDataITwins(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("getRealityDataITwins ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataITwins(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); diff --git a/typescript/packages/reality-capture/src/tests/service/response.test.ts b/typescript/packages/reality-capture/src/tests/service/response.test.ts index d0c0e5d3..b73f8f22 100644 --- a/typescript/packages/reality-capture/src/tests/service/response.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/response.test.ts @@ -7,13 +7,13 @@ describe("Response", () => { const res = new Response(200); expect(res.status_code).to.equal(200); - expect(res.error).to.be.null; - expect(res.value).to.be.null; + expect(res.error).to.equal(null); + expect(res.value).to.equal(null); expect(res.getResponseStatusCode()).to.equal(200); - expect(res.isError()).to.be.false; + expect(res.isError()).to.equal(false); expect(res.status_code).to.equal(200); - expect(res.error).to.be.null; - expect(res.value).to.be.null; + expect(res.error).to.equal(null); + expect(res.value).to.equal(null); }); it("should create a Response with status_code and error", () => { @@ -22,24 +22,24 @@ describe("Response", () => { expect(res.status_code).to.equal(400); expect(res.error).to.deep.equal(error); - expect(res.value).to.be.null; + expect(res.value).to.equal(null); expect(res.getResponseStatusCode()).to.equal(400); - expect(res.isError()).to.be.true; + expect(res.isError()).to.equal(true); expect(res.status_code).to.equal(400); expect(res.error).to.deep.equal(error); - expect(res.value).to.be.null; + expect(res.value).to.equal(null); }); it("should create a Response with status_code and value", () => { const res = new Response(201, null, "created"); expect(res.status_code).to.equal(201); - expect(res.error).to.be.null; + expect(res.error).to.equal(null); expect(res.value).to.equal("created"); expect(res.getResponseStatusCode()).to.equal(201); - expect(res.isError()).to.be.false; + expect(res.isError()).to.equal(false); expect(res.status_code).to.equal(201); - expect(res.error).to.be.null; + expect(res.error).to.equal(null); expect(res.value).to.equal("created"); }); @@ -47,8 +47,8 @@ describe("Response", () => { const res = new Response(204, undefined, undefined); expect(res.status_code).to.equal(204); - expect(res.error).to.be.null; - expect(res.value).to.be.null; - expect(res.isError()).to.be.false; + expect(res.error).to.equal(null); + expect(res.value).to.equal(null); + expect(res.isError()).to.equal(false); }); -}); \ No newline at end of file +}); diff --git a/typescript/packages/reality-capture/src/tests/service/service.test.ts b/typescript/packages/reality-capture/src/tests/service/service.test.ts index c3a4a566..aa84ac2c 100644 --- a/typescript/packages/reality-capture/src/tests/service/service.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/service.test.ts @@ -110,9 +110,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getBucket(iTwinId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.bucket.iTwinId).to.equal(iTwinId); }); @@ -129,9 +129,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getBucket(iTwinId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -145,9 +145,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getBucket(iTwinId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -172,14 +172,14 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getServiceFiles(); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.files).to.have.lengthOf(2); - expect(result.value!.files[0].deprecated).to.be.undefined; + expect(result.value!.files[0].deprecated).to.equal(undefined); expect(result.value!.files[0].description).to.equal("preset file"); - expect(result.value!.files[1].description).to.be.undefined; - expect(result.value!.files[1].deprecated).to.be.true; + expect(result.value!.files[1].description).to.equal(undefined); + expect(result.value!.files[1].deprecated).to.equal(true); }); it("getServiceFiles 401 error", async () => { @@ -195,9 +195,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getServiceFiles(); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -211,9 +211,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getServiceFiles(); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -241,9 +241,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getDetectors(); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.detectors).to.have.lengthOf(2); }); @@ -256,11 +256,11 @@ describe("RealityCaptureService API calls tests", function () { }); const detectorsFilter = "exports in ('Polygons', 'Lines') and labels in ('crack')"; const result = await service.getDetectors(detectorsFilter); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors"); expect(axiosGetStub.firstCall.args[1].params).to.deep.equal({ "$filter": detectorsFilter }); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); }); it("getDetectors 401 error", async () => { @@ -276,9 +276,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getDetectors(); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -292,9 +292,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getDetectors(); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -358,10 +358,10 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getDetector("@bentley/mydetector"); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.detector.name).to.equal("@bentley/mydetector"); }); @@ -378,9 +378,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getDetector("mydetector"); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -394,9 +394,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getDetector("mydetector"); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -422,10 +422,10 @@ describe("RealityCaptureService API calls tests", function () { documentationUrl: "https://www.bentley.com" }; const result = await service.createDetector(detectorCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors"); expect(axiosPostStub.firstCall.args[1]).to.deep.equal(detectorCreate); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.detector.name).to.equal("@bentley/new-detector"); }); @@ -449,10 +449,10 @@ describe("RealityCaptureService API calls tests", function () { documentationUrl: "https://www.bentley.com/docs" }; const result = await service.updateDetector("@bentley/mydetector", detectorUpdate); - expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); expect(axiosPatchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(detectorUpdate); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.detector.displayName).to.equal("Updated detector"); }); @@ -462,10 +462,10 @@ describe("RealityCaptureService API calls tests", function () { data: {} }); const result = await service.deleteDetector("@bentley/mydetector"); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(axiosDeleteStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); - expect(result.isError()).to.be.false; - expect(result.value).to.be.null; + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); }); it("createDetectorVersion should call axios.post with the version payload", async () => { @@ -481,11 +481,11 @@ describe("RealityCaptureService API calls tests", function () { } }; const result = await service.createDetectorVersion("@bentley/mydetector", versionCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions"); expect(axiosPostStub.firstCall.args[1]).to.deep.equal(versionCreate); - expect(result.isError()).to.be.false; - expect(result.value).to.be.null; + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); }); it("deleteDetectorVersion should call axios.delete with encoded detector and version names", async () => { @@ -494,9 +494,9 @@ describe("RealityCaptureService API calls tests", function () { data: {} }); const result = await service.deleteDetectorVersion("@bentley/mydetector", "1.0-beta/1"); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(axiosDeleteStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0-beta%2F1"); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); }); it("publishDetectorVersion should call axios.post on the publish endpoint", async () => { @@ -505,9 +505,9 @@ describe("RealityCaptureService API calls tests", function () { data: {} }); const result = await service.publishDetectorVersion("@bentley/mydetector", "1.0"); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/publish"); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); }); it("unpublishDetectorVersion should call axios.post on the unpublish endpoint", async () => { @@ -516,9 +516,9 @@ describe("RealityCaptureService API calls tests", function () { data: {} }); const result = await service.unpublishDetectorVersion("@bentley/mydetector", "1.0"); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/unpublish"); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); }); it("completeDetectorVersionUpload should call axios.post on the complete endpoint", async () => { @@ -527,9 +527,9 @@ describe("RealityCaptureService API calls tests", function () { data: {} }); const result = await service.completeDetectorVersionUpload("@bentley/mydetector", "1.0"); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/complete"); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); }); //estimateCost tests @@ -546,9 +546,9 @@ describe("RealityCaptureService API calls tests", function () { }); const costCreate: CostEstimationCreate = { type: JobType.CALIBRATION } as any; const result = await service.estimateCost(costCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.estimatedUnits).to.equal(8); }); @@ -566,9 +566,9 @@ describe("RealityCaptureService API calls tests", function () { }); const costCreate: CostEstimationCreate = { type: JobType.CALIBRATION } as any; const result = await service.estimateCost(costCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -583,9 +583,9 @@ describe("RealityCaptureService API calls tests", function () { }); const costCreate: CostEstimationCreate = { type: JobType.CALIBRATION } as any; const result = await service.estimateCost(costCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -619,9 +619,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.cancelJob("jobId", Service.MODELING); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.state).to.equal("Terminating"); }); @@ -638,9 +638,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.cancelJob("jobId", Service.MODELING); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -654,9 +654,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.cancelJob("jobId", Service.MODELING); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -672,9 +672,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJobProgress("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.percentage).to.equal(5); }); @@ -691,9 +691,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJobProgress("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -707,9 +707,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJobProgress("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -730,9 +730,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJobMessages("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.errors).to.have.lengthOf(1); expect(result.value!.errors[0].code).to.equal("InputData_Invalid"); }); @@ -750,9 +750,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJobMessages("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -766,9 +766,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJobMessages("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -799,9 +799,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJob("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.state).to.equal("Active"); expect(result.value!.id).to.equal("jobId"); }); @@ -819,9 +819,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJob("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -835,9 +835,9 @@ describe("RealityCaptureService API calls tests", function () { } }); const result = await service.getJob("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -871,9 +871,9 @@ describe("RealityCaptureService API calls tests", function () { }); const jobCreate: JobCreate = { type: JobType.RECONSTRUCTION } as any; const result = await service.submitJob(jobCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.type).to.equal(JobType.RECONSTRUCTION); }); @@ -891,9 +891,9 @@ describe("RealityCaptureService API calls tests", function () { }); const jobCreate: JobCreate = { type: JobType.RECONSTRUCTION } as any; const result = await service.submitJob(jobCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -908,9 +908,9 @@ describe("RealityCaptureService API calls tests", function () { }); const jobCreate: JobCreate = { type: JobType.RECONSTRUCTION } as any; const result = await service.submitJob(jobCreate); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -981,12 +981,12 @@ describe("RealityCaptureService API calls tests", function () { }, }); const result = await service.getJobs(Service.MODELING, "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[1].params).to.deep.include({ $filter: "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a", }); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.jobs).to.have.lengthOf(2); expect(result.value!.jobs[0].id).to.equal( "2e8b5984-15b1-45d5-8175-572583d8c3c8" @@ -1010,9 +1010,9 @@ describe("RealityCaptureService API calls tests", function () { }, }); const result = await service.getJobs(Service.MODELING, "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); @@ -1026,9 +1026,9 @@ describe("RealityCaptureService API calls tests", function () { }, }); const result = await service.getJobs(Service.MODELING, "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -1052,10 +1052,10 @@ describe("RealityCaptureService API calls tests", function () { it("getRealityData should return a Response on success", async () => { axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); const result = await service.getRealityData(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(result).to.be.instanceOf(Response); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); @@ -1072,15 +1072,15 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityData(rdId); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityData ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityData(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -1088,10 +1088,10 @@ describe("RealityCaptureService API calls tests", function () { axiosPostStub.resolves({ status: 201, data: { realityData: sampleRealityData } }); const create = { iTwinId, displayName: "Test RD", type: Type.CC_IMAGE_COLLECTION }; const result = await service.createRealityData(create); - expect(axiosPostStub.calledOnce).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); expect(axiosPostStub.firstCall.args[1]).to.deep.equal(create); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); @@ -1100,15 +1100,15 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 422, data: { error: { code: "InvalidRealityData", message: "Invalid payload." } } } }); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); - expect(axiosPostStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosPostStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("InvalidRealityData"); }); it("createRealityData ill formed error", async () => { axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -1117,10 +1117,10 @@ describe("RealityCaptureService API calls tests", function () { axiosPatchStub.resolves({ status: 200, data: { realityData: updated } }); const update = { displayName: "Updated RD" }; const result = await service.updateRealityData(update, rdId); - expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); expect(axiosPatchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(update); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.displayName).to.equal("Updated RD"); }); @@ -1129,25 +1129,25 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.updateRealityData({ displayName: "New" }, rdId); - expect(axiosPatchStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("updateRealityData ill formed error", async () => { axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.updateRealityData({}, rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("deleteRealityData should call axios.delete and return a Response", async () => { axiosDeleteStub.resolves({ status: 204, data: {} }); const result = await service.deleteRealityData(rdId); - expect(axiosDeleteStub.calledOnce).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); expect(axiosDeleteStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); - expect(result.isError()).to.be.false; - expect(result.value).to.be.null; + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); }); it("deleteRealityData 404 error", async () => { @@ -1155,26 +1155,26 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } }); const result = await service.deleteRealityData(rdId); - expect(axiosDeleteStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("deleteRealityData ill formed error", async () => { axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.deleteRealityData(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataReadAccess should return a Response", async () => { axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); const result = await service.getRealityDataReadAccess(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess` ); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.access).to.equal(Access.READ); expect(result.value!._links.containerUrl.href).to.equal("https://blob.core.windows.net/container?sas=token"); }); @@ -1194,15 +1194,15 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityDataReadAccess(rdId); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataReadAccess ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataReadAccess(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -1210,11 +1210,11 @@ describe("RealityCaptureService API calls tests", function () { const writeDetails = { ...sampleContainerDetails, access: "Write" }; axiosGetStub.resolves({ status: 200, data: writeDetails }); const result = await service.getRealityDataWriteAccess(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess` ); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value!.access).to.equal(Access.WRITE); }); @@ -1233,15 +1233,15 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityDataWriteAccess(rdId); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataWriteAccess ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataWriteAccess(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); @@ -1257,8 +1257,8 @@ describe("RealityCaptureService API calls tests", function () { }, }); const result = await service.getRealityDataList(); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.false; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(false); expect(result.value!.realityData).to.have.lengthOf(2); }); @@ -1304,28 +1304,28 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } }); const result = await service.getRealityDataList(); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataList ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataList(); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("moveRealityData should call axios.patch on the move endpoint", async () => { axiosPatchStub.resolves({ status: 200, data: {} }); const result = await service.moveRealityData(rdId, iTwinId); - expect(axiosPatchStub.calledOnce).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); expect(axiosPatchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/move` ); expect(axiosPatchStub.firstCall.args[1]).to.deep.equal({ iTwinId }); - expect(result.isError()).to.be.false; - expect(result.value).to.be.null; + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); }); it("moveRealityData 404 error", async () => { @@ -1333,26 +1333,26 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } }); const result = await service.moveRealityData(rdId, iTwinId); - expect(axiosPatchStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosPatchStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("moveRealityData ill formed error", async () => { axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.moveRealityData(rdId, iTwinId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataITwins should return a Response", async () => { axiosGetStub.resolves({ status: 200, data: { iTwins: ["itwin-001", "itwin-002"] } }); const result = await service.getRealityDataITwins(rdId); - expect(axiosGetStub.calledOnce).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); expect(axiosGetStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins` ); - expect(result.isError()).to.be.false; + expect(result.isError()).to.equal(false); expect(result.value).to.deep.equal(["itwin-001", "itwin-002"]); }); @@ -1361,15 +1361,15 @@ describe("RealityCaptureService API calls tests", function () { response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } }); const result = await service.getRealityDataITwins(rdId); - expect(axiosGetStub.calledOnce).to.be.true; - expect(result.isError()).to.be.true; + expect(axiosGetStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("getRealityDataITwins ill formed error", async () => { axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); const result = await service.getRealityDataITwins(rdId); - expect(result.isError()).to.be.true; + expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); }); diff --git a/typescript/packages/reality-capture/src/tests/specifications/test_production.test.ts b/typescript/packages/reality-capture/src/tests/specifications/test_production.test.ts index cbc17310..873f21ce 100644 --- a/typescript/packages/reality-capture/src/tests/specifications/test_production.test.ts +++ b/typescript/packages/reality-capture/src/tests/specifications/test_production.test.ts @@ -6,16 +6,7 @@ import { ThermalUnit, LODScope, LODType, - CesiumCompression, - I3SVersion, - SamplingStrategy, - LasCompression, - ProjectionMode, - OrthoFormat, - DSMFormat, - OrthoColorSource, ProductionInputsSchema, - OptionsLASSchema, OptionsOBJSchema, ExportCreateSchema, ProductionOutputsSchema, From a9024e3c6f89b96814ca5f1b0e0add238039c99c Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Thu, 2 Jul 2026 18:06:07 +0200 Subject: [PATCH 04/11] Add missing unit tests --- .../src/tests/service/service.test.ts | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/typescript/packages/reality-capture/src/tests/service/service.test.ts b/typescript/packages/reality-capture/src/tests/service/service.test.ts index aa84ac2c..37b2b751 100644 --- a/typescript/packages/reality-capture/src/tests/service/service.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/service.test.ts @@ -1372,4 +1372,62 @@ describe("RealityCaptureService API calls tests", function () { expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); + + // associateRealityData tests + it("associateRealityData should call axios.post on the iTwins endpoint", async () => { + axiosPostStub.resolves({ status: 200, data: {} }); + const result = await service.associateRealityData(iTwinId, rdId); + expect(axiosPostStub.calledOnce).to.equal(true); + expect(axiosPostStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins/${iTwinId}` + ); + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); + }); + + it("associateRealityData 404 error", async () => { + axiosPostStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.associateRealityData(iTwinId, rdId); + expect(axiosPostStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("associateRealityData ill formed error", async () => { + axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.associateRealityData(iTwinId, rdId); + expect(result.isError()).to.equal(true); + expect(result.error!.error.code).to.equal("UnknownError"); + }); + + // dissociateRealityData tests + it("dissociateRealityData should call axios.delete on the iTwins endpoint", async () => { + axiosDeleteStub.resolves({ status: 204, data: {} }); + const result = await service.dissociateRealityData(iTwinId, rdId); + expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(axiosDeleteStub.firstCall.args[0]).to.equal( + `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins/${iTwinId}` + ); + expect(result.isError()).to.equal(false); + expect(result.value).to.equal(null); + }); + + it("dissociateRealityData 404 error", async () => { + axiosDeleteStub.rejects({ + response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } + }); + const result = await service.dissociateRealityData(iTwinId, rdId); + expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(result.isError()).to.equal(true); + expect(result.error!.error.code).to.equal("RealityDataNotFound"); + }); + + it("dissociateRealityData ill formed error", async () => { + axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + const result = await service.dissociateRealityData(iTwinId, rdId); + expect(result.isError()).to.equal(true); + expect(result.error!.error.code).to.equal("UnknownError"); + }); }); From e3b13dc88c50fa73549b300106532149587c9a69 Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:25:32 +0200 Subject: [PATCH 05/11] Revert changes --- .../publish_reality-data-client-dev.yml | 44 + .../workflows/publish_reality-data-client.yml | 44 + .../reality-data-client-build-and-test.yml | 130 + .github/workflows/typescript-ci.yaml | 23 + CONTRIBUTING.md | 1 + README.md | 2 +- template.env | 5 + .../packages/reality-data-client/.gitignore | 6 + .../reality-data-client/CHANGELOG.json | 155 + .../packages/reality-data-client/CHANGELOG.md | 97 + .../packages/reality-data-client/LICENSE.md | 9 + .../packages/reality-data-client/README.md | 140 + .../beachball.config.dev.js | 14 + .../reality-data-client/beachball.config.js | 20 + .../packages/reality-data-client/certa.json | 24 + .../reality-data-client/eslint.config.js | 18 + .../packages/reality-data-client/package.json | 78 + .../reality-data-client/pnpm-lock.yaml | 6138 +++++++++++++++++ .../reality-data-client/pnpm-workspace.yaml | 6 + .../reality-data-client/src/Projects.ts | 24 + .../reality-data-client/src/RealityData.ts | 242 + .../src/RealityDataClient.ts | 805 +++ .../reality-data-client/src/RequestOptions.ts | 30 + .../reality-data-client/src/helper/Angle.ts | 36 + .../src/reality-data-client.ts | 16 + .../src/test/TestConfig.ts | 18 + .../integration/RealityDataClient.test.ts | 1415 ++++ .../src/test/utils/webpack.config.js | 105 + .../reality-data-client/tsconfig.json | 10 + 29 files changed, 9654 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/publish_reality-data-client-dev.yml create mode 100644 .github/workflows/publish_reality-data-client.yml create mode 100644 .github/workflows/reality-data-client-build-and-test.yml create mode 100644 typescript/packages/reality-data-client/.gitignore create mode 100644 typescript/packages/reality-data-client/CHANGELOG.json create mode 100644 typescript/packages/reality-data-client/CHANGELOG.md create mode 100644 typescript/packages/reality-data-client/LICENSE.md create mode 100644 typescript/packages/reality-data-client/README.md create mode 100644 typescript/packages/reality-data-client/beachball.config.dev.js create mode 100644 typescript/packages/reality-data-client/beachball.config.js create mode 100644 typescript/packages/reality-data-client/certa.json create mode 100644 typescript/packages/reality-data-client/eslint.config.js create mode 100644 typescript/packages/reality-data-client/package.json create mode 100644 typescript/packages/reality-data-client/pnpm-lock.yaml create mode 100644 typescript/packages/reality-data-client/pnpm-workspace.yaml create mode 100644 typescript/packages/reality-data-client/src/Projects.ts create mode 100644 typescript/packages/reality-data-client/src/RealityData.ts create mode 100644 typescript/packages/reality-data-client/src/RealityDataClient.ts create mode 100644 typescript/packages/reality-data-client/src/RequestOptions.ts create mode 100644 typescript/packages/reality-data-client/src/helper/Angle.ts create mode 100644 typescript/packages/reality-data-client/src/reality-data-client.ts create mode 100644 typescript/packages/reality-data-client/src/test/TestConfig.ts create mode 100644 typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts create mode 100644 typescript/packages/reality-data-client/src/test/utils/webpack.config.js create mode 100644 typescript/packages/reality-data-client/tsconfig.json diff --git a/.github/workflows/publish_reality-data-client-dev.yml b/.github/workflows/publish_reality-data-client-dev.yml new file mode 100644 index 00000000..4ae2d8bf --- /dev/null +++ b/.github/workflows/publish_reality-data-client-dev.yml @@ -0,0 +1,44 @@ +name: (DevReleaseV1) Publish reality-data-client dev + +on: workflow_dispatch + +jobs: + publish: + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: [windows-latest] + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + token: ${{ secrets.IMJS_ADMIN_GH_TOKEN }} + lfs: true + + - name: Use Node.js 22 + uses: actions/setup-node@v6 + with: + node-version: 22.14.0 + registry-url: https://registry.npmjs.org/ + + - name: Install pnpm + uses: pnpm/action-setup@v6 + with: + version: 9 + + - name: Install dependencies + working-directory: ./typescript/packages/reality-data-client + run: pnpm install --frozen-lockfile=true + + - name: Build + working-directory: ./typescript/packages/reality-data-client + run: pnpm build + + - name: Publish packages + working-directory: ./typescript/packages/reality-data-client + run: | + git config --local user.email imodeljs-admin@users.noreply.github.com + git config --local user.name imodeljs-admin + pnpm publish-packages-dev -y --branch origin/${{ github.ref_name }} --message "Version bump [skip actions]" + env: + NODE_AUTH_TOKEN: ${{ secrets.NPMJS_PUBLISH_ITWIN }} diff --git a/.github/workflows/publish_reality-data-client.yml b/.github/workflows/publish_reality-data-client.yml new file mode 100644 index 00000000..9b37e522 --- /dev/null +++ b/.github/workflows/publish_reality-data-client.yml @@ -0,0 +1,44 @@ +name: (ReleaseV1) Publish reality-data-client + +on: workflow_dispatch + +jobs: + publish: + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: [windows-latest] + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + token: ${{ secrets.IMJS_ADMIN_GH_TOKEN }} + lfs: true + + - name: Use Node.js 22 + uses: actions/setup-node@v6 + with: + node-version: 22.14.0 + registry-url: https://registry.npmjs.org/ + + - name: Install pnpm + uses: pnpm/action-setup@v6 + with: + version: 9 + + - name: Install dependencies + working-directory: ./typescript/packages/reality-data-client + run: pnpm install --frozen-lockfile=true + + - name: Build + working-directory: ./typescript/packages/reality-data-client + run: pnpm build + + - name: Publish packages + working-directory: ./typescript/packages/reality-data-client + run: | + git config --local user.email imodeljs-admin@users.noreply.github.com + git config --local user.name imodeljs-admin + pnpm publish-packages --new -y --branch origin/${{ github.ref_name }} --message "Version bump [skip actions]" + env: + NODE_AUTH_TOKEN: ${{ secrets.NPMJS_PUBLISH_ITWIN }} diff --git a/.github/workflows/reality-data-client-build-and-test.yml b/.github/workflows/reality-data-client-build-and-test.yml new file mode 100644 index 00000000..5ba2185b --- /dev/null +++ b/.github/workflows/reality-data-client-build-and-test.yml @@ -0,0 +1,130 @@ +name: (RDCBuildTest) Build and test reality-data-client + +on: + workflow_call: + inputs: + node-version: + required: true + type: string + os: + required: true + type: string + secrets: + INTEGRATION_TESTS_PROJECT_ID: + required: true + INTEGRATION_TESTS_CLIENT_ID: + required: true + INTEGRATION_TESTS_SECRET: + required: true + IMJS_OIDC_BROWSER_TEST_CLIENT_ID: + required: true + IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: + required: true + IMJS_OIDC_BROWSER_TEST_SCOPES: + required: true + IMJS_TEST_REGULAR_USER_NAME: + required: true + IMJS_TEST_REGULAR_USER_PASSWORD: + required: true + IMJS_TEST_MANAGER_USER_NAME: + required: true + IMJS_TEST_MANAGER_USER_PASSWORD: + required: true + +jobs: + build_and_test_sdk: + runs-on: ${{ inputs.os }} + + steps: + - name: Checkout github repo (+ download lfs dependencies) + uses: actions/checkout@v5 + with: + lfs: true + + - name: Checkout LFS objects + run: git lfs checkout + + - name: Install pnpm + uses: pnpm/action-setup@v6 + with: + version: 9 + + - name: Setup Node.js ${{ inputs.node-version }} + uses: actions/setup-node@v6 + with: + node-version: ${{ inputs.node-version }} + + - name: Install dependencies + working-directory: ./typescript/packages/reality-data-client + env: + PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers-${{ inputs.node-version }} + run: pnpm install --frozen-lockfile=true --ignore-scripts + + - name: Build + working-directory: ./typescript/packages/reality-data-client + run: pnpm build + + - name: EsLint + working-directory: ./typescript/packages/reality-data-client + run: pnpm lint + + # Playwright's browser INSTALL (download + extract) is unreliable on very new Node versions: + # the extractor can hang at the end of the download (a known issue affecting Node >= 24). + # The browser binaries themselves are Node-agnostic, so we install them under Node 22 + # (known-good) and then restore the matrix Node for the actual test run below. + - name: Setup Node.js 22 (for Playwright browser install only) + uses: actions/setup-node@v6 + with: + node-version: 22.x + + # @itwin/oidc-signin-tool (via @playwright/test) and @itwin/certa (via playwright) both now + # resolve to Playwright 1.56.1 -> chromium build 1194 (incl. chromium_headless_shell). We + # resolve each tool's REAL playwright CLI via Node module resolution (starting from the + # package that uses it) and run that exact binary, so this stays correct regardless of pnpm's + # layout. `npx playwright` is avoided because it runs whichever `playwright` bin happens to be + # linked, not necessarily the one a given consumer depends on. + - name: Install Chromium for Playwright + working-directory: ./typescript/packages/reality-data-client + shell: bash + env: + PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers-${{ inputs.node-version }} + run: | + set -e + install_chromium() { + node -e ' + const path = require("path"); + const { execFileSync } = require("child_process"); + const consumer = process.argv[1]; + const pkg = process.argv[2]; + const pj = require.resolve(pkg + "/package.json", { paths: [require.resolve(consumer + "/package.json")] }); + const cli = path.join(path.dirname(pj), require(pj).bin.playwright); + console.log("Installing chromium via " + pkg + " (" + require(pj).version + ") resolved from " + consumer); + execFileSync(process.execPath, [cli, "install", "chromium"], { stdio: "inherit" }); + ' "$1" "$2" + } + install_chromium @itwin/oidc-signin-tool @playwright/test + install_chromium @itwin/certa playwright + + - name: Restore Node.js ${{ inputs.node-version }} + uses: actions/setup-node@v6 + with: + node-version: ${{ inputs.node-version }} + + - name: Run SDK Integration Tests + working-directory: ./typescript/packages/reality-data-client + env: + PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.playwright-browsers-${{ inputs.node-version }} + # Needed on Windows: oidc-signin-tool only adds --no-sandbox on Linux; --disable-gpu prevents Chromium from hanging on Windows Server runners. + # Note: the env var name has a typo in the tool source ("ODIC" instead of "OIDC") — use it as-is. + ODIC_SIGNIN_TOOL_EXTRA_LAUNCH_OPTS: ${{ runner.os == 'Windows' && '{"args":["--disable-gpu"]}' || '' }} + IMJS_INTEGRATION_TESTS_PROJECT_ID: ${{ secrets.INTEGRATION_TESTS_PROJECT_ID }} + IMJS_INTEGRATION_TESTS_CLIENT_ID: ${{ secrets.INTEGRATION_TESTS_CLIENT_ID }} + IMJS_INTEGRATION_TESTS_SECRET: ${{ secrets.INTEGRATION_TESTS_SECRET }} + IMJS_OIDC_BROWSER_TEST_CLIENT_ID: ${{ secrets.IMJS_OIDC_BROWSER_TEST_CLIENT_ID }} + IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: ${{ vars.IMJS_OIDC_BROWSER_TEST_REDIRECT_URI }} + IMJS_OIDC_BROWSER_TEST_SCOPES: ${{ vars.IMJS_OIDC_BROWSER_TEST_SCOPES }} + IMJS_TEST_REGULAR_USER_NAME: ${{ vars.IMJS_TEST_REGULAR_USER_NAME }} + IMJS_TEST_REGULAR_USER_PASSWORD: ${{ secrets.IMJS_TEST_REGULAR_USER_PASSWORD }} + IMJS_TEST_MANAGER_USER_NAME: ${{ vars.IMJS_TEST_MANAGER_USER_NAME }} + IMJS_TEST_MANAGER_USER_PASSWORD: ${{ secrets.IMJS_TEST_MANAGER_USER_PASSWORD }} + run: pnpm test:integration diff --git a/.github/workflows/typescript-ci.yaml b/.github/workflows/typescript-ci.yaml index 967a1807..645ab3e9 100644 --- a/.github/workflows/typescript-ci.yaml +++ b/.github/workflows/typescript-ci.yaml @@ -23,3 +23,26 @@ jobs: with: node-version: ${{ matrix.node-version }} os: ${{ matrix.os }} + + build_and_test_reality_data_client: + strategy: + matrix: + node-version: [22.x, 24.x, 26.x] + os: [windows-latest, ubuntu-latest, macos-latest] + fail-fast: false + + uses: ./.github/workflows/reality-data-client-build-and-test.yml + with: + node-version: ${{ matrix.node-version }} + os: ${{ matrix.os }} + secrets: + INTEGRATION_TESTS_PROJECT_ID: ${{ secrets.INTEGRATION_TESTS_PROJECT_ID }} + INTEGRATION_TESTS_CLIENT_ID: ${{ secrets.INTEGRATION_TESTS_CLIENT_ID }} + INTEGRATION_TESTS_SECRET: ${{ secrets.INTEGRATION_TESTS_SECRET }} + IMJS_OIDC_BROWSER_TEST_CLIENT_ID: ${{ secrets.IMJS_OIDC_BROWSER_TEST_CLIENT_ID }} + IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: ${{ secrets.IMJS_OIDC_BROWSER_TEST_REDIRECT_URI }} + IMJS_OIDC_BROWSER_TEST_SCOPES: ${{ secrets.IMJS_OIDC_BROWSER_TEST_SCOPES }} + IMJS_TEST_REGULAR_USER_NAME: ${{ secrets.IMJS_TEST_REGULAR_USER_NAME }} + IMJS_TEST_REGULAR_USER_PASSWORD: ${{ secrets.IMJS_TEST_REGULAR_USER_PASSWORD }} + IMJS_TEST_MANAGER_USER_NAME: ${{ secrets.IMJS_TEST_MANAGER_USER_NAME }} + IMJS_TEST_MANAGER_USER_PASSWORD: ${{ secrets.IMJS_TEST_MANAGER_USER_PASSWORD }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 38fba7e0..3759dad0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,5 +71,6 @@ Example commands below to install, clean, build and test : - `pnpm clean` - `pnpm build` - `pnpm lint` +- `pnpm integration-tests` - `beachball change` to generate a changelog entry. - We use [beachball](https://github.com/microsoft/beachball) to manage versioning and changelogs. diff --git a/README.md b/README.md index 1c9333de..c629c71f 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Copyright © Bentley Systems, Incorporated. All rights reserved. See ## About this Repository -This repository contains Reality Capture SDK for Reality Modeling, Reality Analysis, Reality Conversion and Reality Management services. It provides classes, functions and examples to create reality data, upload local data to Reality Management, run Analysis/Conversion/Modeling jobs and download results. +This repository contains Reality Capture SDKs for Reality Modeling, Reality Analysis, Reality Conversion and Reality Management services. It provides classes, functions and examples to create reality data, upload local data to Reality Management, run Analysis/Conversion/Modeling jobs and download results. - [Reality Capture](./typescript/packages/reality-capture/README.md) diff --git a/template.env b/template.env index fd3a4df9..85598676 100644 --- a/template.env +++ b/template.env @@ -5,3 +5,8 @@ IMJS_UNIT_TESTS_PROJECT_ID= IMJS_UNIT_TESTS_CLIENT_ID= IMJS_UNIT_TESTS_SECRET= + +# For integration tests +IMJS_INTEGRATION_TESTS_PROJECT_ID= +IMJS_INTEGRATION_TESTS_CLIENT_ID= +IMJS_INTEGRATION_TESTS_SECRET= \ No newline at end of file diff --git a/typescript/packages/reality-data-client/.gitignore b/typescript/packages/reality-data-client/.gitignore new file mode 100644 index 00000000..740f05fb --- /dev/null +++ b/typescript/packages/reality-data-client/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +lib/ +.env* +src/index.ts +.vscode/* +!.vscode/launch.json diff --git a/typescript/packages/reality-data-client/CHANGELOG.json b/typescript/packages/reality-data-client/CHANGELOG.json new file mode 100644 index 00000000..501aa9b7 --- /dev/null +++ b/typescript/packages/reality-data-client/CHANGELOG.json @@ -0,0 +1,155 @@ +{ + "name": "@itwin/reality-data-client", + "entries": [ + { + "date": "Thu, 18 Jun 2026 15:27:31 GMT", + "version": "1.5.1", + "tag": "@itwin/reality-data-client_v1.5.1", + "comments": { + "patch": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-data-client", + "commit": "12c46cd59dcd9109f5bade79c0611f4c4107c764", + "comment": "Update axios" + } + ] + } + }, + { + "date": "Mon, 15 Jun 2026 14:39:48 GMT", + "version": "1.5.0", + "tag": "@itwin/reality-data-client_v1.5.0", + "comments": { + "minor": [ + { + "author": "5690282+cnovel@users.noreply.github.com", + "package": "@itwin/reality-data-client", + "commit": "5e5d4f37ebf10cb5a231a247f2ec34bfed8086f4", + "comment": "Update Reality Data models with latest API additions" + } + ] + } + }, + { + "date": "Thu, 20 Nov 2025 15:18:53 GMT", + "version": "1.4.0", + "tag": "@itwin/reality-data-client_v1.4.0", + "comments": { + "minor": [ + { + "author": "Marc-Andre.Cote@bentley.com", + "package": "@itwin/reality-data-client", + "commit": "fdca85c1e775c2d0bf54d901b764bd53b2c4eabd", + "comment": "Added moveRealityData method and new reality data properties : Crs, Attribution & termsOfUse" + } + ] + } + }, + { + "date": "Tue, 08 Jul 2025 14:00:52 GMT", + "version": "1.3.1", + "tag": "@itwin/reality-data-client_v1.3.1", + "comments": { + "patch": [ + { + "author": "bipin.pachhai@bentley.com", + "package": "@itwin/reality-data-client", + "commit": "26dade53226b941a3fad8261c510762d27c5bf85", + "comment": "Update core dev packages on devDependencies with released versions" + } + ] + } + }, + { + "date": "Thu, 12 Jun 2025 14:09:49 GMT", + "version": "1.3.0", + "tag": "@itwin/reality-data-client_v1.3.0", + "comments": { + "minor": [ + { + "author": "bipin.pachhai@bentley.com", + "package": "@itwin/reality-data-client", + "commit": "f447714f12be7c5782782697990eab6484ea55e6", + "comment": "Add support for iTwin.js Core 5.x" + } + ] + } + }, + { + "date": "Thu, 07 Nov 2024 14:16:10 GMT", + "version": "1.2.2", + "tag": "@itwin/reality-data-client_v1.2.2", + "comments": { + "patch": [ + { + "author": "110406974+dbiguenet@users.noreply.github.com", + "package": "@itwin/reality-data-client", + "commit": "5396b814e5640bf45929cf9bf6e99a1961eb7752", + "comment": "Update typescript version from v4 to v5" + } + ] + } + }, + { + "date": "Wed, 28 Feb 2024 14:48:34 GMT", + "version": "1.2.1", + "tag": "@itwin/reality-data-client_v1.2.1", + "comments": { + "patch": [ + { + "author": "Marc-Andre.Cote@bentley.com", + "package": "@itwin/reality-data-client", + "commit": "1db484be28fee97ae41be1ec197614332443aa95", + "comment": "Updated documentation in RealityData listing query parameters" + } + ] + } + }, + { + "date": "Mon, 26 Feb 2024 20:54:34 GMT", + "version": "1.2.0", + "tag": "@itwin/reality-data-client_v1.2.0", + "comments": { + "minor": [ + { + "author": "Marc-Andre.Cote@bentley.com", + "package": "@itwin/reality-data-client", + "commit": "85cee933611277f38c2c013e986765a8286b4939", + "comment": "Implemented Additional Request Parameters & RealityData Tags" + } + ] + } + }, + { + "date": "Tue, 11 Jul 2023 14:02:19 GMT", + "tag": "@itwin/reality-data-client_v1.1.0", + "version": "1.1.0", + "comments": { + "minor": [ + { + "author": "Marc-Andre.Cote@bentley.com", + "package": "@itwin/reality-data-client", + "commit": "a691cd835d2a447a2c6ad2187ba48818469d0b30", + "comment": "- Ported iTwin/reality-data-client to [Reality Management API](https://developer.bentley.com/apis/reality-management/) following deprecation of [Reality Data API](https://developer.bentley.com/apis/reality-data/) \n- No breaking changes should occur.\n- Interfaces with iTwin/core-common should still be respected\n- `getRealityDataProjects` method is now deprecated\n- `getRealityDataITwins` added to replace deprecated `getRealityDataProjects` method\n- `accessControl` property is now deprecated as it is not in Reality Management API. Still defined in `ITwinRealityData` object but does not do anything." + } + ] + } + }, + { + "date": "Wed, 31 May 2023 21:24:48 GMT", + "tag": "@itwin/reality-data-client_v1.0.0", + "version": "1.0.0", + "comments": { + "major": [ + { + "author": "aruniverse@users.noreply.github.com", + "package": "@itwin/reality-data-client", + "commit": "56c052e89c57a3862caf1c38dedef018792fee17", + "comment": "1.0 release of iTwin/reality-data-client" + } + ] + } + } + ] +} diff --git a/typescript/packages/reality-data-client/CHANGELOG.md b/typescript/packages/reality-data-client/CHANGELOG.md new file mode 100644 index 00000000..e793a6ee --- /dev/null +++ b/typescript/packages/reality-data-client/CHANGELOG.md @@ -0,0 +1,97 @@ +# Change Log - @itwin/reality-data-client + + + + + +## 1.5.1 + +Thu, 18 Jun 2026 15:27:31 GMT + +### Patches + +- Update axios (5690282+cnovel@users.noreply.github.com) + +## 1.5.0 + +Mon, 15 Jun 2026 14:39:48 GMT + +### Minor changes + +- Update Reality Data models with latest API additions (5690282+cnovel@users.noreply.github.com) + +## 1.4.0 + +Thu, 20 Nov 2025 15:18:53 GMT + +### Minor changes + +- Added moveRealityData method and new reality data properties : Crs, Attribution & termsOfUse (Marc-Andre.Cote@bentley.com) + +## 1.3.1 + +Tue, 08 Jul 2025 14:00:52 GMT + +### Patches + +- Update core dev packages on devDependencies with released versions (bipin.pachhai@bentley.com) + +## 1.3.0 + +Thu, 12 Jun 2025 14:09:49 GMT + +### Minor changes + +- Add support for iTwin.js Core 5.x (bipin.pachhai@bentley.com) + +## 1.2.2 + +Thu, 07 Nov 2024 14:16:10 GMT + +### Patches + +- Update typescript version from v4 to v5 (110406974+dbiguenet@users.noreply.github.com) + +## 1.2.1 + +Wed, 28 Feb 2024 14:48:34 GMT + +### Patches + +- Updated documentation in RealityData listing query parameters (Marc-Andre.Cote@bentley.com) + +## 1.2.0 + +Mon, 26 Feb 2024 20:54:34 GMT + +### Minor changes + +- Implemented Additional Request Parameters & RealityData Tags (Marc-Andre.Cote@bentley.com) + +## 1.1.0 + +Tue, 11 Jul 2023 14:02:19 GMT + +### Minor changes + +- - Ported iTwin/reality-data-client to [Reality Management API](https://developer.bentley.com/apis/reality-management/) following deprecation of [Reality Data API](https://developer.bentley.com/apis/reality-data/) +- No breaking changes should occur. +- Interfaces with iTwin/core-common should still be respected +- `getRealityDataProjects` method is now deprecated +- `getRealityDataITwins` added to replace deprecated `getRealityDataProjects` method +- `accessControl` property is now deprecated as it is not in Reality Management API. Still defined in `ITwinRealityData` object but does not do anything. (Marc-Andre.Cote@bentley.com) + +## 1.0.0 + +Wed, 31 May 2023 21:24:48 GMT + +### Major changes + +- 1.0 release of iTwin/reality-data-client (aruniverse@users.noreply.github.com) + +## 0.9.0 (2022-06-07) + +### - Added new option `authorizationClient` to `RealityDataClientOptions` + +Defines Authorization client to use to get access token to Context Share API (authority: ) +When defined it will ignore accessToken from API parameters and will get an access token from this client. diff --git a/typescript/packages/reality-data-client/LICENSE.md b/typescript/packages/reality-data-client/LICENSE.md new file mode 100644 index 00000000..cb5ce049 --- /dev/null +++ b/typescript/packages/reality-data-client/LICENSE.md @@ -0,0 +1,9 @@ +# MIT License + +Copyright © 2017-2023 Bentley Systems, Incorporated. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/typescript/packages/reality-data-client/README.md b/typescript/packages/reality-data-client/README.md new file mode 100644 index 00000000..d6da16bb --- /dev/null +++ b/typescript/packages/reality-data-client/README.md @@ -0,0 +1,140 @@ +# @iTwin/reality-data-client + +Copyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice. + +## Description + +The __@iTwin/reality-data-client__ package contains client wrappers for sending requests to the Reality Management API, part of the iTwin platform. + +You must use version `v1.1.0` or greater, as earlier versions uses the deprecated Reality Data API. + +[iTwin.js](http://www.itwinjs.org) is an open source platform for creating, querying, modifying, and displaying Infrastructure Digital Twins. To learn more about the iTwin Platform and its APIs, visit the [iTwin developer portal](https://developer.bentley.com/). + +## Documentation + +Visit the [iTwin developer portal](https://developer.bentley.com/apis/reality-management/) for more information and documentation about the Reality Management API. + +## Requirements + +A registered application in the iTwin Platform is needed for using the Reality Data Client. Documentation for registering an application can be found [here.](https://developer.bentley.com/tutorials/register-and-modify-application/) Make sure that your application has the `itwin-platform` scope enabled. + +To use the Reality Management API you will need to have an access to an iTwin. If you don't have one already, contact one of your Organization Administrators or take some time to go through the following tutorial: Create an [iTwin](https://developer.bentley.com/tutorials/create-and-query-itwins-guide/). + +To build and run the Reality Data Client, you will need [Node.js](https://nodejs.org/en/) v22 (must be greater than 22.14.x). + +## Authorization + +This client uses the `AccessToken` class from __@iTwin/core-bentley__ to represent the authorization token. It may be used as a string. The `AccessToken` may be passed into method parameters whenever called. + +## Key Types and Methods + +### ITwinRealityData + +Implements the `RealityData` interface from __@itwin/core-common__ and represents a single reality data. This class contains properties representing the descriptive data related to a reality data, as well as an access point to the data stored in a blob container. `ITwinRealityData` are bound to an `iTwinId`, which is the identifier of an iTwin. [More information about the iTwin API here.](https://developer.bentley.com/apis/itwins/) + +ITwinRealityData implements a `getBlobUrl()` method that returns the location of the reality data's blob content. This resource is also cached, as to limit the amount of API calls and SAS keys keys to generate. + +### RealityDataAccessClient + +Implements the `RealityDataAccess` interface from __@itwin/core-common__ and serves a client wrapper to the Reality Management API. It contains all the necessary methods to fulfill any workflow related to creating and consuming reality data. Key methods are listed below, and **keep in mind the terms Project and iTwin are used interchangeably.** + +- `getRealityData` : returns the specified reality data with all of its properties +- `getRealityDataUrl` : returns the URL to obtain the Reality Data details. +- `getRealityDatas` : returns all reality data associated with the iTwin. +- `getRealityDataITwins` : Retrieves the list of iTwins associated to the specified realityData. +- `createRealityData` : Creates a RealityData +- `modifyRealityData` : Modifies an existing RealityData +- `deleteRealityData` : Deletes a RealityData +- `associateRealityData` : Associates a RealityData from an iTwin +- `dissociateRealityData` : Dissociates a RealityData from an iTwin + +## Usage example + +The example below demonstrates a workflow where one could create a `RealityData` and upload a `Cesium3DTiles` model to it. + +```ts + +private async realityDataClient_examples(iTwinId: string) { + + var rdaClient = new RealityDataAccessClient(); + let token: string = "Access token value"; + + // Define some data for the reality data to create. + // We want to create a reality data representing a Cesium3DTiles model, so the type of the reality data must be "Cesium3DTiles" + // and the rootDocument must point to the root of the model, in this case "tileset.json". + // Thus, a client interpreting the reality data can find out which file format it handles, and what is the index (or root) of the data (tileset.json). + const realityData = new ITwinRealityData(rdaClient, null, iTwinId); + realityData.displayName = "RealityData Cesium 3DTiles model"; + realityData.dataset = "Test Dataset for iTwinjs"; + realityData.group = "Test group"; + realityData.description = "Reality data created using reality-data-client"; + realityData.rootDocument = "tileset.json"; + realityData.classification = "Model"; + realityData.type = "Cesium3DTiles"; + realityData.acquisition = { + startDateTime: new Date("2021-05-10T09:46:16Z"), + endDateTime: new Date("2021-05-10T12:46:16Z"), + acquirer: "John Doe Surveying using Leico model 123A Point Cloud Scanner", + }; + realityData.authoring = false; + + let realityDataId: string | undefined = undefined; + try { + // Create the reality data + const iTwinRealityData: ITwinRealityData = await rdaClient.createRealityData(token, iTwinId, realityData); + realityDataId = iTwinRealityData.id; + + // Get the reality data + const iTwinRealityData_get: ITwinRealityData = await rdaClient.getRealityData(token, iTwinId, iTwinRealityData.id); + + // Get the blob url to upload to it a Cesium 3DTiles model + const azureBlobUrl: URL = await iTwinRealityData.getBlobUrl(token, "", true); + + // Use Azure SDK's ContainerClient class to upload data to the Azure blob + const containerClient = new ContainerClient(azureBlobUrl.toString()); + + let filePath = "./data/cesium3DTiles/"; + + // The sample 3DTiles model is composed of a root document (tileset.json) and three b3dm files. + // Upload each file to its own blob + let blobName = "tileset.json"; + let blockBlobClient = containerClient.getBlockBlobClient(blobName); + let uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "tileset.json"); + console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); + + blobName = "dragon_high.b3dm"; + blockBlobClient = containerClient.getBlockBlobClient(blobName); + uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "dragon_high.b3dm"); + console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); + + blobName = "dragon_low.b3dm"; + blockBlobClient = containerClient.getBlockBlobClient(blobName); + uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "dragon_low.b3dm"); + console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); + + blobName = "dragon_medium.b3dm"; + blockBlobClient = containerClient.getBlockBlobClient(blobName); + uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "dragon_medium.b3dm"); + console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); + + // This shows how to create a sub-folder in your container, if you ever need to. + blobName = "readme/README.md"; + blockBlobClient = containerClient.getBlockBlobClient(blobName); + uploadBlobResponse = await blockBlobClient.uploadFile(filePath + "readme/README.md"); + console.log(` Uploaded ${blobName} successfully`, uploadBlobResponse.requestId); + + // Delete the reality data that we just created + await rdaClient.deleteRealityData(token, iTwinRealityData.id); + + console.log("Successful requests using reality-data-client !\n"); + + } catch (error: any) { + // Try to clean up created reality data + if (realityDataId !== undefined) { + await rdaClient.deleteRealityData(token, realityDataId); + } + console.log("reality-data-client error: " + error + "\n"); + } + } + +``` diff --git a/typescript/packages/reality-data-client/beachball.config.dev.js b/typescript/packages/reality-data-client/beachball.config.dev.js new file mode 100644 index 00000000..700b7bba --- /dev/null +++ b/typescript/packages/reality-data-client/beachball.config.dev.js @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ +const base = require("./beachball.config.js"); + +/** @type {import("beachball").BeachballConfig } */ +module.exports = { + ...base, + tag: "nightly", + prereleasePrefix: "dev", + generateChangelog: false, + gitTags: false, +}; \ No newline at end of file diff --git a/typescript/packages/reality-data-client/beachball.config.js b/typescript/packages/reality-data-client/beachball.config.js new file mode 100644 index 00000000..946fefcb --- /dev/null +++ b/typescript/packages/reality-data-client/beachball.config.js @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ +/** @type {import("beachball").BeachballConfig } */ +module.exports = { + bumpDeps: false, + access: "public", + tag: "latest", + ignorePatterns: [ + ".nycrc", + ".eslintrc.json", + "tsconfig.*", + ".*ignore", + ".github/**", + ".vscode/**", + "pnpm-lock.yaml", + ], + changehint: "Run 'pnpm change' to generate a change file", + }; \ No newline at end of file diff --git a/typescript/packages/reality-data-client/certa.json b/typescript/packages/reality-data-client/certa.json new file mode 100644 index 00000000..46719abb --- /dev/null +++ b/typescript/packages/reality-data-client/certa.json @@ -0,0 +1,24 @@ +{ + // Comments are allowed here! + "testBundle": "./lib/cjs/test/webpack/bundled-tests.js", + // "instrumentedTestBundle": "./lib/cjs/test/webpack/bundled-tests.instrumented.js", + "backendInitModule": "./node_modules/@itwin/oidc-signin-tool/lib/cjs/certa/certaBackend.js", + "ports": { + "debugging": 5858, + "frontend": 3000, + "frontendDebugging": 9223 + }, + "mochaOptions": { + "timeout": 50000, + "reporter": "node_modules/@itwin/build-tools/mocha-reporter", + "reporterOptions": { + "mochaFile": "lib/test/junit_results.xml" + } + }, + "chromeOptions": { + "args": [ + "--disable-web-security", + "--no-sandbox" + ] + } +} \ No newline at end of file diff --git a/typescript/packages/reality-data-client/eslint.config.js b/typescript/packages/reality-data-client/eslint.config.js new file mode 100644 index 00000000..7aadba13 --- /dev/null +++ b/typescript/packages/reality-data-client/eslint.config.js @@ -0,0 +1,18 @@ +const iTwinPlugin = require("@itwin/eslint-plugin"); + +module.exports = [ + { + files: ["**/*.{ts,tsx}"], + ...iTwinPlugin.configs.iTwinjsRecommendedConfig, + }, + { + files: ["**/*.{ts,tsx}"], + ...iTwinPlugin.configs.jsdocConfig, + }, + { + rules: { + "no-duplicate-imports": "error", + "@typescript-eslint/consistent-type-imports": "error" + } + } + ]; \ No newline at end of file diff --git a/typescript/packages/reality-data-client/package.json b/typescript/packages/reality-data-client/package.json new file mode 100644 index 00000000..a8b38e7c --- /dev/null +++ b/typescript/packages/reality-data-client/package.json @@ -0,0 +1,78 @@ +{ + "name": "@itwin/reality-data-client", + "version": "1.5.1", + "description": "HTTP Client for the iTwin Platform Reality Management APIs", + "main": "lib/cjs/reality-data-client.js", + "module": "lib/esm/reality-data-client.js", + "typings": "lib/cjs/reality-data-client", + "license": "MIT", + "keywords": [ + "Bentley", + "iTwin", + "BIM", + "iModel", + "Reality Data Client" + ], + "author": { + "name": "Bentley Systems, Inc.", + "url": "http://www.bentley.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/iTwin/reality-capture.git", + "directory": "typescript/packages/reality-data-client" + }, + "scripts": { + "compile": "npm run -s build", + "build": "npm run -s build:cjs && npm run -s build:esm", + "build:cjs": "tsc 1>&2 --outDir lib/cjs", + "build:esm": "tsc 1>&2 --module ES2020 --outDir lib/esm", + "clean": "rimraf lib", + "extract-api": "betools extract-api --entry=reality-data-client", + "docs": "betools docs --includes=../../generated-docs/extract --json=../../generated-docs/clients/reality-data-client/file.json --tsIndexFile=reality-data-client.ts --onlyJson", + "lint": "eslint -f visualstudio \"./src/**/*.ts\" 1>&2", + "lint:fix": "npm run lint -- --fix", + "webpackTests": "webpack --config ./src/test/utils/webpack.config.js 1>&2", + "test": "", + "test:integration": "npm run build && npm run -s webpackTests && npm run -s test:integration:chrome", + "test:integration:chrome": "certa -r chrome --grep \"#integration\"", + "test:integration:electron": "certa -r electron --grep \"#integration\"", + "change": "beachball change --no-commit", + "check": "beachball check", + "version-bump": "beachball bump", + "publish-packages": "beachball publish", + "version-bump-dev": "beachball bump --config beachball.config.dev.js --keep-change-files", + "publish-packages-dev": "beachball publish --config beachball.config.dev.js --keep-change-files" + }, + "dependencies": { + "axios": "^1.18.0" + }, + "devDependencies": { + "@itwin/build-tools": "^5.0.2", + "@itwin/certa": "^5.0.2", + "@itwin/core-bentley": "^5.0.2", + "@itwin/core-common": "^5.0.2", + "@itwin/core-geometry": "^5.0.2", + "@itwin/eslint-plugin": "^5.2.1", + "@itwin/oidc-signin-tool": "^5.1.3", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "^9.1.0", + "beachball": "^2.31.12", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "dotenv": "^16.0.3", + "dotenv-expand": "^5.1.0", + "eslint": "^8.36.0", + "eslint-plugin-deprecation": "^1.3.3", + "@playwright/test": "~1.56.1", + "rimraf": "^4.4.1", + "source-map-loader": "^1.0.0", + "typescript": "~5.6.3", + "webpack": "^5.94.0", + "webpack-cli": "^5.0.2" + }, + "peerDependencies": { + "@itwin/core-bentley": "^4.0.0 || ^5.0.0" + } +} diff --git a/typescript/packages/reality-data-client/pnpm-lock.yaml b/typescript/packages/reality-data-client/pnpm-lock.yaml new file mode 100644 index 00000000..8ac6f720 --- /dev/null +++ b/typescript/packages/reality-data-client/pnpm-lock.yaml @@ -0,0 +1,6138 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + axios: + specifier: ^1.18.0 + version: 1.18.0 + devDependencies: + '@itwin/build-tools': + specifier: ^5.0.2 + version: 5.10.0(@types/node@25.9.2)(supports-color@8.1.1) + '@itwin/certa': + specifier: ^5.0.2 + version: 5.10.0 + '@itwin/core-bentley': + specifier: ^5.0.2 + version: 5.10.0 + '@itwin/core-common': + specifier: ^5.0.2 + version: 5.10.0(@itwin/core-bentley@5.10.0)(@itwin/core-geometry@5.10.0) + '@itwin/core-geometry': + specifier: ^5.0.2 + version: 5.10.0 + '@itwin/eslint-plugin': + specifier: ^5.2.1 + version: 5.2.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + '@itwin/oidc-signin-tool': + specifier: ^5.1.3 + version: 5.1.3(@itwin/core-bentley@5.10.0)(supports-color@8.1.1) + '@playwright/test': + specifier: ~1.56.1 + version: 1.56.1 + '@types/chai': + specifier: ^4.3.0 + version: 4.3.20 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/mocha': + specifier: ^9.1.0 + version: 9.1.1 + beachball: + specifier: ^2.31.12 + version: 2.65.5(typescript@5.6.3) + chai: + specifier: ^4.3.4 + version: 4.5.0 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.2(chai@4.5.0) + dotenv: + specifier: ^16.0.3 + version: 16.6.1 + dotenv-expand: + specifier: ^5.1.0 + version: 5.1.0 + eslint: + specifier: ^8.36.0 + version: 8.57.1(supports-color@8.1.1) + eslint-plugin-deprecation: + specifier: ^1.3.3 + version: 1.6.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + rimraf: + specifier: ^4.4.1 + version: 4.4.1 + source-map-loader: + specifier: ^1.0.0 + version: 1.1.3(webpack@5.107.2) + typescript: + specifier: ~5.6.3 + version: 5.6.3 + webpack: + specifier: ^5.94.0 + version: 5.107.2(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.0.2 + version: 5.1.4(webpack@5.107.2) + +packages: + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@es-joy/jsdoccomment@0.50.2': + resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} + engines: {node: '>=18'} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@gerrit0/mini-shiki@3.23.0': + resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@itwin/build-tools@5.10.0': + resolution: {integrity: sha512-1EgakIHbJpLB2OMTMU1o1Hx2GwyJTxrbky9AgkKB7VPheQwpSGh7MlmwTbRTw+U0SLiRb1LeuMYH1DnryW1wBA==} + hasBin: true + + '@itwin/certa@5.10.0': + resolution: {integrity: sha512-LIbnl7uprikW/U971C/R/Lxl5lYsIXbOKe9SJgy+NgKKkCHzxPIBcgF8xya+uF3vgd9SIkqhiQXdtNm5VtHlHA==} + hasBin: true + peerDependencies: + electron: ^35.0.0 || ^36.0.0 || ^37.0.0 || ^38.0.0 || ^39.0.0 || ^40.0.0 || ^41.0.0 || ^42.0.0 + peerDependenciesMeta: + electron: + optional: true + + '@itwin/core-bentley@5.10.0': + resolution: {integrity: sha512-N+OPL3rAbI6zNmlqF/+K58XU9f4reirNWtvt3qUxRRgVV6HSA/DqvigApyPMLA9hQCrxfEPfsjFec/z05WnaBA==} + + '@itwin/core-common@5.10.0': + resolution: {integrity: sha512-GcMmlSgRSrFIgvMqz0Jk0W3Ri0KbPieqVwEMTF5CTDa/Llbz5syWfDk+gwG9L5R3V6zY5XszsSV6coTicxu84w==} + peerDependencies: + '@itwin/core-bentley': 5.10.0 + '@itwin/core-geometry': 5.10.0 + + '@itwin/core-geometry@5.10.0': + resolution: {integrity: sha512-T/lRcONx4QK3RxTatBGyLqXn+H9KGUKIynkZxkxiLFUV4/4q87V8wwBPq8ufuJU4Wnf/xX88RvNe7dLMlYzm+Q==} + + '@itwin/eslint-plugin@5.2.1': + resolution: {integrity: sha512-iFmxAXzBYUm/yHiyp37V8Qn2oZ9iqwB1HxWX1AAhewk77JUIhO1KLY2hrBNisHx49giy7hZmIOBEaXc357z+Uw==} + engines: {node: ^18.18.0 || ^20.0.0 || ^22.0.0} + hasBin: true + peerDependencies: + eslint: ^9.11.1 + typescript: ^3.7.0 || ^4.0.0 || ^5.0.0 + + '@itwin/oidc-signin-tool@5.1.3': + resolution: {integrity: sha512-cOl6cS/xd8hnM5T/EKK45V0voG1G5745MWJuUpy8838J+FU5TvOUMaECQlWy7uYP0BD9LBGULjgDu+i1/BhEmA==} + peerDependencies: + '@itwin/core-bentley': ^5.0.0 + + '@itwin/service-authorization@2.1.1': + resolution: {integrity: sha512-IqW/ALUccCHhQDM7HqRTNCHsoerioZsSPKf3AI054N2coEf59vYg5MqiSfaKGRMwkDM7C952kDC+M5BL4kA8qQ==} + peerDependencies: + '@itwin/core-bentley': ^5.0.0 + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@microsoft/api-extractor-model@7.33.8': + resolution: {integrity: sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==} + + '@microsoft/api-extractor@7.58.7': + resolution: {integrity: sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==} + hasBin: true + + '@microsoft/tsdoc-config@0.18.1': + resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} + + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@playwright/test@1.56.1': + resolution: {integrity: sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==} + engines: {node: '>=18'} + hasBin: true + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/node-core-library@5.23.1': + resolution: {integrity: sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/problem-matcher@0.2.1': + resolution: {integrity: sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.7.3': + resolution: {integrity: sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==} + + '@rushstack/terminal@0.24.0': + resolution: {integrity: sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/ts-command-line@5.3.9': + resolution: {integrity: sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==} + + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/chai-as-promised@7.1.8': + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + + '@types/mocha@9.1.1': + resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@25.9.2': + resolution: {integrity: sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==} + + '@types/parse-path@7.1.0': + resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} + deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.60.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + '@vercel/detect-agent@1.2.3': + resolution: {integrity: sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==} + engines: {node: '>=14'} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.12.0: + resolution: {integrity: sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==} + engines: {node: '>=4'} + + axios@1.18.0: + resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.34: + resolution: {integrity: sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==} + engines: {node: '>=6.0.0'} + hasBin: true + + beachball@2.65.5: + resolution: {integrity: sha512-nAsYfIQ5co1gn718OmLLsYtJSt+oZYkMMQ9k6Yel372sPwMETHgzqAcmxdZb2Bs/XTvy2/Xnm7qz7pashweFZg==} + engines: {node: '>=14.0.0'} + hasBin: true + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + body-parser@1.20.5: + resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001797: + resolution: {integrity: sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==} + + canonical-path@1.0.0: + resolution: {integrity: sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==} + + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} + peerDependencies: + chai: '>= 2.1.2 < 6' + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cpx2@8.0.2: + resolution: {integrity: sha512-exLFEIh8XgWthEtrEq8hs+S6jxM5ZHpjQnRH6D7VU+2uAYS3amLSVOUSuirfx3HeN7WBCq+xFygHpt7l+gQtUA==} + engines: {node: ^20.0.0 || >=22.0.0, npm: '>=10'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debounce@3.0.0: + resolution: {integrity: sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==} + engines: {node: '>=20'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-port@1.3.0: + resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==} + engines: {node: '>= 4.2.1'} + hasBin: true + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} + engines: {node: '>=12'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.368: + resolution: {integrity: sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.23.0: + resolution: {integrity: sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.21.0: + resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} + engines: {node: '>=4'} + hasBin: true + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.3.2: + resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-formatter-visualstudio@8.40.0: + resolution: {integrity: sha512-TsbZJpvu0wclOoy5MEhETzxrVWMPDg5sejowvQfbqw9e0ooozbnX/1STGiGaO/fH1JWLQvqQ4qAmai2u/Kep1g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-module-utils@2.13.0: + resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-deprecation@1.6.0: + resolution: {integrity: sha512-rld+Vrneh/NXRtDB0vQifOvgUy0HJYoejaxWlVnsk/LK7iij2tCWQIFcCKG4uzQb+Ef86bDke39w1lh4wnon4Q==} + deprecated: this package has been deprecated, please use v2.0.0 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: ^4.2.4 || ^5.0.0 + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jam3@0.2.3: + resolution: {integrity: sha512-aW1L8C96fsRji0c8ZAgqtJVIu5p2IaNbeT2kuHNS6p5tontAVK1yP1W4ECjq3BHOv/GgAWvBVIx7kQI0kG2Rew==} + engines: {node: '>=4'} + + eslint-plugin-jsdoc@50.8.0: + resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-prefer-arrow@1.2.3: + resolution: {integrity: sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==} + peerDependencies: + eslint: '>=2.0.0' + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + express@4.22.2: + resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} + engines: {node: '>= 0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + + find-index@0.1.1: + resolution: {integrity: sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatbuffers@1.12.0: + resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + git-up@7.0.0: + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + + git-up@8.1.1: + resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} + + git-url-parse@13.1.1: + resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==} + + git-url-parse@16.1.0: + resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob2base@0.0.12: + resolution: {integrity: sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==} + engines: {node: '>= 0.10'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-ssh@1.4.1: + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@2.0.3: + resolution: {integrity: sha512-WJi9y9ABL01C8CxTKxRRQkkSpY/x2bo4Gy0WuiZGrInxQqgxQpvkBCLNcDYcHOSdhx4ODgbFcgAvfL49C+PHgQ==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jwks-rsa@3.2.2: + resolution: {integrity: sha512-BqTyEDV+lS8F2trk3A+qJnxV5Q9EqKCBJOPti3W97r7qTympCZjb7h2X6f2kc+0K3rsSTY1/6YG2eaXKoj497w==} + engines: {node: '>=14'} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + limiter@1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.1: + resolution: {integrity: sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==} + + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + markdown-it@14.2.0: + resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimatch@10.2.3: + resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} + engines: {node: 18 || 20 || >=22} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@8.0.7: + resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mocha-junit-reporter@2.2.1: + resolution: {integrity: sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==} + peerDependencies: + mocha: '>=2.2.5' + + mocha@11.7.6: + resolution: {integrity: sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-exports-info@1.6.0: + resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + engines: {node: '>= 0.4'} + + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} + + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + oidc-client-ts@3.5.0: + resolution: {integrity: sha512-l2q8l9CTCTOlbX+AnK4p3M+4CEpKpyQhle6blQkdFhm0IsBqsxm15bYaSa11G7pWdsYr6epdsRZxJpCyCRbT8A==} + engines: {node: '>=18'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-graph@1.3.0: + resolution: {integrity: sha512-QL8xXlJl/oWWbzQK0de3KMFDzCXF8SQ2medloXxRFI1GUjNFBHiOtNv7X1azGBzF1SolIhm+gZ5XshBo6+3sdw==} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-path@7.1.0: + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} + + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + + parse-url@8.1.0: + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + playwright-core@1.56.1: + resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.56.1: + resolution: {integrity: sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==} + engines: {node: '>=18'} + hasBin: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + protocols@2.0.2: + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requireindex@1.1.0: + resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} + engines: {node: '>=0.10.5'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true + + rimraf@6.1.3: + resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} + engines: {node: 20 || >=22} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.2: + resolution: {integrity: sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.4: + resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-loader@1.1.3: + resolution: {integrity: sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + subarg@1.0.0: + resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + + terser@5.48.0: + resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + + typedoc-plugin-merge-modules@7.0.0: + resolution: {integrity: sha512-DQyfbbPNBElhpdpGrlkS+CrhGD3iooDjp/PHT8O1D/jumLCB+7XAY3jHiqob7d01o25EfwEOJWVwJK+9J6WlBg==} + peerDependencies: + typedoc: 0.28.x + + typedoc@0.28.19: + resolution: {integrity: sha512-wKh+lhdmMFivMlc6vRRcMGXeGEHGU2g8a2CkPTJjJlwRf1iXbimWIPcFolCqe4E0d/FRtGszpIrsp3WLpDB8Pw==} + engines: {node: '>= 18', pnpm: '>= 10'} + hasBin: true + peerDependencies: + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + engines: {node: '>=10.13.0'} + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.5.0: + resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} + engines: {node: '>=10.13.0'} + + webpack@5.107.2: + resolution: {integrity: sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + + workspace-tools@0.36.4: + resolution: {integrity: sha512-v0UFVvw9BjHtRu2Dau5PEJKkuG8u4jPlpXZQWjSz9XgbSutpPURqtO2P0hp3cVmQVATh8lkMFCewFgJuDnyC/w==} + + workspace-tools@0.41.7: + resolution: {integrity: sha512-krsae4CHOG+jBRj76xtiFeQ35BEJC1Yb4601a3dLoZm1oeswSRiEvgcHJel2JXZESiKT/pXiISOodpLsIKWf+Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wtfnode@0.9.4: + resolution: {integrity: sha512-5xgeLjIxZ8DVHU4ty3kOdd9QfHDxf89tmSy0+yN8n59S3wx6LBJh8XhEg61OPOGE65jEYGAtLq0GMzLKrsjfPQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.29.7': {} + + '@discoveryjs/json-ext@0.5.7': {} + + '@es-joy/jsdoccomment@0.50.2': + dependencies: + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.60.1 + comment-parser: 1.4.1 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 4.1.0 + + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1(supports-color@8.1.1))': + dependencies: + eslint: 8.57.1(supports-color@8.1.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': + dependencies: + ajv: 6.15.0 + debug: 4.4.3(supports-color@8.1.1) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.2.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@gerrit0/mini-shiki@3.23.0': + dependencies: + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@humanwhocodes/config-array@0.13.0(supports-color@8.1.1)': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@itwin/build-tools@5.10.0(@types/node@25.9.2)(supports-color@8.1.1)': + dependencies: + '@microsoft/api-extractor': 7.58.7(@types/node@25.9.2) + chalk: 3.0.0 + cpx2: 8.0.2 + cross-spawn: 7.0.6 + fs-extra: 8.1.0 + glob: 10.5.0 + mocha: 11.7.6 + mocha-junit-reporter: 2.2.1(mocha@11.7.6)(supports-color@8.1.1) + rimraf: 6.1.3 + tree-kill: 1.2.2 + typedoc: 0.28.19(typescript@5.6.3) + typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.6.3)) + typescript: 5.6.3 + wtfnode: 0.9.4 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + + '@itwin/certa@5.10.0': + dependencies: + canonical-path: 1.0.0 + detect-port: 1.3.0 + express: 4.22.2 + jsonc-parser: 2.0.3 + lodash: 4.18.1 + mocha: 11.7.6 + playwright: 1.56.1 + source-map-support: 0.5.21 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@itwin/core-bentley@5.10.0': {} + + '@itwin/core-common@5.10.0(@itwin/core-bentley@5.10.0)(@itwin/core-geometry@5.10.0)': + dependencies: + '@itwin/core-bentley': 5.10.0 + '@itwin/core-geometry': 5.10.0 + flatbuffers: 1.12.0 + js-base64: 3.7.8 + + '@itwin/core-geometry@5.10.0': + dependencies: + '@itwin/core-bentley': 5.10.0 + flatbuffers: 1.12.0 + + '@itwin/eslint-plugin@5.2.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + eslint: 8.57.1(supports-color@8.1.1) + eslint-formatter-visualstudio: 8.40.0 + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1)) + eslint-plugin-jam3: 0.2.3 + eslint-plugin-jsdoc: 50.8.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1(supports-color@8.1.1)) + eslint-plugin-prefer-arrow: 1.2.3(eslint@8.57.1(supports-color@8.1.1)) + eslint-plugin-react: 7.37.5(eslint@8.57.1(supports-color@8.1.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1(supports-color@8.1.1)) + typescript: 5.6.3 + workspace-tools: 0.36.4 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + '@itwin/oidc-signin-tool@5.1.3(@itwin/core-bentley@5.10.0)(supports-color@8.1.1)': + dependencies: + '@itwin/certa': 5.10.0 + '@itwin/core-bentley': 5.10.0 + '@itwin/service-authorization': 2.1.1(@itwin/core-bentley@5.10.0)(supports-color@8.1.1) + '@playwright/test': 1.56.1 + dotenv: 10.0.0 + dotenv-expand: 12.0.3 + oidc-client-ts: 3.5.0 + transitivePeerDependencies: + - electron + - supports-color + + '@itwin/service-authorization@2.1.1(@itwin/core-bentley@5.10.0)(supports-color@8.1.1)': + dependencies: + '@itwin/core-bentley': 5.10.0 + got: 12.6.1 + jsonwebtoken: 9.0.3 + jwks-rsa: 3.2.2(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@microsoft/api-extractor-model@7.33.8(@types/node@25.9.2)': + dependencies: + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1(@types/node@25.9.2) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.58.7(@types/node@25.9.2)': + dependencies: + '@microsoft/api-extractor-model': 7.33.8(@types/node@25.9.2) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1(@types/node@25.9.2) + '@rushstack/rig-package': 0.7.3 + '@rushstack/terminal': 0.24.0(@types/node@25.9.2) + '@rushstack/ts-command-line': 5.3.9(@types/node@25.9.2) + diff: 8.0.4 + minimatch: 10.2.3 + resolve: 1.22.12 + semver: 7.7.4 + source-map: 0.6.1 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.18.1': + dependencies: + '@microsoft/tsdoc': 0.16.0 + ajv: 8.18.0 + jju: 1.4.0 + resolve: 1.22.12 + + '@microsoft/tsdoc@0.16.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@playwright/test@1.56.1': + dependencies: + playwright: 1.56.1 + + '@rtsao/scc@1.1.0': {} + + '@rushstack/node-core-library@5.23.1(@types/node@25.9.2)': + dependencies: + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1(ajv@8.18.0) + fs-extra: 11.3.5 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.12 + semver: 7.7.4 + optionalDependencies: + '@types/node': 25.9.2 + + '@rushstack/problem-matcher@0.2.1(@types/node@25.9.2)': + optionalDependencies: + '@types/node': 25.9.2 + + '@rushstack/rig-package@0.7.3': + dependencies: + jju: 1.4.0 + resolve: 1.22.12 + + '@rushstack/terminal@0.24.0(@types/node@25.9.2)': + dependencies: + '@rushstack/node-core-library': 5.23.1(@types/node@25.9.2) + '@rushstack/problem-matcher': 0.2.1(@types/node@25.9.2) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 25.9.2 + + '@rushstack/ts-command-line@5.3.9(@types/node@25.9.2)': + dependencies: + '@rushstack/terminal': 0.24.0(@types/node@25.9.2) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@shikijs/engine-oniguruma@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/themes@3.23.0': + dependencies: + '@shikijs/types': 3.23.0 + + '@shikijs/types@3.23.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@sindresorhus/is@5.6.0': {} + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@types/argparse@1.0.38': {} + + '@types/chai-as-promised@7.1.8': + dependencies: + '@types/chai': 4.3.20 + + '@types/chai@4.3.20': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-cache-semantics@4.2.0': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 25.9.2 + + '@types/mocha@9.1.1': {} + + '@types/ms@2.1.0': {} + + '@types/node@25.9.2': + dependencies: + undici-types: 7.24.6 + + '@types/parse-path@7.1.0': + dependencies: + parse-path: 7.1.0 + + '@types/semver@7.7.1': {} + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.60.1 + eslint: 8.57.1(supports-color@8.1.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3(supports-color@8.1.1) + eslint: 8.57.1(supports-color@8.1.1) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.60.1(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.6.3) + '@typescript-eslint/types': 8.60.1 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/scope-manager@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@5.6.3)': + dependencies: + typescript: 5.6.3 + + '@typescript-eslint/type-utils@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(typescript@5.6.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 8.57.1(supports-color@8.1.1) + ts-api-utils: 2.5.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/types@8.60.1': {} + + '@typescript-eslint/typescript-estree@6.21.0(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.3(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.8.2 + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.60.1(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/project-service': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.6.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 10.2.5 + semver: 7.8.2 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.1 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.6.3) + eslint: 8.57.1(supports-color@8.1.1) + semver: 7.8.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.60.1(eslint@8.57.1(supports-color@8.1.1))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(supports-color@8.1.1)(typescript@5.6.3) + eslint: 8.57.1(supports-color@8.1.1) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + eslint-visitor-keys: 5.0.1 + + '@ungap/structured-clone@1.3.1': {} + + '@vercel/detect-agent@1.2.3': {} + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.107.2)': + dependencies: + webpack: 5.107.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.107.2) + + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.107.2)': + dependencies: + webpack: 5.107.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.107.2) + + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.107.2)': + dependencies: + webpack: 5.107.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.107.2) + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + '@yarnpkg/lockfile@1.1.0': {} + + abab@2.0.6: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-phases@1.0.4(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + address@1.2.2: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + ajv-draft-04@1.0.0(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + + ajv-keywords@3.5.2(ajv@6.15.0): + dependencies: + ajv: 6.15.0 + + ajv-keywords@5.1.0(ajv@8.20.0): + dependencies: + ajv: 8.20.0 + fast-deep-equal: 3.1.3 + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + are-docs-informative@0.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@1.1.0: {} + + ast-types-flow@0.0.8: {} + + async-function@1.0.0: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.12.0: {} + + axios@1.18.0: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.34: {} + + beachball@2.65.5(typescript@5.6.3): + dependencies: + '@vercel/detect-agent': 1.2.3 + cosmiconfig: 9.0.2(typescript@5.6.3) + execa: 5.1.1 + minimatch: 3.1.5 + p-graph: 1.3.0 + p-limit: 3.1.0 + prompts: 2.4.2 + semver: 7.8.2 + workspace-tools: 0.41.7 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - typescript + + big.js@5.2.2: {} + + body-parser@1.20.5: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.15.2 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.34 + caniuse-lite: 1.0.30001797 + electron-to-chromium: 1.5.368 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + bytes@3.1.2: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001797: {} + + canonical-path@1.0.0: {} + + chai-as-promised@7.1.2(chai@4.5.0): + dependencies: + chai: 4.5.0 + check-error: 1.0.3 + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + charenc@0.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chrome-trace-event@1.0.4: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@2.20.3: {} + + comment-parser@1.4.1: {} + + concat-map@0.0.1: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.7: {} + + cookie@0.7.2: {} + + cosmiconfig@9.0.2(typescript@5.6.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.2.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.3 + + cpx2@8.0.2: + dependencies: + debounce: 3.0.0 + glob: 13.0.6 + glob2base: 0.0.12 + ignore: 7.0.5 + minimatch: 10.2.5 + p-map: 7.0.4 + resolve: 1.22.12 + shell-quote: 1.8.4 + subarg: 1.0.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypt@0.0.2: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debounce@3.0.0: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@4.0.0: {} + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-port@1.3.0: + dependencies: + address: 1.2.2 + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + + diff@7.0.0: {} + + diff@8.0.4: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.6.1 + + dotenv-expand@5.1.0: {} + + dotenv@10.0.0: {} + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.368: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.23.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + envinfo@7.21.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.3.2: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + + es-module-lexer@2.1.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-formatter-visualstudio@8.40.0: {} + + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1(supports-color@8.1.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + eslint: 8.57.1(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.10 + transitivePeerDependencies: + - supports-color + + eslint-plugin-deprecation@1.6.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3): + dependencies: + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + eslint: 8.57.1(supports-color@8.1.1) + tslib: 2.8.1 + tsutils: 3.21.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint@8.57.1(supports-color@8.1.1)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1(supports-color@8.1.1)) + hasown: 2.0.4 + is-core-module: 2.16.2 + is-glob: 4.0.3 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.10 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.60.1(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.6.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jam3@0.2.3: + dependencies: + doctrine: 2.1.0 + has: 1.0.4 + requireindex: 1.1.0 + + eslint-plugin-jsdoc@50.8.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + '@es-joy/jsdoccomment': 0.50.2 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.3(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint: 8.57.1(supports-color@8.1.1) + espree: 10.4.0 + esquery: 1.7.0 + parse-imports-exports: 0.2.4 + semver: 7.8.2 + spdx-expression-parse: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1(supports-color@8.1.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.12.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.57.1(supports-color@8.1.1) + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.1(supports-color@8.1.1)): + dependencies: + eslint: 8.57.1(supports-color@8.1.1) + + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1(supports-color@8.1.1)): + dependencies: + eslint: 8.57.1(supports-color@8.1.1) + + eslint-plugin-react@7.37.5(eslint@8.57.1(supports-color@8.1.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.3.2 + eslint: 8.57.1(supports-color@8.1.1) + estraverse: 5.3.0 + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.7 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@8.57.1(supports-color@8.1.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0(supports-color@8.1.1) + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.1 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.2.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 + + espree@9.6.1: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + express@4.22.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.5 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.13 + proxy-addr: 2.0.7 + qs: 6.15.2 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.2: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.2: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-index@0.1.1: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatbuffers@1.12.0: {} + + flatted@3.4.2: {} + + follow-redirects@1.16.0: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@2.1.4: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.2: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.4 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + git-up@7.0.0: + dependencies: + is-ssh: 1.4.1 + parse-url: 8.1.0 + + git-up@8.1.1: + dependencies: + is-ssh: 1.4.1 + parse-url: 9.2.0 + + git-url-parse@13.1.1: + dependencies: + git-up: 7.0.0 + + git-url-parse@16.1.0: + dependencies: + git-up: 8.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob2base@0.0.12: + dependencies: + find-index: 0.1.1 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@9.3.5: + dependencies: + fs.realpath: 1.0.0 + minimatch: 8.0.7 + minipass: 4.2.8 + path-scurry: 1.11.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has@1.0.4: {} + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + http-cache-semantics@4.2.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.0 + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@2.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-ssh@1.4.1: + dependencies: + protocols: 2.0.2 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 25.9.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jju@1.4.0: {} + + jose@4.15.9: {} + + js-base64@3.7.8: {} + + js-tokens@4.0.0: {} + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + jsdoc-type-pratt-parser@4.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-parser@2.0.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.8.2 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwks-rsa@3.2.2(supports-color@8.1.1): + dependencies: + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.3(supports-color@8.1.1) + jose: 4.15.9 + limiter: 1.1.5 + lru-memoizer: 2.3.0 + transitivePeerDependencies: + - supports-color + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + jwt-decode@4.0.0: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + limiter@1.1.5: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.1: + dependencies: + uc.micro: 2.1.0 + + loader-runner@4.3.2: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.clonedeep@4.5.0: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.merge@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash@4.18.1: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.5.1: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-memoizer@2.3.0: + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 6.0.0 + + lunr@2.3.9: {} + + markdown-it@14.2.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.1 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + math-intrinsics@1.1.0: {} + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + mdurl@2.0.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + minimatch@10.2.3: + dependencies: + brace-expansion: 5.0.6 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimatch@8.0.7: + dependencies: + brace-expansion: 2.1.1 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.1.1 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 + + minimist@1.2.8: {} + + minipass@4.2.8: {} + + minipass@7.1.3: {} + + mkdirp@3.0.1: {} + + mocha-junit-reporter@2.2.1(mocha@11.7.6)(supports-color@8.1.1): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + md5: 2.3.0 + mkdirp: 3.0.1 + mocha: 11.7.6 + strip-ansi: 6.0.1 + xml: 1.0.1 + transitivePeerDependencies: + - supports-color + + mocha@11.7.6: + dependencies: + browser-stdout: 1.3.1 + chokidar: 4.0.3 + debug: 4.4.3(supports-color@8.1.1) + diff: 7.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 10.5.0 + he: 1.2.0 + is-path-inside: 3.0.3 + js-yaml: 4.2.0 + log-symbols: 4.1.0 + minimatch: 9.0.9 + ms: 2.1.3 + picocolors: 1.1.1 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 9.3.4 + yargs: 17.7.2 + yargs-parser: 21.1.1 + yargs-unparser: 2.0.0 + + ms@2.0.0: {} + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + node-exports-info@1.6.0: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + node-releases@2.0.47: {} + + normalize-url@8.1.1: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + oidc-client-ts@3.5.0: + dependencies: + jwt-decode: 4.0.0 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-cancelable@3.0.0: {} + + p-graph@1.3.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@7.0.4: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-path@7.1.0: + dependencies: + protocols: 2.0.2 + + parse-statements@1.0.11: {} + + parse-url@8.1.0: + dependencies: + parse-path: 7.1.0 + + parse-url@9.2.0: + dependencies: + '@types/parse-path': 7.1.0 + parse-path: 7.1.0 + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.1 + minipass: 7.1.3 + + path-to-regexp@0.1.13: {} + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + playwright-core@1.56.1: {} + + playwright@1.56.1: + dependencies: + playwright-core: 1.56.1 + optionalDependencies: + fsevents: 2.3.2 + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + protocols@2.0.2: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@2.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + qs@6.15.2: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-is@16.13.1: {} + + readdirp@4.1.2: {} + + rechoir@0.8.0: + dependencies: + resolve: 1.22.12 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requireindex@1.1.0: {} + + resolve-alpn@1.2.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.0 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@4.4.1: + dependencies: + glob: 9.3.5 + + rimraf@6.1.3: + dependencies: + glob: 13.0.6 + package-json-from-dist: 1.0.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.15.0 + ajv-keywords: 3.5.2(ajv@6.15.0) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) + + semver@6.3.1: {} + + semver@7.7.4: {} + + semver@7.8.2: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.4: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-loader@1.1.3(webpack@5.107.2): + dependencies: + abab: 2.0.6 + iconv-lite: 0.6.3 + loader-utils: 2.0.4 + schema-utils: 3.3.0 + source-map: 0.6.1 + webpack: 5.107.2(webpack-cli@5.1.4) + whatwg-mimetype: 2.3.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + sprintf-js@1.0.3: {} + + statuses@2.0.2: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + subarg@1.0.0: + dependencies: + minimist: 1.2.8 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tapable@2.3.3: {} + + terser-webpack-plugin@5.6.1(webpack@5.107.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.48.0 + webpack: 5.107.2(webpack-cli@5.1.4) + + terser@5.48.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tree-kill@1.2.2: {} + + ts-api-utils@1.4.3(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + ts-api-utils@2.5.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsutils@3.21.0(typescript@5.6.3): + dependencies: + tslib: 1.14.1 + typescript: 5.6.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.20.2: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.6.3)): + dependencies: + typedoc: 0.28.19(typescript@5.6.3) + + typedoc@0.28.19(typescript@5.6.3): + dependencies: + '@gerrit0/mini-shiki': 3.23.0 + lunr: 2.3.9 + markdown-it: 14.2.0 + minimatch: 10.2.5 + typescript: 5.6.3 + yaml: 2.9.0 + + typescript@5.6.3: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@7.24.6: {} + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + + watchpack@2.5.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webpack-cli@5.1.4(webpack@5.107.2): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.107.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.107.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.107.2) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.6 + envinfo: 7.21.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.107.2(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.5.0: {} + + webpack@5.107.2(webpack-cli@5.1.4): + dependencies: + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) + browserslist: 4.28.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.23.0 + es-module-lexer: 2.1.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + loader-runner: 4.3.2 + mime-db: 1.54.0 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(webpack@5.107.2) + watchpack: 2.5.1 + webpack-sources: 3.5.0 + optionalDependencies: + webpack-cli: 5.1.4(webpack@5.107.2) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + + whatwg-mimetype@2.3.0: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.22 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + word-wrap@1.2.5: {} + + workerpool@9.3.4: {} + + workspace-tools@0.36.4: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + fast-glob: 3.3.3 + git-url-parse: 13.1.1 + globby: 11.1.0 + jju: 1.4.0 + js-yaml: 4.2.0 + micromatch: 4.0.8 + + workspace-tools@0.41.7: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + fast-glob: 3.3.3 + git-url-parse: 16.1.0 + jju: 1.4.0 + js-yaml: 4.2.0 + micromatch: 4.0.8 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + wtfnode@0.9.4: {} + + xml@1.0.1: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/typescript/packages/reality-data-client/pnpm-workspace.yaml b/typescript/packages/reality-data-client/pnpm-workspace.yaml new file mode 100644 index 00000000..0db12ee0 --- /dev/null +++ b/typescript/packages/reality-data-client/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +packages: + - . + +allowBuilds: + "@itwin/certa": true + "@itwin/oidc-signin-tool": true diff --git a/typescript/packages/reality-data-client/src/Projects.ts b/typescript/packages/reality-data-client/src/Projects.ts new file mode 100644 index 00000000..7b4a549b --- /dev/null +++ b/typescript/packages/reality-data-client/src/Projects.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ + +import type { GuidString } from "@itwin/core-bentley"; + +/** + * Contains information on a project that is associated to a RealityData. More details about a project can be requested from the Projects API. + */ +export class Project { + + /** Project identifier */ + public id: GuidString; + + /** Project URL in the Projects API, for more information about the project */ + public projectDetailsLink: URL; + + public constructor(project: any){ + this.id = project.id; + this.projectDetailsLink = project._links.self.href; + } +} + diff --git a/typescript/packages/reality-data-client/src/RealityData.ts b/typescript/packages/reality-data-client/src/RealityData.ts new file mode 100644 index 00000000..e4403905 --- /dev/null +++ b/typescript/packages/reality-data-client/src/RealityData.ts @@ -0,0 +1,242 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +import type { RealityData } from "@itwin/core-common"; +import {type AccessToken, BentleyError, type GuidString } from "@itwin/core-bentley"; +import type { RealityDataAccessClient } from "./RealityDataClient"; + +import { getRequestConfig } from "./RequestOptions"; +import axios from "axios"; + +/** + * Extent of a reality data, delimited by southwest and northeast coordinates. + */ +export interface Extent { + southWest: Point; + northEast: Point; +} + +/** + * Point used to define an extent. + */ +export interface Point { + latitude: number; + longitude: number; +} + +/** + * Coordinate Reference System (CRS) used for the reality data. + * It is restricted to specific reality data types, read documentation here: + * https://developer.bentley.com/apis/reality-management/rm-rd-details/#crs + */ +export interface Crs { + id: string; + verticalId?: string; +} + +/** + * Provides information regarding the acquisition, such as dates and acquirer used. + */ +export interface Acquisition { + startDateTime: Date; + endDateTime?: Date; + acquirer?: string; +} + +/** + * Cache parameters for reality data access. Contains the blob url, the timestamp to refresh (every 50 minutes) the url and the root document path. + * Cache contains one value for the read permission url, and one of the write permission. + * */ +class ContainerCache { + + private _containerRead?: ContainerCacheValue; + private _containerWrite?: ContainerCacheValue; + + public getCache(access: string): ContainerCacheValue | undefined { + if (access === "Read") + return this._containerRead; + else + return this._containerWrite; + } + + public setCache(containerCacheValue: ContainerCacheValue, access: string) { + if (access === "Read") + this._containerRead = containerCacheValue; + else + this._containerWrite = containerCacheValue; + } +} + +interface ContainerCacheValue { + url: URL; + timeStamp: Date; +} + +/** RealityData + * This class implements a Reality Data instance. + * Data is accessed directly through methods of the reality data instance. + * Access to the data required a properly entitled token though the access to the blob is controlled through + * an Azure blob URL, the token may be required to obtain this Azure blob URL or refresh it. + * The Azure blob URL is considered valid for an hour and is refreshed after 50 minutes. + * In addition to the reality data properties, and Azure blob URL and internal states, a reality data also contains + * the identification of the iTwin to be used for access permissions and + * may contain a RealityDataClient to obtain the specialization to communicate with Reality Management API (to obtain the Azure blob URL). + * @beta + */ +export class ITwinRealityData implements RealityData { + + public id: GuidString; + public displayName?: string; + public dataset?: string; + public group?: string; + public attribution?: string; + public termsOfUse?: string; + public dataCenterLocation?: string; + public description?: string; + public rootDocument?: string; + public tags?: string[]; + public acquisition?: Acquisition; + public size?: number; + public authoring?: boolean; + public classification?: string; + public type?: string; + public extent?: Extent; + public crs?: Crs; + /** @deprecated in 1.0.1 not used in Reality Management API. Will be removed in next major update.*/ + public accessControl?: string; // TODO: remove in next major update + public modifiedDateTime?: Date; + public lastAccessedDateTime?: Date; + public createdDateTime?: Date; + public ownerId?: string; + + /** Link to client to fetch the blob url */ + public client: undefined | RealityDataAccessClient; + + /** The GUID identifier of the iTwin used when using the client. */ + public iTwinId: GuidString; + + /** Cache parameters for reality data access. Contains the blob url, the timestamp to refresh (every 50 minutes) the url and the root document path. */ + private _containerCache: ContainerCache; + + /** + * Creates an instance of RealityData. + * @beta + */ + public constructor(client: RealityDataAccessClient, realityData?: any, iTwinId?: GuidString) { + + this.client = client; + this._containerCache = new ContainerCache(); + + if (realityData) { + this.id = realityData.id; + this.displayName = realityData.displayName; + this.dataset = realityData.dataset; + this.group = realityData.group; + this.attribution = realityData.attribution; + this.termsOfUse = realityData.termsOfUse; + this.dataCenterLocation = realityData.dataCenterLocation; + this.description = realityData.description; + this.rootDocument = realityData.rootDocument; + this.tags = realityData.tags; + if (realityData.acquisition) { + this.acquisition = (realityData.acquisition as Acquisition); + this.acquisition.startDateTime = new Date(realityData.acquisition.startDateTime); + this.acquisition.endDateTime = realityData.acquisition.endDateTime ? new Date(realityData.acquisition.endDateTime) : undefined; + this.acquisition.acquirer = realityData.acquisition.acquirer ? realityData.acquisition.acquirer : undefined; + } + this.size = realityData.size; + this.authoring = realityData.authoring; + this.classification = realityData.classification; + this.type = realityData.type; + this.extent = realityData.extent; + this.crs = realityData.crs; + // eslint-disable-next-line @typescript-eslint/no-deprecated + this.accessControl = realityData.accessControl; + this.modifiedDateTime = new Date(realityData.modifiedDateTime); + this.lastAccessedDateTime = new Date(realityData.lastAccessedDateTime); + this.createdDateTime = new Date(realityData.createdDateTime); + this.ownerId = realityData.ownerId; + } + + if (iTwinId) + this.iTwinId = iTwinId; + } + + /** + * Gets string url to fetch blob data from. Access is read-only. + * @param accessToken The client request context. + * @param blobPath name or path of tile + * @param writeAccess Optional boolean indicating if write access is requested. Default is false for read-only access. The realitydata:modify scope is required to grant the "write" access. + * @returns string url for blob data + * @beta + */ + public async getBlobUrl(accessToken: AccessToken, blobPath: string, writeAccess = false): Promise { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = await this.getContainerUrl(accessTokenResolved, writeAccess); + if (blobPath === undefined) + return url; + + const host = `${url.origin + url.pathname}/`; + const query = url.search; + return new URL(`${host}${blobPath}${query}`); + } + /** + * Try to use authorizationClient in RealityDataClientOptions to get the access token + * otherwise, will return the input token + * This is a workaround to support different authorization client for the reality data client and iTwin-core. + */ + private async resolveAccessToken(accessToken: AccessToken): Promise { + return this.client?.authorizationClient ? this.client.authorizationClient.getAccessToken() : accessToken; + } + + /** + * Gets a tile access url URL object + * @param accessToken The client request context. + * @param writeAccess Optional boolean indicating if write access is requested. Default is false for read-only access. + * @returns app URL object for blob url + * @beta + */ + private async getContainerUrl(accessToken: AccessToken, writeAccess = false): Promise { + + if (!this.client) + throw new BentleyError(422, "Invalid container request (RealityDataAccessClient is not set)."); + + const access = (writeAccess === true ? "Write" : "Read"); + const accessTokenResolved = await this.resolveAccessToken(accessToken); + + try { + + const containerCache = this._containerCache.getCache(access); + const blobUrlRequiresRefresh = !containerCache?.timeStamp || (Date.now() - containerCache?.timeStamp.getTime()) > 3000000; // 3 million milliseconds or 50 minutes + + if (undefined === containerCache?.url || blobUrlRequiresRefresh) { + + const url = new URL(`${this.client.baseUrl}/${this.id}/${ writeAccess === true ? "writeAccess" : "readAccess"}`); + + if(this.iTwinId) + url.searchParams.append("iTwinId", this.iTwinId); + + const requestOptions = getRequestConfig(accessTokenResolved, "GET", url.href, this.client.apiVersion); + + const response = await axios.get(url.href, requestOptions); + + if (!response.data) { + throw new BentleyError(422, "Invalid container request (API returned an unexpected response)."); + } + + // update cache + const newContainerCacheValue: ContainerCacheValue = { + url: new URL(response.data._links.containerUrl.href), + timeStamp: new Date(Date.now()), + }; + + this._containerCache.setCache(newContainerCacheValue, access); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return this._containerCache.getCache(access)!.url; + } catch { + throw new BentleyError(422, "Invalid container request."); + } + } +} \ No newline at end of file diff --git a/typescript/packages/reality-data-client/src/RealityDataClient.ts b/typescript/packages/reality-data-client/src/RealityDataClient.ts new file mode 100644 index 00000000..18db666a --- /dev/null +++ b/typescript/packages/reality-data-client/src/RealityDataClient.ts @@ -0,0 +1,805 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +/** @packageDocumentation + * @module RealityDataClient + */ + +import { type AccessToken, BentleyError } from "@itwin/core-bentley"; +import type { + AuthorizationClient, + CartographicRange, + RealityDataAccess, +} from "@itwin/core-common"; +import axios, { type AxiosResponse } from "axios"; +import { ITwinRealityData } from "./RealityData"; +import { getRequestConfig } from "./RequestOptions"; +import { Project } from "./Projects"; +import { Angle } from "./helper/Angle"; + +/** Options for initializing Reality Data Client + * @beta + */ +export interface RealityDataClientOptions { + /** The authorization client to use to get access token to Context Share API (authority: https://ims.bentley.com ) + * When define it will ignore accessToken from API parameters and will get an access token from this client. + */ + authorizationClient?: AuthorizationClient; + /** API Version. v1 by default */ + version?: ApiVersion; + /** API Url. Used to select environment. Defaults to "https://api.bentley.com/reality-management" */ + baseUrl?: string; +} + +/** Available Reality Management API Versions */ +export enum ApiVersion { + v1, +} + +/** Criteria used to query for reality data associated with an iTwin context. + * @see getRealityDatas + * @beta + */ +export interface RealityDataQueryCriteria { + /** If supplied, only reality data overlapping this range will be included. */ + extent?: CartographicRange; + + /** If true, return all properties for every reality data found in query. + * If false or undefined, return a minimal representation containing id, displayName and type, along with a url to get full reality data details. */ + getFullRepresentation?: boolean; + + /** If supplied, queries a maximum number of first results Found. Max 500. If not supplied, the query should return the first 100 RealityData found.*/ + top?: number; + + /** Continuation token to get current query's next results.*/ + continuationToken?: string; + + /** Parameter that orders reality data in ascending or descending order. Default is ascending (asc). Can be used on any simple text, date or number property. Example : size desc */ + orderBy?: string; + + /** Searches the given text (case insensitive) in reality data's text properties, such as in Group, DisplayName, Description, RootDocument, Acquirer, Tags. */ + search?: string; + + /** Queries for reality data of specified types.*/ + types?: string[]; + + /** Queries for reality data in which the acquisition is in given date range.*/ + acquisitionDates?: DateRange; + + /** Queries for reality data where the creation date is in given date range.*/ + createdDateTime?: DateRange; + + /** Queries for reality data where the modification date is in given date range.*/ + modifiedDateTime?: DateRange; + + /** Queries for reality data where the last accessed date is in given date range.*/ + lastAccessedDateTime?: DateRange; + + /** Queries for reality data owned by a specific user.*/ + ownerId?: string; + + /** Queries for reality data stored in a specific data center.*/ + dataCenter?: string; + + /** Queries for reality data with exact matching tag.*/ + tag?: string; +} + +/** Date range*/ +export interface DateRange { + startDateTime: Date; + endDateTime: Date; +} + +/** + * Response object containing RealityData and continuation token + */ +export interface RealityDataResponse { + realityDatas: ITwinRealityData[]; + continuationToken?: string; +} + +/** + * Client wrapper to Reality Management API. + * An instance of this class is used to extract reality data from the Reality Management API. + * Most important methods enable to obtain a specific reality data, fetch all reality data associated with an iTwin and + * all reality data of an iTwin within a provided spatial extent. + * This class also implements extraction of the Azure blob address. + * @beta + */ +export class RealityDataAccessClient implements RealityDataAccess { + public readonly baseUrl: string = + "https://api.bentley.com/reality-management/reality-data"; + public readonly apiVersion: ApiVersion = ApiVersion.v1; + public readonly authorizationClient: AuthorizationClient | undefined = + undefined; + + /** + * Creates an instance of RealityDataAccessClient. + */ + public constructor(realityDataClientOptions?: RealityDataClientOptions) { + // runtime config + if (realityDataClientOptions) { + if (realityDataClientOptions.version) + this.apiVersion = realityDataClientOptions.version; + if (realityDataClientOptions.baseUrl) + this.baseUrl = this.setBaseUrl(realityDataClientOptions.baseUrl); + if (realityDataClientOptions.authorizationClient) + this.authorizationClient = realityDataClientOptions.authorizationClient; + } + } + + /** + * Ensures the reality data client points to Reality Management API, as many users hardcode the url to the deprecated Reality Data API. + * @param baseUrl base url given by users of this client + * @returns base url to Reality Management API + */ + private setBaseUrl(baseUrl: string): string { + const url = new URL(baseUrl); + switch (url.host) { + case "dev-api.bentley.com": + return "https://dev-api.bentley.com/reality-management/reality-data"; + case "qa-api.bentley.com": + return "https://qa-api.bentley.com/reality-management/reality-data"; + case "api.bentley.com": + return "https://api.bentley.com/reality-management/reality-data"; + default: + throw new Error("invalid host"); + } + } + + /** + * Try to use authorizationClient in RealityDataClientOptions to get the access token + * otherwise, will return the input token + * This is a workaround to support different authorization client for the reality data client and iTwin-core. + */ + private async resolveAccessToken(accessToken: AccessToken): Promise { + return this.authorizationClient + ? this.authorizationClient.getAccessToken() + : accessToken; + } + + /** + * This method returns the URL to obtain the Reality Data details. + * Technically it should never be required as the RealityData object returned should have all the information to obtain the + * data. + * @param iTwinId the iTwin identifier + * @param realityDataId realityData identifier + * @returns string containing the URL to reality data for indicated tile. + * @beta + */ + public async getRealityDataUrl( + iTwinId: string | undefined, + realityDataId: string, + ): Promise { + if (iTwinId) { + return `${this.baseUrl}/${realityDataId}?iTwinId=${iTwinId}`; + } + return `${this.baseUrl}/${realityDataId}`; + } + + /** + * Gets reality data with all of its properties + * @param accessToken The client request context. + * @param iTwinId id of associated iTwin (or project) + * @param realityDataId realityData identifier + * @returns The requested reality data. + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 404 when the specified reality data is not found + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async getRealityData( + accessToken: AccessToken, + iTwinId: string | undefined, + realityDataId: string, + ): Promise { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${await this.getRealityDataUrl(iTwinId, realityDataId)}`; + try { + const realityDataResponse = await axios.get( + url, + getRequestConfig(accessTokenResolved, "GET", url, this.apiVersion), + ); + + // Axios throws on 4XX and 5XX; we make sure the response here is 200 + if (realityDataResponse.status !== 200) + throw new BentleyError( + 422, + iTwinId + ? `Could not fetch reality data: ${realityDataId} with iTwinId ${iTwinId}` + : `Could not fetch reality data: ${realityDataId}`, + ); + + const realityData = new ITwinRealityData( + this, + realityDataResponse.data.realityData, + iTwinId, + ); + return realityData; + } catch (error) { + return this.handleError(error); + } + } + + /** + * Gets all reality data associated with the iTwin. + * @param accessToken The client request context. + * @param iTwinId id of associated iTwin + * @param criteria Criteria by which to query. + * @returns an array of RealityData that are associated to the iTwin. + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async getRealityDatas( + accessToken: AccessToken, + iTwinId: string | undefined, + criteria: RealityDataQueryCriteria | undefined, + ): Promise { + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = new URL(this.baseUrl); + + if (iTwinId) url.searchParams.append("iTwinId", iTwinId); + + if (criteria) { + if (criteria.continuationToken) { + url.searchParams.append( + "continuationToken", + criteria.continuationToken, + ); + } + + if (criteria.top) { + const top = criteria.top; + if (top > 500) { + throw new BentleyError( + 422, + "Maximum value for top parameter is 500.", + ); + } + url.searchParams.append("$top", top.toString()); + } + + if (criteria.extent) { + const iModelRange = criteria.extent.getLongitudeLatitudeBoundingBox(); + const extent = `${Angle.radiansToDegrees(iModelRange.low.x)},${Angle.radiansToDegrees(iModelRange.low.y)},${Angle.radiansToDegrees(iModelRange.high.x)},${Angle.radiansToDegrees(iModelRange.high.y)}`; + url.searchParams.append("extent", extent); + } + + if (criteria.orderBy) { + url.searchParams.append("$orderBy", criteria.orderBy); + } + + if (criteria.search) { + url.searchParams.append("$search", criteria.search); + } + + if (criteria.types) { + url.searchParams.append("types", criteria.types.join(",")); + } + + if (criteria.acquisitionDates) { + const startDateTime = this.formatIsoString( + criteria.acquisitionDates.startDateTime, + ); + const endDateTime = this.formatIsoString( + criteria.acquisitionDates.endDateTime, + ); + url.searchParams.append( + "acquisitionDateTime", + `${startDateTime}/${endDateTime}`, + ); + } + + if (criteria.createdDateTime) { + const startDateTime = this.formatIsoString( + criteria.createdDateTime.startDateTime, + ); + const endDateTime = this.formatIsoString( + criteria.createdDateTime.endDateTime, + ); + url.searchParams.append( + "createdDateTime", + `${startDateTime}/${endDateTime}`, + ); + } + + if (criteria.modifiedDateTime) { + const startDateTime = this.formatIsoString( + criteria.modifiedDateTime.startDateTime, + ); + const endDateTime = this.formatIsoString( + criteria.modifiedDateTime.endDateTime, + ); + url.searchParams.append( + "modifiedDateTime", + `${startDateTime}/${endDateTime}`, + ); + } + + if (criteria.lastAccessedDateTime) { + const startDateTime = this.formatIsoString( + criteria.lastAccessedDateTime.startDateTime, + ); + const endDateTime = this.formatIsoString( + criteria.lastAccessedDateTime.endDateTime, + ); + url.searchParams.append( + "lastAccessedDateTime", + `${startDateTime}/${endDateTime}`, + ); + } + + if (criteria.ownerId) { + url.searchParams.append("ownerId", criteria.ownerId); + } + + if (criteria.dataCenter) { + url.searchParams.append("dataCenter", criteria.dataCenter); + } + + if (criteria.tag) { + url.searchParams.append("tag", criteria.tag); + } + } + const response = await axios.get( + url.href, + getRequestConfig( + accessTokenResolved, + "GET", + url.href, + this.apiVersion, + criteria?.getFullRepresentation === true ? true : false, + ), + ); + // Axios throws on 4XX and 5XX; we make sure the response here is 200 + if (response.status !== 200) + throw new BentleyError( + 422, + iTwinId + ? `Could not fetch reality data with iTwinId ${iTwinId}` + : "Could not fetch reality data", + ); + + const realityDatasResponseBody = response.data; + + const realityDataResponse: RealityDataResponse = { + realityDatas: [], + continuationToken: this.extractContinuationToken( + response.data._links?.next?.href, + ), + }; + + realityDatasResponseBody.realityData.forEach((realityData: any) => { + realityDataResponse.realityDatas.push( + new ITwinRealityData(this, realityData, iTwinId), + ); + }); + + return realityDataResponse; + } catch (error) { + return this.handleError(error); + } + } + + /** + * trims milliseconds from date.toISOString() method to conform to for date parameters in the API. + * See https://developer.bentley.com/apis/reality-management/operations/get-all-reality-data/#request-parameters + * @param date date to format + * @returns dateTime string in format YYYY-MM-DDTHH:mm:ssZ e.g. 2021-08-01T00:00:00Z + */ + private formatIsoString(date: Date): string { + return `${date.toISOString().slice(0, -5)}Z`; + } + + private extractContinuationToken( + url: string | undefined, + ): string | undefined { + if (url) { + // API returns some case sensitive parameters e.g. "ContinuationToken". Therefore first, set parameters to lowercase + const searchParams = new URLSearchParams(url); + const newParams = new URLSearchParams(); + + for (const [name, value] of searchParams) { + newParams.append(name.toLowerCase(), value); + } + + // Then get continuation token value in case insensitive manner. + const token = newParams.get("continuationtoken"); + + return token ? token : undefined; + } + return undefined; + } + + /** + * Retrieves the list of Projects associated to the specified realityData. + * @deprecated in 1.0.1, getRealityDataProjects is deprecated and no longer used as Projects API is deprecated. Use getRealityDatasITwins method. + * @param accessToken The client request context. + * @param realityDataId realityData identifier + * @returns an array of Projects that are associated to the realityData. + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @beta + */ + public async getRealityDataProjects( + accessToken: AccessToken, + realityDataId: string, + ): Promise { + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${this.baseUrl}/${realityDataId}/itwins`; + const options = getRequestConfig( + accessTokenResolved, + "GET", + url, + this.apiVersion, + ); + + // execute query + const response = await axios.get(url, options); + + const projectsResponseBody = response.data; + + const projectsResponse: Project[] = []; + + // make up projects details link manually + const projectsBaseUrl = this.baseUrl.replace( + "/reality-management/reality-data", + "/projects", + ); + + projectsResponseBody.iTwins.forEach((itwinValue: any) => { + // build Project object with _links.self.href structure + const href = new URL(`${projectsBaseUrl}/${itwinValue}`); + const self = { + href, + }; + + const newProject = new Project({ + id: itwinValue, + // eslint-disable-next-line @typescript-eslint/naming-convention + _links: { + self, + }, + }); + + projectsResponse.push(newProject); + }); + + return projectsResponse; + } catch (error) { + return this.handleError(error); + } + } + + /** + * Retrieves the list of iTwins associated to the specified realityData. + * @param accessToken The client request context. + * @param realityDataId realityData identifier + * @returns an array of iTwin identifiers that are associated to the realityData. + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @beta + */ + public async getRealityDataITwins( + accessToken: AccessToken, + realityDataId: string, + ): Promise { + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${this.baseUrl}/${realityDataId}/itwins`; + const options = getRequestConfig( + accessTokenResolved, + "GET", + url, + this.apiVersion, + ); + + // execute query + const response = await axios.get(url, options); + + const iTwinsResponseBody = response.data; + + const iTwinsResponse: string[] = []; + + iTwinsResponseBody.iTwins.forEach((itwinValue: any) => { + iTwinsResponse.push(itwinValue); + }); + + return iTwinsResponse; + } catch (error) { + return this.handleError(error); + } + } + + /** + * Creates a RealityData + * @param accessToken The client request context. + * @param iTwinId id of associated iTwin + * @param iTwinRealityData the realityData to create + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 403 when user does not have required permissions to create a reality data + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async createRealityData( + accessToken: AccessToken, + iTwinId: string | undefined, + iTwinRealityData: ITwinRealityData, + ): Promise { + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = this.baseUrl; + const options = getRequestConfig( + accessTokenResolved, + "POST", + url, + this.apiVersion, + ); + + // creation payload + + const realityDataToCreate = { + displayName: iTwinRealityData.displayName, + classification: iTwinRealityData.classification, + type: iTwinRealityData.type, + iTwinId, + dataset: iTwinRealityData.dataset, + group: iTwinRealityData.group, + description: iTwinRealityData.description, + rootDocument: iTwinRealityData.rootDocument, + tags: iTwinRealityData.tags, + acquisition: iTwinRealityData.acquisition, + authoring: iTwinRealityData.authoring, + extent: iTwinRealityData.extent, + crs: iTwinRealityData.crs, + attribution: iTwinRealityData.attribution, + termsOfUse: iTwinRealityData.termsOfUse, + }; + + const response = await axios.post(url, realityDataToCreate, options); + iTwinRealityData = new ITwinRealityData( + this, + response.data.realityData, + iTwinId, + ); + } catch (error) { + return this.handleError(error); + } + + return iTwinRealityData; + } + + /** + * Modifies an existing RealityData + * @param accessToken The client request context. + * @param iTwinId id of associated iTwin + * @param iTwinRealityData the realityData to modify + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 404 when the specified reality data was not found + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async modifyRealityData( + accessToken: AccessToken, + iTwinId: string | undefined, + iTwinRealityData: ITwinRealityData, + ): Promise { + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = new URL(`${this.baseUrl}/${iTwinRealityData.id}`); + + const options = getRequestConfig( + accessTokenResolved, + "PATCH", + url.href, + this.apiVersion, + ); + + // payload + + const realityDataToModify = { + id: iTwinRealityData.id, + displayName: iTwinRealityData.displayName, + classification: iTwinRealityData.classification, + type: iTwinRealityData.type, + iTwinId, + dataset: iTwinRealityData.dataset, + group: iTwinRealityData.group, + description: iTwinRealityData.description, + rootDocument: iTwinRealityData.rootDocument, + tags: iTwinRealityData.tags, + acquisition: iTwinRealityData.acquisition, + authoring: iTwinRealityData.authoring, + extent: iTwinRealityData.extent, + crs: iTwinRealityData.crs, + attribution: iTwinRealityData.attribution, + termsOfUse: iTwinRealityData.termsOfUse, + }; + + const response = await axios.patch( + url.href, + realityDataToModify, + options, + ); + + iTwinRealityData = new ITwinRealityData( + this, + response.data.realityData, + iTwinId, + ); + } catch (error) { + return this.handleError(error); + } + + return iTwinRealityData; + } + + /** + * Deletes a RealityData + * @param accessToken The client request context. + * @param realityDataId the realityData to delete + * @returns true if successful (204 response), false if not + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 404 when the specified reality data was not found + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async deleteRealityData( + accessToken: AccessToken, + realityDataId: string, + ): Promise { + let response: AxiosResponse; + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${this.baseUrl}/${realityDataId}`; + const options = getRequestConfig( + accessTokenResolved, + "POST", + url, + this.apiVersion, + ); + + response = await axios.delete(url, options); + } catch (error) { + return this.handleError(error); + } + + if (response.status === 204) return true; + else return false; + } + + /** + * Associates a RealityData to an iTwin + * @param accessToken The client request context. + * @param iTwinId id of iTwin to associate the realityData to. + * @param realityDataId id of the RealityData. + * @returns true if successful (200 response) or false if not + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 404 when the specified reality data or iTwin was not found + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async associateRealityData( + accessToken: AccessToken, + iTwinId: string, + realityDataId: string, + ): Promise { + let response: AxiosResponse; + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${this.baseUrl}/${realityDataId}/iTwins/${iTwinId}`; + const options = getRequestConfig( + accessTokenResolved, + "POST", + url, + this.apiVersion, + ); + + response = await axios.post(url, undefined, options); + } catch (error) { + return this.handleError(error); + } + if (response.status === 200) return true; + else return false; + } + + /** + * Dissociates a RealityData from an iTwin + * @param accessToken The client request context. + * @param iTwinId id of iTwin to dissociate the realityData from. + * @param realityDataId id of the RealityData. + * @returns true if successful (204 response) or false if not + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 404 when the association between the reality data and iTwin was not found + * @throws [[BentleyError]] with code 422 when the request is invalid + * @beta + */ + public async dissociateRealityData( + accessToken: AccessToken, + iTwinId: string, + realityDataId: string, + ): Promise { + let response: AxiosResponse; + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${this.baseUrl}/${realityDataId}/iTwins/${iTwinId}`; + const options = getRequestConfig( + accessTokenResolved, + "DELETE", + url, + this.apiVersion, + ); + + response = await axios.delete(url, options); + } catch (error) { + return this.handleError(error); + } + if (response.status === 204) return true; + else return false; + } + + /** + * Moves a RealityData to a different iTwin + * @param accessToken The client request context. + * @param realityDataId The id of the RealityData to move. + * @param iTwinId The id of the iTwin to move the RealityData to. + * @returns true if successful (204 response) or false if not + * @throws [[BentleyError]] with code 401 when the request lacks valid authentication credentials + * @throws [[BentleyError]] with code 404 when the specified reality data or iTwin was not found + * @throws [[BentleyError]] with code 422 when the request is invalid + * @throws [[BentleyError]] with code 409 when the reality data is already associated with the specified iTwin + * @beta + */ + public async moveRealityData( + accessToken: AccessToken, + realityDataId: string, + iTwinId: string, + ): Promise { + let response: AxiosResponse; + try { + const accessTokenResolved = await this.resolveAccessToken(accessToken); + const url = `${this.baseUrl}/${realityDataId}/move`; + const options = getRequestConfig( + accessTokenResolved, + "PATCH", + url, + this.apiVersion, + ); + const payload = { iTwinId }; + + response = await axios.patch(url, payload, options); + } catch (error) { + return this.handleError(error); + } + if (response.status === 204) return true; + else return false; + } + + /** + * Handle errors thrown. + * Handled errors can be of AxiosError type or BentleyError. + * @beta + */ + private handleError(error: any): any { + // Default error + let status = 422; + let message = "Unknown error. Please ensure that the request is valid."; + + if (axios.isAxiosError(error) && error.response) { + const axiosResponse = error.response; + status = axiosResponse.status; + message = axiosResponse.data?.error?.message; + } else { + const bentleyError = error as BentleyError; + if (bentleyError !== undefined) { + status = bentleyError.errorNumber; + message = bentleyError.message; + } + } + return Promise.reject(new BentleyError(status, message)); + } +} diff --git a/typescript/packages/reality-data-client/src/RequestOptions.ts b/typescript/packages/reality-data-client/src/RequestOptions.ts new file mode 100644 index 00000000..916ddb8b --- /dev/null +++ b/typescript/packages/reality-data-client/src/RequestOptions.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +import type { AxiosRequestConfig, Method } from "axios"; +import { ApiVersion } from "./RealityDataClient"; + +/** + * Build the request methods, headers, and other options + * @param accessTokenString The client access token string + */ +export function getRequestConfig(accessTokenString: string, method: Method, url: string, apiVersion: ApiVersion, returnFullRepresentation: boolean = false): AxiosRequestConfig { + return { + url, + method, + headers: { + "authorization": accessTokenString, + "content-type": "application/json", + "accept": getApiVersionHeader(apiVersion), + "prefer": returnFullRepresentation === true ? "return=representation" : "return=minimal", + }, + }; +} + +function getApiVersionHeader(apiVersion: ApiVersion): string { + switch (apiVersion) { + case ApiVersion.v1: + default: return "application/vnd.bentley.itwin-platform.v1+json"; + } +} diff --git a/typescript/packages/reality-data-client/src/helper/Angle.ts b/typescript/packages/reality-data-client/src/helper/Angle.ts new file mode 100644 index 00000000..a4f8ff7c --- /dev/null +++ b/typescript/packages/reality-data-client/src/helper/Angle.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +/** + * Helper class for angle conversions. + * Copied from https://github.com/iTwin/itwinjs-core/blob/39a5daf889326f1dcf9d2c3d6149b517898960e7/core/geometry/src/geometry3d/Angle.ts + */ +export class Angle { + /** + * Convert an angle in radians to degrees. + * @param radians angle + */ + public static radiansToDegrees(radians: number): number { + if (radians < 0) + return -Angle.radiansToDegrees(-radians); + // Now radians is positive ... + const pi = Math.PI; + const factor = 180.0 / pi; + /* the following if statements are for round-off reasons. The problem is that no IEEE number is + * an exact hit for any primary multiple of pi (90, 180, etc). The following is supposed to have + * a better chance that if the input was computed by direct assignment from 90, 180, etc degrees + * it will return exactly 90,180 etc. + */ + if (radians <= 0.25 * pi) + return factor * radians; + if (radians < 0.75 * pi) + return 90.0 + 180 * ((radians - 0.5 * pi) / pi); + if (radians <= 1.25 * pi) + return 180.0 + 180 * ((radians - pi) / pi); + if (radians <= 1.75 * pi) + return 270.0 + 180 * ((radians - 1.5 * pi) / pi); + // all larger radians reference from 360 degrees (2PI) + return 360.0 + 180 * ((radians - 2.0 * pi) / pi); + } +} \ No newline at end of file diff --git a/typescript/packages/reality-data-client/src/reality-data-client.ts b/typescript/packages/reality-data-client/src/reality-data-client.ts new file mode 100644 index 00000000..703cd6d6 --- /dev/null +++ b/typescript/packages/reality-data-client/src/reality-data-client.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +export * from "./RealityDataClient"; +export * from "./RealityData"; +export * from "./Projects"; + +/** @docs-package-description + * The reality-data-client package contains client wrappers for sending requests to the Reality Management API. + */ + +/** + * @docs-group-description RealityData + * Classes for interacting with reality data. + */ diff --git a/typescript/packages/reality-data-client/src/test/TestConfig.ts b/typescript/packages/reality-data-client/src/test/TestConfig.ts new file mode 100644 index 00000000..da63621f --- /dev/null +++ b/typescript/packages/reality-data-client/src/test/TestConfig.ts @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ +import type { AccessToken } from "@itwin/core-bentley"; +import { getAccessTokenFromBackend, type TestUserCredentials, TestUsers } from "@itwin/oidc-signin-tool/lib/cjs/frontend"; + +/** Basic configuration used by all tests + */ +export class TestConfig { + // iTwin id used by tests + public static readonly integrationTestsITwinId: string = "614a3c70-cc9f-4de9-af87-f834002ca19e"; // iTwin name = "Integration tests for reality-data-client" + public static readonly integrationTestsITwinIdProjects: string = "84856374-51ed-4f13-a386-6721e01f87a3"; // iTwin name = "Integration tests for Reality Data Client 2" + /** Login the specified user and return the AuthorizationToken */ + public static async getAccessToken(user: TestUserCredentials = TestUsers.regular): Promise { + return getAccessTokenFromBackend(user); + } +} diff --git a/typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts b/typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts new file mode 100644 index 00000000..5fd3f2e3 --- /dev/null +++ b/typescript/packages/reality-data-client/src/test/integration/RealityDataClient.test.ts @@ -0,0 +1,1415 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ +import * as chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +import { + type AccessToken, + type GuidString, + Logger, + LogLevel, +} from "@itwin/core-bentley"; +import { CartographicRange, type RealityData } from "@itwin/core-common"; +import { Point3d, Range3d, Transform } from "@itwin/core-geometry"; + +import { + ApiVersion, + RealityDataAccessClient, + type RealityDataClientOptions, + type RealityDataQueryCriteria, +} from "../../RealityDataClient"; +import { TestConfig } from "../TestConfig"; +import { ITwinRealityData } from "../../RealityData"; + +async function delay(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +chai.config.showDiff = true; + +chai.should(); +chai.use(chaiAsPromised); + +const LOG_CATEGORY: string = "RealityDataClient.Test"; + +Logger.initializeToConsole(); +Logger.setLevel(LOG_CATEGORY, LogLevel.Info); + +const realityDataClientConfig: RealityDataClientOptions = { + version: ApiVersion.v1, + baseUrl: "https://api.bentley.com/reality-management/reality-data", +}; + +const realityDataAccessClientForTest = new RealityDataAccessClient( + realityDataClientConfig, +); + +describe("RealityServicesClient Normal (#integration)", () => { + const iTwinId: GuidString = TestConfig.integrationTestsITwinId; + const iTwinId2: GuidString = TestConfig.integrationTestsITwinIdProjects; + + const realityDataAccessClient = new RealityDataAccessClient(); + + let realityDataId: string; + let realityDataIdProjects: string; + + // test RealityData for listing tests. + const realityDataList: ITwinRealityData[] = []; + + let accessToken: AccessToken; + + before(async () => { + // get token + accessToken = await TestConfig.getAccessToken(); + + chai.assert.isDefined(iTwinId); + chai.assert.isDefined(iTwinId2); + + // create a test reality data + let rdTest = new ITwinRealityData( + realityDataAccessClient, + { + displayName: "iTwinjs reality-data-client test, can be deleted", + type: "3MX", + }, + iTwinId, + ); + rdTest = await realityDataAccessClient.createRealityData( + accessToken, + iTwinId, + rdTest, + ); + chai.assert(rdTest, "Failed to create test reality data"); + realityDataId = rdTest.id; + + // create a test reality data associated to both iTwins + let rdTestProjects = new ITwinRealityData( + realityDataAccessClient, + { + displayName: "iTwinjs reality-data-client projects, can be deleted", + type: "3MX", + }, + iTwinId, + ); + rdTestProjects = await realityDataAccessClient.createRealityData( + accessToken, + iTwinId, + rdTestProjects, + ); + await realityDataAccessClient.associateRealityData( + accessToken, + iTwinId2, + rdTestProjects.id, + ); + chai.assert(rdTestProjects, "Failed to create test reality data"); + + // create 10 reality data for listing tests + for (let i = 0; i < 10; i++) { + let rd = new ITwinRealityData( + realityDataAccessClient, + { + displayName: `iTwinjs reality-data-client listing test ${i}, can be deleted`, + type: "3MX", + }, + iTwinId, + ); + rd = await realityDataAccessClient.createRealityData( + accessToken, + iTwinId, + rd, + ); + chai.assert(rd, `Failed to create test reality data ${i}`); + realityDataList.push(rd); + } + + realityDataIdProjects = rdTestProjects.id; + }); + + after(async () => { + // delete the test reality data + const deleteResult1 = await realityDataAccessClient.deleteRealityData( + accessToken, + realityDataId, + ); + chai.assert(deleteResult1, "Failed to delete test reality data"); + + const dissociateResult = + await realityDataAccessClient.dissociateRealityData( + accessToken, + iTwinId2, + realityDataIdProjects, + ); + chai.assert(dissociateResult, "Failed to dissociate test reality data"); + const deleteResult2 = await realityDataAccessClient.deleteRealityData( + accessToken, + realityDataIdProjects, + ); + chai.assert(deleteResult2, "Failed to delete test reality data"); + + // delete the test reality data for listing tests + for (let i = 0; i < 10; i++) { + const deleteResult = await realityDataAccessClient.deleteRealityData( + accessToken, + realityDataList[i].id, + ); + chai.assert(deleteResult, `Failed to delete test reality data ${i}`); + } + }); + + it("should properly redirect configured URL to proper Reality Management API URL", async () => { + // dev + const realityDataClientConfigDev: RealityDataClientOptions = { + version: ApiVersion.v1, + baseUrl: "https://dev-api.bentley.com/realitydata", + }; + + const realityDataAccessClientDev = new RealityDataAccessClient( + realityDataClientConfigDev, + ); + chai.assert( + realityDataAccessClientDev.baseUrl === + "https://dev-api.bentley.com/reality-management/reality-data", + ); + + // qa + const realityDataClientConfigQa: RealityDataClientOptions = { + version: ApiVersion.v1, + baseUrl: "https://qa-api.bentley.com/www.someotherfakehost.com/", + }; + + const realityDataAccessClientQa = new RealityDataAccessClient( + realityDataClientConfigQa, + ); + chai.assert( + realityDataAccessClientQa.baseUrl === + "https://qa-api.bentley.com/reality-management/reality-data", + ); + + // prod + const realityDataClientConfigProd: RealityDataClientOptions = { + version: ApiVersion.v1, + baseUrl: "https://api.bentley.com/realitydata", + }; + + const realityDataAccessClientProd = new RealityDataAccessClient( + realityDataClientConfigProd, + ); + chai.assert( + realityDataAccessClientProd.baseUrl === + "https://api.bentley.com/reality-management/reality-data", + ); + + // error test + const realityDataClientConfigError: RealityDataClientOptions = { + version: ApiVersion.v1, + baseUrl: "https://evilwebsite.net", + }; + + try { + const _realityDataAccessClientError = new RealityDataAccessClient( + realityDataClientConfigError, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.message === "invalid host", + `Error message should be 'invalid host'. It is '${errorResponse.errorNumber}.`, + ); + return; + } + }); + + it("should return a RealityData URL properly from a given ID", async () => { + try { + // test with iTwinId + let realityDataUrl = await realityDataAccessClient.getRealityDataUrl( + iTwinId, + realityDataId, + ); + const expectedUrl = `${realityDataClientConfig.baseUrl}/${realityDataId}?iTwinId=${iTwinId}`; + chai.assert(realityDataUrl === expectedUrl); + + // test without iTwinId + realityDataUrl = await realityDataAccessClient.getRealityDataUrl( + undefined, + realityDataId, + ); + chai.assert( + realityDataUrl === + `${realityDataClientConfig.baseUrl}/${realityDataId}`, + ); + } catch (errorResponse: any) { + throw Error(`Test error: ${errorResponse}`); + } + }); + + it("should return a RealityData from a given ID", async () => { + try { + let realityData = await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + realityDataId, + ); + chai.assert(realityData); + chai.assert(realityData.id === realityDataId); + + // test without iTwinId + await delay(1000); + realityData = await realityDataAccessClientForTest.getRealityData( + accessToken, + undefined, + realityDataId, + ); + chai.assert(realityData); + chai.assert(realityData.id === realityDataId); + } catch (errorResponse: any) { + throw Error(`Test error: ${errorResponse}`); + } + }); + + it("should return a RealityData from a given ID and respect RealityDataAccessProps interfaces", async () => { + try { + const realityData: RealityData = + await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + realityDataId, + ); + chai.assert(realityData); + chai.assert(realityData.id === realityDataId); + } catch (errorResponse: any) { + throw Error(`Test error: ${errorResponse}`); + } + }); + + // TODO: remove once getRealityDataProjects method is removed in next major release + it("should be able to get project information from a RealityData", async () => { + // displayName: iTwinjs RealityData Client get projects test, id: d344d5ec-5068-4752-9432-ff1c8f087111 + const realityData = await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + realityDataIdProjects, + ); + + chai.assert(realityData); + // get all projects information + /* eslint-disable @typescript-eslint/no-deprecated */ + const projects = + await realityDataAccessClientForTest.getRealityDataProjects( + accessToken, + realityData.id, + ); + /* eslint-enable @typescript-eslint/no-deprecated */ + chai.assert(projects); + chai.assert(projects.length === 2); + projects.forEach((value) => { + chai.assert(value.id); + chai.assert(value.projectDetailsLink); + }); + }); + + it("should be able to get iTwin information from a RealityData", async () => { + // displayName: iTwinjs RealityData Client get projects test, id: d344d5ec-5068-4752-9432-ff1c8f087111 + const realityData = await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + realityDataIdProjects, + ); + + chai.assert(realityData); + // get all projects information + const projects = await realityDataAccessClientForTest.getRealityDataITwins( + accessToken, + realityData.id, + ); + chai.assert(projects); + chai.assert(projects.length === 2); + projects.forEach((value) => { + chai.assert(value); + }); + }); + + it("should be able to retrieve the azure blob url", async () => { + const realityData = await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + realityDataId, + ); + const url: URL = await realityData.getBlobUrl(accessToken, "test"); + chai.assert(url); + chai.assert(url.toString().includes("test")); + + // cache test, wait 1 second and make the same call again, url should be the same. + await delay(1000); + const fakeAccessToken = "fake"; // this ensures that we are not executing a request to the API for a new SAS url, otherwise it would fail + const url2: URL = await realityData.getBlobUrl(fakeAccessToken, "test"); + chai.assert(url.href === url2.href); + + // cache test, wait 1 second and request the same reality data with WRITE access, url should be different. + await delay(1000); + const url2Write: URL = await realityData.getBlobUrl( + accessToken, + "test", + true, + ); + chai.assert(url2.href !== url2Write.href); + + // test without iTwinId + await delay(1000); + + const realityData2 = await realityDataAccessClientForTest.getRealityData( + accessToken, + undefined, + realityDataId, + ); + const url3: URL = await realityData2.getBlobUrl(accessToken, "test"); + chai.assert(url3); + chai.assert(url3.toString().includes("test")); + }); + + it("should be able to retrieve reality data properties for every reality data associated with iTwin", async () => { + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + undefined, + ); + const realityDatas = realityDataResponse.realityDatas; + chai.assert(realityDatas); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + }); + }); + + it("should be able to retrieve reality data properties for every available realitydata", async () => { + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + undefined, + undefined, + ); + const realityDatas = realityDataResponse.realityDatas; + + chai.assert(realityDatas); + + realityDatas.forEach((value) => { + chai.assert(value.id); + chai.assert(value.type); + chai.assert(value.displayName); + }); + }); + + it("should query the first 10 reality data using the $top=10 parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + top: 10, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + const realityDatas = realityDataResponse.realityDatas; + chai.assert(realityDatas); + + chai.assert(realityDatas.length === 10); + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + }); + + // max results > 500 should fail. + const badRealityDataQueryCriteria: RealityDataQueryCriteria = { + top: 501, + }; + await chai + .expect( + realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + badRealityDataQueryCriteria, + ), + ) + .to.eventually.be.rejectedWith(Error); + }); + + it("should be able to query using continuationToken", async () => { + // get the first 5 + const realityDataQueryCriteria: RealityDataQueryCriteria = { + top: 5, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert(realityDatas); + + chai.assert(realityDatas.length === 5); + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + }); + + chai.assert(realityDataResponse.continuationToken); + + // get another 5 with continuation token + const realityDataQueryCriteriaContinuationToken: RealityDataQueryCriteria = + { + top: 5, + continuationToken: realityDataResponse.continuationToken, + }; + + const realityDataResponseContinuation = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteriaContinuationToken, + ); + + const realityDatasContinued = realityDataResponseContinuation.realityDatas; + chai.assert(realityDatasContinued); + + chai.assert(realityDatasContinued.length === 5); + realityDatasContinued.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + }); + + // test until no more continuation + const realityDataQueryUntilTheEnd: RealityDataQueryCriteria = { + top: 5, + continuationToken: realityDataResponseContinuation.continuationToken, + }; + + while (realityDataQueryUntilTheEnd.continuationToken) { + const realityDataResponseUntilTheEnd = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryUntilTheEnd, + ); + realityDataQueryUntilTheEnd.continuationToken = + realityDataResponseUntilTheEnd.continuationToken; + } + }); + + it("should query reality data using the $orderby parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + orderBy: "createdDateTime desc", + }; + + const realityDataResponse = await realityDataAccessClient.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert(realityDatas); + chai.assert( + realityDatas.length > 1, + "Expected at least two reality data results", + ); + + let lastCreatedTime = Number.MAX_SAFE_INTEGER; + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value?.createdDateTime); + chai.assert(value.createdDateTime.getTime() <= lastCreatedTime); + lastCreatedTime = value.createdDateTime.getTime(); + }); + }); + + it("should query reality data using the $search parameter with the search term: This is a fairly simple description.", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + search: "This is a fairly simple description.", + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with description 'This is a fairly simple description.'.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert( + value.description?.includes("This is a fairly simple description."), + ); + }); + }); + + it("should query reality data using the types parameter", async () => { + const types = ["3MX", "3SM"]; + const realityDataQueryCriteria: RealityDataQueryCriteria = { + top: 10, + types, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with types 3MX and 3SM.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value.type === "3MX" || value.type === "3SM"); + }); + }); + + it("should query reality data using the acquisitionDateTime parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + acquisitionDates: { + startDateTime: new Date(2017, 5, 12), + endDateTime: new Date(2023, 5, 12), + }, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with acquisition dates between 2017-05-12 and 2023-05-12.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value.acquisition); + chai.assert(value.acquisition?.startDateTime); + chai.assert( + value.acquisition?.startDateTime.getTime() >= + new Date(2017, 5, 12).getTime(), + ); + chai.assert( + value.acquisition?.startDateTime.getTime() <= + new Date(2023, 5, 12).getTime(), + ); + }); + }); + + it("should query reality data using the createdDateTime parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + createdDateTime: { + startDateTime: new Date(2021, 5, 12), + endDateTime: new Date(2022, 5, 12), + }, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with creation dates between 2021-05-12 and 2022-05-12.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value.createdDateTime); + chai.assert( + value.createdDateTime.getTime() >= new Date(2021, 5, 12).getTime(), + ); + chai.assert( + value.createdDateTime.getTime() <= new Date(2022, 5, 12).getTime(), + ); + }); + }); + + it("should query reality data using the modifiedDateTime parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + modifiedDateTime: { + startDateTime: new Date(2021, 0, 1), + endDateTime: new Date(2030, 0, 1), + }, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with modification dates between 2021-01-01 and 2030-01-01.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value.modifiedDateTime); + chai.assert( + value.modifiedDateTime.getTime() >= new Date(2021, 0, 1).getTime(), + ); + chai.assert( + value.modifiedDateTime.getTime() <= new Date(2030, 0, 1).getTime(), + ); + }); + }); + + it("should query reality data using the lastAccessedDateTime parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + lastAccessedDateTime: { + startDateTime: new Date(2021, 0, 1), + endDateTime: new Date(2030, 0, 1), + }, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with last accessed dates between 2021-01-01 and 2030-01-01.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value.lastAccessedDateTime); + chai.assert( + value.lastAccessedDateTime.getTime() >= new Date(2021, 0, 1).getTime(), + ); + chai.assert( + value.lastAccessedDateTime.getTime() <= new Date(2030, 0, 1).getTime(), + ); + }); + }); + + it("should query reality data using the ownerId parameter", async () => { + // Fetch one reality data to get its ownerId, then query by that ownerId + const referenceRd = await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + realityDataId, + ); + chai.assert( + referenceRd.ownerId, + "ownerId must be populated on a fetched reality data", + ); + + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + ownerId: referenceRd.ownerId, + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found when filtering by ownerId.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.id); + chai.assert(value.type); + chai.assert(value.ownerId === referenceRd.ownerId); + }); + }); + + it("should query reality data using the dataCenter parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + dataCenter: "East US", + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found in 'East US' data center. Please verify test reality data exists in that data center.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.id); + chai.assert(value.type); + chai.assert(value.dataCenterLocation === "East US"); + }); + }); + + it("should query reality data using the tag parameter", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + getFullRepresentation: true, + top: 10, + tag: "tag1", + }; + + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + const realityDatas = realityDataResponse.realityDatas; + chai.assert( + realityDatas && realityDatas.length > 0, + "No reality data found. Please verify test reality data exists with tag 'tag1'.", + ); + + realityDatas.forEach((value) => { + chai.assert(value.iTwinId === iTwinId); + chai.assert(value.type); + chai.assert(value.id); + chai.assert(value.tags); + chai.assert(value.tags.includes("tag1")); + }); + }); + + it("should be able to retrieve reality data properties for every reality data associated with iTwin within an extent", async () => { + // arrange + let rdWithExtent = new ITwinRealityData( + realityDataAccessClientForTest, + { + displayName: + "iTwinjs reality-data-client test with extent, can be deleted", + type: "3SM", + extent: { + southWest: { latitude: 40.6706, longitude: -80.3455 }, + northEast: { latitude: 40.6716, longitude: -80.3359 }, + }, + }, + iTwinId, + ); + rdWithExtent = await realityDataAccessClientForTest.createRealityData( + accessToken, + iTwinId, + rdWithExtent, + ); + chai.assert(rdWithExtent, "Failed to create test reality data"); + const rdWithExtentId = rdWithExtent.id; + + // act + const cornerSpatial = new Array(); + cornerSpatial.push(new Point3d(813907, -4775048, 4135438)); + cornerSpatial.push(new Point3d(814123, -4776318, 4135438)); + cornerSpatial.push(new Point3d(812222, -4776642, 4135438)); + cornerSpatial.push(new Point3d(812007, -4775372, 4135438)); + + const rdRange = Range3d.createArray(cornerSpatial); + const rdCartographicRange = new CartographicRange( + rdRange, + Transform.createIdentity(), + ); + + const realityDataQueryCriteria: RealityDataQueryCriteria = { + top: 10, + extent: rdCartographicRange, + }; + const realityDataResponse = + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + + // assert + chai.assert(realityDataResponse); + chai.assert( + realityDataResponse.realityDatas.length > 0, + "No reality data found. Please verify test reality data exists within the given extent.", + ); + chai.assert( + realityDataResponse.realityDatas.filter((rd) => rd.id === rdWithExtentId) + .length > 0, + ); + + // delete the test reality data + const deleteResult = await realityDataAccessClientForTest.deleteRealityData( + accessToken, + rdWithExtentId, + ); + chai.assert(deleteResult, "Failed to delete test reality data"); + }); + + it("should be able to create, modify, then delete a Reality Data", async () => { + // this test also serves as a property test. + const realityData = new ITwinRealityData(realityDataAccessClientForTest); + realityData.displayName = + "iTwinjs RealityData Client create and delete test"; + realityData.dataset = "Test Dataset for iTwinjs"; + realityData.group = "Test group"; + realityData.description = "Dummy description for a test reality data"; + realityData.attribution = "Attribution text"; + realityData.termsOfUse = "Terms of use text"; + realityData.rootDocument = "RootDocumentFile.txt"; + realityData.classification = "Undefined"; + realityData.type = "LAS"; + realityData.acquisition = { + startDateTime: new Date("2019-05-10T09:46:16Z"), + endDateTime: new Date("2019-05-10T09:46:16Z"), + acquirer: "John Doe Surveying using Leico model 123A Point Cloud Scanner", + }; + realityData.extent = { + southWest: { + latitude: 1.0, + longitude: 2.0, + }, + northEast: { + latitude: 1.1, + longitude: 2.1, + }, + }; + realityData.crs = { + id: "EPSG:4326", + verticalId: "EPSG:5773", + }; + realityData.tags = ["tag1", "tag2"]; + realityData.authoring = false; + + const realityDataAdded = + await realityDataAccessClientForTest.createRealityData( + accessToken, + iTwinId, + realityData, + ); + chai.assert(realityDataAdded.id); + chai.assert(realityDataAdded.displayName === realityData.displayName); + chai.assert(realityDataAdded.group === realityData.group); + chai.assert(realityDataAdded.dataset === realityData.dataset); + chai.assert(realityDataAdded.description === realityData.description); + chai.assert(realityDataAdded.attribution === realityData.attribution); + chai.assert(realityDataAdded.termsOfUse === realityData.termsOfUse); + chai.assert(realityDataAdded.rootDocument === realityData.rootDocument); + chai.assert(realityDataAdded.classification === realityData.classification); + chai.assert( + realityDataAdded.type?.toLowerCase() === realityData.type.toLowerCase(), + ); + + chai.assert( + realityDataAdded.acquisition?.acquirer === + realityData.acquisition.acquirer, + ); + chai.assert( + realityDataAdded.acquisition?.startDateTime.getTime() === + realityData.acquisition.startDateTime.getTime(), + ); + chai.assert(realityData.acquisition?.endDateTime); + chai.assert(realityDataAdded.acquisition?.endDateTime); + chai.assert( + realityDataAdded.acquisition.endDateTime.getTime() === + realityData.acquisition.endDateTime.getTime(), + ); + chai.assert(realityDataAdded.extent); + chai.assert(realityDataAdded.extent.southWest.latitude === 1.0); + chai.assert(realityDataAdded.extent.southWest.longitude === 2.0); + chai.assert(realityDataAdded.extent.northEast.latitude === 1.1); + chai.assert(realityDataAdded.extent.northEast.longitude === 2.1); + chai.assert(realityDataAdded.crs); + chai.assert(realityDataAdded.crs.id === "EPSG:4326"); + chai.assert(realityDataAdded.crs.verticalId === "EPSG:5773"); + + chai.assert(realityDataAdded.tags); + chai.assert(realityDataAdded.tags.includes("tag1")); + chai.assert(realityDataAdded.tags.includes("tag2")); + chai.assert(realityDataAdded.authoring === false); + chai.assert(realityDataAdded.dataCenterLocation === "East US"); + chai.assert(realityDataAdded.modifiedDateTime); + chai.assert(realityDataAdded.modifiedDateTime.getTime()); + chai.assert(realityDataAdded.lastAccessedDateTime); + chai.assert(realityDataAdded.lastAccessedDateTime.getTime()); + chai.assert(realityDataAdded.createdDateTime); + chai.assert(realityDataAdded.createdDateTime.getTime()); + chai.assert(realityDataAdded.ownerId); + + realityDataAdded.displayName = + "MODIFIED iTwinjs RealityData Client create and delete test"; + realityDataAdded.group = "MODIFIED Test group"; + realityDataAdded.dataset = "MODIFIED Test Dataset for iTwinjs"; + realityDataAdded.description = + "MODIFIED Dummy description for a test reality data"; + realityDataAdded.rootDocument = "MODIFIED RootDocumentFile.txt"; + realityDataAdded.classification = "Model"; + realityDataAdded.type = "LAZ"; + realityDataAdded.acquisition = { + startDateTime: new Date("2021-05-10T09:46:16Z"), + endDateTime: new Date("2021-05-10T10:46:16Z"), + acquirer: + "MODIFIED John Doe Surveying using Leico model 123A Point Cloud Scanner", + }; + realityDataAdded.extent = { + southWest: { latitude: 1.1, longitude: 2.0 }, + northEast: { latitude: 1.2, longitude: 2.1 }, + }; + realityDataAdded.tags = ["tag1", "tag2", "tag3"]; + realityDataAdded.crs = { + id: "EPSG:3857", + verticalId: "EPSG:5703", + }; + realityDataAdded.attribution = "MODIFIED Attribution text"; + realityDataAdded.termsOfUse = "MODIFIED Terms of use text"; + + const realityDataModified = + await realityDataAccessClientForTest.modifyRealityData( + accessToken, + iTwinId, + realityDataAdded, + ); + + chai.assert( + realityDataModified.displayName === realityDataAdded.displayName, + ); + chai.assert(realityDataModified.group === realityDataAdded.group); + chai.assert(realityDataModified.dataset === realityDataAdded.dataset); + chai.assert( + realityDataModified.description === realityDataAdded.description, + ); + chai.assert( + realityDataModified.rootDocument === realityDataAdded.rootDocument, + ); + chai.assert( + realityDataModified.classification === realityDataAdded.classification, + ); + chai.assert( + realityDataModified.type?.toLowerCase() === + realityDataAdded.type.toLowerCase(), + ); + chai.assert( + realityDataModified.acquisition?.acquirer === + realityDataAdded.acquisition.acquirer, + ); + chai.assert( + realityDataModified.acquisition?.startDateTime.getTime() === + realityDataAdded.acquisition.startDateTime.getTime(), + ); + chai.assert(realityDataModified.acquisition?.endDateTime); + chai.assert(realityDataAdded.acquisition?.endDateTime); + chai.assert( + realityDataModified.acquisition.endDateTime.getTime() === + realityDataAdded.acquisition.endDateTime.getTime(), + ); + chai.assert(realityDataModified.extent); + chai.assert(realityDataModified.extent.southWest.latitude === 1.1); + chai.assert(realityDataModified.extent.southWest.longitude === 2.0); + chai.assert(realityDataModified.extent.northEast.latitude === 1.2); + chai.assert(realityDataModified.extent.northEast.longitude === 2.1); + chai.assert(realityDataModified.crs); + chai.assert(realityDataModified.crs.id === realityDataAdded.crs.id); + chai.assert( + realityDataModified.crs.verticalId === realityDataAdded.crs.verticalId, + ); + chai.assert( + realityDataModified.attribution === realityDataAdded.attribution, + ); + chai.assert(realityDataModified.termsOfUse === realityDataAdded.termsOfUse); + chai.assert(realityDataModified.tags); + chai.assert(realityDataModified.tags.includes("tag1")); + chai.assert(realityDataModified.tags.includes("tag2")); + chai.assert(realityDataModified.tags.includes("tag3")); + + chai.assert( + await realityDataAccessClientForTest.deleteRealityData( + accessToken, + realityDataAdded.id, + ), + ); + }); + + it("should be able to create, associate, dissociate, and delete RealityData", async () => { + const realityData = new ITwinRealityData(realityDataAccessClientForTest); + realityData.displayName = + "iTwinjs RealityData Client associate and dissociate test"; + realityData.classification = "Undefined"; + realityData.type = "3MX"; + + const realityDataAdded = + await realityDataAccessClientForTest.createRealityData( + accessToken, + iTwinId, + realityData, + ); + + chai.assert( + await realityDataAccessClientForTest.associateRealityData( + accessToken, + iTwinId2, + realityDataAdded.id, + ), + ); + + chai.assert( + await realityDataAccessClientForTest.dissociateRealityData( + accessToken, + iTwinId2, + realityDataAdded.id, + ), + ); + + chai.assert( + await realityDataAccessClientForTest.deleteRealityData( + accessToken, + realityDataAdded.id, + ), + ); + }); + + it("should be able to create modify, and delete Reality Data, (Without iTwinId)", async () => { + const realityData = new ITwinRealityData(realityDataAccessClientForTest); + realityData.displayName = + "iTwinjs RealityData Client CRUD test without iTwinId"; + realityData.classification = "Undefined"; + realityData.type = "3MX"; + + // current test user belongs to no organization and needs a iTwin to create realityData. However, the modify without iTwinId can be tested. + const realityDataAdded = + await realityDataAccessClientForTest.createRealityData( + accessToken, + iTwinId, + realityData, + ); + + realityDataAdded.displayName = + "MODIFIED iTwinjs RealityData Client CRUD test without iTwinId"; + + const realityDataModified = + await realityDataAccessClientForTest.modifyRealityData( + accessToken, + undefined, + realityDataAdded, + ); + + chai.assert( + realityDataModified.displayName === realityDataAdded.displayName, + ); + + chai.assert( + await realityDataAccessClientForTest.deleteRealityData( + accessToken, + realityDataAdded.id, + ), + ); + }); + + it("should be able to move Reality Data", async () => { + const realityData = new ITwinRealityData(realityDataAccessClientForTest); + realityData.displayName = "iTwinjs RealityData Client move test"; + realityData.classification = "Undefined"; + realityData.type = "3MX"; + const realityDataAdded = + await realityDataAccessClientForTest.createRealityData( + accessToken, + iTwinId, + realityData, + ); + chai.assert(realityDataAdded.id); + try { + // move the reality data to another iTwin + const movedRealityData = + await realityDataAccessClientForTest.moveRealityData( + accessToken, + realityDataAdded.id, + iTwinId2, + ); + chai.assert(movedRealityData); + + // get itwins + const itwins = await realityDataAccessClientForTest.getRealityDataITwins( + accessToken, + realityDataAdded.id, + ); + chai.assert(itwins.length === 1); + chai.assert(itwins[0] === iTwinId2); + } finally { + // delete the moved reality data + chai.assert( + await realityDataAccessClientForTest.deleteRealityData( + accessToken, + realityDataAdded.id, + ), + ); + } + }); +}); + +describe("RealityServicesClient Errors (#integration)", () => { + let iTwinId: GuidString; + + const nonExistentRealityDataId: string = + "f2065aea-5dcd-49e2-9077-000000000000"; + + let accessToken: AccessToken; + + before(async () => { + accessToken = await TestConfig.getAccessToken(); + iTwinId = TestConfig.integrationTestsITwinId; + chai.assert.isDefined(iTwinId); + }); + + it("should throw a 422 error when Reality Data ID is not a valid Guid", async () => { + const rdId = "f2065aea-5dcd-49e2-9077-xxxxxxxxxxxx"; + try { + await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + rdId, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 422, + `Error code should be 422. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "getRealityData should throw an error."); + }); + + it("should throw a 404 error when Reality Data ID does not exist.", async () => { + try { + await realityDataAccessClientForTest.getRealityData( + accessToken, + iTwinId, + nonExistentRealityDataId, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 404, + `Error code should be 404. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "getRealityData should throw an error."); + }); + + it("should throw a 422 error when the iTwinId is invalid (getting all reality data in a iTwin)", async () => { + const invalidITwinId = "xxxxxxxx-cc9f-4de9-af87-f834002ca19e"; + try { + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + invalidITwinId, + undefined, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 422, + `Error message should be 422. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "getRealityDatas should throw an error."); + }); + + it("should throw a 422 error when the top parameter is > 500 (getting all reality data in a iTwin)", async () => { + const realityDataQueryCriteria: RealityDataQueryCriteria = { + top: 501, + }; + + try { + await realityDataAccessClientForTest.getRealityDatas( + accessToken, + iTwinId, + realityDataQueryCriteria, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 422, + `Error code should be 422. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert( + false, + "getRealityDatas should throw an error when top parameter is > 500.", + ); + }); + + it("should throw a 422 error when required properties are missing (creating a reality data)", async () => { + // displayName is missing + const realityData = new ITwinRealityData(realityDataAccessClientForTest); + realityData.dataset = "Test Dataset for iTwinjs"; + realityData.description = "Dummy description for a test reality data"; + realityData.type = "3MX"; + realityData.classification = "Undefined"; + try { + await realityDataAccessClientForTest.createRealityData( + accessToken, + iTwinId, + realityData, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 422, + `Error code should be 422. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "createRealityData should throw an error."); + }); + + it("should throw a 404 error when reality data id does not exist (modifying a reality data)", async () => { + const realityData = new ITwinRealityData(realityDataAccessClientForTest); + realityData.id = nonExistentRealityDataId; + realityData.displayName = "MODIFIED iTwinjs RealityData"; + realityData.dataset = "Test Dataset for iTwinjs"; + realityData.description = "Dummy description for a test reality data"; + realityData.type = "3MX"; + realityData.classification = "Undefined"; + try { + await realityDataAccessClientForTest.modifyRealityData( + accessToken, + iTwinId, + realityData, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 404, + `Error code should be 404. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "createRealityData should throw an error."); + }); + + it("should throw a 404 error when reality data id does not exist (deleting a reality data)", async () => { + try { + await realityDataAccessClientForTest.deleteRealityData( + accessToken, + nonExistentRealityDataId, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 404, + `Error code should be 404. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "deleteRealityData should throw an error."); + }); + + it("should throw a 404 error when reality data id does not exist (associate a reality data)", async () => { + try { + await realityDataAccessClientForTest.associateRealityData( + accessToken, + iTwinId, + nonExistentRealityDataId, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 404, + `Error code should be 404. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "associateRealityData should throw an error."); + }); + + it("should throw a 404 error when reality data id does not exist (dissociate a reality data)", async () => { + try { + await realityDataAccessClientForTest.dissociateRealityData( + accessToken, + iTwinId, + nonExistentRealityDataId, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 404, + `Error code should be 404. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "dissociateRealityData should throw an error."); + }); + + it("should throw a 404 error when reality data id does not exist (moving a reality data)", async () => { + try { + await realityDataAccessClientForTest.moveRealityData( + accessToken, + nonExistentRealityDataId, + iTwinId, + ); + } catch (errorResponse: any) { + chai.assert( + errorResponse.errorNumber === 404, + `Error code should be 404. It is ${errorResponse.errorNumber}.`, + ); + return; + } + chai.assert(false, "moveRealityData should throw an error."); + }); +}); diff --git a/typescript/packages/reality-data-client/src/test/utils/webpack.config.js b/typescript/packages/reality-data-client/src/test/utils/webpack.config.js new file mode 100644 index 00000000..c81e8015 --- /dev/null +++ b/typescript/packages/reality-data-client/src/test/utils/webpack.config.js @@ -0,0 +1,105 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ + +const path = require("path"); +const glob = require("glob"); +const webpack = require("webpack"); +const fs = require("fs"); + +/** Loads the provided `.env` file into process.env */ +function loadEnv(envFile) { + if (!fs.existsSync(envFile)) + return; + + const dotenv = require("dotenv"); + const dotenvExpand = require("dotenv-expand"); + const envResult = dotenv.config({ path: envFile }); + if (envResult.error) { + throw envResult.error; + } + + dotenvExpand(envResult); +} + +loadEnv(path.join(__dirname, "..", "..", "..", ".env")); + +const clientsLib = path.resolve(__dirname, "../../../lib/cjs"); + +function createConfig(shouldInstrument) { + const config = { + mode: "development", + entry: glob.sync(path.resolve(clientsLib, "test/**/*.test.js").replace(/\\/g, '/')), + output: { + path: path.resolve(clientsLib, "test/webpack/"), + filename: "bundled-tests.js", + devtoolModuleFilenameTemplate: "file:///[absolute-resource-path]" + }, + devtool: "nosources-source-map", + module: { + noParse: [ + // Don't parse draco_*_nodejs.js modules for `require` calls. There are + // requires for fs that cause it to fail even though the fs dependency + // is not used. + /draco_decoder_nodejs.js$/, + /draco_encoder_nodejs.js$/ + ], + rules: [ + { + test: /\.js$/, + use: "source-map-loader", + enforce: "pre" + }, + { + test: /azure-storage|AzureFileHandler|UrlFileHandler/, + use: "null-loader" + }, + ] + }, + stats: "errors-only", + optimization: { + nodeEnv: "production" + }, + externals: { + electron: "commonjs electron", + }, + plugins: [ + // Makes some environment variables available to the JS code, for example: + // if (process.env.NODE_ENV === "development") { ... }. See `./env.js`. + new webpack.DefinePlugin({ + "process.env": Object.keys(process.env) + .filter((key) => { + return key.match(/^imjs_/i); + }) + .reduce((env, key) => { + env[key] = JSON.stringify(process.env[key]); + return env; + }, {}), + }) + ], + target: 'web' + }; + + if (shouldInstrument) { + config.output.filename = "bundled-tests.instrumented.js"; + config.module.rules.push({ + test: /\.(jsx?|tsx?)$/, + include: clientsLib, + exclude: path.join(clientsLib, "test"), + loader: require.resolve("istanbul-instrumenter-loader"), + options: { + debug: true + }, + enforce: "post", + }); + } + + return config; +} + +// Exporting two configs in a array like this actually tells webpack to run twice - once for each config. +module.exports = [ + // createConfig(true), + createConfig(false) +] diff --git a/typescript/packages/reality-data-client/tsconfig.json b/typescript/packages/reality-data-client/tsconfig.json new file mode 100644 index 00000000..bb9af442 --- /dev/null +++ b/typescript/packages/reality-data-client/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@itwin/build-tools/tsconfig-base.json", + "compilerOptions": { + "strictPropertyInitialization": false, + "moduleResolution": "node", + "esModuleInterop": true, + "sourceMap": true, + }, + "include": ["./src/**/*.ts"], +} From 2567e0ebcb41a8b0414b65a69420407f6ca535ad Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:37:51 +0200 Subject: [PATCH 06/11] Fix typescript-ci yaml --- .github/workflows/typescript-ci.yaml | 40 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/typescript-ci.yaml b/.github/workflows/typescript-ci.yaml index 645ab3e9..8d3fddc3 100644 --- a/.github/workflows/typescript-ci.yaml +++ b/.github/workflows/typescript-ci.yaml @@ -25,24 +25,24 @@ jobs: os: ${{ matrix.os }} build_and_test_reality_data_client: - strategy: - matrix: - node-version: [22.x, 24.x, 26.x] - os: [windows-latest, ubuntu-latest, macos-latest] - fail-fast: false + strategy: + matrix: + node-version: [22.x, 24.x, 26.x] + os: [windows-latest, ubuntu-latest, macos-latest] + fail-fast: false - uses: ./.github/workflows/reality-data-client-build-and-test.yml - with: - node-version: ${{ matrix.node-version }} - os: ${{ matrix.os }} - secrets: - INTEGRATION_TESTS_PROJECT_ID: ${{ secrets.INTEGRATION_TESTS_PROJECT_ID }} - INTEGRATION_TESTS_CLIENT_ID: ${{ secrets.INTEGRATION_TESTS_CLIENT_ID }} - INTEGRATION_TESTS_SECRET: ${{ secrets.INTEGRATION_TESTS_SECRET }} - IMJS_OIDC_BROWSER_TEST_CLIENT_ID: ${{ secrets.IMJS_OIDC_BROWSER_TEST_CLIENT_ID }} - IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: ${{ secrets.IMJS_OIDC_BROWSER_TEST_REDIRECT_URI }} - IMJS_OIDC_BROWSER_TEST_SCOPES: ${{ secrets.IMJS_OIDC_BROWSER_TEST_SCOPES }} - IMJS_TEST_REGULAR_USER_NAME: ${{ secrets.IMJS_TEST_REGULAR_USER_NAME }} - IMJS_TEST_REGULAR_USER_PASSWORD: ${{ secrets.IMJS_TEST_REGULAR_USER_PASSWORD }} - IMJS_TEST_MANAGER_USER_NAME: ${{ secrets.IMJS_TEST_MANAGER_USER_NAME }} - IMJS_TEST_MANAGER_USER_PASSWORD: ${{ secrets.IMJS_TEST_MANAGER_USER_PASSWORD }} + uses: ./.github/workflows/reality-data-client-build-and-test.yml + with: + node-version: ${{ matrix.node-version }} + os: ${{ matrix.os }} + secrets: + INTEGRATION_TESTS_PROJECT_ID: ${{ secrets.INTEGRATION_TESTS_PROJECT_ID }} + INTEGRATION_TESTS_CLIENT_ID: ${{ secrets.INTEGRATION_TESTS_CLIENT_ID }} + INTEGRATION_TESTS_SECRET: ${{ secrets.INTEGRATION_TESTS_SECRET }} + IMJS_OIDC_BROWSER_TEST_CLIENT_ID: ${{ secrets.IMJS_OIDC_BROWSER_TEST_CLIENT_ID }} + IMJS_OIDC_BROWSER_TEST_REDIRECT_URI: ${{ secrets.IMJS_OIDC_BROWSER_TEST_REDIRECT_URI }} + IMJS_OIDC_BROWSER_TEST_SCOPES: ${{ secrets.IMJS_OIDC_BROWSER_TEST_SCOPES }} + IMJS_TEST_REGULAR_USER_NAME: ${{ secrets.IMJS_TEST_REGULAR_USER_NAME }} + IMJS_TEST_REGULAR_USER_PASSWORD: ${{ secrets.IMJS_TEST_REGULAR_USER_PASSWORD }} + IMJS_TEST_MANAGER_USER_NAME: ${{ secrets.IMJS_TEST_MANAGER_USER_NAME }} + IMJS_TEST_MANAGER_USER_PASSWORD: ${{ secrets.IMJS_TEST_MANAGER_USER_PASSWORD }} From 56e6b383f3ecc97f7e585c99ad6eeec86d913c36 Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:46:13 +0200 Subject: [PATCH 07/11] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../packages/reality-capture/src/service/reality_data.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/typescript/packages/reality-capture/src/service/reality_data.ts b/typescript/packages/reality-capture/src/service/reality_data.ts index 704646e2..9a02bef8 100644 --- a/typescript/packages/reality-capture/src/service/reality_data.ts +++ b/typescript/packages/reality-capture/src/service/reality_data.ts @@ -51,8 +51,7 @@ export enum Type { PLY = "PLY", PNTS = "PNTS", POD = "PointCloud", - REALITY_MESH_3D_Tiles = "RealityMesh3DTiles", - REFERENCE_MODEL = "ModelingReference", + REALITY_MESH_3D_TILES = "RealityMesh3DTiles", SLPK = "SLPK", SPACEYES = "SpaceEyes3D", SUPER_MAP = "SuperMap", From 7dcbed8e53289c687420712bd0884cdaa5681986 Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:47:28 +0200 Subject: [PATCH 08/11] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- typescript/packages/reality-capture/src/service/reality_data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/packages/reality-capture/src/service/reality_data.ts b/typescript/packages/reality-capture/src/service/reality_data.ts index 9a02bef8..aef9b279 100644 --- a/typescript/packages/reality-capture/src/service/reality_data.ts +++ b/typescript/packages/reality-capture/src/service/reality_data.ts @@ -131,7 +131,7 @@ export const RealityDataSchema = RealityDataBaseSchema.extend({ export type RealityData = z.infer; export const RealityDataUpdateSchema = RealityDataBaseSchema.extend({ - itwinId: z.string().optional().describe("Id of associated iTwin."), + iTwinId: z.string().optional().describe("Id of associated iTwin."), displayName: z.string().optional().describe("Name of the reality data."), type: z.nativeEnum(Type).optional().describe("A key indicating the format of the data."), }); From d37d6c336029d5e1eed633b4868e7b0dec0bae8d Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Fri, 3 Jul 2026 10:04:15 +0200 Subject: [PATCH 09/11] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- typescript/packages/reality-capture/src/service/reality_data.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typescript/packages/reality-capture/src/service/reality_data.ts b/typescript/packages/reality-capture/src/service/reality_data.ts index aef9b279..2f35c28e 100644 --- a/typescript/packages/reality-capture/src/service/reality_data.ts +++ b/typescript/packages/reality-capture/src/service/reality_data.ts @@ -190,7 +190,7 @@ export const RealityDataFilterSchema = z.object({ }); export type RealityDataFilter = z.infer; -export function realityDataFilterAsParams(filter: RealityDataFilter): Record { +export function realityDataFilterAsParams(filter: RealityDataFilter): Record { const params: Record = Object.fromEntries( Object.entries(filter).filter(([, v]) => v !== undefined) ); From 2acd1a12af7a68513916c42a87abe752f91dbabc Mon Sep 17 00:00:00 2001 From: dbiguenet <110406974+dbiguenet@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:55:43 +0200 Subject: [PATCH 10/11] Remove reality capture changelog --- .../packages/reality-capture/CHANGELOG.json | 155 ------------------ .../packages/reality-capture/CHANGELOG.md | 74 --------- 2 files changed, 229 deletions(-) delete mode 100644 typescript/packages/reality-capture/CHANGELOG.json delete mode 100644 typescript/packages/reality-capture/CHANGELOG.md diff --git a/typescript/packages/reality-capture/CHANGELOG.json b/typescript/packages/reality-capture/CHANGELOG.json deleted file mode 100644 index 789cdd7a..00000000 --- a/typescript/packages/reality-capture/CHANGELOG.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "name": "@itwin/reality-capture", - "entries": [ - { - "date": "Fri, 26 Jun 2026 11:34:21 GMT", - "version": "1.5.2", - "tag": "@itwin/reality-capture_v1.5.2", - "comments": { - "patch": [ - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "dafc2ce3626cfed7e9e2fca323c314091c85c325", - "comment": "Add ROI input in gaussian splats" - } - ] - } - }, - { - "date": "Thu, 18 Jun 2026 17:24:16 GMT", - "version": "1.5.1", - "tag": "@itwin/reality-capture_v1.5.1", - "comments": { - "patch": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "12c46cd59dcd9109f5bade79c0611f4c4107c764", - "comment": "Security fixes + upgrades for RDC/RC TS packages" - } - ] - } - }, - { - "date": "Fri, 12 Jun 2026 11:03:07 GMT", - "version": "1.5.0", - "tag": "@itwin/reality-capture_v1.5.0", - "comments": { - "minor": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "c4ac1c5ae40a0680d016a5be3d0cd4a4f12be6e3", - "comment": "Update reality data client" - }, - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "248facfc73948a880447beca75f20da503f4179f", - "comment": "Add detectors endpoints" - }, - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "aa4b54a50b7c84331bc1049a0639fde5c82028fe", - "comment": "Add new exports and options for Modeling" - } - ] - } - }, - { - "date": "Tue, 07 Apr 2026 16:18:12 GMT", - "version": "1.4.1", - "tag": "@itwin/reality-capture_v1.4.1", - "comments": { - "patch": [ - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "b8c779585763702b075a6ab192860c9ffab85e9e", - "comment": "Fix API calls" - }, - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "a8f582ff1c0a7bc14aecd8b8d336b7a05e6f39bf", - "comment": "Add checkerboards option" - } - ] - } - }, - { - "date": "Tue, 07 Apr 2026 11:47:07 GMT", - "version": "1.4.0", - "tag": "@itwin/reality-capture_v1.4.0", - "comments": { - "minor": [ - { - "author": "110406974+dbiguenet@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "fb1ec03518461ee1412a2f7b5616bf57b91293c6", - "comment": "Add gaussian splats LOD support" - } - ] - } - }, - { - "date": "Mon, 02 Mar 2026 13:47:36 GMT", - "version": "1.3.0", - "tag": "@itwin/reality-capture_v1.3.0", - "comments": { - "minor": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "18ef4e6671ab1a5243d1615c00efa615cc4ff555", - "comment": "Add clearance job support" - }, - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "7b9adbd4a7de0183a76a460b926bf2a697e4bc52", - "comment": "Add Crs Data support for Modeling Jobs" - } - ] - } - }, - { - "date": "Thu, 22 Jan 2026 09:03:10 GMT", - "version": "1.1.0", - "tag": "@itwin/reality-capture_v1.1.0", - "comments": { - "minor": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "e10fe6e0351b8a7ea2e6c4391d2c5d729c915a27", - "comment": "Merge 2.1.0 in main for release" - }, - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "8637d6c2027d6a46fcb862195b0f281511546fbf", - "comment": "Add get jobs to SDK" - } - ] - } - }, - { - "date": "Wed, 26 Nov 2025 10:46:48 GMT", - "version": "1.0.0", - "tag": "@itwin/reality-capture_v1.0.0", - "comments": { - "major": [ - { - "author": "5690282+cnovel@users.noreply.github.com", - "package": "@itwin/reality-capture", - "commit": "6d8b25b91b040cc23f648e48fa6d494a54673642", - "comment": "New SDKs for Modeling Service" - } - ] - } - } - ] -} diff --git a/typescript/packages/reality-capture/CHANGELOG.md b/typescript/packages/reality-capture/CHANGELOG.md deleted file mode 100644 index d87985a1..00000000 --- a/typescript/packages/reality-capture/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -# Change Log - @itwin/reality-capture - - - - - -## 1.5.2 - -Fri, 26 Jun 2026 11:34:21 GMT - -### Patches - -- Add ROI input in gaussian splats (110406974+dbiguenet@users.noreply.github.com) - -## 1.5.1 - -Thu, 18 Jun 2026 17:24:16 GMT - -### Patches - -- Security fixes + upgrades for RDC/RC TS packages (5690282+cnovel@users.noreply.github.com) - -## 1.5.0 - -Fri, 12 Jun 2026 11:03:07 GMT - -### Minor changes - -- Update reality data client (5690282+cnovel@users.noreply.github.com) -- Add detectors endpoints (110406974+dbiguenet@users.noreply.github.com) -- Add new exports and options for Modeling (110406974+dbiguenet@users.noreply.github.com) - -## 1.4.1 - -Tue, 07 Apr 2026 16:18:12 GMT - -### Patches - -- Fix API calls (110406974+dbiguenet@users.noreply.github.com) -- Add checkerboards option (110406974+dbiguenet@users.noreply.github.com) - -## 1.4.0 - -Tue, 07 Apr 2026 11:47:07 GMT - -### Minor changes - -- Add gaussian splats LOD support (110406974+dbiguenet@users.noreply.github.com) - -## 1.3.0 - -Mon, 02 Mar 2026 13:47:36 GMT - -### Minor changes - -- Add clearance job support (5690282+cnovel@users.noreply.github.com) -- Add Crs Data support for Modeling Jobs (5690282+cnovel@users.noreply.github.com) - -## 1.1.0 - -Thu, 22 Jan 2026 09:03:10 GMT - -### Minor changes - -- Merge 2.1.0 in main for release (5690282+cnovel@users.noreply.github.com) -- Add get jobs to SDK (5690282+cnovel@users.noreply.github.com) - -## 1.0.0 - -Wed, 26 Nov 2025 10:46:48 GMT - -### Major changes - -- New SDKs for Modeling Service (5690282+cnovel@users.noreply.github.com) From cea52ac32b4f0f6b8d7d997d0e624c92d9a2e058 Mon Sep 17 00:00:00 2001 From: Cyril <5690282+cnovel@users.noreply.github.com> Date: Thu, 16 Jul 2026 14:22:03 +0200 Subject: [PATCH 11/11] Remove axios dependency (#319) --- .../reality-capture/package-lock.json | 300 +--- .../packages/reality-capture/package.json | 1 - .../packages/reality-capture/pnpm-lock.yaml | 289 +--- .../reality-capture/src/service/service.ts | 150 +- .../src/tests/service/reality_data.test.ts | 221 ++- .../src/tests/service/service.test.ts | 1346 ++++++++--------- .../src/tests/service/test_helpers.ts | 17 + 7 files changed, 861 insertions(+), 1463 deletions(-) create mode 100644 typescript/packages/reality-capture/src/tests/service/test_helpers.ts diff --git a/typescript/packages/reality-capture/package-lock.json b/typescript/packages/reality-capture/package-lock.json index 552d9560..1b9a05c9 100644 --- a/typescript/packages/reality-capture/package-lock.json +++ b/typescript/packages/reality-capture/package-lock.json @@ -1,17 +1,15 @@ { "name": "@itwin/reality-capture", - "version": "1.6.0", + "version": "2.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@itwin/reality-capture", - "version": "1.6.0", + "version": "2.0.0", "license": "MIT", "dependencies": { "@azure/storage-blob": "^12.15.0", - "@itwin/reality-data-client": "^1.5.0", - "axios": "^1.18.0", "class-validator": "^0.14.0", "zod": "^3.22.2" }, @@ -1003,6 +1001,7 @@ "version": "5.11.2", "resolved": "https://registry.npmjs.org/@itwin/core-bentley/-/core-bentley-5.11.2.tgz", "integrity": "sha512-KljHK348zH1HCowm66MZi4PLl7Nas6iHJoxLjfsUmhtEpRr99zuEISkETRainUggDXYmz5CSJhM1ndias1ldAA==", + "dev": true, "license": "MIT" }, "node_modules/@itwin/core-common": { @@ -1032,18 +1031,6 @@ "flatbuffers": "~1.12.0" } }, - "node_modules/@itwin/reality-data-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@itwin/reality-data-client/-/reality-data-client-1.5.1.tgz", - "integrity": "sha512-QmMP5oK6oIrqOH8Pq56rqLI+QSRQpuDlV2nB3yLNGgfBhgrSSMPeKjbUJ5nzAfPE7HO3r5n5Z854grCdfPBz8w==", - "license": "MIT", - "dependencies": { - "axios": "^1.18.0" - }, - "peerDependencies": { - "@itwin/core-bentley": "^4.0.0 || ^5.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2004,49 +1991,6 @@ "node": ">=12" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/axios/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/axios/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -2153,19 +2097,6 @@ "node": ">=8" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2366,18 +2297,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2574,15 +2493,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/diff": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", @@ -2619,20 +2529,6 @@ "node": ">=6.0.0" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2667,51 +2563,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -3295,26 +3156,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -3332,22 +3173,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", - "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -3395,6 +3220,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3420,30 +3246,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3454,19 +3256,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -3584,18 +3373,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3620,33 +3397,6 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -3678,6 +3428,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4503,15 +4254,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -4555,27 +4297,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "10.2.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", @@ -5369,15 +5090,6 @@ "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/typescript/packages/reality-capture/package.json b/typescript/packages/reality-capture/package.json index 8a8dbb05..fbc6c98d 100644 --- a/typescript/packages/reality-capture/package.json +++ b/typescript/packages/reality-capture/package.json @@ -53,7 +53,6 @@ "license": "MIT", "dependencies": { "@azure/storage-blob": "^12.15.0", - "axios": "^1.18.0", "class-validator": "^0.14.0", "zod": "^3.22.2" }, diff --git a/typescript/packages/reality-capture/pnpm-lock.yaml b/typescript/packages/reality-capture/pnpm-lock.yaml index 70518aee..f6072f51 100644 --- a/typescript/packages/reality-capture/pnpm-lock.yaml +++ b/typescript/packages/reality-capture/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: '@azure/storage-blob': specifier: ^12.15.0 version: 12.32.0 - axios: - specifier: ^1.18.0 - version: 1.18.0 class-validator: specifier: ^0.14.0 version: 0.14.4 @@ -23,7 +20,7 @@ importers: devDependencies: '@itwin/build-tools': specifier: ^5.0.0 - version: 5.10.0(@types/node@20.19.42) + version: 5.10.0(@types/node@20.19.42)(supports-color@8.1.1) '@itwin/core-bentley': specifier: ^5.0.0 version: 5.10.0 @@ -44,22 +41,22 @@ importers: version: 17.0.4 '@typescript-eslint/eslint-plugin': specifier: ^6.0.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^6.0.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) + version: 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) chai: specifier: ^6.0.0 version: 6.2.2 eslint: specifier: ^8.52.0 - version: 8.57.1 + version: 8.57.1(supports-color@8.1.1) mocha: specifier: ^11.0.0 version: 11.7.6 nyc: specifier: ^17.0.0 - version: 17.1.0 + version: 17.1.0(supports-color@8.1.1) rimraf: specifier: ^4.4.1 version: 4.4.1 @@ -495,10 +492,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -569,12 +562,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.18.0: - resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -613,10 +600,6 @@ packages: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -672,10 +655,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -731,10 +710,6 @@ packages: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - diff@4.0.4: resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} @@ -755,10 +730,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -775,22 +746,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} @@ -908,15 +867,6 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.16.0: - resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -925,10 +875,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} @@ -954,18 +900,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1004,10 +942,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1018,14 +952,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hasha@5.2.2: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} @@ -1045,10 +971,6 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -1268,10 +1190,6 @@ packages: resolution: {integrity: sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==} hasBin: true - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} @@ -1286,14 +1204,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - minimatch@10.2.3: resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} engines: {node: 18 || 20 || >=22} @@ -1458,10 +1368,6 @@ packages: resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} - proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} - punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -1968,7 +1874,7 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -1977,7 +1883,7 @@ snapshots: '@babel/helpers': 7.29.7 '@babel/parser': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 @@ -2008,17 +1914,17 @@ snapshots: '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -2043,7 +1949,7 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -2064,14 +1970,14 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1(supports-color@8.1.1))': dependencies: - eslint: 8.57.1 + eslint: 8.57.1(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': dependencies: ajv: 6.15.0 debug: 4.4.3(supports-color@8.1.1) @@ -2095,7 +2001,7 @@ snapshots: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@humanwhocodes/config-array@0.13.0': + '@humanwhocodes/config-array@0.13.0(supports-color@8.1.1)': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.3(supports-color@8.1.1) @@ -2126,7 +2032,7 @@ snapshots: '@istanbuljs/schema@0.1.6': {} - '@itwin/build-tools@5.10.0(@types/node@20.19.42)': + '@itwin/build-tools@5.10.0(@types/node@20.19.42)(supports-color@8.1.1)': dependencies: '@microsoft/api-extractor': 7.58.7(@types/node@20.19.42) chalk: 3.0.0 @@ -2135,11 +2041,11 @@ snapshots: fs-extra: 8.1.0 glob: 10.5.0 mocha: 11.7.6 - mocha-junit-reporter: 2.2.1(mocha@11.7.6) + mocha-junit-reporter: 2.2.1(mocha@11.7.6)(supports-color@8.1.1) rimraf: 6.1.3 tree-kill: 1.2.2 typedoc: 0.28.19(typescript@5.6.3) - typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.9.3)) + typedoc-plugin-merge-modules: 7.0.0(typedoc@0.28.19(typescript@5.6.3)) typescript: 5.6.3 wtfnode: 0.9.4 yargs: 17.7.2 @@ -2350,16 +2256,16 @@ snapshots: '@types/validator@13.15.10': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 8.57.1(supports-color@8.1.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -2370,14 +2276,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.9.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 8.57.1(supports-color@8.1.1) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -2388,12 +2294,12 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1(supports-color@8.1.1))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 + eslint: 8.57.1(supports-color@8.1.1) ts-api-utils: 1.4.3(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -2402,7 +2308,7 @@ snapshots: '@typescript-eslint/types@6.21.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@6.21.0(supports-color@8.1.1)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 @@ -2417,15 +2323,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1(supports-color@8.1.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/typescript-estree': 6.21.0(supports-color@8.1.1)(typescript@5.9.3) + eslint: 8.57.1(supports-color@8.1.1) semver: 7.8.2 transitivePeerDependencies: - supports-color @@ -2456,12 +2362,6 @@ snapshots: acorn@8.16.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - agent-base@7.1.4: {} aggregate-error@3.1.0: @@ -2519,18 +2419,6 @@ snapshots: assertion-error@2.0.1: {} - asynckit@0.4.0: {} - - axios@1.18.0: - dependencies: - follow-redirects: 1.16.0 - form-data: 4.0.5 - https-proxy-agent: 5.0.1 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - - supports-color - balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -2571,11 +2459,6 @@ snapshots: package-hash: 4.0.0 write-file-atomic: 3.0.3 - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - callsites@3.1.0: {} camelcase@5.3.1: {} @@ -2628,10 +2511,6 @@ snapshots: color-name@1.1.4: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commondir@1.0.1: {} concat-map@0.0.1: {} @@ -2680,8 +2559,6 @@ snapshots: dependencies: strip-bom: 4.0.0 - delayed-stream@1.0.0: {} - diff@4.0.4: {} diff@7.0.0: {} @@ -2696,12 +2573,6 @@ snapshots: dependencies: esutils: 2.0.3 - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - eastasianwidth@0.2.0: {} electron-to-chromium@1.5.368: {} @@ -2712,21 +2583,8 @@ snapshots: entities@4.5.0: {} - es-define-property@1.0.1: {} - es-errors@1.3.0: {} - es-object-atoms@1.1.2: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.4 - es6-error@4.1.1: {} escalade@3.2.0: {} @@ -2740,13 +2598,13 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint@8.57.1(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 + '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/config-array': 0.13.0(supports-color@8.1.1) '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.3.1 @@ -2876,8 +2734,6 @@ snapshots: flatted@3.4.2: {} - follow-redirects@1.16.0: {} - foreground-child@2.0.0: dependencies: cross-spawn: 7.0.6 @@ -2888,14 +2744,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.4 - mime-types: 2.1.35 - fromentries@1.3.2: {} fs-extra@11.3.5: @@ -2918,26 +2766,8 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.2 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.4 - math-intrinsics: 1.1.0 - get-package-type@0.1.0: {} - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.2 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2994,20 +2824,12 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.2.0: {} - graceful-fs@4.2.11: {} graphemer@1.4.0: {} has-flag@4.0.0: {} - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - hasha@5.2.2: dependencies: is-stream: 2.0.1 @@ -3028,13 +2850,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -3100,9 +2915,9 @@ snapshots: dependencies: append-transform: 2.0.0 - istanbul-lib-instrument@6.0.3: + istanbul-lib-instrument@6.0.3(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.7 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 @@ -3125,7 +2940,7 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@4.0.1(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 @@ -3242,8 +3057,6 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - math-intrinsics@1.1.0: {} - md5@2.3.0: dependencies: charenc: 0.0.2 @@ -3259,12 +3072,6 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - minimatch@10.2.3: dependencies: brace-expansion: 5.0.6 @@ -3297,7 +3104,7 @@ snapshots: mkdirp@3.0.1: {} - mocha-junit-reporter@2.2.1(mocha@11.7.6): + mocha-junit-reporter@2.2.1(mocha@11.7.6)(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) md5: 2.3.0 @@ -3342,7 +3149,7 @@ snapshots: node-releases@2.0.47: {} - nyc@17.1.0: + nyc@17.1.0(supports-color@8.1.1): dependencies: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.6 @@ -3356,10 +3163,10 @@ snapshots: glob: 7.2.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 6.0.3 + istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) istanbul-lib-processinfo: 2.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 + istanbul-lib-source-maps: 4.0.1(supports-color@8.1.1) istanbul-reports: 3.2.0 make-dir: 3.1.0 node-preload: 0.2.1 @@ -3460,8 +3267,6 @@ snapshots: dependencies: fromentries: 1.3.2 - proxy-from-env@2.1.0: {} - punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -3658,7 +3463,7 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.9.3)): + typedoc-plugin-merge-modules@7.0.0(typedoc@0.28.19(typescript@5.6.3)): dependencies: typedoc: 0.28.19(typescript@5.6.3) diff --git a/typescript/packages/reality-capture/src/service/service.ts b/typescript/packages/reality-capture/src/service/service.ts index 43ae8c1e..18d3e02c 100644 --- a/typescript/packages/reality-capture/src/service/service.ts +++ b/typescript/packages/reality-capture/src/service/service.ts @@ -1,4 +1,3 @@ -import axios, { AxiosInstance } from "axios"; import type { AuthorizationClient } from "@itwin/core-common"; import { BucketResponse } from "./bucket"; import { @@ -26,7 +25,6 @@ import { ContainerDetails, Prefer, RealityData, RealityDataCreate, RealityDataFi export class RealityCaptureService { private _authorizationClient: AuthorizationClient; - private _axios: AxiosInstance; private _serviceUrl: string; private _additionalUserAgent: string; @@ -35,7 +33,6 @@ export class RealityCaptureService { kwargs?: { env?: string; user_agent?: string }, ) { this._authorizationClient = authorizationClient; - this._axios = axios.create(); const env = kwargs?.env; if (env === "qa") { this._serviceUrl = "https://qa-api.bentley.com/"; @@ -88,6 +85,77 @@ export class RealityCaptureService { return `Service response is ill-formed: ${JSON.stringify(response.data)}. Exception: ${exception}`; } + private _buildUrl(url: string, params?: Record): string { + if (!params) { + return url; + } + const searchParams = new URLSearchParams(); + for (const [key, value] of Object.entries(params)) { + if (value === undefined || value === null) { + continue; + } + if (Array.isArray(value)) { + // Match axios' default params serialization: repeat the key for each + // array element (e.g. types=LAS&types=E57) instead of comma-joining. + for (const item of value) { + if (item !== undefined && item !== null) { + searchParams.append(key, String(item)); + } + } + } else { + searchParams.append(key, String(value)); + } + } + const queryString = searchParams.toString(); + if (!queryString) { + return url; + } + return url + (url.includes("?") ? "&" : "?") + queryString; + } + + private async _parseBody(response: globalThis.Response): Promise { + const text = await response.text(); + if (!text) { + return null; + } + try { + return JSON.parse(text); + } catch { + return text; + } + } + + /** + * Thin wrapper around the native fetch API used by every service call. + * Mirrors the shape previously relied upon from HTTP client responses/errors so + * that `_handleError` can stay unchanged: on success it returns + * `{ status, data }`; on a non-2xx HTTP response it throws + * `{ response: { status, data } }`. + */ + private async _request( + method: "GET" | "POST" | "PATCH" | "DELETE", + url: string, + options?: { params?: Record; headers?: Record; body?: any }, + ): Promise<{ status: number; data: any }> { + const finalUrl = this._buildUrl(url, options?.params); + const init: RequestInit = { + method, + headers: options?.headers, + }; + if (options?.body !== undefined) { + init.body = JSON.stringify(options.body); + } + + const response = await fetch(finalUrl, init); + const data = await this._parseBody(response); + + if (!response.ok) { + throw { response: { status: response.status, data } }; + } + + return { status: response.status, data }; + } + async getJobs( service: Service, filters: string, @@ -96,7 +164,7 @@ export class RealityCaptureService { ): Promise> { const url = this._getCorrectUrl(service); try { - const resp = await this._axios.get(url + "/jobs", { + const resp = await this._request("GET", url + "jobs", { params: { $filter: filters, $top: top, continuationToken }, headers: await this._getHeader("v2"), }); @@ -109,9 +177,7 @@ export class RealityCaptureService { async submitJob(job: JobCreate): Promise> { const url = this._getCorrectUrl(getAppropriateService(job.type)); try { - const resp = await this._axios.post(url + "/jobs", job, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url + "jobs", { body: job, headers: await this._getHeader("v2") }); return new Response(resp.status, null, resp.data.job as Job); } catch (error: any) { return this._handleError(error); @@ -121,7 +187,7 @@ export class RealityCaptureService { async getJob(jobId: string, service: Service): Promise> { const url = this._getCorrectUrl(service); try { - const resp = await this._axios.get(url + "/jobs/" + jobId, { + const resp = await this._request("GET", url + "jobs/" + jobId, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data.job as Job); @@ -136,7 +202,7 @@ export class RealityCaptureService { ): Promise> { const url = this._getCorrectUrl(service); try { - const resp = await this._axios.get(url + `/jobs/${jobId}/messages`, { + const resp = await this._request("GET", url + `jobs/${jobId}/messages`, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data.messages as Messages); @@ -151,7 +217,7 @@ export class RealityCaptureService { ): Promise> { const url = this._getCorrectUrl(service); try { - const resp = await this._axios.get(url + `/jobs/${jobId}/progress`, { + const resp = await this._request("GET", url + `jobs/${jobId}/progress`, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data.progress as Progress); @@ -163,7 +229,7 @@ export class RealityCaptureService { async cancelJob(jobId: string, service: Service): Promise> { const url = this._getCorrectUrl(service); try { - const resp = await this._axios.delete(url + `/jobs/${jobId}`, { + const resp = await this._request("DELETE", url + `jobs/${jobId}`, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data.job as Job); @@ -179,9 +245,7 @@ export class RealityCaptureService { getAppropriateService(estimationCreate.type), ); try { - const resp = await this._axios.post(url + "/costs", estimationCreate, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url + "costs", { body: estimationCreate, headers: await this._getHeader("v2") }); return new Response( resp.status, null, @@ -195,7 +259,7 @@ export class RealityCaptureService { async getBucket(itwinId: string): Promise> { const url = this._getModelingUrl() + `itwins/${itwinId}/bucket`; try { - const resp = await this._axios.get(url, { + const resp = await this._request("GET", url, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data as BucketResponse); @@ -207,7 +271,7 @@ export class RealityCaptureService { async getServiceFiles(): Promise> { const url = this._getModelingUrl() + "files"; try { - const resp = await this._axios.get(url, { + const resp = await this._request("GET", url, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data as Files); @@ -221,7 +285,7 @@ export class RealityCaptureService { ): Promise> { const url = this._getAnalysisUrl() + "detectors"; try { - const resp = await this._axios.get(url, { + const resp = await this._request("GET", url, { params: detectorsFilter ? { $filter: detectorsFilter } : undefined, headers: await this._getHeader("v2"), }); @@ -239,7 +303,7 @@ export class RealityCaptureService { const url = this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}`; try { - const resp = await this._axios.get(url, { + const resp = await this._request("GET", url, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, resp.data as DetectorResponse); @@ -253,9 +317,7 @@ export class RealityCaptureService { ): Promise> { const url = this._getAnalysisUrl() + "detectors"; try { - const resp = await this._axios.post(url, detectorCreate, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url, { body: detectorCreate, headers: await this._getHeader("v2") }); return new Response(resp.status, null, resp.data as DetectorResponse); } catch (error: any) { return this._handleError(error); @@ -269,9 +331,7 @@ export class RealityCaptureService { const url = this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}`; try { - const resp = await this._axios.patch(url, detectorUpdate, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("PATCH", url, { body: detectorUpdate, headers: await this._getHeader("v2") }); return new Response(resp.status, null, resp.data as DetectorResponse); } catch (error: any) { return this._handleError(error); @@ -282,7 +342,7 @@ export class RealityCaptureService { const url = this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}`; try { - const resp = await this._axios.delete(url, { + const resp = await this._request("DELETE", url, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, null); @@ -299,9 +359,7 @@ export class RealityCaptureService { this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}/versions`; try { - const resp = await this._axios.post(url, versionCreate, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url, { body: versionCreate, headers: await this._getHeader("v2") }); return new Response( resp.status, null, @@ -320,7 +378,7 @@ export class RealityCaptureService { this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}/versions/${encodeURIComponent(detectorVersion)}`; try { - const resp = await this._axios.delete(url, { + const resp = await this._request("DELETE", url, { headers: await this._getHeader("v2"), }); return new Response(resp.status, null, null); @@ -337,9 +395,7 @@ export class RealityCaptureService { this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}/versions/${encodeURIComponent(versionNumber)}/publish`; try { - const resp = await this._axios.post(url, undefined, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url, { headers: await this._getHeader("v2") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); @@ -354,9 +410,7 @@ export class RealityCaptureService { this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}/versions/${encodeURIComponent(versionNumber)}/unpublish`; try { - const resp = await this._axios.post(url, undefined, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url, { headers: await this._getHeader("v2") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); @@ -371,9 +425,7 @@ export class RealityCaptureService { this._getAnalysisUrl() + `detectors/${encodeURIComponent(detectorName)}/versions/${encodeURIComponent(versionNumber)}/complete`; try { - const resp = await this._axios.post(url, undefined, { - headers: await this._getHeader("v2"), - }); + const resp = await this._request("POST", url, { headers: await this._getHeader("v2") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); @@ -383,7 +435,7 @@ export class RealityCaptureService { async dissociateRealityData(iTwinId: string, realityDataId: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/iTwins/${encodeURIComponent(iTwinId)}`; try { - const resp = await this._axios.delete(url, { headers: await this._getHeader("v1") }); + const resp = await this._request("DELETE", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); @@ -393,7 +445,7 @@ export class RealityCaptureService { async associateRealityData(iTwinId: string, realityDataId: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/iTwins/${encodeURIComponent(iTwinId)}`; try { - const resp = await this._axios.post(url, undefined, { headers: await this._getHeader("v1") }); + const resp = await this._request("POST", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); @@ -403,7 +455,7 @@ export class RealityCaptureService { async getRealityDataITwins(realityDataId: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/iTwins`; try { - const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + const resp = await this._request("GET", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data.iTwins); } catch (error: any) { return this._handleError(error); @@ -413,7 +465,7 @@ export class RealityCaptureService { async getRealityDataReadAccess(realityDataId: string, itwinId?: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/readaccess` + (itwinId ? `?iTwinId=${encodeURIComponent(itwinId)}` : ""); try { - const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + const resp = await this._request("GET", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data); } catch (error: any) { return this._handleError(error); @@ -423,7 +475,7 @@ export class RealityCaptureService { async getRealityDataWriteAccess(realityDataId: string, itwinId?: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/writeaccess` + (itwinId ? `?iTwinId=${encodeURIComponent(itwinId)}` : ""); try { - const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + const resp = await this._request("GET", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data); } catch (error: any) { return this._handleError(error); @@ -433,7 +485,7 @@ export class RealityCaptureService { async createRealityData(realityData: RealityDataCreate): Promise> { const url = this._getManagementUrl() + "reality-data"; try { - const resp = await this._axios.post(url, realityData, { headers: await this._getHeader("v1") }); + const resp = await this._request("POST", url, { body: realityData, headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data.realityData); } catch (error: any) { return this._handleError(error); @@ -443,7 +495,7 @@ export class RealityCaptureService { async updateRealityData(realityData: RealityDataUpdate, realityDataId: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; try { - const resp = await this._axios.patch(url, realityData, { headers: await this._getHeader("v1") }); + const resp = await this._request("PATCH", url, { body: realityData, headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data.realityData); } catch (error: any) { return this._handleError(error); @@ -458,7 +510,7 @@ export class RealityCaptureService { "Prefer": prefer === Prefer.REPRESENTATION ? "return=representation" : "return=minimal", }; try { - const resp = await this._axios.get(url, { params, headers }); + const resp = await this._request("GET", url, { params, headers }); return new Response(resp.status, null, resp.data as RealityDatas); } catch (error: any) { return this._handleError(error); @@ -471,7 +523,7 @@ export class RealityCaptureService { url += `?iTwinId=${encodeURIComponent(iTwinId)}`; } try { - const resp = await this._axios.get(url, { headers: await this._getHeader("v1") }); + const resp = await this._request("GET", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, resp.data.realityData); } catch (error: any) { return this._handleError(error); @@ -481,7 +533,7 @@ export class RealityCaptureService { async moveRealityData(realityDataId: string, iTwinId: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}/move`; try { - const resp = await this._axios.patch(url, { iTwinId: iTwinId }, { headers: await this._getHeader("v1") }); + const resp = await this._request("PATCH", url, { body: { iTwinId: iTwinId }, headers: await this._getHeader("v1") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); @@ -491,7 +543,7 @@ export class RealityCaptureService { async deleteRealityData(realityDataId: string): Promise> { const url = this._getManagementUrl() + `reality-data/${encodeURIComponent(realityDataId)}`; try { - const resp = await this._axios.delete(url, { headers: await this._getHeader("v1") }); + const resp = await this._request("DELETE", url, { headers: await this._getHeader("v1") }); return new Response(resp.status, null, null); } catch (error: any) { return this._handleError(error); diff --git a/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts b/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts index 373401cf..4d7ceab6 100644 --- a/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/reality_data.test.ts @@ -14,6 +14,8 @@ import { RealityDataCreateSchema, RealityDataFilter, RealityDataFilterSchema, realityDataFilterAsParams, RealityDataMinimalSchema, RealityDatasSchema, RealityDataSchema, RealityDataUpdateSchema, Type, URLSchema, } from "../../service/reality_data"; +import { mockFetchResponse } from "./test_helpers"; + describe("CoordinateSchema", () => { it("should validate a correct coordinate", () => { @@ -310,10 +312,7 @@ describe("RealityDataFilter.asParamsForServiceCall", () => { describe("RealityCaptureService reality data API calls", function () { let service: RealityCaptureService; - let axiosGetStub: sinon.SinonStub; - let axiosPostStub: sinon.SinonStub; - let axiosPatchStub: sinon.SinonStub; - let axiosDeleteStub: sinon.SinonStub; + let fetchStub: sinon.SinonStub; const rdId = "rd-uuid-001"; const iTwinId = "itwin-uuid-001"; @@ -339,17 +338,7 @@ describe("RealityCaptureService reality data API calls", function () { const getAccessTokenStub = sinon.stub().resolves("fake-token"); const mockAuthClient = { getAccessToken: getAccessTokenStub } as AuthorizationClient; service = new RealityCaptureService(mockAuthClient, { env: "dev" }); - - axiosGetStub = sinon.stub(); - axiosPostStub = sinon.stub(); - axiosPatchStub = sinon.stub(); - axiosDeleteStub = sinon.stub(); - (service as any)._axios = { - get: axiosGetStub, - post: axiosPostStub, - patch: axiosPatchStub, - delete: axiosDeleteStub, - }; + fetchStub = sinon.stub(globalThis, "fetch"); }); afterEach(() => { @@ -358,126 +347,118 @@ describe("RealityCaptureService reality data API calls", function () { it("getRealityData should return a Response on success", async () => { - axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: sampleRealityData } )); const result = await service.getRealityData(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); it("getRealityData with iTwinId should append query param", async () => { - axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: sampleRealityData } )); await service.getRealityData(rdId, iTwinId); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}?iTwinId=${iTwinId}` ); }); it("getRealityData 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityData(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityData ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityData(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("createRealityData should call axios.post and return a Response", async () => { - axiosPostStub.resolves({ status: 201, data: { realityData: sampleRealityData } }); + it("createRealityData should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(201, { realityData: sampleRealityData } )); const create = { iTwinId, displayName: "Test RD", type: Type.CC_IMAGE_COLLECTION }; const result = await service.createRealityData(create); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); - expect(axiosPostStub.firstCall.args[1]).to.deep.equal(create); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(create); expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); it("createRealityData 422 error", async () => { - axiosPostStub.rejects({ - response: { status: 422, data: { error: { code: "InvalidRealityData", message: "Invalid payload." } } } - }); + fetchStub.resolves(mockFetchResponse(422, { error: { code: "InvalidRealityData", message: "Invalid payload." } } )); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("InvalidRealityData"); }); it("createRealityData ill formed error", async () => { - axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("updateRealityData should call axios.patch and return a Response", async () => { + it("updateRealityData should call fetch and return a Response", async () => { const updated = { ...sampleRealityData, displayName: "Updated RD" }; - axiosPatchStub.resolves({ status: 200, data: { realityData: updated } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: updated } )); const update = { displayName: "Updated RD" }; const result = await service.updateRealityData(update, rdId); - expect(axiosPatchStub.calledOnce).to.equal(true); - expect(axiosPatchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); - expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(update); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(update); expect(result.isError()).to.equal(false); expect(result.value!.displayName).to.equal("Updated RD"); }); it("updateRealityData 401 error", async () => { - axiosPatchStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.updateRealityData({ displayName: "New" }, rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("updateRealityData ill formed error", async () => { - axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.updateRealityData({}, rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("deleteRealityData should call axios.delete and return a Response", async () => { - axiosDeleteStub.resolves({ status: 204, data: {} }); + it("deleteRealityData should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(204, {} )); const result = await service.deleteRealityData(rdId); - expect(axiosDeleteStub.calledOnce).to.equal(true); - expect(axiosDeleteStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(result.isError()).to.equal(false); expect(result.value).to.equal(null); }); it("deleteRealityData 404 error", async () => { - axiosDeleteStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.deleteRealityData(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("deleteRealityData ill formed error", async () => { - axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.deleteRealityData(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataReadAccess should return a Response", async () => { - axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + fetchStub.resolves(mockFetchResponse(200, sampleContainerDetails )); const result = await service.getRealityDataReadAccess(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess` ); expect(result.isError()).to.equal(false); @@ -486,9 +467,9 @@ describe("RealityCaptureService reality data API calls", function () { }); it("getRealityDataReadAccess with iTwinId should append query param only once", async () => { - axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + fetchStub.resolves(mockFetchResponse(200, sampleContainerDetails )); await service.getRealityDataReadAccess(rdId, iTwinId); - const calledUrl: string = axiosGetStub.firstCall.args[0]; + const calledUrl: string = fetchStub.firstCall.args[0]; expect(calledUrl).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess?iTwinId=${iTwinId}` ); @@ -496,16 +477,14 @@ describe("RealityCaptureService reality data API calls", function () { }); it("getRealityDataReadAccess 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityDataReadAccess(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataReadAccess ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataReadAccess(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); @@ -513,10 +492,10 @@ describe("RealityCaptureService reality data API calls", function () { it("getRealityDataWriteAccess should return a Response with WRITE access", async () => { const writeDetails = { ...sampleContainerDetails, access: "Write" }; - axiosGetStub.resolves({ status: 200, data: writeDetails }); + fetchStub.resolves(mockFetchResponse(200, writeDetails )); const result = await service.getRealityDataWriteAccess(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess` ); expect(result.isError()).to.equal(false); @@ -524,9 +503,9 @@ describe("RealityCaptureService reality data API calls", function () { }); it("getRealityDataWriteAccess with iTwinId should append query param only once", async () => { - axiosGetStub.resolves({ status: 200, data: { ...sampleContainerDetails, access: "Write" } }); + fetchStub.resolves(mockFetchResponse(200, { ...sampleContainerDetails, access: "Write" } )); await service.getRealityDataWriteAccess(rdId, iTwinId); - const calledUrl: string = axiosGetStub.firstCall.args[0]; + const calledUrl: string = fetchStub.firstCall.args[0]; expect(calledUrl).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess?iTwinId=${iTwinId}` ); @@ -534,126 +513,114 @@ describe("RealityCaptureService reality data API calls", function () { }); it("getRealityDataWriteAccess 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityDataWriteAccess(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataWriteAccess ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataWriteAccess(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataList should return a Response with minimal prefer", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [ - { id: "rd-001", displayName: "RD1", type: "CCImageCollection" }, - { id: "rd-002", displayName: "RD2", type: "LAS" }, - ], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/?continuationToken=token123" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [ + { id: "rd-001", displayName: "RD1", type: "CCImageCollection" }, + { id: "rd-002", displayName: "RD2", type: "LAS" }, + ], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/?continuationToken=token123" } }, + }, + )); const result = await service.getRealityDataList(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(false); expect(result.value!.realityData).to.have.lengthOf(2); }); it("getRealityDataList should send Prefer: return=representation when specified", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); await service.getRealityDataList(undefined, Prefer.REPRESENTATION); - const callArgs = axiosGetStub.firstCall.args[1]; + const callArgs = fetchStub.firstCall.args[1]; expect(callArgs.headers["Prefer"]).to.equal("return=representation"); }); it("getRealityDataList should send Prefer: return=minimal by default", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); await service.getRealityDataList(); - const callArgs = axiosGetStub.firstCall.args[1]; + const callArgs = fetchStub.firstCall.args[1]; expect(callArgs.headers["Prefer"]).to.equal("return=minimal"); }); it("getRealityDataList should pass filter as params", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); await service.getRealityDataList({ iTwinId, $top: 10 }); - const callArgs = axiosGetStub.firstCall.args[1]; - expect(callArgs.params).to.deep.equal({ iTwinId, $top: 10 }); + const calledUrl = new URL(fetchStub.firstCall.args[0]); + expect(calledUrl.origin + calledUrl.pathname).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); + expect(calledUrl.searchParams.get("iTwinId")).to.equal(iTwinId); + expect(calledUrl.searchParams.get("$top")).to.equal("10"); }); it("getRealityDataList 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityDataList(); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataList ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataList(); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("moveRealityData should call axios.patch on the move endpoint", async () => { - axiosPatchStub.resolves({ status: 200, data: {} }); + it("moveRealityData should call fetch on the move endpoint", async () => { + fetchStub.resolves(mockFetchResponse(200, {} )); const result = await service.moveRealityData(rdId, iTwinId); - expect(axiosPatchStub.calledOnce).to.equal(true); - expect(axiosPatchStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/move` ); - expect(axiosPatchStub.firstCall.args[1]).to.deep.equal({ iTwinId }); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal({ iTwinId }); expect(result.isError()).to.equal(false); expect(result.value).to.equal(null); }); it("moveRealityData 404 error", async () => { - axiosPatchStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.moveRealityData(rdId, iTwinId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("moveRealityData ill formed error", async () => { - axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.moveRealityData(rdId, iTwinId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataITwins should return a Response", async () => { - axiosGetStub.resolves({ status: 200, data: { iTwins: ["itwin-001", "itwin-002"] } }); + fetchStub.resolves(mockFetchResponse(200, { iTwins: ["itwin-001", "itwin-002"] } )); const result = await service.getRealityDataITwins(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins` ); expect(result.isError()).to.equal(false); @@ -661,32 +628,30 @@ describe("RealityCaptureService reality data API calls", function () { }); it("getRealityDataITwins 404 error", async () => { - axiosGetStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.getRealityDataITwins(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("getRealityDataITwins ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataITwins(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityData should encode the realityDataId in the URL", async () => { - axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: sampleRealityData } )); const specialId = "rd/with special&chars"; await service.getRealityData(specialId); - expect(axiosGetStub.firstCall.args[0]).to.include(encodeURIComponent(specialId)); + expect(fetchStub.firstCall.args[0]).to.include(encodeURIComponent(specialId)); }); it("deleteRealityData should encode the realityDataId in the URL", async () => { - axiosDeleteStub.resolves({ status: 204, data: {} }); + fetchStub.resolves(mockFetchResponse(204, {} )); const specialId = "rd/with special&chars"; await service.deleteRealityData(specialId); - expect(axiosDeleteStub.firstCall.args[0]).to.include(encodeURIComponent(specialId)); + expect(fetchStub.firstCall.args[0]).to.include(encodeURIComponent(specialId)); }); }); diff --git a/typescript/packages/reality-capture/src/tests/service/service.test.ts b/typescript/packages/reality-capture/src/tests/service/service.test.ts index 78b33a7c..07b49896 100644 --- a/typescript/packages/reality-capture/src/tests/service/service.test.ts +++ b/typescript/packages/reality-capture/src/tests/service/service.test.ts @@ -7,6 +7,8 @@ import { JobCreate, JobType, Service } from "../../service/job"; import { CostEstimationCreate } from "../../service/estimation"; import { DetectorBase, DetectorExport, DetectorType, DetectorUpdate, DetectorVersionCreate } from "../../service/detectors"; import { Access, Prefer, RealityDataFilter, Type } from "../../service/reality_data"; +import { mockFetchResponse } from "./test_helpers"; + describe("RealityCaptureService tests", function () { it("should validate RealityCaptureService urls based on environment", async () => { @@ -61,10 +63,7 @@ describe("RealityCaptureService tests", function () { describe("RealityCaptureService API calls tests", function () { let service: RealityCaptureService; - let axiosPostStub: sinon.SinonStub; - let axiosGetStub: sinon.SinonStub; - let axiosPatchStub: sinon.SinonStub; - let axiosDeleteStub: sinon.SinonStub; + let fetchStub: sinon.SinonStub; let getAccessTokenStub: sinon.SinonStub; const iTwinId = "uuidIT"; @@ -74,105 +73,83 @@ describe("RealityCaptureService API calls tests", function () { const mockAuthClient = { getAccessToken: getAccessTokenStub } as AuthorizationClient; service = new RealityCaptureService(mockAuthClient, { env: "dev" }); + fetchStub = sinon.stub(globalThis, "fetch"); + }); - // Stub axios instance methods - axiosPostStub = sinon.stub(); - axiosGetStub = sinon.stub(); - axiosPatchStub = sinon.stub(); - axiosDeleteStub = sinon.stub(); - (service as any)._axios = { - post: axiosPostStub, - get: axiosGetStub, - patch: axiosPatchStub, - delete: axiosDeleteStub - }; - - // Reset stub history + afterEach(() => { sinon.restore(); }); // getBucket tests - it("getBucket should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "bucket": + it("getBucket should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "bucket": { "iTwinId": "uuidIT" }, - "_links": + "_links": { "containerUrl": { "href": "https://realityprodneusa01.blob.core.windows.net/78e3a82d-076e-4d1d-b8ef-ab0625fbb856?sv=2020-08-04&se=2021-07-22T03%3A50%3A21Z&sr=c&sp=rl&sig=**removed**" } } - } - }); + } + )); const result = await service.getBucket(iTwinId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.bucket.iTwinId).to.equal(iTwinId); }); it("getBucket 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getBucket(iTwinId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getBucket ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getBucket(iTwinId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getServiceFiles tests - it("getServiceFiles should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "files": [{ - "id": "File_1", - "name": "file 1", - "type": "Preset", - "description": "preset file" - }, - { - "id": "File_2", - "name": "file 2", - "type": "Preset", - "deprecated": true - } - ] + it("getServiceFiles should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "files": [{ + "id": "File_1", + "name": "file 1", + "type": "Preset", + "description": "preset file" + }, + { + "id": "File_2", + "name": "file 2", + "type": "Preset", + "deprecated": true } - }); + ] + } + )); const result = await service.getServiceFiles(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.files).to.have.lengthOf(2); @@ -183,237 +160,206 @@ describe("RealityCaptureService API calls tests", function () { }); it("getServiceFiles 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getServiceFiles(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getServiceFiles ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getServiceFiles(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getDetectors tests - it("getDetectors should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "detectors": [{ - "name": "@bentley/cracks-ortho", - "displayName": "Cracks Ortho", - "description": "Detects cracks in concrete infrastructure to enable defect inspection workflows.", - "type": "OrthophotoSegmentationDetector", - "documentationUrl": "https://www.bentley.com", - "latestVersion": "1.0" - }, - { - "name": "traffic-signs", - "displayName": "Traffic signs detector", - "description": "Detects all traffic signs within a scene.", - "type": "PhotoObjectDetector", - "documentationUrl": "https://www.example.com" - } - ] + it("getDetectors should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "detectors": [{ + "name": "@bentley/cracks-ortho", + "displayName": "Cracks Ortho", + "description": "Detects cracks in concrete infrastructure to enable defect inspection workflows.", + "type": "OrthophotoSegmentationDetector", + "documentationUrl": "https://www.bentley.com", + "latestVersion": "1.0" + }, + { + "name": "traffic-signs", + "displayName": "Traffic signs detector", + "description": "Detects all traffic signs within a scene.", + "type": "PhotoObjectDetector", + "documentationUrl": "https://www.example.com" } - }); + ] + } + )); const result = await service.getDetectors(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.detectors).to.have.lengthOf(2); }); it("getDetectors should pass filters as query params", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "detectors": [] - } - }); + fetchStub.resolves(mockFetchResponse(200, { + "detectors": [] + } + )); const detectorsFilter = "exports in ('Polygons', 'Lines') and labels in ('crack')"; const result = await service.getDetectors(detectorsFilter); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors"); - expect(axiosGetStub.firstCall.args[1].params).to.deep.equal({ "$filter": detectorsFilter }); + const calledUrl = new URL(fetchStub.firstCall.args[0]); + expect(fetchStub.calledOnce).to.equal(true); + expect(calledUrl.origin + calledUrl.pathname).to.equal("https://dev-api.bentley.com/reality-analysis/detectors"); + expect(calledUrl.searchParams.get("$filter")).to.equal(detectorsFilter); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); }); it("getDetectors 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getDetectors(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getDetectors ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getDetectors(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getDetector tests - it("getDetector should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "detector": { - "name": "@bentley/mydetector", - "displayName": "Cracks detector", - "description": "Detects all the cracks within a scene.", - "type": "PhotoObjectDetector", - "documentationUrl": "https://www.bentley.com", - "versions": [{ - "creationDate": "2025-03-18T14:11:15.5325351Z", - "versionNumber": "2.0", - "status": "AwaitingData", - "creatorId": "e8be5445-c76a-41c6-9bfe-6a3d71953624", - "capabilities": { - "labels": [ - "crack" - ], - "exports": [ - "Lines" - ] - } - }, - { - "creationDate": "2025-03-12T13:32:06.8787916Z", - "versionNumber": "1.1", - "status": "Ready", - "creatorId": "e8be5445-c76a-41c6-9bfe-6a3d71953624", - "downloadUrl": "https://cicsdetectorsprodeussa01.blob.core.windows.net/bd9bf908-9b82-4fcd-9ab4-ff15286d2ada/cracks-detector-1.1.zip?sv=2024-08-04&se=2025-04-23T11%3A26%3A11Z&sr=b&sp=r&sig=***REMOVED***", - "capabilities": { - "labels": [ - "crack" - ], - "exports": [ - "Lines" - ] - } - }, - { - "creationDate": "2025-03-11T15:11:24.2712971Z", - "versionNumber": "1.0", - "status": "Ready", - "creatorId": "d2b5b8e7-8248-49a3-94ac-b097a7a67b6d", - "downloadUrl": "https://cicsdetectorsprodeussa01.blob.core.windows.net/bd9bf908-9b82-4fcd-9ab4-ff15286d2ada/cracks-detector-1.0.zip?sv=2024-08-04&se=2025-04-23T11%3A26%3A11Z&sr=b&sp=r&sig=***REMOVED***", - "capabilities": { - "labels": [ - "Crack Object" - ], - "exports": [ - "Lines" - ] - } + it("getDetector should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "detector": { + "name": "@bentley/mydetector", + "displayName": "Cracks detector", + "description": "Detects all the cracks within a scene.", + "type": "PhotoObjectDetector", + "documentationUrl": "https://www.bentley.com", + "versions": [{ + "creationDate": "2025-03-18T14:11:15.5325351Z", + "versionNumber": "2.0", + "status": "AwaitingData", + "creatorId": "e8be5445-c76a-41c6-9bfe-6a3d71953624", + "capabilities": { + "labels": [ + "crack" + ], + "exports": [ + "Lines" + ] + } + }, + { + "creationDate": "2025-03-12T13:32:06.8787916Z", + "versionNumber": "1.1", + "status": "Ready", + "creatorId": "e8be5445-c76a-41c6-9bfe-6a3d71953624", + "downloadUrl": "https://cicsdetectorsprodeussa01.blob.core.windows.net/bd9bf908-9b82-4fcd-9ab4-ff15286d2ada/cracks-detector-1.1.zip?sv=2024-08-04&se=2025-04-23T11%3A26%3A11Z&sr=b&sp=r&sig=***REMOVED***", + "capabilities": { + "labels": [ + "crack" + ], + "exports": [ + "Lines" + ] + } + }, + { + "creationDate": "2025-03-11T15:11:24.2712971Z", + "versionNumber": "1.0", + "status": "Ready", + "creatorId": "d2b5b8e7-8248-49a3-94ac-b097a7a67b6d", + "downloadUrl": "https://cicsdetectorsprodeussa01.blob.core.windows.net/bd9bf908-9b82-4fcd-9ab4-ff15286d2ada/cracks-detector-1.0.zip?sv=2024-08-04&se=2025-04-23T11%3A26%3A11Z&sr=b&sp=r&sig=***REMOVED***", + "capabilities": { + "labels": [ + "Crack Object" + ], + "exports": [ + "Lines" + ] } - ] } + ] } - }); + } + )); const result = await service.getDetector("@bentley/mydetector"); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.detector.name).to.equal("@bentley/mydetector"); }); it("getDetector 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getDetector("mydetector"); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getDetector ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getDetector("mydetector"); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("createDetector should call axios.post and return a Response", async () => { - axiosPostStub.resolves({ - status: 201, - data: { - detector: { - name: "@bentley/new-detector", - displayName: "New detector", - description: "Creates a detector.", - type: "PhotoObjectDetector", - documentationUrl: "https://www.bentley.com", - versions: [] - } + it("createDetector should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(201, { + detector: { + name: "@bentley/new-detector", + displayName: "New detector", + description: "Creates a detector.", + type: "PhotoObjectDetector", + documentationUrl: "https://www.bentley.com", + versions: [] } - }); + } + )); const detectorCreate: DetectorBase = { name: "@bentley/new-detector", displayName: "New detector", @@ -422,69 +368,63 @@ describe("RealityCaptureService API calls tests", function () { documentationUrl: "https://www.bentley.com" }; const result = await service.createDetector(detectorCreate); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors"); - expect(axiosPostStub.firstCall.args[1]).to.deep.equal(detectorCreate); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors"); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(detectorCreate); expect(result.isError()).to.equal(false); expect(result.value!.detector.name).to.equal("@bentley/new-detector"); }); - it("updateDetector should call axios.patch with an encoded detector name", async () => { - axiosPatchStub.resolves({ - status: 200, - data: { - detector: { - name: "@bentley/mydetector", - displayName: "Updated detector", - description: "Updated description", - type: "PhotoObjectDetector", - documentationUrl: "https://www.bentley.com/docs", - versions: [] - } + it("updateDetector should call fetch with an encoded detector name", async () => { + fetchStub.resolves(mockFetchResponse(200, { + detector: { + name: "@bentley/mydetector", + displayName: "Updated detector", + description: "Updated description", + type: "PhotoObjectDetector", + documentationUrl: "https://www.bentley.com/docs", + versions: [] } - }); + } + )); const detectorUpdate: DetectorUpdate = { displayName: "Updated detector", description: "Updated description", documentationUrl: "https://www.bentley.com/docs" }; const result = await service.updateDetector("@bentley/mydetector", detectorUpdate); - expect(axiosPatchStub.calledOnce).to.equal(true); - expect(axiosPatchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); - expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(detectorUpdate); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(detectorUpdate); expect(result.isError()).to.equal(false); expect(result.value!.detector.displayName).to.equal("Updated detector"); }); - it("deleteDetector should call axios.delete with an encoded detector name", async () => { - axiosDeleteStub.resolves({ - status: 204, - data: {} - }); + it("deleteDetector should call fetch with an encoded detector name", async () => { + fetchStub.resolves(mockFetchResponse(204, {} + )); const result = await service.deleteDetector("@bentley/mydetector"); - expect(axiosDeleteStub.calledOnce).to.equal(true); - expect(axiosDeleteStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector"); expect(result.isError()).to.equal(false); expect(result.value).to.equal(null); }); - it("createDetectorVersion should call axios.post with the version payload", async () => { - axiosPostStub.resolves({ - status: 201, - data: { - version: { - versionNumber: "1.0", - capabilities: { labels: ["crack"], exports: ["Lines"] }, - creationDate: "2025-03-18T14:11:15.5325351Z", - status: "AwaitingData", - creatorId: "e8be5445-c76a-41c6-9bfe-6a3d71953624" - }, - _links: { - completeUrl: { href: "https://example.com/complete" }, - uploadUrl: { href: "https://example.com/upload" } - } + it("createDetectorVersion should call fetch with the version payload", async () => { + fetchStub.resolves(mockFetchResponse(201, { + version: { + versionNumber: "1.0", + capabilities: { labels: ["crack"], exports: ["Lines"] }, + creationDate: "2025-03-18T14:11:15.5325351Z", + status: "AwaitingData", + creatorId: "e8be5445-c76a-41c6-9bfe-6a3d71953624" + }, + _links: { + completeUrl: { href: "https://example.com/complete" }, + uploadUrl: { href: "https://example.com/upload" } } - }); + } + )); const versionCreate: DetectorVersionCreate = { versionNumber: "1.0", capabilities: { @@ -493,257 +433,217 @@ describe("RealityCaptureService API calls tests", function () { } }; const result = await service.createDetectorVersion("@bentley/mydetector", versionCreate); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions"); - expect(axiosPostStub.firstCall.args[1]).to.deep.equal(versionCreate); - expect(result.isError()).to.be.false; + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions"); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(versionCreate); + expect(result.isError()).to.equal(false); expect(result.value!.version.versionNumber).to.equal("1.0"); expect(result.value!._links.uploadUrl.href).to.equal("https://example.com/upload"); }); - it("deleteDetectorVersion should call axios.delete with encoded detector and version names", async () => { - axiosDeleteStub.resolves({ - status: 204, - data: {} - }); + it("deleteDetectorVersion should call fetch with encoded detector and version names", async () => { + fetchStub.resolves(mockFetchResponse(204, {} + )); const result = await service.deleteDetectorVersion("@bentley/mydetector", "1.0-beta/1"); - expect(axiosDeleteStub.calledOnce).to.equal(true); - expect(axiosDeleteStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0-beta%2F1"); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0-beta%2F1"); expect(result.isError()).to.equal(false); }); - it("publishDetectorVersion should call axios.post on the publish endpoint", async () => { - axiosPostStub.resolves({ - status: 200, - data: {} - }); + it("publishDetectorVersion should call fetch on the publish endpoint", async () => { + fetchStub.resolves(mockFetchResponse(200, {} + )); const result = await service.publishDetectorVersion("@bentley/mydetector", "1.0"); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/publish"); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/publish"); expect(result.isError()).to.equal(false); }); - it("unpublishDetectorVersion should call axios.post on the unpublish endpoint", async () => { - axiosPostStub.resolves({ - status: 200, - data: {} - }); + it("unpublishDetectorVersion should call fetch on the unpublish endpoint", async () => { + fetchStub.resolves(mockFetchResponse(200, {} + )); const result = await service.unpublishDetectorVersion("@bentley/mydetector", "1.0"); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/unpublish"); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/unpublish"); expect(result.isError()).to.equal(false); }); - it("completeDetectorVersionUpload should call axios.post on the complete endpoint", async () => { - axiosPostStub.resolves({ - status: 200, - data: {} - }); + it("completeDetectorVersionUpload should call fetch on the complete endpoint", async () => { + fetchStub.resolves(mockFetchResponse(200, {} + )); const result = await service.completeDetectorVersionUpload("@bentley/mydetector", "1.0"); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/complete"); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-analysis/detectors/%40bentley%2Fmydetector/versions/1.0/complete"); expect(result.isError()).to.equal(false); }); //estimateCost tests - it("estimateCost should call axios.post and return a Response", async () => { - axiosPostStub.resolves({ - status: 200, - data: { - "costEstimation": { - "id": "jobId", - "estimatedUnits": 8, - "unitType": "Modeling" - } + it("estimateCost should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "costEstimation": { + "id": "jobId", + "estimatedUnits": 8, + "unitType": "Modeling" } - }); + } + )); const costCreate: CostEstimationCreate = { type: JobType.CALIBRATION } as any; const result = await service.estimateCost(costCreate); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.estimatedUnits).to.equal(8); }); it("estimateCost 401 error", async () => { - axiosPostStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const costCreate: CostEstimationCreate = { type: JobType.CALIBRATION } as any; const result = await service.estimateCost(costCreate); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("estimateCost ill formed error", async () => { - axiosPostStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const costCreate: CostEstimationCreate = { type: JobType.CALIBRATION } as any; const result = await service.estimateCost(costCreate); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // cancelJob tests - it("cancelJob should call axios.delete and return a Response", async () => { - axiosDeleteStub.resolves({ - status: 200, - data: { - "job": { - "id": "jobId", - "state": "Terminating", - "userId": "911edf8b-59ad-404c-a743-aec05ca038e9", - "executionInfo": { - "startedDateTime": "2025-03-10T11:30:03Z", - "createdDateTime": "2025-03-10T11:30:00Z" + it("cancelJob should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "job": { + "id": "jobId", + "state": "Terminating", + "userId": "911edf8b-59ad-404c-a743-aec05ca038e9", + "executionInfo": { + "startedDateTime": "2025-03-10T11:30:03Z", + "createdDateTime": "2025-03-10T11:30:00Z" + }, + "specifications": { + "inputs": { + "scene": "sceneId" }, - "specifications": { - "inputs": { - "scene": "sceneId" - }, - "outputs": { - "modelingReference": { - "location": "modelingReferenceId" - } + "outputs": { + "modelingReference": { + "location": "modelingReferenceId" } - }, - "name": "jobName", - "type": "Reconstruction", - "iTwinId": "uuidIT" - } + } + }, + "name": "jobName", + "type": "Reconstruction", + "iTwinId": "uuidIT" } - }); + } + )); const result = await service.cancelJob("jobId", Service.MODELING); - expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.state).to.equal("Terminating"); }); it("cancelJob 401 error", async () => { - axiosDeleteStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.cancelJob("jobId", Service.MODELING); - expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("cancelJob ill formed error", async () => { - axiosDeleteStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.cancelJob("jobId", Service.MODELING); - expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getJobProgress tests - it("getJobProgress should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "progress": { - "percentage": 5, - "state": "Active" - } + it("getJobProgress should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "progress": { + "percentage": 5, + "state": "Active" } - }); + } + )); const result = await service.getJobProgress("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.percentage).to.equal(5); }); it("getJobProgress 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getJobProgress("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("cancelJob ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getJobProgress("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getJobMessages - it("getJobMessages should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "messages": { - "errors": [{ - "code": "InputData_Invalid", - "message": "Invalid input data. Please check the documentation. (\"%1\")", - "title": "Invalid input data", - "params": ["Sample_scan"] - }], - "warnings": [] - } + it("getJobMessages should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "messages": { + "errors": [{ + "code": "InputData_Invalid", + "message": "Invalid input data. Please check the documentation. (\"%1\")", + "title": "Invalid input data", + "params": ["Sample_scan"] + }], + "warnings": [] } - }); + } + )); const result = await service.getJobMessages("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.errors).to.have.lengthOf(1); @@ -751,68 +651,58 @@ describe("RealityCaptureService API calls tests", function () { }); it("getJobMessages 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getJobMessages("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getJobMessages ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getJobMessages("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getJob tests - it("getJobMessages should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - "job": { - "id": "jobId", - "state": "Active", - "userId": "userId", - "executionInfo": { - "createdDateTime": "2025-03-06T09:42:33Z" - }, - "specifications": { - "inputs": { - "sceneToProcess": "sceneId" - }, - "outputs": { - "scene": "sceneId" - } + it("getJobMessages should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "job": { + "id": "jobId", + "state": "Active", + "userId": "userId", + "executionInfo": { + "createdDateTime": "2025-03-06T09:42:33Z" + }, + "specifications": { + "inputs": { + "sceneToProcess": "sceneId" }, - "name": "jobName", - "type": "FillImageProperties", - "iTwinId": "uuidIT" - } + "outputs": { + "scene": "sceneId" + } + }, + "name": "jobName", + "type": "FillImageProperties", + "iTwinId": "uuidIT" } - }); + } + )); const result = await service.getJob("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.state).to.equal("Active"); @@ -820,184 +710,166 @@ describe("RealityCaptureService API calls tests", function () { }); it("getJob 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const result = await service.getJob("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getJob ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const result = await service.getJob("jobId", Service.MODELING); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // submitJob tests - it("submitJob should call axios.post and return a Response", async () => { - axiosPostStub.resolves({ - status: 200, - data: { - "job": { - "id": "jobId", - "state": "Active", - "userId": "userId", - "executionInfo": { - "createdDateTime": "2025-03-10T11:30:00Z" + it("submitJob should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + "job": { + "id": "jobId", + "state": "Active", + "userId": "userId", + "executionInfo": { + "createdDateTime": "2025-03-10T11:30:00Z" + }, + "specifications": { + "inputs": { + "scene": "sceneId" }, - "specifications": { - "inputs": { - "scene": "sceneId" - }, - "outputs": { - "modelingReference": { - "location": "modelingReferenceId" - } + "outputs": { + "modelingReference": { + "location": "modelingReferenceId" } - }, - "name": "jobName", - "type": "Reconstruction", - "iTwinId": "uuidIT" - } + } + }, + "name": "jobName", + "type": "Reconstruction", + "iTwinId": "uuidIT" } - }); + } + )); const jobCreate: JobCreate = { type: JobType.RECONSTRUCTION } as any; const result = await service.submitJob(jobCreate); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.type).to.equal(JobType.RECONSTRUCTION); }); it("submitJob 401 error", async () => { - axiosPostStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: "Header Authorization was not found in the request. Access denied." - } - } + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: "Header Authorization was not found in the request. Access denied." } - }); + } + )); const jobCreate: JobCreate = { type: JobType.RECONSTRUCTION } as any; const result = await service.submitJob(jobCreate); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("submitJob ill formed error", async () => { - axiosPostStub.rejects({ - response: { - status: 400, - data: { - bad: "response" - } - } - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response" + } + )); const jobCreate: JobCreate = { type: JobType.RECONSTRUCTION } as any; const result = await service.submitJob(jobCreate); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // getJobs tests - it("getJobs should call axios.get and return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - jobs: [ - { - id: "2e8b5984-15b1-45d5-8175-572583d8c3c8", - state: "Success", - userId: "c6ed4bad-b7d1-46d5-b9f3-7bae29cf39a9", - executionInfo: { - startedDateTime: "2025-11-24T08:12:33Z", - endedDateTime: "2025-11-24T08:14:00Z", - createdDateTime: "2025-11-24T08:12:09Z", - processingUnits: 0, + it("getJobs should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(200, { + jobs: [ + { + id: "2e8b5984-15b1-45d5-8175-572583d8c3c8", + state: "Success", + userId: "c6ed4bad-b7d1-46d5-b9f3-7bae29cf39a9", + executionInfo: { + startedDateTime: "2025-11-24T08:12:33Z", + endedDateTime: "2025-11-24T08:14:00Z", + createdDateTime: "2025-11-24T08:12:09Z", + processingUnits: 0, + }, + specifications: { + inputs: { + imageCollections: ["fc2746d5-7b62-4f00-9a88-1bfaa22475d7"], + }, + outputs: { + scene: "0bdccf29-452e-4610-b00c-d2a1f58c9100", }, - specifications: { - inputs: { - imageCollections: ["fc2746d5-7b62-4f00-9a88-1bfaa22475d7"], - }, - outputs: { - scene: "0bdccf29-452e-4610-b00c-d2a1f58c9100", - }, - options: { - recursiveImageCollections: false, - altitudeReference: "SeaLevel", - }, + options: { + recursiveImageCollections: false, + altitudeReference: "SeaLevel", }, - name: "Unified Job- FillImageProperties", - type: "FillImageProperties", - iTwinId: "2c8e4988-eb9b-4e5f-a903-8c7c18f3030a", }, - { - id: "7358a7f6-dcf3-4f81-8cdd-5df3396bb0c9", - state: "Failed", - userId: "c6ed4bad-b7d1-46d5-b9f3-7bae29cf39a9", - executionInfo: { - startedDateTime: "2025-11-24T13:31:39Z", - endedDateTime: "2025-11-24T13:31:39Z", - createdDateTime: "2025-11-24T08:12:12Z", - processingUnits: 0.0, + name: "Unified Job- FillImageProperties", + type: "FillImageProperties", + iTwinId: "2c8e4988-eb9b-4e5f-a903-8c7c18f3030a", + }, + { + id: "7358a7f6-dcf3-4f81-8cdd-5df3396bb0c9", + state: "Failed", + userId: "c6ed4bad-b7d1-46d5-b9f3-7bae29cf39a9", + executionInfo: { + startedDateTime: "2025-11-24T13:31:39Z", + endedDateTime: "2025-11-24T13:31:39Z", + createdDateTime: "2025-11-24T08:12:12Z", + processingUnits: 0.0, + }, + specifications: { + inputs: { + imageCollections: ["fc2746d5-7b62-4f00-9a88-1bfaa22475d7"], }, - specifications: { - inputs: { - imageCollections: ["fc2746d5-7b62-4f00-9a88-1bfaa22475d7"], - }, - outputs: { - scene: "66d86817-e959-4eea-ac65-176dde1093cf", - }, - options: { - recursiveImageCollections: false, - altitudeReference: "SeaLevel", - }, + outputs: { + scene: "66d86817-e959-4eea-ac65-176dde1093cf", + }, + options: { + recursiveImageCollections: false, + altitudeReference: "SeaLevel", }, - name: "Unified Job- FillImageProperties", - type: "FillImageProperties", - iTwinId: "2c8e4988-eb9b-4e5f-a903-8c7c18f3030a", - }, - ], - _links: { - next: { - href: "https://api.bentley.com/reality-modeling/jobs?$filter=iTwinId%20eq%202c8e4988-eb9b-4e5f-a903-8c7c18f3030a&$top=2&continuationToken=MTRmZDkwOGYtNWEzOS00YzY3LWFmMGYtMGMxMWQxYWNkMDhl", }, + name: "Unified Job- FillImageProperties", + type: "FillImageProperties", + iTwinId: "2c8e4988-eb9b-4e5f-a903-8c7c18f3030a", + }, + ], + _links: { + next: { + href: "https://api.bentley.com/reality-modeling/jobs?$filter=iTwinId%20eq%202c8e4988-eb9b-4e5f-a903-8c7c18f3030a&$top=2&continuationToken=MTRmZDkwOGYtNWEzOS00YzY3LWFmMGYtMGMxMWQxYWNkMDhl", }, }, - }); + }, + )); const result = await service.getJobs(Service.MODELING, "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[1].params).to.deep.include({ - $filter: "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a", - }); + const calledUrl = new URL(fetchStub.firstCall.args[0]); + expect(fetchStub.calledOnce).to.equal(true); + expect(calledUrl.origin + calledUrl.pathname).to.equal("https://dev-api.bentley.com/reality-modeling/jobs"); + expect(calledUrl.searchParams.get("$filter")).to.equal("iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); + expect(calledUrl.searchParams.get("$top")).to.equal("100"); + expect(calledUrl.searchParams.get("continuationToken")).to.equal(""); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.jobs).to.have.lengthOf(2); @@ -1005,41 +877,31 @@ describe("RealityCaptureService API calls tests", function () { "2e8b5984-15b1-45d5-8175-572583d8c3c8" ); expect(result.value!.jobs[1].state).to.equal("Failed"); - expect(result.value!._links).to.not.be.undefined; + expect(result.value!._links).to.not.equal(undefined); expect(result.value!._links!.next.href).to.include("continuationToken"); }); it("getJobs 401 error", async () => { - axiosGetStub.rejects({ - response: { - status: 401, - data: { - error: { - code: "HeaderNotFound", - message: - "Header Authorization was not found in the request. Access denied.", - }, - }, + fetchStub.resolves(mockFetchResponse(401, { + error: { + code: "HeaderNotFound", + message: + "Header Authorization was not found in the request. Access denied.", }, - }); + })); const result = await service.getJobs(Service.MODELING, "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getJobs ill formed error", async () => { - axiosGetStub.rejects({ - response: { - status: 400, - data: { - bad: "response", - }, - }, - }); + fetchStub.resolves(mockFetchResponse(400, { + bad: "response", + })); const result = await service.getJobs(Service.MODELING, "iTwinId eq 2c8e4988-eb9b-4e5f-a903-8c7c18f3030a"); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); @@ -1063,128 +925,120 @@ describe("RealityCaptureService API calls tests", function () { }; it("getRealityData should return a Response on success", async () => { - axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: sampleRealityData } )); const result = await service.getRealityData(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(result).to.be.instanceOf(Response); expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); it("getRealityData with iTwinId should append query param", async () => { - axiosGetStub.resolves({ status: 200, data: { realityData: sampleRealityData } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: sampleRealityData } )); await service.getRealityData(rdId, iTwinId); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}?iTwinId=${iTwinId}` ); }); it("getRealityData 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } })); const result = await service.getRealityData(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityData ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityData(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("createRealityData should call axios.post and return a Response", async () => { - axiosPostStub.resolves({ status: 201, data: { realityData: sampleRealityData } }); + it("createRealityData should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(201, { realityData: sampleRealityData } )); const create = { iTwinId, displayName: "Test RD", type: Type.CC_IMAGE_COLLECTION }; const result = await service.createRealityData(create); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); - expect(axiosPostStub.firstCall.args[1]).to.deep.equal(create); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(create); expect(result.isError()).to.equal(false); expect(result.value!.id).to.equal(rdId); }); it("createRealityData 422 error", async () => { - axiosPostStub.rejects({ - response: { status: 422, data: { error: { code: "InvalidRealityData", message: "Invalid payload." } } } - }); + fetchStub.resolves(mockFetchResponse(422, { error: { code: "InvalidRealityData", message: "Invalid payload." } } )); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("InvalidRealityData"); }); it("createRealityData ill formed error", async () => { - axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.createRealityData({ iTwinId, displayName: "Test", type: Type.LAS }); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("updateRealityData should call axios.patch and return a Response", async () => { + it("updateRealityData should call fetch and return a Response", async () => { const updated = { ...sampleRealityData, displayName: "Updated RD" }; - axiosPatchStub.resolves({ status: 200, data: { realityData: updated } }); + fetchStub.resolves(mockFetchResponse(200, { realityData: updated } )); const update = { displayName: "Updated RD" }; const result = await service.updateRealityData(update, rdId); - expect(axiosPatchStub.calledOnce).to.equal(true); - expect(axiosPatchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); - expect(axiosPatchStub.firstCall.args[1]).to.deep.equal(update); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal(update); expect(result.isError()).to.equal(false); expect(result.value!.displayName).to.equal("Updated RD"); }); it("updateRealityData 401 error", async () => { - axiosPatchStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.updateRealityData({ displayName: "New" }, rdId); - expect(axiosPatchStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("updateRealityData ill formed error", async () => { - axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.updateRealityData({}, rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("deleteRealityData should call axios.delete and return a Response", async () => { - axiosDeleteStub.resolves({ status: 204, data: {} }); + it("deleteRealityData should call fetch and return a Response", async () => { + fetchStub.resolves(mockFetchResponse(204, {} )); const result = await service.deleteRealityData(rdId); - expect(axiosDeleteStub.calledOnce).to.equal(true); - expect(axiosDeleteStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal(`https://dev-api.bentley.com/reality-management/reality-data/${rdId}`); expect(result.isError()).to.equal(false); expect(result.value).to.equal(null); }); it("deleteRealityData 404 error", async () => { - axiosDeleteStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.deleteRealityData(rdId); - expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("deleteRealityData ill formed error", async () => { - axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.deleteRealityData(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataReadAccess should return a Response", async () => { - axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + fetchStub.resolves(mockFetchResponse(200, sampleContainerDetails )); const result = await service.getRealityDataReadAccess(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess` ); expect(result.isError()).to.equal(false); @@ -1193,9 +1047,9 @@ describe("RealityCaptureService API calls tests", function () { }); it("getRealityDataReadAccess with iTwinId should append query param only once", async () => { - axiosGetStub.resolves({ status: 200, data: sampleContainerDetails }); + fetchStub.resolves(mockFetchResponse(200, sampleContainerDetails )); await service.getRealityDataReadAccess(rdId, iTwinId); - const calledUrl: string = axiosGetStub.firstCall.args[0]; + const calledUrl: string = fetchStub.firstCall.args[0]; expect(calledUrl).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/readaccess?iTwinId=${iTwinId}` ); @@ -1203,17 +1057,15 @@ describe("RealityCaptureService API calls tests", function () { }); it("getRealityDataReadAccess 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityDataReadAccess(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataReadAccess ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataReadAccess(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); @@ -1221,10 +1073,10 @@ describe("RealityCaptureService API calls tests", function () { it("getRealityDataWriteAccess should return a Response with WRITE access", async () => { const writeDetails = { ...sampleContainerDetails, access: "Write" }; - axiosGetStub.resolves({ status: 200, data: writeDetails }); + fetchStub.resolves(mockFetchResponse(200, writeDetails )); const result = await service.getRealityDataWriteAccess(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess` ); expect(result.isError()).to.equal(false); @@ -1232,9 +1084,9 @@ describe("RealityCaptureService API calls tests", function () { }); it("getRealityDataWriteAccess with iTwinId should append query param only once", async () => { - axiosGetStub.resolves({ status: 200, data: { ...sampleContainerDetails, access: "Write" } }); + fetchStub.resolves(mockFetchResponse(200, { ...sampleContainerDetails, access: "Write" } )); await service.getRealityDataWriteAccess(rdId, iTwinId); - const calledUrl: string = axiosGetStub.firstCall.args[0]; + const calledUrl: string = fetchStub.firstCall.args[0]; expect(calledUrl).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/writeaccess?iTwinId=${iTwinId}` ); @@ -1242,127 +1094,129 @@ describe("RealityCaptureService API calls tests", function () { }); it("getRealityDataWriteAccess 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityDataWriteAccess(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataWriteAccess ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataWriteAccess(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataList should return a Response", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [ - { id: "rd-001", displayName: "RD1", type: "CCImageCollection" }, - { id: "rd-002", displayName: "RD2", type: "LAS" }, - ], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/?continuationToken=token123" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [ + { id: "rd-001", displayName: "RD1", type: "CCImageCollection" }, + { id: "rd-002", displayName: "RD2", type: "LAS" }, + ], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/?continuationToken=token123" } }, + }, + )); const result = await service.getRealityDataList(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(false); expect(result.value!.realityData).to.have.lengthOf(2); }); it("getRealityDataList should send Prefer: return=representation when specified", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); await service.getRealityDataList(undefined, Prefer.REPRESENTATION); - expect(axiosGetStub.firstCall.args[1].headers["Prefer"]).to.equal("return=representation"); + expect(fetchStub.firstCall.args[1].headers["Prefer"]).to.equal("return=representation"); }); it("getRealityDataList should send Prefer: return=minimal by default", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); await service.getRealityDataList(); - expect(axiosGetStub.firstCall.args[1].headers["Prefer"]).to.equal("return=minimal"); + expect(fetchStub.firstCall.args[1].headers["Prefer"]).to.equal("return=minimal"); }); it("getRealityDataList should pass filter as params", async () => { - axiosGetStub.resolves({ - status: 200, - data: { - realityData: [], - links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, - }, - }); + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); const filter: RealityDataFilter = { iTwinId, $top: 10 }; await service.getRealityDataList(filter); - expect(axiosGetStub.firstCall.args[1].params).to.deep.equal({ iTwinId, $top: 10 }); + const calledUrl = new URL(fetchStub.firstCall.args[0]); + expect(calledUrl.origin + calledUrl.pathname).to.equal("https://dev-api.bentley.com/reality-management/reality-data"); + expect(calledUrl.searchParams.get("iTwinId")).to.equal(iTwinId); + expect(calledUrl.searchParams.get("$top")).to.equal("10"); + }); + + it("getRealityDataList should serialize array-valued params as repeated keys", async () => { + fetchStub.resolves(mockFetchResponse(200, { + realityData: [], + links: { next: { href: "https://dev-api.bentley.com/reality-management/reality-data/" } }, + }, + )); + const filter: RealityDataFilter = { types: [Type.LAS, Type.E57] }; + await service.getRealityDataList(filter); + const calledUrl = new URL(fetchStub.firstCall.args[0]); + expect(calledUrl.searchParams.getAll("types")).to.deep.equal(["LAS", "E57"]); + expect(calledUrl.search).to.not.include(","); }); it("getRealityDataList 401 error", async () => { - axiosGetStub.rejects({ - response: { status: 401, data: { error: { code: "HeaderNotFound", message: "Access denied." } } } - }); + fetchStub.resolves(mockFetchResponse(401, { error: { code: "HeaderNotFound", message: "Access denied." } } )); const result = await service.getRealityDataList(); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("HeaderNotFound"); }); it("getRealityDataList ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataList(); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); - it("moveRealityData should call axios.patch on the move endpoint", async () => { - axiosPatchStub.resolves({ status: 200, data: {} }); + it("moveRealityData should call fetch on the move endpoint", async () => { + fetchStub.resolves(mockFetchResponse(200, {} )); const result = await service.moveRealityData(rdId, iTwinId); - expect(axiosPatchStub.calledOnce).to.equal(true); - expect(axiosPatchStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/move` ); - expect(axiosPatchStub.firstCall.args[1]).to.deep.equal({ iTwinId }); + expect(JSON.parse(fetchStub.firstCall.args[1].body)).to.deep.equal({ iTwinId }); expect(result.isError()).to.equal(false); expect(result.value).to.equal(null); }); it("moveRealityData 404 error", async () => { - axiosPatchStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.moveRealityData(rdId, iTwinId); - expect(axiosPatchStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("moveRealityData ill formed error", async () => { - axiosPatchStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.moveRealityData(rdId, iTwinId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); it("getRealityDataITwins should return a Response", async () => { - axiosGetStub.resolves({ status: 200, data: { iTwins: ["itwin-001", "itwin-002"] } }); + fetchStub.resolves(mockFetchResponse(200, { iTwins: ["itwin-001", "itwin-002"] } )); const result = await service.getRealityDataITwins(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); - expect(axiosGetStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins` ); expect(result.isError()).to.equal(false); @@ -1370,28 +1224,26 @@ describe("RealityCaptureService API calls tests", function () { }); it("getRealityDataITwins 404 error", async () => { - axiosGetStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.getRealityDataITwins(rdId); - expect(axiosGetStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("getRealityDataITwins ill formed error", async () => { - axiosGetStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.getRealityDataITwins(rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // associateRealityData tests - it("associateRealityData should call axios.post on the iTwins endpoint", async () => { - axiosPostStub.resolves({ status: 200, data: {} }); + it("associateRealityData should call fetch on the iTwins endpoint", async () => { + fetchStub.resolves(mockFetchResponse(200, {} )); const result = await service.associateRealityData(iTwinId, rdId); - expect(axiosPostStub.calledOnce).to.equal(true); - expect(axiosPostStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins/${iTwinId}` ); expect(result.isError()).to.equal(false); @@ -1399,28 +1251,26 @@ describe("RealityCaptureService API calls tests", function () { }); it("associateRealityData 404 error", async () => { - axiosPostStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.associateRealityData(iTwinId, rdId); - expect(axiosPostStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("associateRealityData ill formed error", async () => { - axiosPostStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.associateRealityData(iTwinId, rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); }); // dissociateRealityData tests - it("dissociateRealityData should call axios.delete on the iTwins endpoint", async () => { - axiosDeleteStub.resolves({ status: 204, data: {} }); + it("dissociateRealityData should call fetch on the iTwins endpoint", async () => { + fetchStub.resolves(mockFetchResponse(204, {} )); const result = await service.dissociateRealityData(iTwinId, rdId); - expect(axiosDeleteStub.calledOnce).to.equal(true); - expect(axiosDeleteStub.firstCall.args[0]).to.equal( + expect(fetchStub.calledOnce).to.equal(true); + expect(fetchStub.firstCall.args[0]).to.equal( `https://dev-api.bentley.com/reality-management/reality-data/${rdId}/iTwins/${iTwinId}` ); expect(result.isError()).to.equal(false); @@ -1428,17 +1278,15 @@ describe("RealityCaptureService API calls tests", function () { }); it("dissociateRealityData 404 error", async () => { - axiosDeleteStub.rejects({ - response: { status: 404, data: { error: { code: "RealityDataNotFound", message: "Not found." } } } - }); + fetchStub.resolves(mockFetchResponse(404, { error: { code: "RealityDataNotFound", message: "Not found." } } )); const result = await service.dissociateRealityData(iTwinId, rdId); - expect(axiosDeleteStub.calledOnce).to.equal(true); + expect(fetchStub.calledOnce).to.equal(true); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("RealityDataNotFound"); }); it("dissociateRealityData ill formed error", async () => { - axiosDeleteStub.rejects({ response: { status: 500, data: { bad: "response" } } }); + fetchStub.resolves(mockFetchResponse(500, { bad: "response" } )); const result = await service.dissociateRealityData(iTwinId, rdId); expect(result.isError()).to.equal(true); expect(result.error!.error.code).to.equal("UnknownError"); diff --git a/typescript/packages/reality-capture/src/tests/service/test_helpers.ts b/typescript/packages/reality-capture/src/tests/service/test_helpers.ts new file mode 100644 index 00000000..8690557c --- /dev/null +++ b/typescript/packages/reality-capture/src/tests/service/test_helpers.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ + +/** + * Builds a minimal fetch `Response`-like object for use with a stubbed global `fetch` + * in tests, mirroring what `RealityCaptureService`'s `_request` helper relies on + * (`response.ok`, `response.status`, `response.text()`). + */ +export function mockFetchResponse(status: number, data?: any): globalThis.Response { + return { + ok: status >= 200 && status < 300, + status, + text: async () => (data === undefined || data === null ? "" : typeof data === "string" ? data : JSON.stringify(data)), + } as globalThis.Response; +}