diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e9d727d1303..605a69daf20 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ on: jobs: build-viewer: name: Build Reveal - runs-on: ubuntu-latest + runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -53,7 +53,7 @@ jobs: working-directory: viewer run: yarn run build - - name: Upload dist/ artifact + - name: Upload dist/ artifact uses: actions/upload-artifact@v3 with: name: viewer @@ -61,17 +61,10 @@ jobs: run-coverage-tests: name: Run unit tests - runs-on: ubuntu-latest - needs: build-viewer + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Download viewer build artifact - uses: actions/download-artifact@v3 - with: - name: viewer - path: viewer/dist/ - - uses: actions/cache@v2 id: npm_cache with: @@ -128,7 +121,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: msg: | - There were failures in the Visual regression tests workflow. + There were failures in the visual tests workflow. Image diffs for visual tests can be downloaded as an artifact [here](https://github.com/cognitedata/reveal/actions/runs/${{ github.run_id }}). - name: Upload image diffs for failed visual tests @@ -146,12 +139,12 @@ jobs: ci-examples: name: Examples - runs-on: ubuntu-latest + runs-on: ubuntu-latest needs: build-viewer steps: - uses: actions/checkout@v3 - - name: Download viewer build artifact + - name: Download viewer build artifact uses: actions/download-artifact@v3 with: name: viewer @@ -174,44 +167,10 @@ jobs: # if: steps.npm_cache.outputs.cache-hit != 'true' working-directory: examples run: yarn install --immutable - - - name: Increase number of inotify watches - run: 'echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p' - - # Disabled because visual tests also builds examples - # - name: Build examples - # working-directory: examples - # run: | - # echo "NODE_OPTIONS=--max-old-space-size=8192" >> $GITHUB_ENV - # yarn build - - - name: Visual regression tests - id: visualtests - working-directory: examples - run: 'yarn ci:e2e' - continue-on-error: true - - name: Check for failed visual test diffs - if: (always() && steps.visualtests.outcome == 'failure') + - name: Build examples working-directory: examples - run: | - yarn - yarn test:ghprcomment - env: - ACTIONS_RUNTIME_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload image diffs for failed visual tests - if: (always() && steps.visualtests.outcome == 'failure') - uses: actions/upload-artifact@v3 - with: - name: image-diffs-${{ github.sha }} - path: examples/src/visual_tests/__image_snapshots__/__diff_output__/* - - - name: Report failed visual tests - if: (always() && steps.visualtests.outcome == 'failure') - run: | - echo There are failed visual tests, please inspect test results. - exit 1 + run: yarn build # runs only when there are changes in parser-worker/ # we use it here because github haven't figured out conditionally required checks @@ -345,7 +304,7 @@ jobs: yarn install --immutable yarn build:fast - - name: Upload documentation artifact + - name: Upload documentation artifact uses: actions/upload-artifact@v3 with: name: preview-docs @@ -364,7 +323,7 @@ jobs: run: | echo "PR_NUMBER=$(jq --raw-output .pull_request.number $GITHUB_EVENT_PATH)" >> $GITHUB_ENV - - name: Download documentation artifact + - name: Download documentation artifact uses: actions/download-artifact@v3 if: with: diff --git a/.gitignore b/.gitignore index 6176c983504..529256f2404 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ target **/.env **/.env.* +**/.cdf-environments.json !**/.env.example # Viewer ignores diff --git a/documentation/docs/examples/point-to-point-measurement.mdx b/documentation/docs/examples/point-to-point-measurement.mdx new file mode 100644 index 00000000000..2eb5834d2a6 --- /dev/null +++ b/documentation/docs/examples/point-to-point-measurement.mdx @@ -0,0 +1,160 @@ +--- +id: point-to-point-measurement +title: Point to point measurement +description: Demo shows how to measure point to point distance in Reveal. +--- + +import { DemoWrapper } from '@site/docs/components/DemoWrapper'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +The `MeasurementTool` is a measuring tool for point to point distance in 3D models, by clicking to- and from-points. The default measurement unit is meters, but the tool provides callbacks to allow configuring the unit. +When exiting from the tool, all the measurement will be removed from the `Cognite3DViewer`. Note that the precision the tool can provide is limited, and the tool should only be used for approximate measurement - not high precision measurement for e.g. construction. + +To effectively edit measuring line properties, tool is configurable with `MeasurementOptions` options to set +- Custom label content for each measurement. +- Size of line width in meters. +- Color of line. + +:::tip +`CameraControlsOptions.changeCameraTargetOnClick` should be set to `false` to avoid click event registering for camera when `MeasurementTool` is active. Also avoid any custom click-handler that might interfere with the measurement tool. +::: + + + +## Point to point distance measurment +To enter point-to-point measurement mode, use `MeasurementTool.enterMeasurementMode()`. This will register events for handling mouse clicks and touch events to allow placing the measurement end-points. Note that the tool is optimized for use with mouse. + +To exit measurement mode, call `exitMeasurementMode()`. The tool will also exit measurement mode if user presses Escape key. + +```jsx runnable +// import { MeasurementTool } from '@cognite/reveal/tools'; + +const measurementTool = new MeasurementTool(viewer); +measurementTool.enterMeasurementMode(); +``` + +## Events +The tool exposes events for subscribing to measurement start, end & added. In the below example, the mouse cursor is changed to a cross-hair while measuring. + +```jsx runnable +// import { MeasurementTool } from '@cognite/reveal/tools'; +const measurementTool = new MeasurementTool(viewer); + +// Subscribe to measurement events +measurementTool.on('started', + () => viewer.domElement.style.cursor = 'crosshair'); +measurementTool.on('ended', + () => viewer.domElement.attributeStyleMap.delete('cursor')); +measurementTool.on('added', (measurement) => { + alert(`Measurement added with ${JSON.stringify(measurement.distanceInMeters)} distance!`); + measurementTool.exitMeasurementMode(); +}); + +measurementTool.enterMeasurementMode(); +``` + + + +### Mode of measurement +To get the mode of measurement `MeasurementTool.isInMeasurementMode`. It returns `true` if the measurement is active else `false`. + + +## Set width, color & label units of the measuring line +To change width, color of the line and label units, use `MeasurementTool.setLineOptions(options: MeasurementOptions)`. MeasurementOptions expects + - `distanceToLabelCallback` : callback for custom operation on measurement labels + - `lineWidth` : number - units in meters + - `color` : THREE.color + +The updated line width, color and label units will be applied for the next measuring distance. + +```jsx runnable +// import { MeasurementTool } from '@cognite/reveal/tools'; + +const lineOptions = { + distanceToLabelCallback: (distanceInMeters) => { + // 1 meter = 100 centimeter + return `${(distanceInMeters * 100).toFixed(2)} cm`; + }, + lineWidth: 0.1, + color: new THREE.Color(0xff0000) +}; +const measurementTool = new MeasurementTool(viewer); +measurementTool.enterMeasurementMode(); + +//Update line width, color and label units for the next measuring line. +measurementTool.setLineOptions(lineOptions); +``` + +### Get all measurement +To get all measurements added the tool provides `MeasurementTool.getAllMeasurements()` which will +return an array of measurements of type `Measurement`, having below details + - `measurementId` : unique id of measurement. + - `startPoint` : start point of the measurement. + - `endPoint` : end point of the measurement. + - `distanceInMeters` : measured distance in meters. +```jsx runnable +// import { MeasurementTool } from '@cognite/reveal/tools'; + +const measurementTool = new MeasurementTool(viewer); +measurementTool.enterMeasurementMode(); + +//add measurements + +//get all measurements +setTimeout(() => { + const measurements = measurementTool.getAllMeasurements(); + measurements.forEach(measurement => { + alert(measurement.distanceInMeters); + }); +}, 6000); +``` + +### Change appearance of existing measurement +To change existing measurement line width or color, use `MeasurementTool.updateLineWidth(lineWidth: number)` or `MeasurementTool.updateLineColor(color: THREE.Color)` + +```jsx runnable +// import { MeasurementTool } from '@cognite/reveal/tools'; + +const measurementTool = new MeasurementTool(viewer); +setInterval(() => { + const measurements = measurementTool.getAllMeasurements(); + console.log(measurements); + for (const measurement of measurements) { + const color = Math.floor(Math.random() * 16777215); + const lineWidth = (Math.random() * 1.0) + 0.2; + measurementTool.updateLineColor(measurement, new THREE.Color(color)); + measurementTool.updateLineWidth(measurement, lineWidth); + } +}, 200); +measurementTool.enterMeasurementMode(); +``` + +### Remove measurement +To remove a measurement from the viewer, we have `MeasurementTool.removeMeasurement(measurement: Measurement)` + - `measurement` : Measurement to be removed. + +```jsx runnable +// import { MeasurementTool } from '@cognite/reveal/tools'; + +const measurementTool = new MeasurementTool(viewer); +measurementTool.enterMeasurementMode(); + +//remove the first measurement in the added list +setTimeout(() => { + const measurements = measurementTool.getAllMeasurements(); + + if (measurements[0]) { + measurementTool.removeMeasurement(measurements[0]); + } +}, 6000); +``` + +To remove all measurement from the viewer, use `MeasurementTool.removeAllMeasurement()` + +### Label visibility +Measurement labels can be hidden/visible using `MeasurementTool.showMeasurementLabels(enable: boolean)`. +```jsx +// Hide all measurement lables +measurementTool.showMeasurementLabels(false); +``` + diff --git a/documentation/docs/examples/pointcloud.mdx b/documentation/docs/examples/pointcloud.mdx index 7d3d0aa5456..6d86794ae50 100644 --- a/documentation/docs/examples/pointcloud.mdx +++ b/documentation/docs/examples/pointcloud.mdx @@ -4,8 +4,11 @@ title: Pointcloud models description: Usage of pointcloud models with Cognite3DViewer --- -`@cognite/reveal` supports point clouds through a third-party library, [`potree-core`](https://github.com/tentone/potree-core). The viewer -supports loading both point clouds and CAD models at the same time. Point clouds can be generated from various sources including +import useBaseUrl from '@docusaurus/useBaseUrl'; + +`@cognite/reveal` supports point clouds through a third-party library, [`three-loader`](https://github.com/pnext/three-loader) that is +included in the Reveal codebase and modified for our needs. Most of the internal point cloud logic is based on [`potree`](https://github.com/potree/potree/). +The viewer supports loading both point clouds and CAD models at the same time. Point clouds can be generated from various sources including [laser scans](https://en.wikipedia.org/wiki/Laser_scanning) and [photogrammetry models](https://en.wikipedia.org/wiki/Photogrammetry). Loading point clouds is done with identical code to when [loading CAD models](./cad-basic) - Reveal will determine that the model is a point cloud model and act accordingly. @@ -88,6 +91,27 @@ model.pointColorType = PotreePointColorType.Depth; Other useful coloring schemes are `Rgb` (color) , `Classification` (color by point class) and `Intensity` (strength of the backscattered signal in a laser scan). +## Point cloud post processing effects + +Users can enable various post processing effects for point cloud rendering. One of them is the "point blending" effect +which produces a more "stable" rendering of surfaces within the point cloud model but it comes with a cost of +decreased performance. + + + Illustration of point blending effect + + +You can enable the described effect by passing a corresponding property on initialization of `Cognite3DViewer`: +```jsx +const viewer = new Cognite3DViewer( + { + sdk: client, + pointCloudEffects: { + pointBlending: true + } + }); +``` + ## Classification filtering Some point clouds have classification information associated with each point. This can diff --git a/documentation/docs/extending/camera-manager.mdx b/documentation/docs/extending/camera-manager.mdx index ecaa8c2b01e..98817f1886b 100644 --- a/documentation/docs/extending/camera-manager.mdx +++ b/documentation/docs/extending/camera-manager.mdx @@ -16,7 +16,8 @@ In certain cases it can be useful to customize behaviour of the camera: ## Overview To create a custom camera manager class, `CameraManager` interface from `@cognite/reveal` must be implemented -and provided to `Cognite3DViewer` on construction using the `cameraManager`-option. Interface looks like this: +and provided to `Cognite3DViewer` on construction using the `cameraManager`-option. You can also set camera manager +in runtime by calling `setCameraManager` method of `Cognite3DViewer` class. Interface looks like this: ```js export interface CameraManager { @@ -96,7 +97,7 @@ When implementing these functions you can use a helper class `CameraManagerHelpe Here is an example implementation of a custom camera manager that utilizes standard ThreeJS [`OrbitControls`](https://threejs.org/docs/index.html?q=orbit#examples/en/controls/OrbitControls) for mouse movement: ```js -import * as THREE from 'three'; +import { THREE } from '@cognite/reveal'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; import { CameraManager, CameraManagerHelper, CameraState, CameraChangeDelegate } from '@cognite/reveal'; @@ -115,19 +116,24 @@ export class CustomCameraManager implements CameraManager { this._controls.dampingFactor = 0.3; this._controls.addEventListener('change', () => { - this._cameraChangedListener.forEach( cb => cb(this._camera.position, - this._controls.target)); + this._cameraChangedListener.forEach( cb => cb(this._camera.position, this._controls.target)); }); } + set enabled(value: boolean) { + this._controls.enabled = value; + } + + get enabled(): boolean { + return this._controls.enabled; + } + getCamera(): THREE.PerspectiveCamera { return this._camera; } setCameraState(state: CameraState): void { - if (state.rotation && state.target) throw - new Error("Can't set both rotation and target"); - + if (state.rotation && state.target) throw new Error("Can't set both rotation and target"); const position = state.position ?? this._camera.position; const rotation = state.rotation ?? this._camera.quaternion; const target = state.target ?? ( state.rotation ? @@ -160,8 +166,7 @@ export class CustomCameraManager implements CameraManager { } fitCameraToBoundingBox(boundingBox: THREE.Box3, duration?: number, radiusFactor?: number): void { - const { position, target } = CameraManagerHelper - .calculateCameraStateToFitBoundingBox(this._camera, boundingBox, radiusFactor); + const { position, target } = CameraManagerHelper.calculateCameraStateToFitBoundingBox(this._camera, boundingBox, radiusFactor); this.setCameraState({ position, target }); } diff --git a/documentation/package.json b/documentation/package.json index 91ef2d39060..caaccee173f 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -74,7 +74,7 @@ "three": "0.125.2" }, "devDependencies": { - "@types/react": "18.0.17", + "@types/react": "18.0.18", "@types/styled-components": "5.1.26", "@types/three": "0.125.2", "concat-md": "0.5.0", @@ -83,9 +83,9 @@ "replace": "1.2.1", "rimraf": "3.0.2", "typedoc": "0.22.17", - "typedoc-plugin-markdown": "3.13.4", - "typedoc-plugin-no-inherit": "1.3.1", - "typescript": "4.7.4" + "typedoc-plugin-markdown": "3.13.6", + "typedoc-plugin-no-inherit": "1.4.0", + "typescript": "4.8.2" }, "browserslist": { "production": [ diff --git a/documentation/sidebars.js b/documentation/sidebars.js index 13c5259ff5a..dfb00d35177 100644 --- a/documentation/sidebars.js +++ b/documentation/sidebars.js @@ -44,6 +44,7 @@ module.exports = { 'examples/timelinetool', 'examples/combine-models', 'examples/controlsmodes', + 'examples/point-to-point-measurement', ], }, { diff --git a/documentation/static/img/point-blending.jpg b/documentation/static/img/point-blending.jpg new file mode 100644 index 00000000000..431986eee23 Binary files /dev/null and b/documentation/static/img/point-blending.jpg differ diff --git a/documentation/tsconfig.json b/documentation/tsconfig.json index cb1ad2651e6..3ea6b8763a2 100644 --- a/documentation/tsconfig.json +++ b/documentation/tsconfig.json @@ -22,11 +22,12 @@ "*" ] }, - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true }, "include": [ "src", "docs", "versioned_docs" ] -} +} \ No newline at end of file diff --git a/documentation/versioned_docs/version-3.x/examples/pointcloud.mdx b/documentation/versioned_docs/version-3.x/examples/pointcloud.mdx index 1106814b6c0..cc87b0141c9 100644 --- a/documentation/versioned_docs/version-3.x/examples/pointcloud.mdx +++ b/documentation/versioned_docs/version-3.x/examples/pointcloud.mdx @@ -4,8 +4,9 @@ title: Pointcloud models description: Usage of pointcloud models with Cognite3DViewer --- -`@cognite/reveal` supports point clouds through a third-party library, [`potree-core`](https://github.com/tentone/potree-core). The viewer -supports loading both point clouds and CAD models at the same time. Point clouds can be generated from various sources including +`@cognite/reveal` supports point clouds through a third-party library, [`three-loader`](https://github.com/pnext/three-loader) that is +included in reveal codebase and modified for our needs. The most of internal point cloud logic is based on [`potree`](https://github.com/potree/potree/). +The viewer supports loading both point clouds and CAD models at the same time. Point clouds can be generated from various sources including [laser scans](https://en.wikipedia.org/wiki/Laser_scanning) and [photogrammetry models](https://en.wikipedia.org/wiki/Photogrammetry). Loading point clouds is done with identical code to when [loading CAD models](./cad-basic) - Reveal will determine that the model is a point cloud model and act accordingly. diff --git a/documentation/yarn.lock b/documentation/yarn.lock index 99ca116a347..d6ad908b44f 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -1644,6 +1644,17 @@ query-string "^5.1.1" url "^0.11.0" +"@cognite/sdk-core@^4.6.2": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@cognite/sdk-core/-/sdk-core-4.6.5.tgz#1606788be077b56c856467d5107c7f50f8c7535b" + integrity sha512-iwJ7jEFFS270DxvDNHwYuwpB5hEKZzcKdKTtfj0U5nEd4h1jPWjsBoVrNLVQKcm7+x5U/gzaxSKwUvv3hFSHTw== + dependencies: + cross-fetch "^3.0.4" + is-buffer "^2.0.5" + lodash "^4.17.11" + query-string "^5.1.1" + url "^0.11.0" + "@cognite/sdk@link:../viewer/node_modules/@cognite/sdk": version "0.0.0" uid "" @@ -2495,10 +2506,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@18.0.17": - version "18.0.17" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.17.tgz#4583d9c322d67efe4b39a935d223edcc7050ccf4" - integrity sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ== +"@types/react@18.0.18": + version "18.0.18" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.18.tgz#9f16f33d57bc5d9dca848d12c3572110ff9429ac" + integrity sha512-6hI08umYs6NaiHFEEGioXnxJ+oEhY3eRz8VCUaudZmGdtvPviCJB8mgaMxaDWAdPSYd4eFavrPk2QIolwbLYrg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2548,13 +2559,6 @@ resolved "https://registry.yarnpkg.com/@types/three/-/three-0.140.0.tgz#3b74a021a69a6e2cd0e2550def15aa4c1c20e924" integrity sha512-YPJLSIY6uKUOp1k6BZYDq5GtEIdhfeK04UCbc9IPAVbdn/RNjkfrbnyd7smrsNkJhc0IFASLpd3AAYgwqgXKVQ== -"@types/three@0.141.0": - version "0.141.0" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.141.0.tgz#d9d81a54b28ebc2a56931dfd4d9c54d25c20d6c8" - integrity sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA== - dependencies: - "@types/webxr" "*" - "@types/uglify-js@*": version "3.13.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" @@ -2593,11 +2597,6 @@ anymatch "^3.0.0" source-map "^0.6.0" -"@types/webxr@*": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.4.0.tgz#ad06c96a324293e0d5175d13dd5ded5931f90ba3" - integrity sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg== - "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -8956,11 +8955,6 @@ path-browserify@0.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -11693,11 +11687,6 @@ three@0.140.2: resolved "https://registry.yarnpkg.com/three/-/three-0.140.2.tgz#ca0b7390d1ce4f7f2850e80afd00ef48fc244491" integrity sha512-DdT/AHm/TbZXEhQKQpGt5/iSgBrmXpjU26FNtj1KhllVPTKj1eG4X/ShyD5W2fngE+I1s1wa4ttC4C3oCJt7Ag== -three@0.141.0: - version "0.141.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" - integrity sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA== - through2@^0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" @@ -11939,17 +11928,17 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typedoc-plugin-markdown@3.13.4: - version "3.13.4" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.13.4.tgz#4c2f02b254c47d25b91579177900c1da5c5579b8" - integrity sha512-E/EBBmu6ARtnbswZGtBVBB/BfukZiGMOlqPc0RXCI/NFitONBahFqbCAF5fKQlijlcfipJj5pw5AMFH3NytrAw== +typedoc-plugin-markdown@3.13.6: + version "3.13.6" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.13.6.tgz#a419794e3bdbe459fb22772d8e6e02bac05211c1" + integrity sha512-ISSc9v3BK7HkokxSBuJPttXox4tJ6hP0N9wfSIk0fmLN67+eqtAxbk97gs2nDiuha+RTO5eW9gdeAb+RPP0mgg== dependencies: handlebars "^4.7.7" -typedoc-plugin-no-inherit@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/typedoc-plugin-no-inherit/-/typedoc-plugin-no-inherit-1.3.1.tgz#c0b1c81c91bb1d03f1303622c3791dd4f4b576f3" - integrity sha512-3fdPHRaIcCVV1W5gJYpZTdZL+F2VZTlUMd3Hw9xIv931ILh18CcD8IfxZtTtOijJRuKbgRLJ+J/+hVlgCbq1RQ== +typedoc-plugin-no-inherit@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-no-inherit/-/typedoc-plugin-no-inherit-1.4.0.tgz#8eafc790588f63f0a24621b646219cd6e8d6e4d6" + integrity sha512-cAvqQ8X9xh1xztVoDKtF4nYRSBx9XwttN3OBbNNpA0YaJSRM8XvpVVhugq8FoO1HdWjF3aizS0JzdUOMDt0y9g== typedoc@0.22.17: version "0.22.17" @@ -11962,10 +11951,10 @@ typedoc@0.22.17: minimatch "^5.1.0" shiki "^0.10.1" -typescript@4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== +typescript@4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.2.tgz#e3b33d5ccfb5914e4eeab6699cf208adee3fd790" + integrity sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw== ua-parser-js@^0.7.18: version "0.7.28" diff --git a/examples/jest.config.js b/examples/jest.config.js deleted file mode 100644 index 91a2d2c0d31..00000000000 --- a/examples/jest.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', -}; \ No newline at end of file diff --git a/examples/package.json b/examples/package.json index 93d4718202c..f004229fda5 100644 --- a/examples/package.json +++ b/examples/package.json @@ -5,13 +5,7 @@ "private": true, "scripts": { "start": "webpack serve --mode development", - "start:e2e-server": "cross-env HTTPS=false BROWSER=none webpack serve --mode development", - "test:visual": "cross-env JEST_PUPPETEER_CONFIG=src/visual_tests/jest-puppeteer.config.js jest -c src/visual_tests/jest.config.js", - "test:visual:update": "yarn run test:visual --updateSnapshot", - "test:ghprcomment": "node src/visual_tests/GithubActionsPRComment.js", - "snapshots:update": "yarn run ci:start-server 'test:visual:update'", - "ci:e2e": "yarn run ci:start-server 'test:visual'", - "ci:start-server": "START_SERVER_AND_TEST_INSECURE=1 start-server-and-test 'start:e2e-server' http://localhost:3000" + "build": "webpack --mode development" }, "author": "Lars Moastuen ", "contributors": [ @@ -27,52 +21,28 @@ "@cognite/sdk": "link:../viewer/node_modules/@cognite/sdk", "camera-controls": "^1.25.1", "dat.gui": "^0.7.7", - "geo-three": "^0.0.16", "hold-event": "^0.0.1", - "install": "^0.13.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-router-dom": "^5.2.0", "styled-components": "^5.2.0" }, "devDependencies": { - "@actions/core": "^1.2.6", - "@actions/github": "^4.0.0", "@testing-library/jest-dom": "^5.11.5", - "@testing-library/react": "^11.1.0", - "@testing-library/user-event": "^12.1.10", "@types/dat.gui": "^0.7.5", - "@types/jest": "^26.0.19", - "@types/jest-environment-puppeteer": "^4.4.1", - "@types/jest-image-snapshot": "^4.1.2", - "@types/node": "^14.14.5", "@types/react": "^16.9.54", "@types/react-dom": "^16.9.0", "@types/react-router-dom": "^5.1.6", "@types/styled-components": "^5.1.4", "@types/three": "0.141.0", - "@types/webpack-env": "^1.16.2", - "copy-webpack-plugin": "^6.2.1", - "cross-env": "^7.0.2", "css-loader": "^6.7.1", - "customize-cra": "^1.0.0", "dotenv-webpack": "^7.1.0", "html-webpack-plugin": "^5.5.0", - "jest": "^28.1.1", - "jest-environment-puppeteer": "^4.4.0", - "jest-image-snapshot": "^4.3.0", - "jest-puppeteer": "^4.4.0", - "jest-retries": "^1.0.1", - "moq.ts": "^9.0.2", - "prettier": "^2.1.2", - "puppeteer": "13.5.1", - "start-server-and-test": "^1.12.3", - "ts-jest": "^28.0.5", "ts-loader": "^9.3.1", "typescript": "^4.3.2", "webpack": "^5.73.0", "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.9.2", + "webpack-dev-server": "^4.10.0", "webpack-log": "^3.0.2" }, "eslintConfig": { @@ -90,4 +60,4 @@ "last 1 safari version" ] } -} \ No newline at end of file +} diff --git a/examples/public/index.html b/examples/public/index.html index 31d26367148..01e40f4079a 100644 --- a/examples/public/index.html +++ b/examples/public/index.html @@ -24,7 +24,7 @@ Learn how to configure a non-root public URL by running `npm run build`. --> Reveal examples - +
diff --git a/examples/src/App.tsx b/examples/src/App.tsx index 63a7a6b8c4d..012d90ced52 100644 --- a/examples/src/App.tsx +++ b/examples/src/App.tsx @@ -2,16 +2,8 @@ * Copyright 2021 Cognite AS */ -import React from 'react'; -import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom'; -import { - ExampleRoute, - exampleRoutes, - cadTestRoutes, - pointCloudTestRoutes, -} from './routes'; -import { Container } from './components/styled'; import styled from 'styled-components'; +import { Migration } from './pages/Migration'; const PageContainer = styled.div` box-shadow: rgba(0, 0, 0, 0.1) 0 1px 5px 0; @@ -24,76 +16,6 @@ const PageContainer = styled.div` overflow-x: auto; `; -const UlStyled = styled.ul` - padding-left: 20px; - margin: 16px 0; - - > li { - padding: 2px 0; - font-size: 1.4em; - } -`; - -const PagesList = (props: { routes: ExampleRoute[] }) => { - return ( - - {props.routes.map((page) => ( -
  • - {page.menuTitle} -
  • - ))} -
    - ); -}; - -export default function App() { - const MainMenuPage = () => ( - -

    Select an example:

    - -
    - ); - - return ( - <> - -
    - - - {exampleRoutes - .concat(cadTestRoutes(), pointCloudTestRoutes()) - .map((page) => ( - - - Back to menu -

    {page.menuTitle}

    - {page.component} -
    -
    - ))} - - -
    -
    -
    -
    - - ); +export default function App(): JSX.Element { + return ; } diff --git a/examples/src/pages/Clipping.tsx b/examples/src/pages/Clipping.tsx deleted file mode 100644 index 6397acd9ee2..00000000000 --- a/examples/src/pages/Clipping.tsx +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ -import React, { useEffect, useRef } from 'react'; -import { THREE } from '@cognite/reveal'; -import * as reveal from '@cognite/reveal/internals'; -import CameraControls from 'camera-controls'; -import dat from 'dat.gui'; -import { getParamsFromURL, createSDKFromEnvironment } from '../utils/example-helpers'; -import { CogniteClient } from '@cognite/sdk'; -import { BoundingBoxClipper } from '@cognite/reveal'; -import { CanvasWrapper } from '../components/styled'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; -import { suggestCameraConfig } from '../utils/cameraConfig'; - -CameraControls.install({ THREE }); - -export function Clipping() { - const canvasRef = useRef(null); - - useEffect(() => { - const gui = new dat.GUI(); - let revealManager: reveal.RevealManager; - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - - async function main() { - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives', - }); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.clipping', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.clipping', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const sceneHandler = new reveal.SceneHandler(); - const renderer = new THREE.WebGLRenderer({ - canvas: canvasRef.current!, - }); - renderer.localClippingEnabled = true; - renderer.setClearColor('#444'); - renderer.setSize(window.innerWidth, window.innerHeight); - - const { revealManager, model } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'cad', modelRevision, modelUrl); - sceneHandler.addCadModel(model, model.cadModelIdentifier); - - const { position, target, near, far } = suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - near, - far - ); - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - position.x, - position.y, - position.z, - target.x, - target.y, - target.z - ); - controls.update(0.0); - camera.updateMatrixWorld(); - revealManager.update(camera); - - const params = { - width: 10, - height: 10, - depth: 10, - x: 0, - y: 0, - z: 0, - showHelpers: false, - }; - - let guiNeedsUpdate = true; - - const boxClipper = new BoundingBoxClipper( - new THREE.Box3( - new THREE.Vector3( - params.x - params.width / 2, - params.y - params.height / 2, - params.z - params.depth / 2 - ), - new THREE.Vector3( - params.x + params.width / 2, - params.y + params.height / 2, - params.z + params.depth / 2 - ) - ) - ); - - function updateClippingPlanes() { - revealManager.clippingPlanes = boxClipper.clippingPlanes; - } - updateClippingPlanes(); - - const helpers = new THREE.Group(); - helpers.add( - new THREE.PlaneHelper(boxClipper.clippingPlanes[0], 2, 0xff0000) - ); - helpers.add( - new THREE.PlaneHelper(boxClipper.clippingPlanes[1], 2, 0xff0000) - ); - helpers.add( - new THREE.PlaneHelper(boxClipper.clippingPlanes[2], 2, 0x00ff00) - ); - helpers.add( - new THREE.PlaneHelper(boxClipper.clippingPlanes[3], 2, 0x00ff00) - ); - helpers.add( - new THREE.PlaneHelper(boxClipper.clippingPlanes[4], 2, 0x0000ff) - ); - helpers.add( - new THREE.PlaneHelper(boxClipper.clippingPlanes[5], 2, 0x0000ff) - ); - updateClippingPlanes(); - sceneHandler.addCustomObject(helpers); - - animationLoopHandler.setOnAnimationFrameListener(async (deltaTime) => { - const controlsNeedUpdate = controls.update(deltaTime); - if (controlsNeedUpdate) { - revealManager.update(camera); - } - - if (controlsNeedUpdate || revealManager.needsRedraw || guiNeedsUpdate) { - revealManager.render(camera); - guiNeedsUpdate = false; - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - - gui - .add(params, 'x', -600, 600) - .step(0.1) - .name('x') - .onChange((_) => { - boxClipper.minX = params.x - params.width / 2; - boxClipper.maxX = params.x + params.width / 2; - updateClippingPlanes(); - }); - - gui - .add(params, 'y', -600, 600) - .step(0.1) - .name('y') - .onChange((_) => { - boxClipper.minY = params.y - params.height / 2; - boxClipper.maxY = params.y + params.height / 2; - updateClippingPlanes(); - }); - - gui - .add(params, 'z', -600, 600) - .step(0.1) - .name('z') - .onChange((_) => { - boxClipper.minZ = params.z - params.depth / 2; - boxClipper.maxZ = params.z + params.depth / 2; - updateClippingPlanes(); - }); - - gui - .add(params, 'width', 0, 10000) - .step(0.1) - .name('width') - .onChange((_) => { - boxClipper.minX = params.x - params.width / 2; - boxClipper.maxX = params.x + params.width / 2; - updateClippingPlanes(); - }); - - gui - .add(params, 'height', 0, 10000) - .step(0.1) - .name('height') - .onChange((_) => { - boxClipper.minY = params.y - params.height / 2; - boxClipper.maxY = params.y + params.height / 2; - updateClippingPlanes(); - }); - - gui - .add(params, 'depth', 0, 10000) - .step(0.1) - .name('depth') - .onChange((_) => { - boxClipper.minZ = params.z - params.depth / 2; - boxClipper.maxZ = params.z + params.depth / 2; - updateClippingPlanes(); - }); - - gui - .add(params, 'showHelpers') - .name('show helpers') - .onChange((value) => { - helpers.visible = value; - guiNeedsUpdate = true; - }); - - (window as any).sceneHandler = sceneHandler; - (window as any).THREE = THREE; - (window as any).camera = camera; - (window as any).controls = controls; - } - - main(); - - return () => { - gui.destroy(); - revealManager?.dispose(); - animationLoopHandler.dispose(); - }; - }); - return ( - - - - ); -} diff --git a/examples/src/pages/CustomDataSource.tsx b/examples/src/pages/CustomDataSource.tsx deleted file mode 100644 index 7c4917c1852..00000000000 --- a/examples/src/pages/CustomDataSource.tsx +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import { useEffect, useRef } from 'react'; -import { CanvasWrapper } from '../components/styled'; -import { THREE } from '@cognite/reveal'; -import { CogniteClient } from '@cognite/sdk'; -import { - Cognite3DViewer, - Cognite3DViewerOptions, -} from '@cognite/reveal'; -import * as reveal from '@cognite/reveal'; - -import { - DataSource, - ModelDataProvider, - ModelIdentifier, - ModelMetadataProvider, - NodesApiClient, - File3dFormat, - BlobOutputMetadata -} from '@cognite/reveal/extensions/datasource'; - -class MyDataSource implements DataSource { - getNodesApiClient(): NodesApiClient { - return new MyNodesApiClient(); - } - getModelMetadataProvider(): ModelMetadataProvider { - return new MyModelMetadataProvider(); - } - getModelDataProvider(): ModelDataProvider { - return new MyModelDataProvider(); - } -} - -class MyModelMetadataProvider implements ModelMetadataProvider { - getModelOutputs(modelIdentifier: ModelIdentifier): Promise { - return Promise.resolve([ - { - blobId: -1, - format: File3dFormat.RevealCadModel, - version: 8 - } - ]); - } - getModelUri(identifier: ModelIdentifier, formatMetadata: BlobOutputMetadata): Promise { - // Note! identifier will always be a CdfModelIdentifier - return Promise.resolve('/primitives'); - } - getModelCamera(identifier: ModelIdentifier): Promise< { position: THREE.Vector3; target: THREE.Vector3 } | undefined> { - // Note! identifier will always be a CdfModelIdentifier - - // Use default camera - return Promise.resolve(undefined); - } - getModelMatrix(identifier: ModelIdentifier, format: File3dFormat | string): Promise { - // Note! identifier will always be a CdfModelIdentifier - - // CAD models are usually stored in Z-up, while Reveal uses Y-up, so - // we need to account for this - const cadModelToReveal = new THREE.Matrix4().makeRotationFromEuler(new THREE.Euler(-Math.PI / 2, 0, 0)); - - return Promise.resolve(cadModelToReveal); - } - -} - -class MyModelDataProvider implements ModelDataProvider { - async getJsonFile(baseUrl: string, fileName: string): Promise { - const url = `${baseUrl}/${fileName}`; - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Could not fetch '${url}'`); - } - return response.json(); - } - - async getBinaryFile(baseUrl: string, fileName: string): Promise { - const url = `${baseUrl}/${fileName}`; - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Could not fetch '${url}'`); - } - return response.arrayBuffer(); - } -} - -class MyNodesApiClient implements NodesApiClient { - mapTreeIndicesToNodeIds(modelId: number, revisionId: number, treeIndices: number[]): Promise { - // Map 1:1 - pretend treeIndices == nodeIds - return Promise.resolve(treeIndices); - } - mapNodeIdsToTreeIndices(modelId: number, revisionId: number, nodeIds: number[]): Promise { - // Map 1:1 - pretend treeIndices == nodeIds - return Promise.resolve(nodeIds); - } - determineTreeIndexAndSubtreeSizesByNodeIds(modelId: number, revisionId: number, nodeIds: number[]): Promise<{treeIndex: number; subtreeSize: number }[]> { - throw new Error('Not supported.'); - } - determineNodeAncestorsByNodeId(modelId: number, revisionId: number, nodeId: number, generation: number): Promise<{treeIndex: number; subtreeSize: number }> { - throw new Error('Not supported.'); - } - getBoundingBoxesByNodeIds(modelId: number, revisionId: number, nodeIds: number[]): Promise { - throw new Error('Not supported.'); - } -} - -window.THREE = THREE; -(window as any).reveal = reveal; - -export function CustomDataSource() { - const canvasWrapperRef = useRef(null); - useEffect(() => { - let viewer: Cognite3DViewer; - - async function main() { - let viewerOptions: Cognite3DViewerOptions = { - sdk: undefined as unknown as CogniteClient, - customDataSource: new MyDataSource(), - domElement: canvasWrapperRef.current!, - logMetrics: false - }; - - // Prepare viewer - viewer = new Cognite3DViewer(viewerOptions); - // ModelID + revisionID doesn't really matter here as we've - // hardcoded the behavior in MyDataSource - const model = await viewer.addCadModel({modelId: 42, revisionId: 78}); - viewer.fitCameraToModel(model); - - (window as any).viewer = viewer; - } - - - main(); - - return () => { - viewer?.dispose(); - }; - }); - return ; -} diff --git a/examples/src/pages/Geomap.tsx b/examples/src/pages/Geomap.tsx deleted file mode 100644 index 3c6701a9d8b..00000000000 --- a/examples/src/pages/Geomap.tsx +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { useEffect, useRef } from 'react'; -import { CanvasWrapper } from '../components/styled'; -import { createSDKFromEnvironment } from '../utils/example-helpers'; -import { THREE } from '@cognite/reveal'; -import { CogniteClient } from '@cognite/sdk'; -import dat from 'dat.gui'; -import { - AddModelOptions, - Cognite3DViewer, - Cognite3DModel, - CognitePointCloudModel, - PotreePointColorType, - PotreePointShape, - TreeIndexNodeCollection, - IndexSet -} from '@cognite/reveal'; -import { DebugCameraTool, DebugLoadedSectorsTool, DebugLoadedSectorsToolOptions, AxisViewTool, GeomapTool, MapConfig, - MapboxMode, MapboxStyle, MapProviders, MapboxImageFormat, BingMapType, HereMapType, HereMapScheme, HereMapImageFormat } from '@cognite/reveal/tools'; -import * as reveal from '@cognite/reveal'; - -window.THREE = THREE; -(window as any).reveal = reveal; - -export function Geomap() { - const canvasWrapperRef = useRef(null); - useEffect(() => { - const gui = new dat.GUI({ width: Math.min(500, 0.8*window.innerWidth) }); - let viewer: Cognite3DViewer; - - function createGeometryFilter(input: string | null): { center: THREE.Vector3, size: THREE.Vector3 } | undefined { - if (input === null) return undefined; - const parsed = JSON.parse(input) as { center: THREE.Vector3, size: THREE.Vector3 }; - return { center: new THREE.Vector3().copy(parsed.center), size: new THREE.Vector3().copy(parsed.size) }; - } - - async function main() { - const url = new URL(window.location.href); - const urlParams = url.searchParams; - const project = urlParams.get('project'); - const geometryFilterInput = urlParams.get('geometryFilter'); - const environmentParam = urlParams.get('env'); - const geometryFilter = createGeometryFilter(geometryFilterInput); - if (!project) { - throw new Error('Must provide "project"as URL parameter'); - } - - const totalBounds = new THREE.Box3(); - - const pointCloudParams = { - pointSize: 1.0, - budget: 2_000_000, - pointColorType: PotreePointColorType.Rgb, - pointShape: PotreePointShape.Circle, - apply: () => { - pointCloudModels.forEach(model => { - model.pointSize = pointCloudParams.pointSize; - model.pointColorType = pointCloudParams.pointColorType; - model.pointShape = pointCloudParams.pointShape; - console.log(model.pointColorType, model.pointShape); - }); - } - }; - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.geomap', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.geomap', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const progress = (itemsLoaded: number, itemsRequested: number, itemsCulled: number) => { - guiState.debug.loadedSectors.statistics.culledCount = itemsCulled; - console.log(`loaded ${itemsLoaded}/${itemsRequested} (culled: ${itemsCulled})`); - - }; - // Prepare viewer - viewer = new Cognite3DViewer({ - sdk: client, - domElement: canvasWrapperRef.current!, - onLoading: progress, - logMetrics: false, - antiAliasingHint: (urlParams.get('antialias') || undefined) as any, - ssaoQualityHint: (urlParams.get('ssao') || undefined) as any - }); - (window as any).viewer = viewer; - - async function addModel(options: AddModelOptions) { - try { - const model = await viewer.addModel(options); - - const bounds = model.getModelBoundingBox(); - totalBounds.expandByPoint(bounds.min); - totalBounds.expandByPoint(bounds.max); - - viewer.loadCameraFromModel(model); - if (model instanceof Cognite3DModel) { - cadModels.push(model); - } else if (model instanceof CognitePointCloudModel) { - pointCloudModels.push(model); - pointCloudParams.apply(); - } - if (createGeometryFilterFromState(guiState.geometryFilter) === undefined) { - createGeometryFilterStateFromBounds(bounds, guiState.geometryFilter); - } - } catch (e) { - console.error(e); - alert(`Model ID is invalid or is not supported`); - } - } - - // Add GUI for loading models and such - const cadModels: Cognite3DModel[] = []; - const pointCloudModels: CognitePointCloudModel[] = []; - const guiState = { - modelId: 0, - revisionId: 0, - geometryFilter: - geometryFilter !== undefined - ? { ...geometryFilter, enabled: true } - : { center: new THREE.Vector3(), size: new THREE.Vector3(), enabled: false }, - antiAliasing: urlParams.get('antialias'), - ssaoQuality: urlParams.get('ssao'), - debug: { - stats: { - drawCalls: 0, - points: 0, - triangles: 0, - geometries: 0, - textures: 0, - renderTime: 0 - }, - loadedSectors: { - options: { - showSimpleSectors: true, - showDetailedSectors: true, - showDiscardedSectors: false, - colorBy: 'lod', - leafsOnly: false - } as DebugLoadedSectorsToolOptions, - tool: new DebugLoadedSectorsTool(viewer), - statistics: { - insideSectors: 0, - maxSectorDepth: 0, - maxSectorDepthOfInsideSectors: 0, - simpleSectorCount: 0, - detailedSectorCount: 0, - culledCount: 0, - forceDetailedSectorCount: 0, - downloadSizeMb: 0 - } - }, - suspendLoading: false, - ghostAllNodes: false, - hideAllNodes: false - }, - showCameraTool: new DebugCameraTool(viewer), - providers: 'MapboxMap', - latitude: 0.000001, - longitude: 0.000001 - }; - - // Load model if provided by URL - const modelIdStr = urlParams.get('modelId'); - const revisionIdStr = urlParams.get('revisionId'); - if (modelIdStr && revisionIdStr) { - const modelId = Number.parseInt(modelIdStr, 10); - const revisionId = Number.parseInt(revisionIdStr, 10); - await addModel({ modelId, revisionId, geometryFilter: createGeometryFilterFromState(guiState.geometryFilter) }); - } - - const selectedSet = new TreeIndexNodeCollection([]); - - new AxisViewTool(viewer); - viewer.on('click', async (event) => { - const { offsetX, offsetY } = event; - console.log('2D coordinates', event); - const intersection = await viewer.getIntersectionFromPixel(offsetX, offsetY); - if (intersection !== null) { - console.log(intersection); - switch (intersection.type) { - case 'cad': - { - const { treeIndex, point, model } = intersection; - console.log(`Clicked node with treeIndex ${treeIndex} at`, point); - // highlight the object - selectedSet.updateSet(new IndexSet([treeIndex])); - const boundingBox = await model.getBoundingBoxByTreeIndex(treeIndex); - viewer.fitCameraToBoundingBox(boundingBox, 1000); - } - break; - - case 'pointcloud': - { - const { pointIndex, point } = intersection; - console.log(`Clicked point with pointIndex ${pointIndex} at`, point); - const sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.1), new THREE.MeshBasicMaterial({ color: 'red' })); - sphere.position.copy(point); - viewer.addObject3D(sphere); - } - break; - } - } - }); - - let mapConfig: MapConfig = { - provider: MapProviders.MapboxMap, - APIKey: "pk.eyJ1IjoicHJhbW9kLXMiLCJhIjoiY2tzb2JkbXdyMGd5cjJubnBrM3IwMTd0OCJ9.jA9US2D2FRXUlldhE8bZgA", - mode: MapboxMode.Style, - id: MapboxStyle.Satellite_Streets, - tileFormat: MapboxImageFormat.JPG70, - latlong: { - latitude: 59.9016426931744, - longitude: 10.607235872426175 - } - }; - let map = new GeomapTool(viewer, mapConfig); - - const renderGui = gui.addFolder('Options'); - const mapProviders = ['MapboxMap', 'HereMap', 'BingMap', 'OpenStreetMap']; - renderGui.add(guiState, 'providers', mapProviders).name('MapProviders').onFinishChange(value => { - switch(value) { - case 'HereMap': - mapConfig = { - provider: MapProviders.HereMap, - APIKey: "HqSchC7XT2PA9qCfxzFq", - appCode: "5rob9QcZ70J-m18Er8-rIA", - style: HereMapType.Aerial, - scheme: HereMapScheme.Terrain, - imageFormat: HereMapImageFormat.PNG, - latlong: { - latitude: 59.9016426931744, - longitude: 10.607235872426175 - } - }; - break; - case 'MapboxMap': - mapConfig = { - provider: MapProviders.MapboxMap, - APIKey: "pk.eyJ1IjoicHJhbW9kLXMiLCJhIjoiY2tzb2JkbXdyMGd5cjJubnBrM3IwMTd0OCJ9.jA9US2D2FRXUlldhE8bZgA", - mode: MapboxMode.Style, - id: MapboxStyle.Satellite_Streets, - tileFormat: MapboxImageFormat.JPG70, - latlong: { - latitude: 59.9016426931744, - longitude: 10.607235872426175 - } - }; - break; - case 'BingMap': - mapConfig = { - provider: MapProviders.BingMap, - APIKey: "AuViYD_FXGfc3dxc0pNa8ZEJxyZyPq1lwOLPCOydV3f0tlEVH-HKMgxZ9ilcRj-T", - type: BingMapType.Aerial, - latlong: { - latitude: 59.9016426931744, - longitude: 10.607235872426175 - } - }; - break; - case 'OpenStreetMap': - mapConfig = { - provider: MapProviders.OpenStreetMap, - latlong: { - latitude: 59.9016426931744, - longitude: 10.607235872426175 - } - }; - break; - } - map.dispose(); - map = new GeomapTool(viewer, mapConfig); - }); - } - - main(); - - return () => { - gui.destroy(); - viewer?.dispose(); - }; - }); - return ; -} - -function createGeometryFilterStateFromBounds(bounds: THREE.Box3, out: { center: THREE.Vector3, size: THREE.Vector3 }) { - bounds.getCenter(out.center); - bounds.getSize(out.size); - return out; -} - -function createGeometryFilterFromState(state: { center: THREE.Vector3, size: THREE.Vector3 }): - { boundingBox: THREE.Box3, isBoundingBoxInModelCoordinates: true } | undefined { - state.size.clamp(new THREE.Vector3(0,0,0), new THREE.Vector3(Infinity, Infinity, Infinity)); - if (state.size.equals(new THREE.Vector3())) { - return undefined; - } - return { boundingBox: new THREE.Box3().setFromCenterAndSize(state.center, state.size), isBoundingBoxInModelCoordinates: true }; -} diff --git a/examples/src/pages/Migration.tsx b/examples/src/pages/Migration.tsx index 75bda199145..3064aa761bf 100644 --- a/examples/src/pages/Migration.tsx +++ b/examples/src/pages/Migration.tsx @@ -30,6 +30,8 @@ import { ModelUi } from '../utils/ModelUi'; import { createSDKFromEnvironment } from '../utils/example-helpers'; import { PointCloudClassificationFilterUI } from '../utils/PointCloudClassificationFilterUI'; import { PointCloudObjectStylingUI } from '../utils/PointCloudObjectStylingUI'; +import { CustomCameraManager } from '../utils/CustomCameraManager'; +import { MeasurementUi } from '../utils/MeasurementUi'; window.THREE = THREE; @@ -40,20 +42,31 @@ export function Migration() { const url = new URL(window.location.href); const urlParams = url.searchParams; const environmentParam = urlParams.get('env'); - const canvasWrapperRef = useRef(null); useEffect(() => { + // Check in order to avoid double initialization of everything, especially dat.gui. + // See https://reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects for why its called twice. + if (!canvasWrapperRef.current) { + return () => {}; + } + const gui = new dat.GUI({ width: Math.min(500, 0.8 * window.innerWidth) }); let viewer: Cognite3DViewer; let cameraManager: DefaultCameraManager; + let cameraManagers: { + Default: DefaultCameraManager; + Custom: CustomCameraManager; + } async function main() { const project = urlParams.get('project'); - const modelUrl = urlParams.get('modelUrl'); + let modelUrl = urlParams.get('modelUrl'); if (!modelUrl && !(environmentParam && project)) { - throw Error('Must specify URL parameters "project" and "env", or "modelUrl"'); + modelUrl = 'primitives'; + url.searchParams.set('modelUrl', 'primitives'); + window.history.pushState({}, '', url.toString()); } const progress = (itemsLoaded: number, itemsRequested: number, itemsCulled: number) => { @@ -67,9 +80,11 @@ export function Migration() { if (project && environmentParam) { client = await createSDKFromEnvironment('reveal.example.example', project, environmentParam); } else { - client = new CogniteClient({ appId: 'reveal.example.example', - project: 'dummy', - getToken: async () => 'dummy' }); + client = new CogniteClient({ + appId: 'reveal.example.example', + project: 'dummy', + getToken: async () => 'dummy' + }); } let viewerOptions: Cognite3DViewerOptions = { @@ -77,9 +92,12 @@ export function Migration() { domElement: canvasWrapperRef.current!, onLoading: progress, logMetrics: false, - antiAliasingHint: (urlParams.get('antialias') || undefined) as any, - ssaoQualityHint: (urlParams.get('ssao') || undefined) as any, - continuousModelStreaming: true + antiAliasingHint: (urlParams.get('antialias') ?? undefined) as any, + ssaoQualityHint: (urlParams.get('ssao') ?? undefined) as any, + continuousModelStreaming: true, + pointCloudEffects: { + pointBlending: (urlParams.get('pointBlending') === 'true' ?? undefined) + } }; if (modelUrl !== null) { @@ -90,8 +108,8 @@ export function Migration() { }; } else if (!(project && environmentParam)) { throw new Error('Must either provide URL parameters "env", "project", ' + - '"modelId" and "revisionId" to load model from CDF ' + - '"or "modelUrl" to load model from URL.'); + '"modelId" and "revisionId" to load model from CDF ' + + '"or "modelUrl" to load model from URL.'); } // Prepare viewer @@ -99,13 +117,19 @@ export function Migration() { (window as any).viewer = viewer; const controlsOptions: CameraControlsOptions = { - changeCameraTargetOnClick: true, + changeCameraTargetOnClick: false, mouseWheelAction: 'zoomToCursor', }; cameraManager = viewer.cameraManager as DefaultCameraManager; cameraManager.setCameraControlsOptions(controlsOptions); + cameraManagers = { + Default: viewer.cameraManager as DefaultCameraManager, + Custom: new CustomCameraManager(canvasWrapperRef.current!, new THREE.PerspectiveCamera(5, 1., 0.01, 1000)) + }; + cameraManagers.Custom.enabled = false; + // Add GUI for loading models and such const guiState = { antiAliasing: urlParams.get('antialias'), @@ -148,7 +172,8 @@ export function Migration() { renderMode: 'Color', controls: { mouseWheelAction: 'zoomToCursor', - changeCameraTargetOnClick: true + changeCameraTargetOnClick: true, + cameraManager: 'Default' } }; const guiActions = { @@ -353,16 +378,20 @@ export function Migration() { const controlsGui = gui.addFolder('Camera controls'); const mouseWheelActionTypes = ['zoomToCursor', 'zoomPastCursor', 'zoomToTarget']; + const cameraManagerTypes = ['Default', 'Custom']; controlsGui.add(guiState.controls, 'mouseWheelAction', mouseWheelActionTypes).name('Mouse wheel action type').onFinishChange(value => { cameraManager.setCameraControlsOptions({ ...cameraManager.getCameraControlsOptions(), mouseWheelAction: value }); }); controlsGui.add(guiState.controls, 'changeCameraTargetOnClick').name('Change camera target on click').onFinishChange(value => { cameraManager.setCameraControlsOptions({ ...cameraManager.getCameraControlsOptions(), changeCameraTargetOnClick: value }); }); + controlsGui.add(guiState.controls, 'cameraManager', cameraManagerTypes).name('Camera manager type').onFinishChange( (value: ('Default' | 'Custom')) => { + viewer.setCameraManager(cameraManagers[value]); + }); const inspectNodeUi = new InspectNodeUI(gui.addFolder('Last clicked node'), client, viewer); - viewer.renderer.setPixelRatio(window.devicePixelRatio); + new MeasurementUi(viewer, gui.addFolder('Measurement')); viewer.on('click', async (event) => { const { offsetX, offsetY } = event; @@ -423,6 +452,6 @@ export function Migration() { gui.destroy(); viewer?.dispose(); }; - }); + }, []); return ; } diff --git a/examples/src/pages/SSAO.tsx b/examples/src/pages/SSAO.tsx deleted file mode 100644 index 21801a82d47..00000000000 --- a/examples/src/pages/SSAO.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { useEffect, useRef } from 'react'; -import { CanvasWrapper } from '../components/styled'; -import CameraControls from 'camera-controls'; -import * as reveal from '@cognite/reveal/internals'; -import { THREE } from '@cognite/reveal'; -import dat from 'dat.gui'; -import { createSDKFromEnvironment, getParamsFromURL } from '../utils/example-helpers'; -import { CogniteClient } from '@cognite/sdk'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; -import { resizeRendererToDisplaySize } from '../utils/sceneHelpers'; -import { suggestCameraConfig } from '../utils/cameraConfig'; -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; - -CameraControls.install({ THREE }); - -export function SSAO() { - const canvasRef = useRef(null); - useEffect(() => { - const gui = new dat.GUI(); - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - let revealManager: reveal.RevealManager; - - async function main() { - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives', - }); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.ssao', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.ssao', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const sceneHandler = new reveal.SceneHandler(); - - const renderer = new THREE.WebGLRenderer({ - canvas: canvasRef.current!, - }); - renderer.setClearColor('#444'); - renderer.setSize(window.innerWidth, window.innerHeight); - - const { revealManager, model } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'cad', modelRevision, modelUrl); - sceneHandler.addCadModel(model, model.cadModelIdentifier); - - const { position, target, near, far } = suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - near, - far - ); - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - position.x, - position.y, - position.z, - target.x, - target.y, - target.z - ); - controls.update(0.0); - camera.updateMatrixWorld(); - revealManager.update(camera); - - animationLoopHandler.setOnAnimationFrameListener(async (deltaTime: number) => { - let needsResize = resizeRendererToDisplaySize(renderer, camera); - const controlsNeedUpdate = controls.update(deltaTime); - if (controlsNeedUpdate) { - revealManager.update(camera); - } - - if (controlsNeedUpdate || revealManager.needsRedraw || needsResize) { - revealManager.render(camera); - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - } - - main(); - - return () => { - gui.destroy(); - animationLoopHandler.dispose(); - revealManager?.dispose(); - }; - }); - return ( - - - - ); -} diff --git a/examples/src/pages/SectorWithPointcloud.tsx b/examples/src/pages/SectorWithPointcloud.tsx deleted file mode 100644 index a63f721ee30..00000000000 --- a/examples/src/pages/SectorWithPointcloud.tsx +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { useEffect, useRef } from 'react'; -import { CanvasWrapper } from '../components/styled'; - -import { PotreePointColorType, PotreePointShape, THREE } from '@cognite/reveal'; - -import CameraControls from 'camera-controls'; -import dat, { GUI } from 'dat.gui'; -import { - RenderOptions, - applyRenderingFilters, - RenderMode, - createDefaultRenderOptions, -} from '../utils/renderer-debug-widget'; -import { CogniteClient } from '@cognite/sdk'; -import { getParamsFromURL, createSDKFromEnvironment } from '../utils/example-helpers'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; -import { suggestCameraConfig } from '../utils/cameraConfig'; -import { CadNode, CdfModelIdentifier, LocalModelIdentifier, PotreeGroupWrapper, PotreeNodeWrapper, SceneHandler } from '@cognite/reveal/internals'; - -CameraControls.install({ THREE }); - -function getPointCloudParams() { - return getParamsFromURL( - { - project: 'publicdata', - modelUrl: 'primitives', - }, - { - modelId: 'pointCloudModelId', - revisionId: 'pointCloudRevisionId', - modelUrl: 'pointCloudUrl', - } - ); -} - -function initializeGui( - gui: GUI, - cadNode: CadNode, - pcGroup: PotreeGroupWrapper, - pcNode: PotreeNodeWrapper, - handleSettingsChangedCb: () => void -): RenderOptions { - gui - .add(pcGroup, 'visible') - .name('Show point cloud') - .onChange(handleSettingsChangedCb); - gui - .add(cadNode, 'visible') - .name('Show CAD') - .onChange(handleSettingsChangedCb); - const pcGui = gui.addFolder('Point cloud'); - pcGui - .add(pcGroup.position, 'x') - .name('Offset X') - .onChange(handleSettingsChangedCb); - pcGui - .add(pcGroup.position, 'y') - .name('Offset Y') - .onChange(handleSettingsChangedCb); - pcGui - .add(pcGroup.position, 'z') - .name('Offset Z') - .onChange(handleSettingsChangedCb); - const rotation = { y: pcGroup.rotation.y }; - pcGui - .add(rotation, 'y') - .name('Rotation') - .onChange((newValue) => { - pcGroup.setRotationFromEuler(new THREE.Euler(0.0, newValue, 0.0)); - handleSettingsChangedCb(); - }); - - pcGui.add(pcGroup, 'pointBudget', 0, 10_000_000); - pcGui.add(pcNode, 'pointSize', 0, 10).onChange(handleSettingsChangedCb); - pcGui - .add(pcNode, 'pointColorType', { - Rgb: PotreePointColorType.Rgb, - Depth: PotreePointColorType.Depth, - Height: PotreePointColorType.Height, - PointIndex: PotreePointColorType.PointIndex, - LevelOfDetail: PotreePointColorType.LevelOfDetail, - Classification: PotreePointColorType.Classification, - }) - .onChange((valueAsString: string) => { - const value: PotreePointColorType = parseInt( - valueAsString, - 10 - ); - pcNode.pointColorType = value; - handleSettingsChangedCb(); - }); - pcGui - .add(pcNode, 'pointShape', { - Circle: PotreePointShape.Circle, - Square: PotreePointShape.Square, - }) - .onChange((valueAsString: string) => { - const value: PotreePointShape = parseInt( - valueAsString, - 10 - ); - pcNode.pointShape = value; - handleSettingsChangedCb(); - }); - return createDefaultRenderOptions(); - // Uncomment to enable debugging widget - // return createRendererDebugWidget(renderer, scene, gui.addFolder('Debug')); -} - -export function SectorWithPointcloud() { - const canvasRef = useRef(null); - useEffect(() => { - const gui = new dat.GUI(); - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - - async function main() { - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives', - }); - - const { - modelRevision: pointCloudModelRevision, - modelUrl: pointCloudUrl, - } = getPointCloudParams(); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.hybrid-cad-pointcloud', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.hybrid-cad-pointcloud', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const sceneHandler = new SceneHandler(); - - const renderer = new THREE.WebGLRenderer({ - canvas: canvasRef.current!, - }); - renderer.setClearColor('#000000'); - renderer.setSize(window.innerWidth, window.innerHeight); - - const { revealManager, model } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'cad', modelRevision, modelUrl); - sceneHandler.addCadModel(model, model.cadModelIdentifier); - - let pointCloud - if (pointCloudModelRevision) { - const modelIdentifier = new CdfModelIdentifier(pointCloudModelRevision.modelId, pointCloudModelRevision.revisionId); - pointCloud = await revealManager.addModel('pointcloud', modelIdentifier); - } else if (pointCloudUrl) { - const modelIdentifier = new LocalModelIdentifier(pointCloudUrl.fileName!); - pointCloud = await revealManager.addModel('pointcloud', modelIdentifier); - } else { - throw new Error( - 'Need to provide either project & pointCloud OR pointCloudlUrl as query parameters' - ); - } - - const pointCloudGroup = pointCloud.potreeGroup; - const pointCloudNode = pointCloud.potreeNode; - sceneHandler.addCustomObject(pointCloudGroup); - - let settingsChanged = false; - function handleSettingsChanged() { - settingsChanged = true; - } - const renderOptions = initializeGui( - gui, - model, - pointCloudGroup, - pointCloudNode, - handleSettingsChanged - ); - - const { position, target, near, far } = - suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - near, - far - ); - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - position.x, - position.y, - position.z, - target.x, - target.y, - target.z - ); - controls.update(0.0); - camera.updateMatrixWorld(); - - animationLoopHandler.setOnAnimationFrameListener(async (deltaTime) => { - const controlsNeedUpdate = controls.update(deltaTime); - if (renderOptions.loadingEnabled) { - revealManager.update(camera); - } - const needsUpdate = - renderOptions.renderMode === RenderMode.AlwaysRender || - (renderOptions.renderMode === RenderMode.WhenNecessary && - (controlsNeedUpdate || - revealManager.needsRedraw || - pointCloudGroup.needsRedraw || - settingsChanged)); - - if (needsUpdate) { - applyRenderingFilters(sceneHandler.scene, renderOptions.renderFilter); - revealManager.render(camera); - settingsChanged = false; - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - - (window as any).sceneHandler = sceneHandler; - (window as any).THREE = THREE; - (window as any).camera = camera; - (window as any).controls = controls; - } - - main(); - - return () => { - gui.destroy(); - }; - }); - return ( - - - - ); -} diff --git a/examples/src/pages/Simple.tsx b/examples/src/pages/Simple.tsx deleted file mode 100644 index 7e699c1ea51..00000000000 --- a/examples/src/pages/Simple.tsx +++ /dev/null @@ -1,111 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import CameraControls from 'camera-controls'; -import { getParamsFromURL, createSDKFromEnvironment } from '../utils/example-helpers'; -import { CogniteClient } from '@cognite/sdk'; -import React, { useEffect, useRef, useState } from 'react'; -import { CanvasWrapper, Loader } from '../components/styled'; -import { resizeRendererToDisplaySize } from '../utils/sceneHelpers'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; - -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; -import { suggestCameraConfig } from '../utils/cameraConfig'; -import { LoadingState, RevealManager, SceneHandler } from '@cognite/reveal/internals'; - -CameraControls.install({ THREE }); - -export function Simple() { - const canvas = useRef(null); - const [loadingState, setLoadingState] = useState({ isLoading: false, itemsLoaded: 0, itemsRequested: 0, itemsCulled: 0 }); - - useEffect(() => { - let revealManager: RevealManager; - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - async function main() { - if (!canvas.current) { - return; - } - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives', - }); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.simple', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.simple', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const renderer = new THREE.WebGLRenderer({ - canvas: canvas.current, - }); - - renderer.localClippingEnabled = true; - renderer.setClearColor('#444'); - renderer.setPixelRatio(window.devicePixelRatio); - - const sceneHandler = new SceneHandler(); - const { revealManager, model } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'cad', modelRevision, modelUrl); - sceneHandler.addCadModel(model, model.cadModelIdentifier) - revealManager.on('loadingStateChanged', setLoadingState); - - const { position, target, near, far } = suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - const camera = new THREE.PerspectiveCamera(75, 2, near, far); - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - position.x, - position.y, - position.z, - target.x, - target.y, - target.z - ); - controls.update(0.0); - camera.updateMatrixWorld(); - revealManager.update(camera); - - animationLoopHandler.setOnAnimationFrameListener(async (deltaTime: number) => { - let needsResize = resizeRendererToDisplaySize(renderer, camera); - const controlsNeedUpdate = controls.update(deltaTime); - if (controlsNeedUpdate) { - revealManager.update(camera); - } - - if (controlsNeedUpdate || revealManager.needsRedraw || needsResize) { - revealManager.render(camera); - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - - (window as any).sceneHandler = sceneHandler; - (window as any).THREE = THREE; - (window as any).camera = camera; - (window as any).controls = controls; - (window as any).renderer = renderer; - } - - main(); - - return () => { - revealManager?.dispose(); - animationLoopHandler.dispose(); - }; - }, []); - const { isLoading, itemsLoaded, itemsRequested } = loadingState; - return ( - - - Downloading {itemsLoaded} / {itemsRequested} sectors. - - - - ); -} diff --git a/examples/src/pages/SimplePointcloud.tsx b/examples/src/pages/SimplePointcloud.tsx deleted file mode 100644 index 233568ef7a9..00000000000 --- a/examples/src/pages/SimplePointcloud.tsx +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { useEffect, useRef, useState } from 'react' -import { CanvasWrapper, Loader } from '../components/styled' - -import { PotreePointColorType, PotreePointShape, PotreePointSizeType, THREE } from '@cognite/reveal'; -import { CogniteClient } from '@cognite/sdk'; - -import CameraControls from 'camera-controls'; -import dat, { GUI } from 'dat.gui'; -import { createSDKFromEnvironment, getParamsFromURL } from '../utils/example-helpers'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; -import { ClippingUI } from '../utils/ClippingUI'; -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; -import { LoadingState, PointCloudNode, RevealManager, SceneHandler } from '@cognite/reveal/internals'; - -CameraControls.install({ THREE }); - -class RevealManagerUpdater { - - private _revealManager: RevealManager; - - constructor(revealManager: RevealManager) { - this._revealManager = revealManager; - } - - public get pointCloudBudget(): number { - return this._revealManager.pointCloudBudget.numberOfPoints; - } - - public set pointCloudBudget(val: number) { - this._revealManager.pointCloudBudget = { numberOfPoints: val }; - } -} - -function initializeGui( - gui: GUI, - node: PointCloudNode, - revealManagerUpdater: RevealManagerUpdater, - handleSettingsChangedCb: () => void -) { - gui.add(revealManagerUpdater, 'pointCloudBudget', 0, 20_000_000); - gui.add(node, 'visiblePointCount', 0, 20_000_000).onChange(() => { /* Ignore update */ }); - gui.add(node, 'pointSize', 0, 10).onChange(handleSettingsChangedCb); - gui - .add(node, 'pointColorType', { - Rgb: PotreePointColorType.Rgb, - Depth: PotreePointColorType.Depth, - Height: PotreePointColorType.Height, - PointIndex: PotreePointColorType.PointIndex, - LevelOfDetail: PotreePointColorType.LevelOfDetail, - Classification: PotreePointColorType.Classification, - }) - .onChange((valueAsString: string) => { - const value: PotreePointColorType = parseInt( - valueAsString, - 10 - ); - node.pointColorType = value; - handleSettingsChangedCb(); - }); - gui - .add(node, 'pointShape', { - Circle: PotreePointShape.Circle, - Square: PotreePointShape.Square, - }) - .onChange((valueAsString: string) => { - const value: PotreePointShape = parseInt( - valueAsString, - 10 - ); - node.pointShape = value; - handleSettingsChangedCb(); - }); - gui.add(node, 'pointSizeType', { - Adaptive: PotreePointSizeType.Adaptive, - Fixed: PotreePointSizeType.Fixed - }) -} - -export function SimplePointcloud() { - const canvasRef = useRef(null); - const [loadingState, setLoadingState] = useState({ isLoading: false, itemsLoaded: 0, itemsRequested: 0, itemsCulled: 0 }); - - useEffect(() => { - let revealManager: RevealManager; - if (!canvasRef.current) { - return - } - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - const gui = new dat.GUI(); - - async function main() { - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - }); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.simplepointcloud', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.simplepointcloud', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const sceneHandler = new SceneHandler(); - const renderer = new THREE.WebGLRenderer({ - canvas: canvasRef.current!, - }); - renderer.setClearColor('#444444'); - renderer.setSize(window.innerWidth, window.innerHeight); - - const { revealManager, model: pointCloudNode } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'pointcloud', modelRevision, modelUrl); - sceneHandler.addCustomObject(pointCloudNode); - revealManager.on('loadingStateChanged', setLoadingState); - - const classesGui = gui.addFolder('Class filters'); - const enabledClasses: { [clazz: number]: boolean } = {}; - console.log(pointCloudNode.getClasses()); - for (const clazz of pointCloudNode.getClasses()) { - enabledClasses[clazz] = true; - classesGui.add(enabledClasses, `${clazz}`, true) - .name(`Class ${clazz}`) - .onChange(visible => { - pointCloudNode.setClassVisible(clazz, visible); - }); - } - - const clippingUi = new ClippingUI(gui.addFolder('Clipping'), planes => { - revealManager.clippingPlanes = planes; - }); - clippingUi.updateWorldBounds(pointCloudNode.getBoundingBox()); - - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - 0.1, - 10000 - ); - - let settingsChanged = false; - function handleSettingsChanged() { - settingsChanged = true; - } - initializeGui(gui, pointCloudNode, new RevealManagerUpdater(revealManager), handleSettingsChanged); - - // Create a bounding box around the point cloud for debugging - const bbox: THREE.Box3 = pointCloudNode.getBoundingBox(); - const bboxHelper = new THREE.Box3Helper(bbox); - sceneHandler.addCustomObject(bboxHelper); - - const controls = new CameraControls(camera, renderer.domElement); - - const camTarget = bbox.getCenter(new THREE.Vector3()); - const minToCenter = new THREE.Vector3().subVectors(camTarget, bbox.min); - const camPos = camTarget.clone().addScaledVector(minToCenter, -1.5); - controls.setLookAt( - camPos.x, - camPos.y, - camPos.z, - camTarget.x, - camTarget.y, - camTarget.z - ); - - animationLoopHandler.setOnAnimationFrameListener((deltaTime) => { - const controlsNeedUpdate = controls.update(deltaTime); - - revealManager.update(camera); - - const needsUpdate = - controlsNeedUpdate || revealManager.needsRedraw || settingsChanged; - - if (needsUpdate) { - revealManager.render(camera); - settingsChanged = false; - } - }); - animationLoopHandler.start(); - - (window as any).sceneHandler = sceneHandler; - (window as any).renderer = renderer; - (window as any).THREE = THREE; - (window as any).camera = camera; - (window as any).controls = controls; - (window as any).model = pointCloudNode; - } - - main(); - - return () => { - gui.destroy(); - animationLoopHandler.dispose(); - revealManager?.dispose(); - }; - }, []); - - return ( - - - Loading... - - - - ); -} diff --git a/examples/src/pages/TwoModels.tsx b/examples/src/pages/TwoModels.tsx deleted file mode 100644 index d3960be797c..00000000000 --- a/examples/src/pages/TwoModels.tsx +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { useEffect, useRef } from 'react'; -import { CanvasWrapper } from '../components/styled'; -import { THREE } from '@cognite/reveal'; - -import CameraControls from 'camera-controls'; -import { createSDKFromEnvironment, getParamsFromURL } from '../utils/example-helpers'; -import { CogniteClient } from '@cognite/sdk'; -import * as reveal from '@cognite/reveal/internals'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; -import { suggestCameraConfig } from '../utils/cameraConfig'; - -CameraControls.install({ THREE }); - -function getModel2Params() { - return getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives' - }, { - modelId: 'modelId2', - revisionId: 'revisionId2', - modelUrl: 'modelUrl2' - }); -} - -export function TwoModels() { - const canvasRef = useRef(null); - useEffect(() => { - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - let revealManager: reveal.RevealManager; - async function main() { - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives', - }); - const { modelUrl: modelUrl2, modelRevision: modelRevision2 } = getModel2Params(); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.twomodels', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.twomodels', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const renderer = new THREE.WebGLRenderer({ - canvas: canvasRef.current!, - }); - renderer.setClearColor('#444'); - renderer.setSize(window.innerWidth, window.innerHeight); - - const sceneHandler = new reveal.SceneHandler(); - - const { revealManager, model } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'cad', modelRevision, modelUrl); - sceneHandler.addCadModel(model, model.cadModelIdentifier); - - let model2: reveal.CadNode; - if (modelRevision2) { - const modelIdentifier = new reveal.CdfModelIdentifier(modelRevision2.modelId, modelRevision2.revisionId); - model2 = await revealManager.addModel('cad', modelIdentifier); - } else if (modelUrl2) { - const modelIdentifier = new reveal.LocalModelIdentifier(modelUrl2.fileName!); - model2 = await revealManager.addModel('cad', modelIdentifier); - } else { - throw new Error( - 'Need to provide either project & modelId2/revisionId2 OR modelUrl2 as query parameters' - ); - } - sceneHandler.addCadModel(model2, model2.cadModelIdentifier); - - const { position, target, near, far } = suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - near, - far - ); - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - position.x, - position.y, - position.z, - target.x, - target.y, - target.z - ); - controls.update(0.0); - camera.updateMatrixWorld(); - revealManager.update(camera); - - const model2Offset = new THREE.Group(); - model2Offset.position.set(-2, -2, 0); - model2Offset.add(model2); - sceneHandler.addCadModel(model, model.cadModelIdentifier); - sceneHandler.addCadModel(model2Offset, model2.cadModelIdentifier); - - revealManager.update(camera); - - animationLoopHandler.setOnAnimationFrameListener((deltaTime) => { - const controlsNeedUpdate = controls.update(deltaTime); - if (controlsNeedUpdate) { - revealManager.update(camera); - } - const needsUpdate = controlsNeedUpdate || revealManager.needsRedraw; - - if (needsUpdate) { - revealManager.render(camera); - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - - (window as any).sceneHandler = sceneHandler; - (window as any).THREE = THREE; - (window as any).camera = camera; - (window as any).controls = controls; - } - - main(); - return () => { - animationLoopHandler.dispose(); - revealManager?.dispose(); - } - }); - return ( - - - - ); -} diff --git a/examples/src/pages/WalkablePath.tsx b/examples/src/pages/WalkablePath.tsx deleted file mode 100644 index 74281fe8993..00000000000 --- a/examples/src/pages/WalkablePath.tsx +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { useEffect, useRef } from 'react'; -import { CanvasWrapper } from '../components/styled'; -import { THREE } from '@cognite/reveal'; -import CameraControls from 'camera-controls'; -import { CogniteClient, HttpError } from '@cognite/sdk'; -import * as reveal from '@cognite/reveal/internals'; -import { GUI, GUIController } from 'dat.gui'; -import { createSDKFromEnvironment, getParamsFromURL } from '../utils/example-helpers'; -import { AnimationLoopHandler } from '../utils/AnimationLoopHandler'; -import { createManagerAndLoadModel } from '../utils/createManagerAndLoadModel'; -import { suggestCameraConfig } from '../utils/cameraConfig'; - -CameraControls.install({ THREE }); - -interface Coordinates { - x: number; - y: number; - z: number; -} - -interface NodeIdReference { - nodeId: number; -} - -interface TransitPathRequest { - revisionId: number; - items: { - from: Coordinates | NodeIdReference; - to: Coordinates | NodeIdReference; - movingObjectSize: { diameter: number; height: number }; - }[]; -} - -enum Type { - coordinates = 'coordinates', - nodeId = 'nodeId', -} - -interface Waypoint { - type: Type; - coordinates: Coordinates; - nodeId: NodeIdReference; -} - -interface TransitPathItem { - from: Waypoint; - to: Waypoint; - movingObjectSize: { diameter: number; height: number }; -} - -interface TransitPathData { - revisionId: number; - items: TransitPathItem[]; -} - -export function WalkablePath() { - const canvasRef = useRef(null); - useEffect(() => { - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - let revealManager: reveal.RevealManager; - async function main() { - const { project, modelUrl, modelRevision, environmentParam } = getParamsFromURL({ - project: 'publicdata', - modelUrl: 'primitives', - }); - - let client; - if (project && environmentParam) { - client = await createSDKFromEnvironment('reveal.example.walkable-path', project, environmentParam); - } else { - client = new CogniteClient({ appId: 'reveal.example.walkable-path', - project: 'dummy', - getToken: async () => 'dummy' }); - } - - const sceneHandler = new reveal.SceneHandler(); - const renderer = new THREE.WebGLRenderer({ - canvas: canvasRef.current!, - }); - renderer.setClearColor('#444'); - renderer.setSize(window.innerWidth, window.innerHeight); - - const { revealManager, model } = await createManagerAndLoadModel(client, renderer, sceneHandler, 'cad', modelRevision, modelUrl); - sceneHandler.addCadModel(model, model.cadModelIdentifier); - - const { position, target, near, far } = suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - const camera = new THREE.PerspectiveCamera( - 75, - window.innerWidth / window.innerHeight, - near, - far - ); - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - position.x, - position.y, - position.z, - target.x, - target.y, - target.z - ); - controls.update(0.0); - camera.updateMatrixWorld(); - - const walkablePathSdkClient = createNetworkDataSource(client); - - let updated = false; - const pathMeshes: THREE.Mesh[] = []; - - const removeWalkablePath = () => { - for (const pathMesh of pathMeshes) { - sceneHandler.removeCustomObject(pathMesh); - } - pathMeshes.splice(0, pathMeshes.length); - updated = true; - }; - - createGUIWrapper(modelRevision ? modelRevision.revisionId : 0, { - createWalkablePath: async (walkablePath: TransitPathRequest) => { - const walkablePathResponse = await walkablePathSdkClient.getTransitPath( - walkablePath - ); - removeWalkablePath(); - const vector3Path = convertToVector3Array( - walkablePathResponse, - model.getModelTransformation() - ); - const meshes = createWalkablePathMeshes(vector3Path); - for (const mesh of meshes) { - sceneHandler.addCustomObject(mesh); - pathMeshes.push(mesh); - } - updated = true; - }, - removeWalkablePath, - }); - - animationLoopHandler.setOnAnimationFrameListener((deltaTime) => { - const controlsNeedUpdate = controls.update(deltaTime); - if (controlsNeedUpdate) { - revealManager.update(camera); - } - const walkablePathUpdated = updated; - - if ( - controlsNeedUpdate || - revealManager.needsRedraw || - walkablePathUpdated - ) { - updated = false; - revealManager.render(camera); - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - revealManager.update(camera); - (window as any).sceneHandler = sceneHandler; - (window as any).THREE = THREE; - (window as any).camera = camera; - (window as any).controls = controls; - (window as any).renderer = renderer; - } - - main(); - return () => { - animationLoopHandler.dispose(); - revealManager?.dispose(); - }; - }); - return ( - - - - ); -} - -// TODO: Add to some kind of primitives like class in reveal viewer? - -function createWalkablePathMeshes( - pathArrays: THREE.Vector3[][], - radius: number = 0.0275, - radiusSegments: number = 10, - closed: boolean = false, - heightOffset: number = 0.15 -) { - const meshes = []; - try { - for (const path of pathArrays) { - const curve = new THREE.CatmullRomCurve3(path); - const geometry = new THREE.TubeBufferGeometry( - curve, - 2 * (path.length - 1), - radius, - radiusSegments, - closed - ); - const material = new THREE.MeshPhongMaterial({ color: 0xfeafeafe }); - const mesh = new THREE.Mesh(geometry, material); - mesh.position.y += heightOffset; - meshes.push(mesh); - } - } catch (error) {} - return meshes; -} - -// THREE js parser, from TransitResponse to Vector3 - -function convertToVector3Array( - pointData: TransitPathResponse, - modelMatrix: THREE.Matrix4 -): THREE.Vector3[][] { - const paths: THREE.Vector3[][] = []; - const vector = new THREE.Vector3(); - for (const item of pointData.items) { - const pathVectors: THREE.Vector3[] = []; - for (const segment of item.segments) { - for (const path of segment.path) { - vector.set(path.x, path.y, path.z); - vector.applyMatrix4(modelMatrix); - pathVectors.push(vector.clone()); - } - } - paths.push(pathVectors); - } - return paths; -} - -// Parser from GUI Data, to API request -function transformDataToRequest(data: TransitPathData): TransitPathRequest { - return { - revisionId: data.revisionId, - items: data.items.map((item) => { - return { - from: transformWaypoint(item.from), - to: transformWaypoint(item.to), - movingObjectSize: item.movingObjectSize, - }; - }), - }; -} -// Helper Parser from GUI Data, to API format -function transformWaypoint(data: Waypoint): Coordinates | NodeIdReference { - switch (data.type) { - case Type.coordinates: - return data.coordinates; - case Type.nodeId: - return data.nodeId; - default: - throw new TypeError(''); - } -} - -// GUI Wrapper with callbacks on create / remove path -function createGUIWrapper( - revisionId: number, - callbacks: { - createWalkablePath: (data: TransitPathRequest) => void; - removeWalkablePath: () => void; - } -) { - let transitPathData = defaultPathData(revisionId); - const gui = new GUI({ width: 300 }); - updateQueryGUI(gui, transitPathData); - gui.add( - { - resetToDefault: () => { - transitPathData = defaultPathData(revisionId); - gui.destroy(); - createGUIWrapper(revisionId, callbacks); - }, - }, - 'resetToDefault' - ); - gui.add( - { - createWalkablePath: () => { - callbacks.createWalkablePath.call( - gui, - transformDataToRequest(transitPathData) - ); - }, - }, - 'createWalkablePath' - ); - gui.add(callbacks, 'removeWalkablePath'); -} - -function defaultPathData(revisionId: number): TransitPathData { - return { - revisionId, - items: [defaultPathItem()], - }; -} - -function defaultPathItem(): TransitPathItem { - return { - from: { - type: Type.coordinates, - coordinates: { x: 332.4, y: 117.6, z: 500.21 }, - nodeId: { nodeId: 0 }, - }, - to: { - type: Type.coordinates, - coordinates: { x: 332.38, y: 114.6, z: 517.02 }, - nodeId: { nodeId: 0 }, - }, - movingObjectSize: { diameter: 0.55, height: 1.6 }, - }; -} - -function updateQueryGUI(parent: GUI, data: TransitPathData): GUI { - const queryFolder = parent.addFolder('WalkablePath'); - queryFolder.open(); - queryFolder.add(data, 'modelId'); - const updateItems = () => { - queryFolder.removeFolder(itemsFolder); - itemsFolder = updateItemsGUI(queryFolder, data.items, updateItems); - }; - let itemsFolder = updateItemsGUI(queryFolder, data.items, updateItems); - return queryFolder; -} - -function updateItemsGUI( - parent: GUI, - items: TransitPathItem[], - onItemsUpdated: () => void -) { - const itemsFolder = parent.addFolder('items'); - itemsFolder.open(); - itemsFolder.add( - { - addItem: () => { - const newItem = defaultPathItem(); - items.push(newItem); - onItemsUpdated(); - }, - }, - 'addItem' - ); - let index = 0; - for (const item of items) { - const itemIndex = index; - const indexFolder = itemsFolder.addFolder(`${index}`); - indexFolder.open(); - createItemGUI(indexFolder, item, () => { - items.splice(itemIndex, 1); - onItemsUpdated(); - }); - index += 1; - } - return itemsFolder; -} - -function createItemGUI( - parent: GUI, - item: TransitPathItem, - onDelete: () => void -) { - parent.add( - { - delete: onDelete, - }, - 'delete' - ); - const from = parent.addFolder('from'); - from.open(); - createWaypointGUI(from, item.from); - const to = parent.addFolder('to'); - to.open(); - createWaypointGUI(to, item.to); - - const movingObjectSize = parent.addFolder('movingObjectSize'); - movingObjectSize.add(item.movingObjectSize, 'diameter'); - movingObjectSize.add(item.movingObjectSize, 'height'); -} - -function getWaypointData(waypoint: Waypoint) { - switch (waypoint.type) { - case Type.coordinates: - return waypoint.coordinates; - case Type.nodeId: - return waypoint.nodeId; - default: - throw new TypeError(''); - } -} - -function createWaypointGUI(parent: GUI, waypoint: Waypoint) { - const type = parent.add(waypoint, 'type', Object.values(Type)); - const data = getWaypointData(waypoint); - let items = addToGui(parent, data, Object.keys(data)); - type.onChange(() => { - for (const item of items) { - parent.remove(item); - } - const newData = getWaypointData(waypoint); - items = addToGui(parent, newData, Object.keys(newData)); - }); -} - -function addToGui(parent: GUI, target: T, items: string[]) { - const addedItems: GUIController[] = []; - for (const item of items) { - addedItems.push(parent.add(target, item)); - } - return addedItems; -} - -// Cognite Client, returns a function that queries the api for TransitPathResponse. -interface TransitPathResponse { - items: [ - { - segments: [ - { - path: Coordinates[]; - } - ]; - } - ]; -} - -function createNetworkDataSource( - client: CogniteClient -): { - getTransitPath: ( - transitRequest: TransitPathRequest - ) => Promise; -} { - const getTransitPath = async ( - transitRequest: TransitPathRequest - ): Promise => { - const url = `https://api.cognitedata.com/api/playground/projects/${client.project}/3d/pathfinder/transit`; - const response = await client.post(url, { - data: transitRequest, - }); - if (response.status === 200) { - return response.data; - } else { - throw new HttpError(response.status, response.data, response.headers); - } - }; - - return { getTransitPath }; -} diff --git a/examples/src/pages/e2e/Cognite3DTestViewer.tsx b/examples/src/pages/e2e/Cognite3DTestViewer.tsx deleted file mode 100644 index 80d08cd0e1e..00000000000 --- a/examples/src/pages/e2e/Cognite3DTestViewer.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { Container } from '../../components/styled'; -import { AddModelOptions, Cognite3DModel, Cognite3DViewer, Cognite3DViewerOptions, CognitePointCloudModel, GeometryFilter } from '@cognite/reveal'; -import { CogniteClient } from '@cognite/sdk'; -import { isLocalUrlPointCloudModel } from '../../utils/isLocalUrlPointCloudModel'; - -import { Mock } from 'moq.ts'; - -type Props = { - viewerOptions?: Partial; - - modelUrls: string[]; - fitCameraToModel?: boolean; - geometryFilter?: GeometryFilter; - - cadModelAddedCallback?: (model: Cognite3DModel, modelIndex: number, modelUrl: string) => void; - pointCloudModelAddedCallback?: (model: CognitePointCloudModel, modelIndex: number, modelUrl: string) => void; - - initializeCallback?: (viewer: Cognite3DViewer) => void; -}; - -type LoadingState = { - itemsLoaded: number; - itemsRequested: number; - itemsCulled: number; -} - -export function Cognite3DTestViewer(props: Props) { - const { viewerOptions, modelUrls, geometryFilter, fitCameraToModel } = props; - const { cadModelAddedCallback, pointCloudModelAddedCallback, initializeCallback } = props; - - const containerRef = useRef(null); - const [loadingState, setLoadingState] = useState( - { itemsLoaded: 0, itemsRequested: Infinity, itemsCulled: 0 } - ); - - useEffect(() => { - if (!containerRef.current) { - return; - } - - const cogniteClientMock = new Mock() - .setup(p => p.annotations) - .returns(new Mock() - .setup(p => p.list) - .returns(() => { - const promise = Promise.resolve({ items: [] }); - Object.assign(promise, { autoPagingToArray: async (_arg: { limit: number }) => (await promise).items }); - return promise as any; - }) - .object()); - - // Prepare viewer - const options: Cognite3DViewerOptions = { - domElement: containerRef.current, - onLoading: (itemsLoaded, itemsRequested, itemsCulled) => setLoadingState({ itemsLoaded, itemsRequested, itemsCulled }), - // Note! Pure fake - we will not contact CDF during our tests - sdk: cogniteClientMock.object(), - // Instruct viewer to load models from local storage - // @ts-expect-error - _localModels: true, - // Dont use any post-processing effects - antiAliasingHint: 'disabled', - ssaoQualityHint: 'disabled', - enableEdges: false, - - // Let provided options override options above - ...viewerOptions, - } - const viewer = new Cognite3DViewer(options); - if (initializeCallback) { - initializeCallback(viewer); - } - - async function addModel(modelIndex: number, modelUrl: string, geometryFilter?: GeometryFilter) { - const fullModelUrl = `${window.location.origin}/${modelUrl}`; - const isPointCloud = await isLocalUrlPointCloudModel(fullModelUrl); - const addOptions: AddModelOptions = { - modelId: -1, - revisionId: -1, - localPath: modelUrl, - geometryFilter - }; - const model = await (async () => { - if (isPointCloud) { - const model = await viewer.addPointCloudModel(addOptions); - if (pointCloudModelAddedCallback) { - pointCloudModelAddedCallback(model, modelIndex, modelUrl); - } - return model; - } else { - const model = await viewer.addCadModel(addOptions); - if (cadModelAddedCallback) { - cadModelAddedCallback(model, modelIndex, modelUrl); - } - return model; - } - })(); - - if (fitCameraToModel !== false) { - viewer.fitCameraToModel(model, 0); - } - } - - modelUrls.forEach((modelUrl, modelIndex) => addModel(modelIndex, modelUrl, geometryFilter)); - - return () => { - viewer && viewer.dispose(); - }; - }, [geometryFilter, initializeCallback, cadModelAddedCallback, pointCloudModelAddedCallback, modelUrls, viewerOptions, fitCameraToModel]); - - const readyForScreenshot = loadingState.itemsLoaded > 0 && - loadingState.itemsLoaded === loadingState.itemsRequested; - - return ( - <> - - {readyForScreenshot &&
    Ready
    } - - ); -} diff --git a/examples/src/pages/e2e/TestViewer.tsx b/examples/src/pages/e2e/TestViewer.tsx deleted file mode 100644 index 31e50f52f7d..00000000000 --- a/examples/src/pages/e2e/TestViewer.tsx +++ /dev/null @@ -1,254 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { AnimationLoopHandler } from '../../utils/AnimationLoopHandler'; -import { getParamsFromURL } from '../../utils/example-helpers'; -import { PotreePointColorType, THREE } from '@cognite/reveal'; -import CameraControls from 'camera-controls'; -import { resizeRendererToDisplaySize } from '../../utils/sceneHelpers'; -import { CanvasWrapper } from '../../components/styled'; -import { SuggestedCameraConfig, suggestCameraConfig } from '../../utils/cameraConfig'; - -import { CadNode, createLocalRevealManager, defaultRenderOptions, LoadingState, LocalModelIdentifier, PointCloudNode, RenderOptions, RevealManager, SceneHandler } from '@cognite/reveal/internals'; - -type CadModelEnv = { - modelType: 'cad'; - model: CadNode; -}; -type PointCloudModelEnv = { - modelType: 'pointcloud'; - model: PointCloudNode; -}; - -export type TestEnv = { - camera: THREE.PerspectiveCamera; - revealManager: RevealManager; - sceneHandler: SceneHandler; - renderer: THREE.WebGLRenderer; -}; - -export type TestEnvCad = TestEnv & CadModelEnv; - -export type TestEnvPointCloud = TestEnv & PointCloudModelEnv; - -type TestEnvModified = Partial> & { - cameraConfig?: Partial; - postRender?: () => void; -}; - -type PropsCad = { - // when `?` is used TS forces to mark env arg explicitly in tsx components (see e.g. Clipping). - // Otherwise it complains that arg is any (unless you pass modelType='cad'). - // TS doesn't infer correct type when prop is undefined here :( - modelType?: 'cad'; - modifyTestEnv?: (env: T) => TestEnvModified | void; -}; -type PropsPointCloud = { - modelType: 'pointcloud'; - pointColorType?: PotreePointColorType; - nodeAppearanceProvider?: never; - modifyTestEnv?: (env: T) => TestEnvModified | void; -}; - -type Props = { - modelName?: string; - backgroundColor?: string; -} & (PropsCad | PropsPointCloud); - -CameraControls.install({ THREE }); - -export function TestViewer(props: Props) { - const canvas = useRef(null); - const [loadingState, setLoadingState] = useState< - LoadingState - >({ - isLoading: true, - itemsLoaded: 0, - itemsRequested: 0, - itemsCulled: 0 - }); - - const setupLoadingStateHandler = ( - revealManager: RevealManager - ) => { - let skipFirstLoadingState = true; - revealManager.on('loadingStateChanged', (loadingState) => { - // Ignore isLoading updates untill we see that we are starting to download data - if (skipFirstLoadingState) { - if (loadingState.isLoading) { - skipFirstLoadingState = false; - setLoadingState(loadingState); - } - } else { - setLoadingState(loadingState); - } - }); - }; - - const getCameraConfig = ( - model: CadNode | PointCloudNode - ): SuggestedCameraConfig => { - - if ( model instanceof CadNode) { - return suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()); - } - - const near = 0.1; - const far = 10000; - const bbox: THREE.Box3 = model.getBoundingBox(); - const target = bbox.getCenter(new THREE.Vector3()); - const minToCenter = new THREE.Vector3().subVectors(target, bbox.min); - const position = target.clone().addScaledVector(minToCenter, -1.5); - - return { - near, - far, - position, - target, - }; - }; - - useEffect(() => { - const animationLoopHandler: AnimationLoopHandler = new AnimationLoopHandler(); - let revealManager: RevealManager; - - async function main() { - if (!canvas.current) { - return; - } - const { modelUrl } = getParamsFromURL({ - project: 'test', - modelUrl: props.modelName || 'primitives', - }); - - let sceneHandler = new SceneHandler(); - - const renderOptions: RenderOptions = { - ...defaultRenderOptions, - ssaoRenderParameters: { - depthCheckBias: 0.0, - sampleRadius: 0.0, - sampleSize: 0 - } - }; - - let renderer = new THREE.WebGLRenderer({ - canvas: canvas.current, - }); - renderer.setClearColor(props.backgroundColor ? props.backgroundColor : '#444'); - renderer.setPixelRatio(window.devicePixelRatio); - renderer.localClippingEnabled = true; - - revealManager = createLocalRevealManager(renderer, sceneHandler, { logMetrics: false, renderOptions: renderOptions }); - setupLoadingStateHandler(revealManager); - - let model: PointCloudNode | CadNode; - - if (props.modelType === 'pointcloud') { - const modelIdentifier = new LocalModelIdentifier(modelUrl.fileName!); - model = await revealManager.addModel('pointcloud', modelIdentifier); - (model as PointCloudNode).pointColorType = props.pointColorType ? props.pointColorType : PotreePointColorType.Rgb; - sceneHandler.addCustomObject(model); - } else { - const modelIdentifier = new LocalModelIdentifier(modelUrl.fileName!); - model = await revealManager.addModel( - 'cad', - modelIdentifier - ); - - sceneHandler.addCadModel(model, (model as CadNode).cadModelIdentifier); - } - - let cameraConfig = getCameraConfig(model); - - let camera: THREE.PerspectiveCamera = new THREE.PerspectiveCamera( - 75, - 2, - cameraConfig.near, - cameraConfig.far - ); - - let testEnv: TestEnvModified = {}; - - if (props.modifyTestEnv) { - let defaultTestEnv: any = { - camera, - model, - renderer, - revealManager, - sceneHandler - }; - testEnv = props.modifyTestEnv(defaultTestEnv) || testEnv; - - camera = testEnv.camera || camera; - cameraConfig = { - ...cameraConfig, - ...testEnv.cameraConfig, - }; - renderer = testEnv.renderer || renderer; - revealManager = testEnv.revealManager || revealManager; - sceneHandler = testEnv.sceneHandler || sceneHandler; - } - - const controls = new CameraControls(camera, renderer.domElement); - controls.setLookAt( - cameraConfig.position.x, - cameraConfig.position.y, - cameraConfig.position.z, - cameraConfig.target.x, - cameraConfig.target.y, - cameraConfig.target.z - ); - controls.update(0.0); - - camera.updateProjectionMatrix(); - camera.updateMatrixWorld(); - revealManager.update(camera); - - animationLoopHandler.setOnAnimationFrameListener((deltaTime) => { - let needsResize = resizeRendererToDisplaySize(renderer, camera); - - const controlsNeedUpdate = controls.update(deltaTime); - if (controlsNeedUpdate) { - revealManager.update(camera); - } - - if (controlsNeedUpdate || revealManager.needsRedraw || needsResize) { - revealManager.render(camera); - - if (testEnv.postRender) { - testEnv.postRender(); - } - - revealManager.resetRedraw(); - } - }); - animationLoopHandler.start(); - - const w = window as any; - w.sceneHandler = sceneHandler; - w.THREE = THREE; - w.camera = camera; - w.controls = controls; - w.renderer = renderer; - w.revealManager = revealManager; - } - - main(); - - return () => { - revealManager?.dispose(); - animationLoopHandler.dispose(); - }; - }, [props]); - - const readyForScreenshot = !loadingState.isLoading; - - return ( - <> - - - - {readyForScreenshot &&
    Ready
    } - - ); -} diff --git a/examples/src/pages/e2e/cad/ClippingTestPage.tsx b/examples/src/pages/e2e/cad/ClippingTestPage.tsx deleted file mode 100644 index b663a81820b..00000000000 --- a/examples/src/pages/e2e/cad/ClippingTestPage.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import { BoundingBoxClipper } from '@cognite/reveal'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; - -function ClippingTestPage() { - return ( - { - const params = { - width: 10, - height: 10, - depth: 10, - x: 0, - y: 0, - z: 0, - showHelpers: false, - }; - - const boxClipper = new BoundingBoxClipper( - new THREE.Box3( - new THREE.Vector3( - params.x - params.width / 2, - params.y - params.height / 2, - params.z - params.depth / 1.5 - ), - new THREE.Vector3( - params.x + params.width / 1.5, - params.y + params.height / 2, - params.z + params.depth / 2 - ) - ) - ); - - revealManager.clippingPlanes = boxClipper.clippingPlanes; - - return { - camera: new THREE.PerspectiveCamera(), - }; - }} - /> - ); -} - -registerVisualTest('cad', 'clipping', 'Clipping planes', ) \ No newline at end of file diff --git a/examples/src/pages/e2e/cad/CustomObjectBlending.tsx b/examples/src/pages/e2e/cad/CustomObjectBlending.tsx deleted file mode 100644 index 5f42f45c597..00000000000 --- a/examples/src/pages/e2e/cad/CustomObjectBlending.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { Cognite3DModel, Cognite3DViewer, DefaultNodeAppearance, NumericRange, THREE, TreeIndexNodeCollection } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; -import { TransformControls } from 'three/examples/jsm/controls/TransformControls'; - -/** - * Test verifies that edges from regular, highlighted and ghosted objects doesn't "bleed through" - * custom objects in undesired ways (i.e. highlighted are overlaid, while ghosted and regular objects - * are depth blended). - */ -function CustomObjectBlending() { - const modelUrl = 'primitives'; - - return { - viewer.renderer.setClearColor(new THREE.Color(0.1, 0.2, 0.3), 0.5); - viewer.domElement.style.backgroundColor = "#777777"; - viewer.cameraManager.setCameraState({position: new THREE.Vector3(30,10,50), target: new THREE.Vector3()}); - - const customBox = new THREE.Mesh( - new THREE.BoxGeometry(5, 10, 20), - new THREE.MeshBasicMaterial({ - color: new THREE.Color(1, 0, 0), - transparent: true, - opacity: 0.5, - depthTest: true - }) - ); - - customBox.position.set(0, 0, -15); - viewer.addObject3D(customBox); - - const customBox2 = new THREE.Mesh( - new THREE.BoxGeometry(5, 10, 20), - new THREE.MeshBasicMaterial({ color: new THREE.Color(1, 0, 0) })); - - customBox2.position.set(10, 0, -15); - viewer.addObject3D(customBox2); - - const customBox3 = new THREE.Mesh( - new THREE.BoxGeometry(5, 10, 20), - new THREE.MeshBasicMaterial({ - color: new THREE.Color(1, 0, 0), - blending: THREE.CustomBlending, - opacity: 0.4 - }) - ); - - customBox3.position.set(20, 0, -15); - viewer.addObject3D(customBox3); - - const transformControls = new TransformControls(viewer.getCamera(), viewer.renderer.domElement); - transformControls.attach(customBox); - viewer.addObject3D(transformControls); - - const grid = new THREE.GridHelper(30, 40); - grid.position.set(14, -1, -14); - viewer.addObject3D(grid); - - }} cadModelAddedCallback={(model: Cognite3DModel, modelIndex: number, modelUrl: string) => { - model.assignStyledNodeCollection( - new TreeIndexNodeCollection(new NumericRange(0, 10)), - DefaultNodeAppearance.Ghosted - ); - - model.assignStyledNodeCollection( - new TreeIndexNodeCollection(new NumericRange(10, 20)), - DefaultNodeAppearance.Highlighted - ); - - model.assignStyledNodeCollection(new TreeIndexNodeCollection(new NumericRange(40, 41)), { - ...DefaultNodeAppearance.Default, - outlineColor: 6 - }); - }}/>; -} -registerVisualTest('cad', 'customObjectBlending', 'Custom objects with different blending', ) diff --git a/examples/src/pages/e2e/cad/CustomObjectWithHighlightAndGhosted.tsx b/examples/src/pages/e2e/cad/CustomObjectWithHighlightAndGhosted.tsx deleted file mode 100644 index c22dbcd0d40..00000000000 --- a/examples/src/pages/e2e/cad/CustomObjectWithHighlightAndGhosted.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@cognite/reveal'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; - -/** - * Test verifies that edges from regular, highlighted and ghosted objects doesn't "bleed through" - * custom objects in undesired ways (i.e. highlighted are overlaid, while ghosted and regular objects - * are depth blended). - */ -function CustomObjectWithHighlightAndGhosted() { - return ( - { - const highlightedNodes = new TreeIndexNodeCollection([0, 2, 4, 6, 8, 10]); - model.nodeAppearanceProvider.assignStyledNodeCollection(highlightedNodes, DefaultNodeAppearance.Highlighted); - - const ghostedNodes = new TreeIndexNodeCollection([1, 3, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]); - model.nodeAppearanceProvider.assignStyledNodeCollection(ghostedNodes, DefaultNodeAppearance.Ghosted); - - const sphere = new THREE.SphereBufferGeometry(5, 32, 16); - const sphereMesh = new THREE.Mesh(sphere, new THREE.MeshBasicMaterial({color: 'red'})); - sphereMesh.position.set(12, 0, -5); - sceneHandler.addCustomObject(sphereMesh); - - return { - cameraConfig: { - position: new THREE.Vector3(9, 3.4, -12), - target: new THREE.Vector3(12, 0, -5), - }, - }; - }} - /> - ); -} -registerVisualTest('cad', 'customObjectWithHighlightAndGhosted', 'Custom objects with highlighted and ghosted objects', ) diff --git a/examples/src/pages/e2e/cad/CustomObjectWithHighlightAndGhostedV8.tsx b/examples/src/pages/e2e/cad/CustomObjectWithHighlightAndGhostedV8.tsx deleted file mode 100644 index 58f43371e4d..00000000000 --- a/examples/src/pages/e2e/cad/CustomObjectWithHighlightAndGhostedV8.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@cognite/reveal'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; - -/** - * Test verifies that edges from regular, highlighted and ghosted objects doesn't "bleed through" - * custom objects in undesired ways (i.e. highlighted are overlaid, while ghosted and regular objects - * are depth blended). - */ -function CustomObjectWithHighlightAndGhostedV8() { - return ( - { - const highlightedNodes = new TreeIndexNodeCollection([0, 2, 4, 6, 8, 10]); - model.nodeAppearanceProvider.assignStyledNodeCollection(highlightedNodes, DefaultNodeAppearance.Highlighted); - - const ghostedNodes = new TreeIndexNodeCollection([1, 3, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]); - model.nodeAppearanceProvider.assignStyledNodeCollection(ghostedNodes, DefaultNodeAppearance.Ghosted); - - const sphere = new THREE.SphereBufferGeometry(5, 32, 16); - const sphereMesh = new THREE.Mesh(sphere, new THREE.MeshBasicMaterial({color: 'red'})); - sphereMesh.position.set(12, 0, -5); - sceneHandler.addCustomObject(sphereMesh); - - return { - cameraConfig: { - position: new THREE.Vector3(9, 3.4, -12), - target: new THREE.Vector3(12, 0, -5), - }, - }; - }} - /> - ); -} -registerVisualTest('cad', 'customObjectWithHighlightAndGhostedV8', 'Custom objects with highlighted and ghosted objects V8', ) diff --git a/examples/src/pages/e2e/cad/DefaultCadTestPage.tsx b/examples/src/pages/e2e/cad/DefaultCadTestPage.tsx deleted file mode 100644 index 66603927231..00000000000 --- a/examples/src/pages/e2e/cad/DefaultCadTestPage.tsx +++ /dev/null @@ -1,13 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import React from 'react'; -import { registerVisualTest } from '../../../visual_tests'; - -import { TestViewer } from '../TestViewer'; - -function DefaultCadTestPage() { - return ; -} -registerVisualTest('cad', 'default', 'Default', ) diff --git a/examples/src/pages/e2e/cad/DefaultCadTestPageV8.tsx b/examples/src/pages/e2e/cad/DefaultCadTestPageV8.tsx deleted file mode 100644 index 5902084e768..00000000000 --- a/examples/src/pages/e2e/cad/DefaultCadTestPageV8.tsx +++ /dev/null @@ -1,13 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import React from 'react'; -import { registerVisualTest } from '../../../visual_tests'; - -import { TestViewer } from '../TestViewer'; - -function DefaultCadTestPageV8() { - return ; -} -registerVisualTest('cad', 'default-v8', 'Default V8', ) diff --git a/examples/src/pages/e2e/cad/DefaultCameraTestPage.tsx b/examples/src/pages/e2e/cad/DefaultCameraTestPage.tsx deleted file mode 100644 index f8204662b0b..00000000000 --- a/examples/src/pages/e2e/cad/DefaultCameraTestPage.tsx +++ /dev/null @@ -1,15 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import React from 'react'; -import { TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; - -function DefaultCameraTestPage() { - const newEnv = { camera: new THREE.PerspectiveCamera() }; - return newEnv} />; -} - -registerVisualTest('cad', 'defaultCamera', 'Default camera', ) diff --git a/examples/src/pages/e2e/cad/DefaultCognite3DViewerTestPage.tsx b/examples/src/pages/e2e/cad/DefaultCognite3DViewerTestPage.tsx deleted file mode 100644 index 5801ef7f598..00000000000 --- a/examples/src/pages/e2e/cad/DefaultCognite3DViewerTestPage.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { Cognite3DViewer } from '@cognite/reveal'; -import React from 'react'; -import { THREE } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; - -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -function DefaultCognite3DViewerTestPage() { - const modelUrl = 'primitives'; - - return { - // Sanity check for pixel ratio. It should not impact the resolution in any way - viewer.renderer.setPixelRatio(4); - - viewer.cameraManager.setCameraState({position: new THREE.Vector3(30,10,50), - target: new THREE.Vector3()}); - }}/>; -} - -registerVisualTest('cad', 'default-cognite3dviewer', 'Default Cognite3DViewer', ) diff --git a/examples/src/pages/e2e/cad/DefaultCognite3DViewerTestPageV8.tsx b/examples/src/pages/e2e/cad/DefaultCognite3DViewerTestPageV8.tsx deleted file mode 100644 index f1eb7e3ec61..00000000000 --- a/examples/src/pages/e2e/cad/DefaultCognite3DViewerTestPageV8.tsx +++ /dev/null @@ -1,21 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { Cognite3DViewer } from '@cognite/reveal'; -import React from 'react'; -import { THREE } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; - -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -function DefaultCognite3DViewerTestPageV8() { - const modelUrl = 'primitives_v8'; - - return { - viewer.cameraManager.setCameraState({position: new THREE.Vector3(30,10,50), - target: new THREE.Vector3()}); - }} />; -} - -registerVisualTest('cad', 'default-cognite3dviewer-v8', 'Default Cognite3DViewer V8', ) diff --git a/examples/src/pages/e2e/cad/HighlightTestPage.tsx b/examples/src/pages/e2e/cad/HighlightTestPage.tsx deleted file mode 100644 index eb8d8d6b608..00000000000 --- a/examples/src/pages/e2e/cad/HighlightTestPage.tsx +++ /dev/null @@ -1,30 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import React from 'react'; - -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { THREE } from '@cognite/reveal'; -import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; - -function HighlightTestPage() { - return ( - { - const nodeAppearanceProvider = model.nodeAppearanceProvider; - const nodes = new TreeIndexNodeCollection([...Array(15).keys()]); - nodeAppearanceProvider.assignStyledNodeCollection(nodes, DefaultNodeAppearance.Highlighted); - - return { - camera: new THREE.PerspectiveCamera(), - cameraConfig: { - position: new THREE.Vector3(12, -4, -45), - }, - }}} - /> - ); -} - -registerVisualTest('cad', 'default-highlight', 'Highlight objects', ) diff --git a/examples/src/pages/e2e/cad/HighlightWithDefaultGhostingTestPage.tsx b/examples/src/pages/e2e/cad/HighlightWithDefaultGhostingTestPage.tsx deleted file mode 100644 index 865385cce89..00000000000 --- a/examples/src/pages/e2e/cad/HighlightWithDefaultGhostingTestPage.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import { DefaultNodeAppearance, TreeIndexNodeCollection, Cognite3DViewer, Cognite3DModel } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; - -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -function HighlightWithDefaultGhostingTestPage() { - - function handleModelAdded(model: Cognite3DModel) { - model.setDefaultNodeAppearance(DefaultNodeAppearance.Ghosted); - - const nodes = new TreeIndexNodeCollection([...Array(15).keys()]); - model.assignStyledNodeCollection(nodes, DefaultNodeAppearance.Highlighted); - } - - return ( - { - viewer.cameraManager.setCameraState({ position: new THREE.Vector3(12, -4, -45) }); - - }}/> - ); -} - -registerVisualTest('cad', 'highlight-with-default-ghosting', 'Highlight with "ghosted" as default style', ) diff --git a/examples/src/pages/e2e/cad/NodeTransformOverride.tsx b/examples/src/pages/e2e/cad/NodeTransformOverride.tsx deleted file mode 100644 index 8fb2d246443..00000000000 --- a/examples/src/pages/e2e/cad/NodeTransformOverride.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { Cognite3DModel, Cognite3DViewer, THREE } from '@cognite/reveal'; -import React from 'react'; -import { registerVisualTest } from '../../../visual_tests'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -function NodeTransformOverridePage() { - const modelUrl = 'primitives'; - - return { - viewer.cameraManager.setCameraState({ - position: new THREE.Vector3(30, 10, 50), - target: new THREE.Vector3() - }); - }} cadModelAddedCallback={(model: Cognite3DModel) => { - const scale = new THREE.Matrix4().makeScale(3, 3, 3); - const rotation = new THREE.Matrix4().makeRotationFromEuler(new THREE.Euler(Math.PI / 2, 0, 0)); - const translation = new THREE.Matrix4().makeTranslation(12, 10, -12); - - const transform = translation.multiply(rotation.multiply(scale)); - model.setNodeTransformByTreeIndex(1, transform, false); - - for (let i = 2; i < 80; i++) { - model.setNodeTransformByTreeIndex(i, new THREE.Matrix4().makeTranslation(0, ((i % 2) * 2 - 1) * 2, 0), false); - } - }} />; -} - -registerVisualTest('cad', 'nodeTransform', 'Override Node Transform', ) diff --git a/examples/src/pages/e2e/cad/OutlineTestPage.tsx b/examples/src/pages/e2e/cad/OutlineTestPage.tsx deleted file mode 100644 index 23d37e0ff16..00000000000 --- a/examples/src/pages/e2e/cad/OutlineTestPage.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ -import { THREE } from '@cognite/reveal'; - -import { Cognite3DModel, NumericRange, IndexSet, TreeIndexNodeCollection, NodeOutlineColor, Cognite3DViewer } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; - -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -function OutlineTestPage() { - const modelUrl = 'primitives'; - - function initializeViewer(viewer: Cognite3DViewer) { - viewer.setBackgroundColor(new THREE.Color('lightGray')); - viewer.cameraManager.setCameraState({position: new THREE.Vector3(31.63, 6.50, -12.18), - target: new THREE.Vector3(21.04, 0.53, -11.88)}); - } - - function styleModel(model: Cognite3DModel) { - const nodesPerColor = 10; - for (let color = 0; color < 8; ++color) { - const indexes = new IndexSet(); - indexes.addRange(new NumericRange(nodesPerColor*color, 10)); - const nodes = new TreeIndexNodeCollection(indexes); - model.assignStyledNodeCollection(nodes, { outlineColor: color as NodeOutlineColor}); - } - } - - return ; -} - -registerVisualTest('cad', 'outlines', 'Outline colors', ) diff --git a/examples/src/pages/e2e/cad/RotationTestPage.tsx b/examples/src/pages/e2e/cad/RotationTestPage.tsx deleted file mode 100644 index 3ba6e4254ef..00000000000 --- a/examples/src/pages/e2e/cad/RotationTestPage.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import React from 'react'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; -import { suggestCameraConfig } from '../../../utils/cameraConfig'; - -function RotationTestPage() { - return ( - { - const matrix = model.getModelTransformation(); - const newMatrix = new THREE.Matrix4().multiplyMatrices( - matrix, - new THREE.Matrix4().makeRotationY(Math.PI / 3.0) - ); - model.setModelTransformation(newMatrix); - - return { - cameraConfig: suggestCameraConfig(model.cadModelMetadata.scene.root, - model.getModelTransformation()) - }; - }} - /> - ); -} - -registerVisualTest('cad', 'rotateCadModel', 'Rotate model', ) diff --git a/examples/src/pages/e2e/cad/ScaledModelTestPage.tsx b/examples/src/pages/e2e/cad/ScaledModelTestPage.tsx deleted file mode 100644 index 27645fc2c1a..00000000000 --- a/examples/src/pages/e2e/cad/ScaledModelTestPage.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import React from 'react'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; - -function ScaledModelTestPage() { - return ( - { - const matrix = model.getModelTransformation(); - const newMatrix = matrix.scale(new THREE.Vector3(5, 5, 5)); - model.setModelTransformation(newMatrix); - }} - /> - ); -} - -registerVisualTest('cad', 'scaledModel', 'Scale model', ) diff --git a/examples/src/pages/e2e/cad/SsaoTestPage.tsx b/examples/src/pages/e2e/cad/SsaoTestPage.tsx deleted file mode 100644 index 18e0e7c21bc..00000000000 --- a/examples/src/pages/e2e/cad/SsaoTestPage.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import React from 'react'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { defaultRenderOptions } from '@cognite/reveal/internals'; -import { registerVisualTest } from '../../../visual_tests'; - -function SsaoTestPage() { - return ( - { - - (revealManager as any)._renderPipeline.renderOptions = defaultRenderOptions; - - return { - cameraConfig: { - position: new THREE.Vector3(0, -1, 2), - }, - }; - }} - /> - ); -} - -registerVisualTest('cad', 'ssao', 'SSAO', ) diff --git a/examples/src/pages/e2e/cad/TwoModelsOneGhosted.tsx b/examples/src/pages/e2e/cad/TwoModelsOneGhosted.tsx deleted file mode 100644 index 3d1e84ccea9..00000000000 --- a/examples/src/pages/e2e/cad/TwoModelsOneGhosted.tsx +++ /dev/null @@ -1,34 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import { Cognite3DModel, Cognite3DViewer, DefaultNodeAppearance } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -/** - * Regression issue where ghosting one model made the other invisible (ACEPC-110). - */ -function TwoModelsOneGhostedPage() { - function handleModelAdded(model: Cognite3DModel, modelIndex: number) { - if (modelIndex === 0) { - model.setDefaultNodeAppearance(DefaultNodeAppearance.Ghosted); - const translation = new THREE.Matrix4().makeTranslation(0, 0, 5); - const transform = model.getModelTransformation(); - transform.multiply(translation); - model.setModelTransformation(transform); - } - } - - return ( - { - viewer.cameraManager.setCameraState({position: new THREE.Vector3(30,10,50), - target: new THREE.Vector3()}); - }} /> - ); -} -registerVisualTest('cad', 'two-models-one-ghosted', 'Two models, one is ghosted', ) diff --git a/examples/src/pages/e2e/cad/UserRenderTargetTestPage.tsx b/examples/src/pages/e2e/cad/UserRenderTargetTestPage.tsx deleted file mode 100644 index 813ead7ca5d..00000000000 --- a/examples/src/pages/e2e/cad/UserRenderTargetTestPage.tsx +++ /dev/null @@ -1,106 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import React from 'react'; -import { TestEnvCad, TestViewer } from '../TestViewer'; -import { registerVisualTest } from '../../../visual_tests'; - -function UserRenderTargetTestPage() { - return ( - { - const renderTarget = new THREE.WebGLRenderTarget(300, 300); - renderTarget.depthTexture = new THREE.DepthTexture(300, 300); - renderTarget.depthTexture.format = THREE.DepthFormat; - renderTarget.depthTexture.type = THREE.UnsignedIntType; - - // TODO christjt - 10-05-2022: The rendertarget should be added in the initialization options - // for the revealManager, but that is not available to be here. - (revealManager as any)._renderPipeline._outputRenderTarget = renderTarget; - - const orthographicCamera = new THREE.OrthographicCamera( - -1, - 1, - 1, - -1, - 0, - 1 - ); - - const vShader = ` - uniform mat4 modelMatrix; - - in vec3 position; - in vec2 uv; - - out vec2 vUv; - - const mat4 unitOrthographicProjection = mat4(1., 0., 0., 0., 0., 1., 0., 0., 0., 0., -1., 0., 0., 0., 0., 1.); - - void main() { - vUv = uv; - gl_Position = unitOrthographicProjection * modelMatrix * vec4(position, 1.0); - } - `; - - const fShader = ` - precision highp float; - - uniform sampler2D tDiffuse; - uniform sampler2D tDepth; - - in vec2 vUv; - - out vec4 color; - - void main() { - if(vUv.x > 0.5){ - color = texture(tDiffuse, vUv); - } else { - float d = texture(tDepth, vUv).r; - color = vec4(vec3(1.0 - pow(d, 20.0)), 1.0); - } - } - `; - - const geometry = new THREE.BufferGeometry(); - const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]); - const uvs = new Float32Array([0, 0, 2, 0, 0, 2]); - - geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)); - geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2)); - - var shaderMaterial = new THREE.RawShaderMaterial({ - vertexShader: vShader, - fragmentShader: fShader, - uniforms: { - tDiffuse: {value: renderTarget.texture}, - tDepth: {value: renderTarget.depthTexture}, - }, - glslVersion: THREE.GLSL3, - depthTest: true - }); - - const mesh = new THREE.Mesh(geometry, shaderMaterial); - - const testScene = new THREE.Scene(); - testScene.add(mesh); - - return { - camera: new THREE.PerspectiveCamera(), - cameraConfig: { - position: new THREE.Vector3(10, -5, -26), - }, - postRender() { - renderer.setRenderTarget(null); - renderer.render(testScene, orthographicCamera); - }, - }; - }} - /> - ); -} - -registerVisualTest('cad', 'userRenderTarget', 'Custom render target', ) diff --git a/examples/src/pages/e2e/pointcloud/ClippingPlanesCognite3DViewerPointCloudTestPage.tsx b/examples/src/pages/e2e/pointcloud/ClippingPlanesCognite3DViewerPointCloudTestPage.tsx deleted file mode 100644 index 5517376090e..00000000000 --- a/examples/src/pages/e2e/pointcloud/ClippingPlanesCognite3DViewerPointCloudTestPage.tsx +++ /dev/null @@ -1,22 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import React from 'react'; -import { registerVisualTest } from '../../../visual_tests'; - -import { PotreePointColorType } from '@cognite/reveal'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -import { THREE } from '@cognite/reveal'; - -function ClippingPlanesCognite3DViewerPointCloudTestPage() { - const modelUrl = 'pointcloud-bunny'; - - return { - model.pointColorType = PotreePointColorType.Height; - }} - initializeCallback={(viewer) => { viewer.setClippingPlanes([new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 0, 0))]); } }/>; -} - -registerVisualTest('pointcloud', 'clipping-planes-cognite3dviewer-pointcloud', 'Clipping Planes PointCloud', ) diff --git a/examples/src/pages/e2e/pointcloud/ColorStylingCognite3DViewerPointCloudTestPage.tsx b/examples/src/pages/e2e/pointcloud/ColorStylingCognite3DViewerPointCloudTestPage.tsx deleted file mode 100644 index 0e188d6a9f7..00000000000 --- a/examples/src/pages/e2e/pointcloud/ColorStylingCognite3DViewerPointCloudTestPage.tsx +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * Copyright 2022 Cognite AS - */ - -import React from 'react'; -import { registerVisualTest } from '../../../visual_tests'; - -import { - Cognite3DViewerOptions, - PotreePointColorType, - AnnotationIdPointCloudObjectCollection, - CognitePointCloudModel -} from '@cognite/reveal'; -import { CogniteClient } from '@cognite/sdk'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -import { Mock } from 'moq.ts'; - -function ColorStylingCognite3DViewerPointCloudTestPage() { - const modelUrl = 'pointcloud-bunny'; - const sdkMock = new Mock() - .setup(p => p.annotations) - .returns(new Mock() - .setup(a => a.list) - .returns(() => { - const promise = Promise.resolve({ items: [{ id: 123, data: { region: [ - { cylinder: { centerA: [-0.03, 0.1, -1000], centerB: [-0.03, 0.1, 1000], radius: 0.04 } } - ] } } ] } ); - - Object.assign(promise, { autoPagingToArray: async (_arg: { limit: number }) => (await promise).items }); - return promise as any; - }).object() - ); - - const viewerOptions: Partial = { - sdk: sdkMock.object() - }; - - return { - model.pointColorType = PotreePointColorType.Height; - - const stylableObjectIds: number[] = []; - model.traverseStylableObjects(m => stylableObjectIds.push(m.annotationId)); - - const objectCollection = new AnnotationIdPointCloudObjectCollection(stylableObjectIds); - const appearance = { color: [0, 255, 0] as [number, number, number] }; - - model.assignStyledObjectCollection(objectCollection, appearance); - model.setDefaultPointCloudAppearance({ visible: false }); - }} - viewerOptions={viewerOptions} />; -} - -registerVisualTest('pointcloud', 'color-styling', 'Color Styling', ) diff --git a/examples/src/pages/e2e/pointcloud/DefaultCognite3DViewerPointCloudTestPage.tsx b/examples/src/pages/e2e/pointcloud/DefaultCognite3DViewerPointCloudTestPage.tsx deleted file mode 100644 index 9413bb2ffcb..00000000000 --- a/examples/src/pages/e2e/pointcloud/DefaultCognite3DViewerPointCloudTestPage.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import React from 'react'; -import { registerVisualTest } from '../../../visual_tests'; - -import { PotreePointColorType } from '@cognite/reveal'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; - -function DefaultCognite3DViewerPointCloudTestPage() { - const modelUrl = 'pointcloud-bunny'; - - return { - model.pointColorType = PotreePointColorType.Height; - }}/>; -} - -registerVisualTest('pointcloud', 'default-cognite3dviewer-pointcloud', 'Default Cognite3DViewer PointCloud', ) diff --git a/examples/src/pages/e2e/visualTests.ts b/examples/src/pages/e2e/visualTests.ts deleted file mode 100644 index 5e16f7f3042..00000000000 --- a/examples/src/pages/e2e/visualTests.ts +++ /dev/null @@ -1,101 +0,0 @@ -export type VisualTest = { - testKey: string, - category: 'cad' | 'pointcloud', - snapshotBlur?: number, -} - -// TODO 2021-09-15 larsmoa: Figure out how we can do create this automatically -// I failed to implement one registry of tests, because we need all logic to work -// both in the server hosting the HTTP server used for visual tests and the -// Jest/Puppeteer test runner. - -export const visualTests: VisualTest[] = [ - { - testKey: 'clipping', - category: 'cad' - }, - { - testKey: 'customObjectWithHighlightAndGhosted', - category: 'cad' - }, - { - testKey: 'customObjectWithHighlightAndGhostedV8', - category: 'cad' - }, - { - testKey: 'customObjectBlending', - category: 'cad' - }, - { - testKey: 'default', - category: 'cad' - }, - { - testKey: 'default-v8', - category: 'cad' - }, - { - testKey: 'defaultCamera', - category: 'cad' - }, - { - testKey: 'default-cognite3dviewer', - category: 'cad' - }, - { - testKey: 'default-cognite3dviewer-pointcloud', - category: 'pointcloud' - }, - { - testKey: 'clipping-planes-cognite3dviewer-pointcloud', - category: 'pointcloud' - }, - { - testKey: 'color-styling', - category: 'pointcloud' - }, - { - testKey: 'default-cognite3dviewer-v8', - category: 'cad' - }, - { - testKey: 'default-highlight', - category: 'cad' - }, - { - testKey: 'rotateCadModel', - category: 'cad' - }, - { - testKey: 'scaledModel', - category: 'cad' - }, - { - testKey: 'ssao', - category: 'cad' - }, - { - testKey: 'userRenderTarget', - category: 'cad' - }, - { - testKey: 'two-models-one-ghosted', - category: 'cad' - }, - { - testKey: 'reassign-node-style', - category: 'cad' - }, - { - testKey: 'outlines', - category: 'cad' - }, - { - testKey: 'nodeTransform', - category: 'cad' - }, - { - testKey: 'highlight-with-default-ghosting', - category: 'cad' - } -]; diff --git a/examples/src/react-app-env.d.ts b/examples/src/react-app-env.d.ts deleted file mode 100644 index 6431bc5fc6b..00000000000 --- a/examples/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/examples/src/routes.tsx b/examples/src/routes.tsx deleted file mode 100644 index 1d568f7ef95..00000000000 --- a/examples/src/routes.tsx +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import React, { ReactNode } from 'react'; -import { Simple } from './pages/Simple'; -import { Clipping } from './pages/Clipping'; -import { Migration } from './pages/Migration'; -import { Geomap } from './pages/Geomap'; -import { SectorWithPointcloud } from './pages/SectorWithPointcloud'; -import { SimplePointcloud } from './pages/SimplePointcloud'; -import { SSAO } from './pages/SSAO'; -import { TwoModels } from './pages/TwoModels'; -import { WalkablePath } from './pages/WalkablePath'; -import { visualTests } from './pages/e2e/visualTests'; -import { CustomDataSource } from './pages/CustomDataSource'; - -const cadTestBasePath = '/test/cad/'; -const pointcloudTestBasePath = '/test/pointcloud/'; - -// if you want to test your latest changes in workers or rust files -// copy your worker files to some folder in /public and specify the path below -// parser-worker has `yarn local-cdn` to set it up quickly -// notice that experimental is separate entry point so it required to override env for it too - -// import { revealEnv } from '@cognite/reveal'; -// import { revealEnv as revealEnv2 } from '@cognite/reveal/internals' - -// revealEnv.publicPath = `${process.env.PUBLIC_URL}/local-cdn/`; -// revealEnv2.publicPath = `${process.env.PUBLIC_URL}/local-cdn/`; - -export type ExampleRoute = { - name: string; - path: string; - menuTitle: string; - component: ReactNode; -}; - -function getEnv(key: keyof typeof process.env) { - return process.env[key] || ''; -} - -const project = getEnv('REACT_APP_PROJECT'); -const cadId = getEnv('REACT_APP_CAD_ID'); -const cadRevisionId = getEnv('REACT_APP_CAD_REVISION_ID'); -const cad2Id = getEnv('REACT_APP_CAD_2_ID'); -const cad2RevisionId = getEnv('REACT_APP_CAD_2_REVISION_ID'); -const pointCloudId = getEnv('REACT_APP_POINTCLOUD_ID'); -const pointCloudRevisionId = getEnv('REACT_APP_POINTCLOUD_REVISION_ID'); - -const defaultEnvironmentParam = 'europewest11-3d'; - -function menuTitleAz(a: ExampleRoute, b: ExampleRoute): number { - return a.menuTitle < b.menuTitle ? -1 : a.menuTitle === b.menuTitle ? 0 : 1; -} - -export const exampleRoutes: Array = [ - { - name: 'simple', - path: '/simple', - menuTitle: 'Simple', - component: , - }, - { - name: 'clipping', - path: '/clipping', - menuTitle: 'Clipping planes', - component: , - }, - { - name: 'default', - path: - `/migration?project=${project}` + - `&env=${defaultEnvironmentParam}` + - `&modelId=${cadId}` + - `&revisionId=${cadRevisionId}`, - menuTitle: 'Default', - component: , - }, - { - name: 'geomap', - path: - `/geomap?project=${project}` + - `&env=${defaultEnvironmentParam}` + - `&modelId=${cadId}` + - `&revisionId=${cadRevisionId}`, - menuTitle: 'Geomap', - component: , - }, - { - name: 'cad-pointcloud', - path: - `/sector-with-pointcloud?project=${project}` + - `&env=${defaultEnvironmentParam}` + - `&modelId=${cadId}` + - `&revisionId=${cadRevisionId}` + - `&pointCloudModelId=${pointCloudId}` + - `&pointCloudRevisionId=${pointCloudRevisionId}`, - menuTitle: 'Sector With Pointcloud', - component: , - }, - { - name: 'pointcloud', - path: - `/simple-point-cloud?project=${project}` + - `&env=${defaultEnvironmentParam}` + - `&modelId=${pointCloudId}` + - `&revisionId=${pointCloudRevisionId}`, - menuTitle: 'Simple Point Cloud', - component: , - }, - { - name: 'ssao', - path: '/ssao', - menuTitle: 'Screen space ambient occlusion shading', - component: , - }, - { - name: 'two-models', - // not really good defaults, provide something more meaningful - path: - `/two-models?project=${project}` + - `&env=${defaultEnvironmentParam}` + - `&modelId=${cadId}&revisionId=${cadRevisionId}` + - `&modelId2=${cad2Id}&revisionId2=${cad2RevisionId}`, - menuTitle: 'Two models', - component: , - }, - { - name: 'walkable-path', - path: '/walkable-path', - menuTitle: 'Walkable Path', - component: , - }, - { - name: 'customDatasource', - path: '/customDatasource', - menuTitle: 'Custom data source', - component: , - }, -].sort(menuTitleAz); - -const cadTestPages: Record = {}; -const pointcloudTestPages: Record = {}; - -export function registerVisualTest( - category: 'cad' | 'pointcloud', - testKey: string, - testDescription: string, - testPage: JSX.Element) { - - // Ensure test is registered in visualTests so it is actually part of the - // test stage - const found = visualTests.find(x => x.category === category && x.testKey === testKey) !== undefined; - if (!found) { - throw new Error(`registerVisualTest() was invoked for test '${testKey}' (${category}), but has not been registered. Add the test to pages/e2e/visualTests.ts`); - } - - switch (category) { - case 'cad': - cadTestPages[testKey] = { testDescription, testPage }; - break; - - case 'pointcloud': - pointcloudTestPages[testKey] = { testDescription, testPage }; - break; - - default: - throw new Error(`Unknown test category: '${category}'`); - } -} - -export function cadTestRoutes(): Array { - return Object.entries(cadTestPages).map(([testName, test]) => { - return { - name: testName, - path: cadTestBasePath + testName, - menuTitle: test.testDescription, - component: test.testPage - }; - }).sort((x, y) => x.menuTitle.localeCompare(y.menuTitle)); -} - -export function pointCloudTestRoutes(): Array { - return Object.entries(pointcloudTestPages).map(([testName, test]) => { - return { - name: testName, - path: pointcloudTestBasePath + testName, - menuTitle: test.testDescription, - component: test.testPage - }; - }).sort((x, y) => x.menuTitle.localeCompare(y.menuTitle)); -} - -// Register all visual tests -const context = require.context('./pages/e2e', true, /\.tsx$/); -context.keys().forEach((key) => { - context(key); -}); diff --git a/examples/src/setupTests.ts b/examples/src/setupTests.ts deleted file mode 100644 index 74b1a275a0e..00000000000 --- a/examples/src/setupTests.ts +++ /dev/null @@ -1,5 +0,0 @@ -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom/extend-expect'; diff --git a/examples/src/utils/AnimationLoopHandler.ts b/examples/src/utils/AnimationLoopHandler.ts deleted file mode 100644 index 27d8fad158a..00000000000 --- a/examples/src/utils/AnimationLoopHandler.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; - -export class AnimationLoopHandler { - private _animationFrameHandle?: number; - private _animationFrameDelegate?: (deltaTime: number) => void; - - setOnAnimationFrameListener(callback: (deltaTime: number) => void) { - this._animationFrameDelegate = callback; - } - - public start(): boolean { - if (this._animationFrameHandle === undefined) { - const clock = new THREE.Clock(); - const animationLoop = () => { - this._animationFrameHandle = requestAnimationFrame(animationLoop); - if (this._animationFrameDelegate) { - this._animationFrameDelegate(clock.getDelta()); - } - } - this._animationFrameHandle = requestAnimationFrame(animationLoop); - return true; - } - return false; - } - - public dispose() { - if (this._animationFrameHandle !== undefined) { - cancelAnimationFrame(this._animationFrameHandle); - } - } -} diff --git a/examples/src/utils/CustomCameraManager.ts b/examples/src/utils/CustomCameraManager.ts index f0bb420386f..baa08d0fdd9 100644 --- a/examples/src/utils/CustomCameraManager.ts +++ b/examples/src/utils/CustomCameraManager.ts @@ -21,6 +21,14 @@ export class CustomCameraManager implements CameraManager { }); } + set enabled(value: boolean) { + this._controls.enabled = value; + } + + get enabled(): boolean { + return this._controls.enabled; + } + getCamera(): THREE.PerspectiveCamera { return this._camera; } @@ -56,7 +64,6 @@ export class CustomCameraManager implements CameraManager { if (index !== -1) { this._cameraChangedListener.splice(index, 1); } - } fitCameraToBoundingBox(boundingBox: THREE.Box3, duration?: number, radiusFactor?: number): void { diff --git a/examples/src/utils/MeasurementUi.ts b/examples/src/utils/MeasurementUi.ts new file mode 100644 index 00000000000..b8a99b8ec8b --- /dev/null +++ b/examples/src/utils/MeasurementUi.ts @@ -0,0 +1,80 @@ +import { Cognite3DViewer } from "@cognite/reveal"; +import { MeasurementTool } from "@cognite/reveal/tools"; +import dat from "dat.gui"; +import { THREE } from '@cognite/reveal'; + +export class MeasurementUi { + private readonly _viewer: Cognite3DViewer; + private readonly _measurementTool: MeasurementTool; + private _gui: dat.GUI; + private _guiController: dat.GUIController[]; + + private state = { + lineWidth: 0.01, + color: 0xff8746, + allMeasurement: false, + showAllMeasurementLabels: true + }; + + private measurement = { + enable: false + } + + constructor(viewer: Cognite3DViewer, ui: dat.GUI) { + this._viewer = viewer; + this._measurementTool = new MeasurementTool(this._viewer, { distanceToLabelCallback: (distanceInMeters: number) => { + // 1 meters = 3.281 feet + return `${(distanceInMeters * 3.281).toFixed(2)} ft`; + }}); + this._gui = ui.addFolder('Types'); + this._guiController = []; + const addDistanceOptions = this.addDistanceOptions.bind(this); + + this._gui.add(this.measurement, 'enable').name('Point To Point Distance').onChange(addDistanceOptions); + } + + private addDistanceOptions(enable: boolean) { + if (enable && this._guiController.length === 0) { + //add the point to point measurement distance + this._measurementTool.enterMeasurementMode(); + this.addGUI(); + } else if(!enable && this._guiController.length > 0) { + this.removeGUI(); + } + } + + private addGUI() { + this._guiController.push(this._gui.add(this.state, 'lineWidth', 0.001, 10, 0.001).name('Line width').onFinishChange(lineWidth => { + this.state.lineWidth = lineWidth; + this.setMeasurementLineOptions(); + })); + this._guiController.push(this._gui.addColor(this.state, 'color').name('Line Color').onFinishChange(color => { + debugger; + this.state.color = color; + this.setMeasurementLineOptions(); + })); + this._guiController.push(this._gui.add(this.state, 'showAllMeasurementLabels').name('Show Measurement Labels').onChange(showAllMeasurementLabels => { + this.state.showAllMeasurementLabels = showAllMeasurementLabels; + this._measurementTool.setMeasurementLabelsVisible(showAllMeasurementLabels); + })); + } + + private removeGUI() { + this._guiController.forEach(guiController => { + guiController.remove(); + }); + this._guiController.splice(0, this._guiController.length); + this.state.allMeasurement = false; + this._measurementTool.exitMeasurementMode(); + } + + private setMeasurementLineOptions() { + const options = { + lineWidth: this.state.lineWidth, + color: new THREE.Color(this.state.color), + allMeasurement: this.state.allMeasurement, + showAllMeasurementLabels: this.state.showAllMeasurementLabels + } + this._measurementTool.setLineOptions(options); + } +} \ No newline at end of file diff --git a/examples/src/utils/PointCloudUi.ts b/examples/src/utils/PointCloudUi.ts index c2a3644ac3e..ecd0667cb13 100644 --- a/examples/src/utils/PointCloudUi.ts +++ b/examples/src/utils/PointCloudUi.ts @@ -10,10 +10,15 @@ export class PointCloudUi { budget: 2_000_000, pointColorType: PotreePointColorType.Rgb, pointShape: PotreePointShape.Circle, + pointBlending: true }; constructor(viewer: Cognite3DViewer, ui: dat.GUI) { + const url = new URL(window.location.href); + const urlParams = url.searchParams; + this._viewer = viewer; + this._params.pointBlending = urlParams.get('pointBlending') === 'true'; ui.add(this._params, 'budget', 0, 20_000_000, 100_000).onChange(() => this.applyToAllModels()); ui.add(this._params, 'pointSize', 0, 2, 0.025).onChange(() => this.applyToAllModels()); @@ -41,6 +46,11 @@ export class PointCloudUi { this._params.pointShape = parseInt(valueStr, 10); this.applyToAllModels() }); + ui.add(this._params, 'pointBlending').onChange(value => { + urlParams.set('pointBlending', value); + window.location.href = url.toString() + }); + } applyToAllModels() { diff --git a/examples/src/utils/cameraConfig.ts b/examples/src/utils/cameraConfig.ts deleted file mode 100644 index be64c9651d5..00000000000 --- a/examples/src/utils/cameraConfig.ts +++ /dev/null @@ -1,83 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ -import { THREE } from '@cognite/reveal'; - -export interface SuggestedCameraConfig { - position: THREE.Vector3; - target: THREE.Vector3; - near: number; - far: number; -} - -const MAX_VERTICAL_ANGLE = (30 / 180) * Math.PI; - -function ensureYAngleBelowThresholdForNormalizedVector(direction: THREE.Vector3): void { - if (direction.y < Math.sin(MAX_VERTICAL_ANGLE)) { - return; - } - - let xzProjection = new THREE.Vector2(direction.x, direction.z); - const xzLength = xzProjection.length(); - - xzProjection = xzLength > 1e-4 ? xzProjection : new THREE.Vector2(1.0, 1.0); - - xzProjection.normalize().multiplyScalar(Math.cos(MAX_VERTICAL_ANGLE)); - - direction.x = xzProjection.x; - direction.z = xzProjection.y; - - direction.y = Math.sin(MAX_VERTICAL_ANGLE); -} - -export type BaseSectorMetadata = { - readonly id: number; - readonly path: string; - readonly depth: number; - readonly subtreeBoundingBox: THREE.Box3; - readonly children: BaseSectorMetadata[]; - readonly estimatedDrawCallCount: number; - readonly estimatedRenderCost: number; -}; - -export function suggestCameraConfig(rootSector: BaseSectorMetadata, modelMatrix: THREE.Matrix4): SuggestedCameraConfig { - const averageMin = new THREE.Vector3(); - const averageMax = new THREE.Vector3(); - let count = 0; - - function traverseDepthFirst(sector: BaseSectorMetadata, func: (v: BaseSectorMetadata) => void) { - func(sector); - for (const child of sector.children) { - traverseDepthFirst(child, func); - } - } - - traverseDepthFirst(rootSector, node => { - averageMin.add(node.subtreeBoundingBox.min); - averageMax.add(node.subtreeBoundingBox.max); - count += 1; - return true; - }); - - averageMin.divideScalar(count); - averageMax.divideScalar(count); - - const bounds = new THREE.Box3(averageMin, averageMax); - bounds.applyMatrix4(modelMatrix); - - const target = bounds.getCenter(new THREE.Vector3()); - const extent = bounds.getSize(new THREE.Vector3()); - - const positionDirection = new THREE.Vector3(-1.0 / extent.x, 1.0 / extent.y, -1.0 / extent.z).normalize(); - ensureYAngleBelowThresholdForNormalizedVector(positionDirection); - - positionDirection.multiplyScalar(extent.length()); - const position = new THREE.Vector3().addVectors(target, positionDirection); - - return { - position, - target, - near: 0.1, - far: position.distanceTo(target) * 12 - }; -} diff --git a/examples/src/utils/cameraControls.ts b/examples/src/utils/cameraControls.ts deleted file mode 100644 index 9474671f62e..00000000000 --- a/examples/src/utils/cameraControls.ts +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import CameraControls from 'camera-controls'; -import * as holdEvent from 'hold-event'; -import { THREE } from '@cognite/reveal'; - -export function addWASDHandling(cameraControls: CameraControls) { - const KEYCODE = { - W: 87, - A: 65, - S: 83, - D: 68, - ARROW_LEFT: 37, - ARROW_UP: 38, - ARROW_RIGHT: 39, - ARROW_DOWN: 40, - }; - - const wKey = new holdEvent.KeyboardKeyHold(KEYCODE.W, 100); - const aKey = new holdEvent.KeyboardKeyHold(KEYCODE.A, 100); - const sKey = new holdEvent.KeyboardKeyHold(KEYCODE.S, 100); - const dKey = new holdEvent.KeyboardKeyHold(KEYCODE.D, 100); - aKey.addEventListener('holding', function (event: any) { - cameraControls.truck(-0.05 * event.deltaTime, 0, true); - }); - dKey.addEventListener('holding', function (event: any) { - cameraControls.truck(0.05 * event.deltaTime, 0, true); - }); - wKey.addEventListener('holding', function (event: any) { - cameraControls.forward(0.05 * event.deltaTime, true); - }); - sKey.addEventListener('holding', function (event: any) { - cameraControls.forward(-0.05 * event.deltaTime, true); - }); - - const leftKey = new holdEvent.KeyboardKeyHold(KEYCODE.ARROW_LEFT, 100); - const rightKey = new holdEvent.KeyboardKeyHold(KEYCODE.ARROW_RIGHT, 100); - const upKey = new holdEvent.KeyboardKeyHold(KEYCODE.ARROW_UP, 100); - const downKey = new holdEvent.KeyboardKeyHold(KEYCODE.ARROW_DOWN, 100); - leftKey.addEventListener('holding', function (event: any) { - cameraControls.rotate( - -0.1 * THREE.MathUtils.DEG2RAD * event.deltaTime, - 0, - true - ); - }); - rightKey.addEventListener('holding', function (event: any) { - cameraControls.rotate( - 0.1 * THREE.MathUtils.DEG2RAD * event.deltaTime, - 0, - true - ); - }); - upKey.addEventListener('holding', function (event: any) { - cameraControls.rotate( - 0, - -0.05 * THREE.MathUtils.DEG2RAD * event.deltaTime, - true - ); - }); - downKey.addEventListener('holding', function (event: any) { - cameraControls.rotate( - 0, - 0.05 * THREE.MathUtils.DEG2RAD * event.deltaTime, - true - ); - }); -} diff --git a/examples/src/utils/createManagerAndLoadModel.ts b/examples/src/utils/createManagerAndLoadModel.ts deleted file mode 100644 index b1d942514c8..00000000000 --- a/examples/src/utils/createManagerAndLoadModel.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { THREE } from '@cognite/reveal'; -import { - PointCloudNode, - CadNode, - RevealManager, - CdfModelIdentifier, - LocalModelIdentifier, - createCdfRevealManager, - createLocalRevealManager, - SceneHandler -} from "@cognite/reveal/internals"; - -import { CogniteClient } from "@cognite/sdk"; - -export async function createManagerAndLoadModel( - sdkClient: CogniteClient, - renderer: THREE.WebGLRenderer, - sceneHandler: SceneHandler, - modelType: 'cad', - modelRevision: { modelId: number, revisionId: number } | undefined, - modelUrl: { fileName: string | undefined } | undefined -): Promise<{ revealManager: RevealManager, model: CadNode }>; -export async function createManagerAndLoadModel( - sdkClient: CogniteClient, - renderer: THREE.WebGLRenderer, - sceneHandler: SceneHandler, - modelType: 'pointcloud', - modelRevision: { modelId: number, revisionId: number } | undefined, - modelUrl: { fileName: string | undefined } | undefined -): Promise<{ revealManager: RevealManager, model: PointCloudNode }>; - -export async function createManagerAndLoadModel( - sdkClient: CogniteClient, - renderer: THREE.WebGLRenderer, - sceneHandler: SceneHandler, - modelType: 'cad' | 'pointcloud', - modelRevision: { modelId: number, revisionId: number } | undefined, - modelUrl: { fileName: string | undefined } | undefined -): Promise<{ revealManager: RevealManager, model: CadNode | PointCloudNode }> { - if (modelRevision) { - const revealManager = createCdfRevealManager(sdkClient, renderer, sceneHandler, { logMetrics: false }); - switch (modelType) { - case 'cad': { - const modelIdentifier = new CdfModelIdentifier(modelRevision.modelId, modelRevision.revisionId); - const model = await revealManager.addModel('cad', modelIdentifier); - return { revealManager, model }; - } - case 'pointcloud': { - const modelIdentifier = new CdfModelIdentifier(modelRevision.modelId, modelRevision.revisionId); - const model = await revealManager.addModel('pointcloud', modelIdentifier); - return { revealManager, model }; - } - default: - throw new Error(`Unsupported model type '${modelType}'`); - } - } else if (modelUrl) { - const revealManager = createLocalRevealManager(renderer, sceneHandler, { logMetrics: false }); - switch (modelType) { - case 'cad': { - const modelIdentifier = new LocalModelIdentifier(modelUrl.fileName!); - const model = await revealManager.addModel('cad', modelIdentifier); - return { revealManager, model }; - } - case 'pointcloud': { - const modelIdentifier = new LocalModelIdentifier(modelUrl.fileName!); - const model = await revealManager.addModel('pointcloud', modelIdentifier); - return { revealManager, model }; - } - default: - throw new Error(`Unsupported model type '${modelType}'`); - } - } else { - throw new Error( - 'Need to provide either project & model OR modelUrl as query parameters' - ); - } -} \ No newline at end of file diff --git a/examples/src/utils/renderer-debug-widget.ts b/examples/src/utils/renderer-debug-widget.ts deleted file mode 100644 index a732f9f58db..00000000000 --- a/examples/src/utils/renderer-debug-widget.ts +++ /dev/null @@ -1,396 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import { THREE } from '@cognite/reveal'; -import * as reveal from '@cognite/reveal/internals'; -import dat from 'dat.gui'; - -export type RenderFilter = { - renderQuads: boolean; - renderPrimitives: boolean; - renderTriangleMeshes: boolean; - renderInstancedMeshes: boolean; -}; -const everythingRenderFilter: RenderFilter = { - renderQuads: true, - renderPrimitives: true, - renderTriangleMeshes: true, - renderInstancedMeshes: true, -}; - -export enum RenderMode { - WhenNecessary = 'WhenNecessary', - DisableRendering = 'DisableRendering', - AlwaysRender = 'AlwaysRender', -} - -export type RenderOptions = { - loadingEnabled: boolean; - renderMode: RenderMode; - renderFilter: RenderFilter; - overrideWantedSectors?: reveal.WantedSector[]; -}; - -export function createDefaultRenderOptions(): RenderOptions { - return { - loadingEnabled: true, - renderMode: RenderMode.WhenNecessary, - renderFilter: everythingRenderFilter, - overrideWantedSectors: undefined, - }; -} - -function createEmptySceneInfo() { - return { - sectors: { - count: 0, - loadedDetailedCount: 0, - }, - primitives: { - meshCount: 0, - instanceCount: 0, - templateTriangleCount: 0, - }, - triangleMeshes: { - meshCount: 0, - triangleCount: 0, - }, - instanceMeshes: { - meshCount: 0, - instanceCount: 0, - avgInstancesPerMesh: 0.0, - templateTriangleCount: 0, - }, - quads: { - meshCount: 0, - quadCount: 0, - templateTriangleCount: 0, - }, - distinctMaterialCount: 0, - // Stuff to compute FPS - lastUpdate: { - timestamp: Date.now(), - frame: 0, - }, - fps: 0, - }; -} -type SceneInfo = ReturnType; - -export function createRendererDebugWidget( - sectorMetadataRoot: reveal.SectorMetadata, - renderer: THREE.WebGLRenderer, - cadNode: reveal.CadNode, - gui: dat.GUI, - intervalMs: number = 100 -): RenderOptions { - const renderInfo = renderer.info; - const sceneInfo = createEmptySceneInfo(); - const renderOptions = createDefaultRenderOptions(); - - const controls: dat.GUIController[] = []; // List of controls that must be manually updated - - const renderModes = [ - RenderMode.WhenNecessary, - RenderMode.AlwaysRender, - RenderMode.DisableRendering, - ]; - gui.add(renderOptions, 'loadingEnabled').name('Loading enabled'); - gui.add(renderOptions, 'renderMode', renderModes).name('Render mode'); - - // Basic render performance - const statsGui = gui.addFolder('Stats'); - controls.push(statsGui.add(sceneInfo, 'fps').name('FPS')); - controls.push(statsGui.add(renderInfo.render, 'calls').name('Draw calls')); - controls.push(statsGui.add(renderInfo.render, 'triangles').name('Triangles')); - controls.push( - statsGui.add(renderInfo.programs || [], 'length').name('Shaders') - ); - controls.push( - statsGui.add(sceneInfo, 'distinctMaterialCount').name('Materials') - ); - statsGui.open(); - - // Render filtering - const filterGui = gui.addFolder('Filtering'); - filterGui - .add(renderOptions.renderFilter, 'renderInstancedMeshes') - .name('Instanced meshes'); - filterGui - .add(renderOptions.renderFilter, 'renderPrimitives') - .name('Primitives'); - filterGui - .add(renderOptions.renderFilter, 'renderTriangleMeshes') - .name('Triangle meshes'); - filterGui.add(renderOptions.renderFilter, 'renderQuads').name('Quads'); - - // Sectors - const sectorsGui = gui.addFolder('Sectors'); - controls.push(sectorsGui.add(sceneInfo.sectors, 'count').name('Total')); - controls.push( - sectorsGui - .add(sceneInfo.sectors, 'loadedDetailedCount') - .name('Loaded detailed') - ); - controls.push( - sectorsGui.add(sceneInfo.quads, 'meshCount').name('Loaded quads') - ); - - // Details about different geometries - const primitivesGui = gui.addFolder('Primitives'); - controls.push( - primitivesGui.add(sceneInfo.primitives, 'meshCount').name('Mesh count') - ); - controls.push( - primitivesGui - .add(sceneInfo.primitives, 'instanceCount') - .name('Instance count') - ); - controls.push( - primitivesGui - .add(sceneInfo.primitives, 'templateTriangleCount') - .name('Triangles') - ); - const instancesGui = gui.addFolder('Instances'); - controls.push( - instancesGui.add(sceneInfo.instanceMeshes, 'meshCount').name('Mesh count') - ); - controls.push( - instancesGui - .add(sceneInfo.instanceMeshes, 'instanceCount') - .name('Instance count') - ); - controls.push( - instancesGui - .add(sceneInfo.instanceMeshes, 'templateTriangleCount') - .name('Triangles') - ); - controls.push( - instancesGui - .add(sceneInfo.instanceMeshes, 'avgInstancesPerMesh') - .name('Avg instances per mesh') - ); - const meshesGui = gui.addFolder('Meshes'); - controls.push( - meshesGui.add(sceneInfo.triangleMeshes, 'meshCount').name('Mesh count') - ); - controls.push( - meshesGui.add(sceneInfo.triangleMeshes, 'triangleCount').name('Triangles') - ); - - const quadsGui = gui.addFolder('Quads (low detail geometry)'); - controls.push(quadsGui.add(sceneInfo.quads, 'meshCount').name('Mesh count')); - controls.push(quadsGui.add(sceneInfo.quads, 'quadCount').name('Quad count')); - - // Actions - const actions = { - logVisible: () => logVisibleSectorsInScene(cadNode), - logActiveSectors: () => logActiveSectors(cadNode), - logMaterials: () => logActiveMaterialsInScene(cadNode), - saveWindowVariables: () => - saveWindowVariables(renderer, cadNode, sectorMetadataRoot), - }; - const actionsGui = gui.addFolder('Actions'); - actionsGui.add(actions, 'logVisible').name('Log visible meshes'); - actionsGui.add(actions, 'logActiveSectors').name('Log active sectors'); - actionsGui.add(actions, 'saveWindowVariables').name('Save global variables'); - actionsGui.add(actions, 'logMaterials').name('Print materials'); - - // Regularly update displays - setInterval(() => { - computeFramesPerSecond(renderer, sceneInfo); - updateSceneInfo(cadNode, sceneInfo); - controls.forEach((ctrl) => ctrl.updateDisplay()); - }, intervalMs); - - return renderOptions; -} - -function computeFramesPerSecond( - renderer: THREE.WebGLRenderer, - sceneInfo: SceneInfo -) { - const timestamp = Date.now(); - const currentFrame = renderer.info.render.frame; - - const dts = (timestamp - sceneInfo.lastUpdate.timestamp) / 1000; - const dFrames = currentFrame - sceneInfo.lastUpdate.frame; - // FPS over time - sceneInfo.fps = 0.3 * (dFrames / dts) + 0.7 * sceneInfo.fps; - sceneInfo.lastUpdate.frame = currentFrame; - sceneInfo.lastUpdate.timestamp = timestamp; -} - -function isSectorRoot(object: THREE.Object3D): boolean { - return object.name.startsWith('Sector'); -} - -function isHighDetailSectorRoot(object: THREE.Object3D): boolean { - return ( - // Container for a sector - isSectorRoot(object) && - !!object.children.find( - // Container has a group - (y) => - y.type === 'Group' && - // The group contains mesh that isn't quad - y.children.find((z) => z.type === 'Mesh' && !z.name.startsWith('Quads')) - ) - ); -} - -function updateSceneInfo(scene: THREE.Object3D, sceneInfo: SceneInfo) { - sceneInfo.sectors.count = 0; - sceneInfo.sectors.loadedDetailedCount = 0; - sceneInfo.primitives.meshCount = 0; - sceneInfo.primitives.templateTriangleCount = 0; - sceneInfo.primitives.instanceCount = 0; - sceneInfo.instanceMeshes.meshCount = 0; - sceneInfo.instanceMeshes.templateTriangleCount = 0; - sceneInfo.instanceMeshes.instanceCount = 0; - sceneInfo.instanceMeshes.avgInstancesPerMesh = 0.0; - sceneInfo.triangleMeshes.meshCount = 0; - sceneInfo.triangleMeshes.triangleCount = 0; - sceneInfo.quads.meshCount = 0; - sceneInfo.quads.quadCount = 0; - - const materialIds = new Set(); - scene.traverseVisible((x) => { - if (isSectorRoot(x)) { - sceneInfo.sectors.count++; - sceneInfo.sectors.loadedDetailedCount += isHighDetailSectorRoot(x) - ? 1 - : 0; - } - - if (x.type !== 'Mesh') { - return; - } - const mesh = x as THREE.Mesh; - const geometry = mesh.geometry as THREE.BufferGeometry; - - const materials = getMaterials(mesh); - materials.forEach((m) => materialIds.add(m.id)); - - if (x.name.startsWith('Primitives')) { - const indexAttribute = geometry.index!; - sceneInfo.primitives.meshCount++; - sceneInfo.primitives.templateTriangleCount += indexAttribute.count / 3; - sceneInfo.primitives.instanceCount += - geometry.attributes.a_treeIndex.count; - } else if (x.name.startsWith('Triangle mesh')) { - const indexAttribute = geometry.index!; - sceneInfo.triangleMeshes.meshCount++; - sceneInfo.triangleMeshes.triangleCount += indexAttribute.count / 3; - } else if (x.name.startsWith('Instanced mesh')) { - sceneInfo.instanceMeshes.meshCount++; - sceneInfo.instanceMeshes.templateTriangleCount += - geometry.drawRange.count; - sceneInfo.instanceMeshes.instanceCount += - geometry.attributes.a_treeIndex.count; - } else if (x.name.startsWith('Quads')) { - sceneInfo.quads.meshCount++; - sceneInfo.quads.quadCount += geometry.attributes.color.count; - } - }); - - sceneInfo.distinctMaterialCount = materialIds.size; - sceneInfo.instanceMeshes.avgInstancesPerMesh = - sceneInfo.instanceMeshes.instanceCount / sceneInfo.instanceMeshes.meshCount; -} - -/** - * Apply filters from a RenderFilter created using createRendererDebugWidget. - * This must be called every frame in order to ensure scene is updated correctly. - * @param scene - * @param filter - */ -export function applyRenderingFilters( - scene: THREE.Scene, - filter: RenderFilter -) { - scene.traverse((x) => { - if (x.name.startsWith('Primitives')) { - x.visible = filter.renderPrimitives; - } else if (x.name.startsWith('Triangle mesh')) { - x.visible = filter.renderTriangleMeshes; - } else if (x.name.startsWith('Instanced mesh')) { - x.visible = filter.renderInstancedMeshes; - } else if (x.name.startsWith('Quads')) { - x.visible = filter.renderQuads; - } - }); -} - -function getMaterials(mesh: THREE.Mesh): THREE.Material[] { - if (!mesh.material) { - return []; - } else if (Array.isArray(mesh.material)) { - return mesh.material; - } else { - return [mesh.material as THREE.Material]; - } -} - -function logVisibleSectorsInScene(scene: THREE.Object3D) { - const visibleMeshes: Record = {}; - scene.traverseVisible((x) => { - if (x.type === 'Mesh' || x.type === 'LOD') { - let path = ''; - x.traverseAncestors((y) => { - path = y.name + '/' + path; - }); - visibleMeshes[path + x.name] = x as THREE.Mesh; - } - }); - console.log('Visible meshes:', visibleMeshes); -} - -function logActiveMaterialsInScene(scene: THREE.Object3D) { - const uniqueMaterials: Record = {}; - scene.traverseVisible((x) => { - if (x.type === 'Mesh') { - const mesh = x as THREE.Mesh; - const materials = getMaterials(mesh); - materials.forEach((m) => (uniqueMaterials[m.id] = m)); - } - }); - console.log('Unique materials:', uniqueMaterials); -} - -function logActiveSectors(scene: THREE.Object3D) { - const activeDetailedRoots: THREE.Object3D[] = []; - const activeQuadsRoots: THREE.Object3D[] = []; - scene.traverseVisible((x) => { - if ( - x.name.startsWith('Sector') && - x.children.find((y) => y.type === 'Mesh') - ) { - if (x.children.find((y) => y.name.startsWith('Quads'))) { - activeQuadsRoots.push(x); - } else { - activeDetailedRoots.push(x); - } - } - }); - console.log('Active detailed sectors:', activeDetailedRoots); - console.log('Active quads sectors:', activeQuadsRoots); -} - -function saveWindowVariables( - renderer: THREE.WebGLRenderer, - scene: THREE.Object3D, - sectorMetadataRoot: reveal.SectorMetadata -) { - (window as any).THREE = THREE; - (window as any).scene = scene; - (window as any).renderer = renderer; - (window as any).sectorRoot = sectorMetadataRoot; - console.log( - 'Set window.scene, window.renderer, window.THREE and window.sectorRoot' - ); - console.log( - 'See https://github.com/jeromeetienne/threejs-inspector/blob/master/README.md for details on the ThreeJS inspector' - ); -} diff --git a/examples/src/utils/sceneHelpers.ts b/examples/src/utils/sceneHelpers.ts deleted file mode 100644 index 0e5e110a0d8..00000000000 --- a/examples/src/utils/sceneHelpers.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2021 Cognite AS - */ - -import { default as THREE, WebGLRenderer } from 'three'; - -export function resizeRendererToDisplaySize( - renderer: WebGLRenderer, - camera: THREE.PerspectiveCamera, - updateStyle: boolean = false -) { - const canvas = renderer.domElement; - const width = canvas.clientWidth; - const height = canvas.clientHeight; - const needResize = canvas.width !== Math.floor(width * window.devicePixelRatio) || canvas.height !== Math.floor(height * window.devicePixelRatio); - if (needResize) { - renderer.setSize(width, height, updateStyle); - camera.aspect = canvas.clientWidth / canvas.clientHeight; - camera.updateProjectionMatrix(); - } - return needResize; -} diff --git a/examples/src/visual_tests/GithubActionsPRComment.js b/examples/src/visual_tests/GithubActionsPRComment.js deleted file mode 100644 index 4f419dce4ae..00000000000 --- a/examples/src/visual_tests/GithubActionsPRComment.js +++ /dev/null @@ -1,41 +0,0 @@ -const core = require('@actions/core'); -const github = require('@actions/github') - -async function commentOnPR(octokit) { - const context = github.context; - if (context.payload.pull_request == null) { - console.log("Not running in a PR"); - return; - } - - const url = "https://github.com/cognitedata/reveal/actions/runs/" + process.env["GITHUB_RUN_ID"]; - const message = "There were failures in the examples workflow. " + - "This usually means a visual regression test has failed. " + - `Image diffs for visual tests can be downloaded as an artifact [here](${url}). ` + - "If there are no artifacts there's an error somewhere else in the examples workflow. " + - "If you have made intentional changes you can update the image snapshots by running `yarn snapshots:update` in `examples/`"; - - const prNumber = context.payload.pull_request.number; - await octokit.issues.createComment({ - ...context.repo, - issue_number: prNumber, - body: message - }); -} - -async function run() { - const commitHash = process.env["GITHUB_SHA"]; - if (!commitHash) { - console.log("Not running in Github - exiting"); - process.exit(); - } - try { - const github_token = process.env['ACTIONS_RUNTIME_TOKEN']; - const octokit = github.getOctokit(github_token); - await commentOnPR(octokit); - } catch (err) { - core.setFailed(err.message); - } -} - -run(); diff --git a/examples/src/visual_tests/__image_snapshots__/.gitignore b/examples/src/visual_tests/__image_snapshots__/.gitignore deleted file mode 100644 index 2550c80a7e7..00000000000 --- a/examples/src/visual_tests/__image_snapshots__/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -__diff_output__/ - diff --git a/examples/src/visual_tests/__image_snapshots__/cad_clipping-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_clipping-snap.png deleted file mode 100644 index c125a8ccf12..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_clipping-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_customObjectBlending-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_customObjectBlending-snap.png deleted file mode 100644 index c9c875e8d6e..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_customObjectBlending-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_customObjectWithHighlightAndGhosted-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_customObjectWithHighlightAndGhosted-snap.png deleted file mode 100644 index dcf8956f563..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_customObjectWithHighlightAndGhosted-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_customObjectWithHighlightAndGhostedV8-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_customObjectWithHighlightAndGhostedV8-snap.png deleted file mode 100644 index bedf13a3732..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_customObjectWithHighlightAndGhostedV8-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_default-cognite3dviewer-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_default-cognite3dviewer-snap.png deleted file mode 100644 index 6397bc3d1d8..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_default-cognite3dviewer-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_default-cognite3dviewer-v8-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_default-cognite3dviewer-v8-snap.png deleted file mode 100644 index 16ac44308e2..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_default-cognite3dviewer-v8-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_default-highlight-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_default-highlight-snap.png deleted file mode 100644 index bdfb001c5f7..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_default-highlight-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_default-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_default-snap.png deleted file mode 100644 index d02d3aae87c..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_default-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_default-v8-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_default-v8-snap.png deleted file mode 100644 index f0bca03e4c6..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_default-v8-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_defaultCamera-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_defaultCamera-snap.png deleted file mode 100644 index 6820dc2b94f..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_defaultCamera-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_highlight-with-default-ghosting-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_highlight-with-default-ghosting-snap.png deleted file mode 100644 index 6a0c9810da9..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_highlight-with-default-ghosting-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_nodeTransform-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_nodeTransform-snap.png deleted file mode 100644 index b7e64f1dfb0..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_nodeTransform-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_outlines-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_outlines-snap.png deleted file mode 100644 index 89ee3bc2463..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_outlines-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_reassign-node-style-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_reassign-node-style-snap.png deleted file mode 100644 index 842c44fc981..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_reassign-node-style-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_rotateCadModel-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_rotateCadModel-snap.png deleted file mode 100644 index e017513e401..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_rotateCadModel-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_scaledModel-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_scaledModel-snap.png deleted file mode 100644 index 91ffe5d7bd2..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_scaledModel-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_ssao-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_ssao-snap.png deleted file mode 100644 index 17a58227187..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_ssao-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_two-models-one-ghosted-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_two-models-one-ghosted-snap.png deleted file mode 100644 index fbcc321894b..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_two-models-one-ghosted-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/cad_userRenderTarget-snap.png b/examples/src/visual_tests/__image_snapshots__/cad_userRenderTarget-snap.png deleted file mode 100644 index d19a9814191..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/cad_userRenderTarget-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/pointcloud_clipping-planes-cognite3dviewer-pointcloud-snap.png b/examples/src/visual_tests/__image_snapshots__/pointcloud_clipping-planes-cognite3dviewer-pointcloud-snap.png deleted file mode 100644 index 62625481f89..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/pointcloud_clipping-planes-cognite3dviewer-pointcloud-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/pointcloud_color-styling-snap.png b/examples/src/visual_tests/__image_snapshots__/pointcloud_color-styling-snap.png deleted file mode 100644 index 3e21cb885d5..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/pointcloud_color-styling-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/__image_snapshots__/pointcloud_default-cognite3dviewer-pointcloud-snap.png b/examples/src/visual_tests/__image_snapshots__/pointcloud_default-cognite3dviewer-pointcloud-snap.png deleted file mode 100644 index c1749a1a593..00000000000 Binary files a/examples/src/visual_tests/__image_snapshots__/pointcloud_default-cognite3dviewer-pointcloud-snap.png and /dev/null differ diff --git a/examples/src/visual_tests/ambientTypes.d.ts b/examples/src/visual_tests/ambientTypes.d.ts deleted file mode 100644 index 519f0553fa5..00000000000 --- a/examples/src/visual_tests/ambientTypes.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module 'jest-retries' { - export default function(...args: any[]): any; -} diff --git a/examples/src/visual_tests/basic.test.ts b/examples/src/visual_tests/basic.test.ts deleted file mode 100644 index db3d65895a5..00000000000 --- a/examples/src/visual_tests/basic.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { visualTests } from '../pages/e2e/visualTests'; - -const retry = require('jest-retries'); - -const RETRIES = parseInt(process.env.RETRIES!) || 3; - -jest.retryTimes(RETRIES); - -async function screenShotTest(url: string, snapshotName: string, blur = 0) { - const testPage = await browser.newPage(); - - await testPage.goto(url, { - waitUntil: ['domcontentloaded'], - }); - - await testPage.waitForSelector('#ready'); - - const canvas = await testPage.$('canvas'); - const image = await canvas!.screenshot(); - - expect(image).toMatchImageSnapshot({ - failureThreshold: 0.005, - failureThresholdType: 'percent', - customSnapshotIdentifier: snapshotName, - comparisonMethod: 'ssim', - blur: blur - }); - - await testPage.close(); -} - -console.log(`Run tests with ${RETRIES} retries`); - -/* - * To add a new test, start from adding a new entry to TestCaseCad or TestCasePointCloud enum. TS errors will suggest missing parts. - * Basically, you just need to add a new test page to src/pages/e2e - * and create a new record in src/routes to map a component to its route - */ -describe('Reveal visual tests', () => { - visualTests.forEach(test => { - const { testKey, category, snapshotBlur } = test; - - const snapshotName = `${category}_${testKey}`; - const url = `http://localhost:3000/test/${category}/${testKey}`; - const blur = snapshotBlur ?? 0; - - retry(snapshotName, RETRIES, async () => { - console.log(`Running test with key ${testKey}`); - await screenShotTest(url, snapshotName, blur); - }); - - }); -}); diff --git a/examples/src/visual_tests/index.ts b/examples/src/visual_tests/index.ts deleted file mode 100644 index c024d5d85b3..00000000000 --- a/examples/src/visual_tests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { registerVisualTest} from '../routes'; \ No newline at end of file diff --git a/examples/src/visual_tests/jest-puppeteer.config.js b/examples/src/visual_tests/jest-puppeteer.config.js deleted file mode 100644 index f8257a5a30a..00000000000 --- a/examples/src/visual_tests/jest-puppeteer.config.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - launch: { - ignoreHTTPSErrors: true, - // https://peter.sh/experiments/chromium-command-line-switches/ - args: ['--allow-insecure-localhost', - '--window-size=800,600', - '--no-sandbox' - ], - headless: true, - defaultViewport: { - width: 1280, - height: 720, - deviceScaleFactor: 1, // https://github.com/puppeteer/puppeteer/issues/571 - isMobile: false - }, - dumpio: true, // get console output - }, -}; diff --git a/examples/src/visual_tests/jest.config.js b/examples/src/visual_tests/jest.config.js deleted file mode 100644 index b717535acea..00000000000 --- a/examples/src/visual_tests/jest.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - preset: 'jest-puppeteer', - testRegex: './*\\.test\\.ts$', - transform: { - "^.+\\.(ts|tsx)$": "ts-jest" - }, - setupFilesAfterEnv: ['./setupTests.ts'], - globalSetup: "jest-environment-puppeteer/setup", - globalTeardown: "jest-environment-puppeteer/teardown", - testEnvironment: "jest-environment-puppeteer", - testTimeout: 30 * 1000 // typical test ~5s, so 5*retryTimes should be less than timeout or test will fail during retry -}; diff --git a/examples/src/visual_tests/setupTests.ts b/examples/src/visual_tests/setupTests.ts deleted file mode 100644 index 881aca36d5c..00000000000 --- a/examples/src/visual_tests/setupTests.ts +++ /dev/null @@ -1,5 +0,0 @@ -// @ts-ignore isolated modules - -const { toMatchImageSnapshot } = require('jest-image-snapshot'); - -expect.extend({ toMatchImageSnapshot }); diff --git a/examples/tsconfig.json b/examples/tsconfig.json index 1f1fdffe316..e19ab671bba 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -11,6 +11,7 @@ "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, + "sourceMap": true, "forceConsistentCasingInFileNames": true, "module": "esnext", "moduleResolution": "node", diff --git a/examples/webpack.config.js b/examples/webpack.config.js index 183d7c49690..26027f99b8b 100644 --- a/examples/webpack.config.js +++ b/examples/webpack.config.js @@ -49,8 +49,9 @@ module.exports = { ], resolve: { extensions: ['.tsx', '.ts', '.js', '.css'], + symlinks: false }, - devtool: 'inline-source-map', + devtool: 'eval-source-map', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'public'), diff --git a/examples/yarn.lock b/examples/yarn.lock index 559487a5b9b..4981f9d6796 100644 --- a/examples/yarn.lock +++ b/examples/yarn.lock @@ -2,36 +2,6 @@ # yarn lockfile v1 -"@actions/core@^1.2.6": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.4.0.tgz#cf2e6ee317e314b03886adfeb20e448d50d6e524" - integrity sha512-CGx2ilGq5i7zSLgiiGUtBCxhRRxibJYU6Fim0Q1Wg2aQL2LTnF27zbqZOrxfvFQ55eSBW0L8uVStgtKMpa0Qlg== - -"@actions/github@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@actions/github/-/github-4.0.0.tgz#d520483151a2bf5d2dc9cd0f20f9ac3a2e458816" - integrity sha512-Ej/Y2E+VV6sR9X7pWL5F3VgEWrABaT292DRqRU6R4hnQjPtC/zD3nagxVdXWiRQvYDh8kHXo7IDmG42eJ/dOMA== - dependencies: - "@actions/http-client" "^1.0.8" - "@octokit/core" "^3.0.0" - "@octokit/plugin-paginate-rest" "^2.2.3" - "@octokit/plugin-rest-endpoint-methods" "^4.0.0" - -"@actions/http-client@^1.0.8": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.11.tgz#c58b12e9aa8b159ee39e7dd6cbd0e91d905633c0" - integrity sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg== - dependencies: - tunnel "0.0.6" - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - "@azure/msal-browser@^2.21.0": version "2.21.0" resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-2.21.0.tgz#2ebe4b0874a61d64009419d4cfef1f6bb5e226b3" @@ -46,46 +16,13 @@ dependencies: debug "^4.1.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.14.5": +"@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== dependencies: "@babel/highlight" "^7.14.5" -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.17.10": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" - integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" - integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.5" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.5" - "@babel/types" "^7.18.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - "@babel/generator@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" @@ -95,15 +32,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.18.2", "@babel/generator@^7.7.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== - dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@^7.0.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" @@ -111,21 +39,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== - "@babel/helper-function-name@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" @@ -135,14 +48,6 @@ "@babel/template" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - "@babel/helper-get-function-arity@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" @@ -157,13 +62,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-module-imports@^7.0.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" @@ -171,39 +69,6 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-simple-access@^7.17.7": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" - integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== - dependencies: - "@babel/types" "^7.18.2" - "@babel/helper-split-export-declaration@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" @@ -211,37 +76,11 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -251,116 +90,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== - "@babel/parser@^7.14.5", "@babel/parser@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.0.tgz#b6d6e29058ca369127b0eeca2a1c4b5794f1b6b9" integrity sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ== -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" - integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/runtime-corejs3@^7.10.2": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.9.tgz#fb21b1cf11650dcb8fcf4de2e6b3b8cf411da3f3" @@ -369,7 +103,7 @@ core-js-pure "^3.16.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.9.2": version "7.14.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== @@ -385,31 +119,6 @@ "@babel/parser" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5", "@babel/traverse@^7.7.2": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" - integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.5" - "@babel/types" "^7.18.4" - debug "^4.1.0" - globals "^11.1.0" - "@babel/traverse@^7.4.5": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" @@ -425,14 +134,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - "@babel/types@^7.14.5", "@babel/types@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" @@ -441,33 +142,14 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@choojs/findup@^0.2.0": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz#ac13c59ae7be6e1da64de0779a0a7f03d75615a3" - integrity sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw== - dependencies: - commander "^2.15.1" - -"@cognite/reveal-parser-worker@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@cognite/reveal-parser-worker/-/reveal-parser-worker-1.3.0.tgz#9910121ba90cad684a91b3b04e6df0528ea671f5" - integrity sha512-39wuqtdogmZfTmnQhigNpgU/nfYG3POpUFKFO/FMKJKJ+pAsCCZfu4IPEXCDAevJS6/K+mEViPSLL6+Gagi1HQ== - dependencies: - comlink "4.3.1" - "@cognite/reveal@link:../viewer/dist": version "0.0.0" uid "" -"@cognite/sdk-core@^4.5.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@cognite/sdk-core/-/sdk-core-4.5.0.tgz#d93c128f552aed124128345adc8f35ce1cbba3a5" - integrity sha512-HwurP2XfkTQcPgKI5R+90i5vpRNI2EyZf7Qvvauw5VCXmn7iOgOgEJD1BaXCmP/Oz280VySPBwhSLih/6Ffbvg== +"@cognite/sdk-core@^4.6.2": + version "4.6.5" + resolved "https://registry.yarnpkg.com/@cognite/sdk-core/-/sdk-core-4.6.5.tgz#1606788be077b56c856467d5107c7f50f8c7535b" + integrity sha512-iwJ7jEFFS270DxvDNHwYuwpB5hEKZzcKdKTtfj0U5nEd4h1jPWjsBoVrNLVQKcm7+x5U/gzaxSKwUvv3hFSHTw== dependencies: cross-fetch "^3.0.4" is-buffer "^2.0.5" @@ -506,270 +188,7 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - -"@hapi/hoek@^9.0.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" - integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== - -"@hapi/joi@^15.0.3": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" - integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== - dependencies: - "@jest/types" "^28.1.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - slash "^3.0.0" - -"@jest/core@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.1.tgz#086830bec6267accf9af5ca76f794858e9f9f092" - integrity sha512-3pYsBoZZ42tXMdlcFeCc/0j9kOlK7MYuXs2B1QbvDgMoW1K9NJ4G/VYvIbMb26iqlkTfPHo7SC2JgjDOk/mxXw== - dependencies: - "@jest/console" "^28.1.1" - "@jest/reporters" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^28.0.2" - jest-config "^28.1.1" - jest-haste-map "^28.1.1" - jest-message-util "^28.1.1" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-resolve-dependencies "^28.1.1" - jest-runner "^28.1.1" - jest-runtime "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" - jest-watcher "^28.1.1" - micromatch "^4.0.4" - pretty-format "^28.1.1" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== - dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - -"@jest/environment@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.1.tgz#c4cbf85283278d768f816ebd1a258ea6f9e39d4f" - integrity sha512-9auVQ2GzQ7nrU+lAr8KyY838YahElTX9HVjbQPPS2XjlxQ+na18G113OoBhyBGBtD6ZnO/SrUy5WR8EzOj1/Uw== - dependencies: - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/node" "*" - jest-mock "^28.1.1" - -"@jest/expect-utils@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587" - integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw== - dependencies: - jest-get-type "^28.0.2" - -"@jest/expect@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.1.tgz#ea4fcc8504b45835029221c0dc357c622a761326" - integrity sha512-/+tQprrFoT6lfkMj4mW/mUIfAmmk/+iQPmg7mLDIFOf2lyf7EBHaS+x3RbeR0VZVMe55IvX7QRoT/2aK3AuUXg== - dependencies: - expect "^28.1.1" - jest-snapshot "^28.1.1" - -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== - dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" - "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -"@jest/fake-timers@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.1.tgz#47ce33296ab9d680c76076d51ddbe65ceb3337f1" - integrity sha512-BY/3+TyLs5+q87rGWrGUY5f8e8uC3LsVHS9Diz8+FV3ARXL4sNnkLlIB8dvDvRrp+LUCGM+DLqlsYubizGUjIA== - dependencies: - "@jest/types" "^28.1.1" - "@sinonjs/fake-timers" "^9.1.1" - "@types/node" "*" - jest-message-util "^28.1.1" - jest-mock "^28.1.1" - jest-util "^28.1.1" - -"@jest/globals@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.1.tgz#c0a7977f85e26279cc090d9adcdf82b8a34c4061" - integrity sha512-dEgl/6v7ToB4vXItdvcltJBgny0xBE6xy6IYQrPJAJggdEinGxCDMivNv7sFzPcTITGquXD6UJwYxfJ/5ZwDSg== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/expect" "^28.1.1" - "@jest/types" "^28.1.1" - -"@jest/reporters@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" - integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - jest-worker "^28.1.1" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.0" - -"@jest/schemas@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" - integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== - dependencies: - "@sinclair/typebox" "^0.23.3" - -"@jest/source-map@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" - integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.7" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" - integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== - dependencies: - "@jest/console" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e" - integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA== - dependencies: - "@jest/test-result" "^28.1.1" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" - slash "^3.0.0" - -"@jest/transform@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.1.tgz#83541f2a3f612077c8501f49cc4e205d4e4a6b27" - integrity sha512-PkfaTUuvjUarl1EDr5ZQcCA++oXkFCP9QFUkG0yVKVmNObjhrqDy0kbMpMebfHWm3CCDHjYNem9eUSH8suVNHQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" - jest-regex-util "^28.0.2" - jest-util "^28.1.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" - -"@jest/types@>=24 <=26", "@jest/types@^26.6.2": +"@jest/types@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== @@ -780,26 +199,6 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@jest/types@^28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" - integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== - dependencies: - "@jest/schemas" "^28.0.2" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/gen-mapping@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -814,11 +213,6 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== - "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -837,7 +231,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.7": +"@jridgewell/trace-mapping@^0.3.7": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== @@ -858,178 +252,6 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@octokit/auth-token@^2.4.4": - version "2.4.5" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" - integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== - dependencies: - "@octokit/types" "^6.0.3" - -"@octokit/core@^3.0.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" - integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== - dependencies: - "@octokit/auth-token" "^2.4.4" - "@octokit/graphql" "^4.5.8" - "@octokit/request" "^5.4.12" - "@octokit/request-error" "^2.0.5" - "@octokit/types" "^6.0.3" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^6.0.1": - version "6.0.11" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" - integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== - dependencies: - "@octokit/types" "^6.0.3" - is-plain-object "^5.0.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^4.5.8": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.1.tgz#f975486a46c94b7dbe58a0ca751935edc7e32cc9" - integrity sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA== - dependencies: - "@octokit/request" "^5.3.0" - "@octokit/types" "^6.0.3" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-6.1.0.tgz#cf0f859f9a4833b7fa5141b53e1d62d5d1cbc78f" - integrity sha512-Z9fDZVbGj4dFLErEoXUSuZhk3wJ8KVGnbrUwoPijsQ9EyNwOeQ+U2jSqaHUz8WtgIWf0aeO59oJyhMpWCKaabg== - -"@octokit/plugin-paginate-rest@^2.2.3": - version "2.13.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" - integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== - dependencies: - "@octokit/types" "^6.11.0" - -"@octokit/plugin-rest-endpoint-methods@^4.0.0": - version "4.15.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.15.1.tgz#91a064bee99d0ffcef74a04357e1cf15c27d1cd0" - integrity sha512-4gQg4ySoW7ktKB0Mf38fHzcSffVZd6mT5deJQtpqkuPuAqzlED5AJTeW8Uk7dPRn7KaOlWcXB0MedTFJU1j4qA== - dependencies: - "@octokit/types" "^6.13.0" - deprecation "^2.3.1" - -"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" - integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== - dependencies: - "@octokit/types" "^6.0.3" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": - version "5.4.15" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" - integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== - dependencies: - "@octokit/endpoint" "^6.0.1" - "@octokit/request-error" "^2.0.0" - "@octokit/types" "^6.7.1" - is-plain-object "^5.0.0" - node-fetch "^2.6.1" - universal-user-agent "^6.0.0" - -"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.0", "@octokit/types@^6.7.1": - version "6.13.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.13.1.tgz#85f447f97dc7edb672f221df51f56a51785c131a" - integrity sha512-UF/PL0y4SKGx/p1azFf7e6j9lB78tVwAFvnHtslzOJ6VipshYks74qm9jjTEDlCyaTmbhbk2h3Run5l0CtCF6A== - dependencies: - "@octokit/openapi-types" "^6.0.0" - -"@sideway/address@^4.1.0": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.2.tgz#811b84333a335739d3969cfc434736268170cad1" - integrity sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.23.3": - version "0.23.5" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" - integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== - -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^9.1.1": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@testing-library/dom@^7.28.1": - version "7.31.2" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a" - integrity sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - aria-query "^4.2.2" - chalk "^4.1.0" - dom-accessibility-api "^0.5.6" - lz-string "^1.4.4" - pretty-format "^26.6.2" - "@testing-library/jest-dom@^5.11.5": version "5.14.1" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz#8501e16f1e55a55d675fe73eecee32cdaddb9766" @@ -1045,64 +267,6 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^11.1.0": - version "11.2.7" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818" - integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA== - dependencies: - "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^7.28.1" - -"@testing-library/user-event@^12.1.10": - version "12.8.3" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a" - integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ== - dependencies: - "@babel/runtime" "^7.12.5" - -"@tweenjs/tween.js@18.6.4": - version "18.6.4" - resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-18.6.4.tgz#40a3d0a93647124872dec8e0fd1bd5926695b6ca" - integrity sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ== - -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== - -"@types/babel__core@^7.1.14": - version "7.1.19" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== - dependencies: - "@babel/types" "^7.3.0" - "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -1138,18 +302,6 @@ resolved "https://registry.yarnpkg.com/@types/dat.gui/-/dat.gui-0.7.7.tgz#2125aedfaa190364c5a50b0447858a7e159aea2e" integrity sha512-CxLCme0He5Jk3uQwfO/fGZMyNhb/ypANzqX0yU9lviBQMlen5SOvQTBQ/Cd9x5mFlUAK5Tk8RgvTyLj1nYkz+w== -"@types/draco3d@*": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@types/draco3d/-/draco3d-1.4.1.tgz#bb3d5030be7ffd6e5b0b1b86079d051d97ec55fa" - integrity sha512-gXeVdWXN9zlx+nlaNEsFcxQSZxI574h3iwjsram2I/l/gpFYBe1KwXUR3xnFglD3cQ26/aeGiNBtSd8Muer5xQ== - -"@types/draco3dgltf@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@types/draco3dgltf/-/draco3dgltf-1.4.0.tgz#61a839f199dd9bd92029ce5640d2890ffc7903d0" - integrity sha512-vo/GQzRmdYaae7uNiJd2QE/zfeMHgRPfWeqoKtCwWSTBwCd+XzrFrJEcgubooA4ZJNTEcx8+N8BUbCx9gIlR3Q== - dependencies: - "@types/draco3d" "*" - "@types/eslint-scope@^3.7.3": version "3.7.3" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" @@ -1177,9 +329,9 @@ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.29" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" - integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== + version "4.17.30" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz#0f2f99617fa8f9696170c46152ccf7500b34ac04" + integrity sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1195,18 +347,6 @@ "@types/qs" "*" "@types/serve-static" "*" -"@types/geojson@7946.0.8": - version "7946.0.8" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" - integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== - -"@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - "@types/history@*": version "4.7.9" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" @@ -1237,11 +377,6 @@ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== -"@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - "@types/istanbul-lib-report@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" @@ -1256,25 +391,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest-environment-puppeteer@^4.4.1": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@types/jest-environment-puppeteer/-/jest-environment-puppeteer-4.4.1.tgz#cee73afe7a774f6a02591dc117b47d39aa5e6119" - integrity sha512-LiZTD6i63le6QMnxi7pJB0SFv/fWtss6VVEEDm/UaeowBgjduf8txyE//j3WEeDPxngTvioUjbzA7Rc6Wc3cBA== - dependencies: - "@jest/types" ">=24 <=26" - "@types/puppeteer" "*" - jest-environment-node ">=24 <=26" - -"@types/jest-image-snapshot@^4.1.2": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/jest-image-snapshot/-/jest-image-snapshot-4.3.1.tgz#1382e9e155d6e29af0a81efce1056aaba92110c9" - integrity sha512-WDdUruGF14C53axe/mNDgQP2YIhtcwXrwmmVP8eOGyfNTVD+FbxWjWR7RTU+lzEy4K6V6+z7nkVDm/auI/r3xQ== - dependencies: - "@types/jest" "*" - "@types/pixelmatch" "*" - ssim.js "^3.1.1" - -"@types/jest@*", "@types/jest@^26.0.19": +"@types/jest@*": version "26.0.24" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== @@ -1292,45 +409,21 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/node@*": version "16.4.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.12.tgz#961e3091f263e6345d2d84afab4e047a60b4b11b" integrity sha512-zxrTNFl9Z8boMJXs6ieqZP0wAhvkdzmHSxTlJabM16cf5G9xBc1uPRH5Bbv2omEDDiM8MzTfqTJXBf0Ba4xFWA== -"@types/node@^14.14.5": - version "14.17.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.9.tgz#b97c057e6138adb7b720df2bd0264b03c9f504fd" - integrity sha512-CMjgRNsks27IDwI785YMY0KLt3co/c0cQ5foxHYv/shC2w8oOnVwz5Ubq1QG5KzrcW+AXk6gzdnxIkDnTvzu3g== - -"@types/pixelmatch@*": - version "5.2.4" - resolved "https://registry.yarnpkg.com/@types/pixelmatch/-/pixelmatch-5.2.4.tgz#ca145cc5ede1388c71c68edf2d1f5190e5ddd0f6" - integrity sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.1.5": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" - integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== - "@types/prop-types@*": version "15.7.4" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -"@types/puppeteer@*": - version "5.4.3" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.3.tgz#cdca84aa7751d77448d8a477dbfa0af1f11485f2" - integrity sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg== - dependencies: - "@types/node" "*" - "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -1401,11 +494,11 @@ "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== dependencies: - "@types/mime" "^1" + "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": @@ -1415,11 +508,6 @@ dependencies: "@types/node" "*" -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - "@types/styled-components@^5.1.4": version "5.1.12" resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.12.tgz#1a3679942746adecd1e736bfc47aea2c938a7d9a" @@ -1443,11 +531,6 @@ dependencies: "@types/webxr" "*" -"@types/webpack-env@^1.16.2": - version "1.16.2" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.2.tgz#8db514b059c1b2ae14ce9d7bb325296de6a9a0fa" - integrity sha512-vKx7WNQNZDyJveYcHAm9ZxhqSGLYwoyLhrHjLBOkw3a7cT76sTdjgtwyijhk1MaHyRIuSztcVwrUOO/NEu68Dw== - "@types/webxr@*": version "0.4.0" resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.4.0.tgz#ad06c96a324293e0d5175d13dd5ded5931f90ba3" @@ -1472,20 +555,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.8": - version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" - integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== - dependencies: - "@types/yargs-parser" "*" - -"@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== - dependencies: - "@types/node" "*" - "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -1647,35 +716,15 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.4.1, acorn@^8.5.0: version "8.8.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" @@ -1691,7 +740,7 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.3, ajv@^6.12.5: +ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1711,23 +760,11 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -1738,11 +775,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1757,12 +789,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1770,13 +797,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -1785,11 +805,6 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1800,99 +815,11 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== - dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.1.tgz#2a3a4ae50964695b2d694ccffe4bec537c5a3586" - integrity sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw== - dependencies: - "@jest/transform" "^28.1.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11" - integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - "babel-plugin-styled-components@>= 1.12.0": version "1.13.2" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" @@ -1908,91 +835,21 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4" - integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g== - dependencies: - babel-plugin-jest-hoist "^28.1.1" - babel-preset-current-node-syntax "^1.0.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -before-after-hook@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" - integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" - integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - body-parser@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" @@ -2034,7 +891,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2052,48 +909,11 @@ browserslist@^4.14.5: node-releases "^2.0.5" picocolors "^1.0.0" -browserslist@^4.20.2: - version "4.21.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe" - integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== - dependencies: - caniuse-lite "^1.0.30001358" - electron-to-chromium "^1.4.164" - node-releases "^2.0.5" - update-browserslist-db "^1.0.0" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.2.1, buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -2104,30 +924,7 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^15.0.5: - version "15.2.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" - integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== - dependencies: - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -2135,11 +932,6 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" @@ -2148,16 +940,6 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -2168,27 +950,11 @@ camera-controls@^1.25.1: resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-1.30.0.tgz#ac7fe7c872339cb446313286ded1889867d63ebf" integrity sha512-ZtYT/1YdjXjk+51xKF71J4NOJxDnRn7oVbO2LEjJsp3ffKN46QaMzfTLG1fjpp2VaZ4e2R1Gx9J9EWmzUKDftw== -caniuse-lite@^1.0.30001349, caniuse-lite@^1.0.30001358: +caniuse-lite@^1.0.30001349: version "1.0.30001358" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz#473d35dabf5e448b463095cab7924e96ccfb8c00" integrity sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2214,16 +980,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -check-more-types@2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= - chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -2239,36 +995,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" - integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - clean-css@^5.2.2: version "5.3.0" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" @@ -2276,31 +1007,6 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" - integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= - dependencies: - for-own "^0.1.3" - is-plain-object "^2.0.1" - kind-of "^3.0.2" - lazy-cache "^1.0.3" - shallow-clone "^0.1.2" - clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -2310,16 +1016,6 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2349,33 +1045,11 @@ colorette@^2.0.10, colorette@^2.0.14: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comlink@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.3.1.tgz#0c6b9d69bcd293715c907c33fe8fc45aecad13c5" - integrity sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA== - -commander@^2.15.1, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - commander@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -2386,11 +1060,6 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -2416,20 +1085,10 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== content-disposition@0.5.4: version "0.5.4" @@ -2443,13 +1102,6 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -2460,53 +1112,24 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -copy-webpack-plugin@^6.2.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" - integrity sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA== - dependencies: - cacache "^15.0.5" - fast-glob "^3.2.4" - find-cache-dir "^3.3.1" - glob-parent "^5.1.1" - globby "^11.0.1" - loader-utils "^2.0.0" - normalize-path "^3.0.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - webpack-sources "^1.4.3" - core-js-pure@^3.16.0: version "3.16.0" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.16.0.tgz#218e07add3f1844e53fab195c47871fc5ba18de8" integrity sha512-wzlhZNepF/QA9yvx3ePDgNGudU5KDB8lu/TRPKelYA/QtSnkS/cLl2W+TIdEX1FAFcBr0YpY7tPDlcmXJ7AyiQ== -core-js@^2.6.5: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-env@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-fetch@3.1.5, cross-fetch@^3.0.4: +cross-fetch@^3.0.4: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: node-fetch "2.6.7" -cross-spawn@^7.0.1, cross-spawn@^7.0.3: +cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2583,28 +1206,6 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== -customize-cra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/customize-cra/-/customize-cra-1.0.0.tgz#73286563631aa08127ad4d30a2e3c89cf4e93c8d" - integrity sha512-DbtaLuy59224U+xCiukkxSq8clq++MOtJ1Et7LED1fLszWe88EoblEYFBJ895sB1mC6B4uu3xPT/IjClELhMbA== - dependencies: - lodash.flow "^3.5.0" - -cwd@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" - integrity sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc= - dependencies: - find-pkg "^0.1.2" - fs-exists-sync "^0.1.0" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - dat.gui@^0.7.7: version "0.7.7" resolved "https://registry.yarnpkg.com/dat.gui/-/dat.gui-0.7.7.tgz#7f96dbd21621a76385203659aebfa264ee6ae89b" @@ -2617,47 +1218,18 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@4.3.2, debug@^4.1.0, debug@^4.1.1: +debug@^4.1.0, debug@^4.1.1: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -2670,19 +1242,6 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -2693,48 +1252,21 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -deprecation@^2.0.0, deprecation@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -devtools-protocol@0.0.969999: - version "0.0.969999" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.969999.tgz#3d6be0a126b3607bb399ae2719b471dda71f3478" - integrity sha512-6GfzuDWU0OFAuOvBokXpXPLxjOJ5DZ157Ue3sGQQM3LgAamb8m0R0ruSfN0DDu+XG5XJgT50i6zZ/0o8RglreQ== - diff-sequences@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2805,9 +1337,9 @@ dotenv-defaults@^2.0.2: dotenv "^8.2.0" dotenv-webpack@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-7.1.0.tgz#211fefac6bf500bf3bb66b286e1b12a23a2a70c0" - integrity sha512-+aUOe+nqgLerA/n611oyC15fY79BIkGm2fOxJAcHDonMZ7AtDpnzv/Oe591eHAenIE0t6w03UyxDnLs/YUxx5Q== + version "7.1.1" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-7.1.1.tgz#ee8a699e1d736fd8eb9363fbc7054cfff1bd9dbf" + integrity sha512-xw/19VqHDkXALtBOJAnnrSU/AZDIQRXczAmJyp0lZv6SH2aBLzUTl96W1MVryJZ7okZ+djZS4Gj4KlZ0xP7deA== dependencies: dotenv-defaults "^2.0.2" @@ -2816,29 +1348,6 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -duplexer@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -duplexify@^3.4.5: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2849,38 +1358,11 @@ electron-to-chromium@^1.4.147: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.163.tgz#d881ad93360001e79cdc871b3a5b5cd9c74e9639" integrity sha512-c9q94pUVqIdc8hyr7jZDB4bNEoNF3QJ7y35lnddMD+mXtiv5GsL1bT/RmfW/KEOmvlNg5Oy1qioiy4tA7e864Q== -electron-to-chromium@^1.4.164: - version "1.4.167" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.167.tgz#72424aebc85df12c5331d37b1bcfd1ae01322c55" - integrity sha512-lPHuHXBwpkr4RcfaZBKm6TKOWG/1N9mVggUpP4fY3l1JIUU2x4fkM8928smYdZ5lF+6KCTAxo1aK9JmqT+X71Q== - -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" @@ -2899,61 +1381,11 @@ envinfo@^7.7.3: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - regexp.prototype.flags "^1.4.3" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2964,28 +1396,11 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@^1.11.1: - version "1.14.3" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -2994,11 +1409,6 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -3006,7 +1416,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -3016,29 +1426,11 @@ estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-stream@=3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -3049,7 +1441,7 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@5.1.1, execa@^5.0.0: +execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -3064,34 +1456,6 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= - dependencies: - os-homedir "^1.0.1" - -expect-puppeteer@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz#1c948af08acdd6c8cbdb7f90e617f44d86888886" - integrity sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA== - -expect@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420" - integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w== - dependencies: - "@jest/expect-utils" "^28.1.1" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - express@^4.17.3: version "4.18.1" resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" @@ -3129,89 +1493,20 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -falafel@^2.1.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.5.tgz#3ccb4970a09b094e9e54fead2deee64b4a589d56" - integrity sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ== - dependencies: - acorn "^7.1.1" - isarray "^2.0.1" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.1.tgz#5d8175aae17db61947f8b162cfc7f63264d22807" - integrity sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw== - dependencies: - reusify "^1.0.4" + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== faye-websocket@^0.11.3: version "0.11.4" @@ -3220,20 +1515,6 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3254,40 +1535,7 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-file-up@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" - integrity sha1-z2gJG8+fMApA2kEbN9pczlovvqA= - dependencies: - fs-exists-sync "^0.1.0" - resolve-dir "^0.1.0" - -find-pkg@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" - integrity sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc= - dependencies: - find-file-up "^0.1.2" - -find-process@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.4.tgz#52820561162fda0d1feef9aed5d56b3787f0fd6e" - integrity sha512-rRSuT1LE4b+BFK588D2V8/VG9liW0Ark1XJgroxZXI0LtwmQJOb490DvDYvbm+Hek9ETFzTutGfJ90gumITPhQ== - dependencies: - chalk "^4.0.0" - commander "^5.1.0" - debug "^4.1.1" - -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -3300,89 +1548,16 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== -follow-redirects@^1.14.0: - version "1.14.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" - integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -from2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4= - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - fs-monkey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -3393,7 +1568,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3403,46 +1578,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -geo-three@0.0.17: - version "0.0.17" - resolved "https://registry.yarnpkg.com/geo-three/-/geo-three-0.0.17.tgz#869694f81df09b5a2724340ad212f47e48459162" - integrity sha512-yPujgRnkRNdYVllLt32JOFB/mSJtUKkTKrT7YYbuEyDmCa9CotxzJkI7Wlhqd8ky1STMccSluYDi4JDV30InLw== - -geo-three@^0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/geo-three/-/geo-three-0.0.16.tgz#0a8a1fd8e5ee7c66766cc1d44b9af4d9151f6ffd" - integrity sha512-HktRGmOBlTZP8AukSSXwVxFVIwylccKoNq1H/LRMi2DKRpteTZKw0Mh42+wLTPLVymz9WqJTdG4RImS7OCAozw== - geojson@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/geojson/-/geojson-0.5.0.tgz#3cd6c96399be65b56ee55596116fe9191ce701c0" integrity sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ== -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - get-intrinsic@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -3452,53 +1592,12 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" -get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stdin@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" - integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3510,7 +1609,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -3522,182 +1621,11 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -glsl-inject-defines@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" - integrity sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A== - dependencies: - glsl-token-inject-block "^1.0.0" - glsl-token-string "^1.0.1" - glsl-tokenizer "^2.0.2" - -glsl-resolve@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" - integrity sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA== - dependencies: - resolve "^0.6.1" - xtend "^2.1.2" - -glsl-token-assignments@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" - integrity sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ== - -glsl-token-defines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" - integrity sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ== - dependencies: - glsl-tokenizer "^2.0.0" - -glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" - integrity sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg== - -glsl-token-descope@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" - integrity sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw== - dependencies: - glsl-token-assignments "^2.0.0" - glsl-token-depth "^1.1.0" - glsl-token-properties "^1.0.0" - glsl-token-scope "^1.1.0" - -glsl-token-inject-block@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" - integrity sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA== - -glsl-token-properties@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" - integrity sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA== - -glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" - integrity sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A== - -glsl-token-string@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" - integrity sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg== - -glsl-token-whitespace-trim@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" - integrity sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ== - -glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz#1c2e78c16589933c274ba278d0a63b370c5fee1a" - integrity sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA== - dependencies: - through2 "^0.6.3" - -glslify-bundle@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.1.1.tgz#30d2ddf2e6b935bf44d1299321e3b729782c409a" - integrity sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A== - dependencies: - glsl-inject-defines "^1.0.1" - glsl-token-defines "^1.0.0" - glsl-token-depth "^1.1.1" - glsl-token-descope "^1.0.2" - glsl-token-scope "^1.1.1" - glsl-token-string "^1.0.1" - glsl-token-whitespace-trim "^1.0.0" - glsl-tokenizer "^2.0.2" - murmurhash-js "^1.0.0" - shallow-copy "0.0.1" - -glslify-deps@^1.2.5: - version "1.3.2" - resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.2.tgz#c09ee945352bfc07ac2d8a1cc9e3de776328c72b" - integrity sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag== - dependencies: - "@choojs/findup" "^0.2.0" - events "^3.2.0" - glsl-resolve "0.0.1" - glsl-tokenizer "^2.0.0" - graceful-fs "^4.1.2" - inherits "^2.0.1" - map-limit "0.0.1" - resolve "^1.0.0" - -glslify-import@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glslify-import/-/glslify-import-3.1.0.tgz#3dc745a667bb80e14aaba2f4c9294463f96ab18c" - integrity sha512-3n7gI7mDcpkpGMFrbCEFhbyUU70sNrih5OrU6oN6EcgTsTVjrbHpQVjjG78Ta2kzZGEqQX0OD2BgFgglm2DZPg== - dependencies: - glsl-resolve "0.0.1" - glsl-token-string "^1.0.1" - glsl-tokenizer "^2.0.2" - -glslify@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.1.1.tgz#454d9172b410cb49864029c86d5613947fefd30b" - integrity sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog== - dependencies: - bl "^2.2.1" - concat-stream "^1.5.2" - duplexify "^3.4.5" - falafel "^2.1.0" - from2 "^2.3.0" - glsl-resolve "0.0.1" - glsl-token-whitespace-trim "^1.0.0" - glslify-bundle "^5.0.0" - glslify-deps "^1.2.5" - minimist "^1.2.5" - resolve "^1.1.5" - stack-trace "0.0.9" - static-eval "^2.0.5" - through2 "^2.0.1" - xtend "^4.0.0" - -glur@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glur/-/glur-1.1.2.tgz#f20ea36db103bfc292343921f1f91e83c3467689" - integrity sha1-8g6jbbEDv8KSNDkh8fkeg8NGdok= - graceful-fs@^4.1.2, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -3713,31 +1641,6 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3748,30 +1651,11 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - has-symbols@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -3808,13 +1692,6 @@ hold-event@^0.0.1: resolved "https://registry.yarnpkg.com/hold-event/-/hold-event-0.0.1.tgz#576f9b57fb2af7526029609adbd1089485ef7334" integrity sha512-CB63bPcgMaierrHAGBnNaucJ1ZHVaPmtCKp1hsRc6nc66b5p+OM1n3MyExk1wtS5vrhCopP/lpUZ3kbwOxXmbQ== -homedir-polyfill@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -3830,11 +1707,6 @@ html-entities@^2.3.2: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - html-minifier-terser@^6.0.2: version "6.1.0" resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" @@ -3896,9 +1768,9 @@ http-errors@~1.6.2: statuses ">= 1.4.0 < 2" http-parser-js@>=0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.7.tgz#39bde369fb8a57235121bb69d05f079fa1b598f4" - integrity sha512-8gQM8ZcewlONQLnik2AKzS13euQhaZcu4rK5QBSYOszW0T1upLW9VA2MdWvTvMmRo42HjXp7igFmdROoBCCrfg== + version "0.5.8" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== http-proxy-middleware@^2.0.3: version "2.0.6" @@ -3920,23 +1792,6 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -3954,16 +1809,6 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -3972,21 +1817,11 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3995,7 +1830,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4005,25 +1840,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -install@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/install/-/install-0.13.0.tgz#6af6e9da9dd0987de2ab420f78e60d9c17260776" - integrity sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA== - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - interpret@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" @@ -4039,26 +1855,6 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -4066,36 +1862,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.0.2, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-buffer@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-core-module@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -4103,79 +1874,23 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-nan@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" - integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4186,80 +1901,18 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-object@^2.0.1, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" - integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= - is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -4272,11 +1925,6 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -4290,146 +1938,7 @@ isexe@^2.0.0: isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.0.2.tgz#7d7810660a5bd043af9e9cfbe4d58adb05e91531" - integrity sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA== - dependencies: - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.1.tgz#3d27da6a974d85a466dc0cdc6ddeb58daaa57bb4" - integrity sha512-75+BBVTsL4+p2w198DQpCeyh1RdaS2lhEG87HkaFX/UG0gJExVq2skG2pT7XZEGBubNj2CytcWSPan4QEPNosw== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/expect" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^28.1.1" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-runtime "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - pretty-format "^28.1.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.1.tgz#23ddfde8940e1818585ae4a568877b33b0e51cfe" - integrity sha512-+sUfVbJqb1OjBZ0OdBbI6OWfYM1i7bSfzYy6gze1F1w3OKWq8ZTEKkZ8a7ZQPq6G/G1qMh/uKqpdWhgl11NFQQ== - dependencies: - "@jest/core" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" - integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.1" - "@jest/types" "^28.1.1" - babel-jest "^28.1.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^28.1.1" - jest-environment-node "^28.1.1" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-runner "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^28.1.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-dev-server@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/jest-dev-server/-/jest-dev-server-4.4.0.tgz#557113faae2877452162696aa94c1e44491ab011" - integrity sha512-STEHJ3iPSC8HbrQ3TME0ozGX2KT28lbT4XopPxUm2WimsX3fcB3YOptRh12YphQisMhfqNSNTZUmWyT3HEXS2A== - dependencies: - chalk "^3.0.0" - cwd "^0.10.0" - find-process "^1.4.3" - prompts "^2.3.0" - spawnd "^4.4.0" - tree-kill "^1.2.2" - wait-on "^3.3.0" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== jest-diff@^26.0.0: version "26.6.2" @@ -4441,356 +1950,11 @@ jest-diff@^26.0.0: jest-get-type "^26.3.0" pretty-format "^26.6.2" -jest-diff@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" - integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.1" - -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== - dependencies: - detect-newline "^3.0.0" - -jest-each@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4" - integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw== - dependencies: - "@jest/types" "^28.1.1" - chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.1" - pretty-format "^28.1.1" - -"jest-environment-node@>=24 <=26": - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - -jest-environment-node@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.1.tgz#1c86c59003a7d319fa06ea3b1bbda6c193715c67" - integrity sha512-2aV/eeY/WNgUUJrrkDJ3cFEigjC5fqT1+fCclrY6paqJ5zVPoM//sHmfgUUp7WLYxIdbPwMiVIzejpN56MxnNA== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/node" "*" - jest-mock "^28.1.1" - jest-util "^28.1.1" - -jest-environment-puppeteer@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-puppeteer/-/jest-environment-puppeteer-4.4.0.tgz#d82a37e0e0c51b63cc6b15dea101d53967508860" - integrity sha512-iV8S8+6qkdTM6OBR/M9gKywEk8GDSOe05hspCs5D8qKSwtmlUfdtHfB4cakdc68lC6YfK3AUsLirpfgodCHjzQ== - dependencies: - chalk "^3.0.0" - cwd "^0.10.0" - jest-dev-server "^4.4.0" - merge-deep "^3.0.2" - jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-haste-map@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3" - integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ== - dependencies: - "@jest/types" "^28.1.1" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.1" - jest-worker "^28.1.1" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-image-snapshot@^4.3.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/jest-image-snapshot/-/jest-image-snapshot-4.5.1.tgz#79fe0419c7729eb1be6c873365307a7b60f5cda0" - integrity sha512-0YkgupgkkCx0wIZkxvqs/oNiUT0X0d2WTpUhaAp+Dy6CpqBUZMRTIZo4KR1f+dqmx6WXrLCvecjnHLIsLkI+gQ== - dependencies: - chalk "^1.1.3" - get-stdin "^5.0.1" - glur "^1.1.2" - lodash "^4.17.4" - mkdirp "^0.5.1" - pixelmatch "^5.1.0" - pngjs "^3.4.0" - rimraf "^2.6.2" - ssim.js "^3.1.1" - -jest-leak-detector@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb" - integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw== - dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.1" - -jest-matcher-utils@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" - integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== - dependencies: - chalk "^4.0.0" - jest-diff "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.1" - -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" - slash "^3.0.0" - stack-utils "^2.0.2" - -jest-message-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" - integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - -jest-mock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371" - integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw== - dependencies: - "@jest/types" "^28.1.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-puppeteer@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/jest-puppeteer/-/jest-puppeteer-4.4.0.tgz#4b906e638a5e3782ed865e7b673c82047b85952e" - integrity sha512-ZaiCTlPZ07B9HW0erAWNX6cyzBqbXMM7d2ugai4epBDKpKvRDpItlRQC6XjERoJELKZsPziFGS0OhhUvTvQAXA== - dependencies: - expect-puppeteer "^4.4.0" - jest-environment-puppeteer "^4.4.0" - -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - -jest-resolve-dependencies@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.1.tgz#3dffaaa56f4b41bc6b61053899d1756401763a27" - integrity sha512-p8Y150xYJth4EXhOuB8FzmS9r8IGLEioiaetgdNGb9VHka4fl0zqWlVe4v7mSkYOuEUg2uB61iE+zySDgrOmgQ== - dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.1" - -jest-resolve@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" - integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" - jest-pnp-resolver "^1.2.2" - jest-util "^28.1.1" - jest-validate "^28.1.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-retries@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jest-retries/-/jest-retries-1.0.1.tgz#b60eac2c6f6ee7033fbc9a3cb6f3016a63b82822" - integrity sha512-tR9tCXs9+Vqw/2toQEOg+CpzOwUqReppcZH2550EnuEhw4F8TR+NbICPUJexegjN9xnuF4ABSGPgzCgAFZI0Ng== - -jest-runner@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.1.tgz#9ecdb3f27a00059986797aa6b012ba8306aa436c" - integrity sha512-W5oFUiDBgTsCloTAj6q95wEvYDB0pxIhY6bc5F26OucnwBN+K58xGTGbliSMI4ChQal5eANDF+xvELaYkJxTmA== - dependencies: - "@jest/console" "^28.1.1" - "@jest/environment" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.10.2" - graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.1" - jest-haste-map "^28.1.1" - jest-leak-detector "^28.1.1" - jest-message-util "^28.1.1" - jest-resolve "^28.1.1" - jest-runtime "^28.1.1" - jest-util "^28.1.1" - jest-watcher "^28.1.1" - jest-worker "^28.1.1" - source-map-support "0.5.13" - throat "^6.0.1" - -jest-runtime@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.1.tgz#569e1dc3c36c6c4c0b29516c1c49b6ad580abdaf" - integrity sha512-J89qEJWW0leOsqyi0D9zHpFEYHwwafFdS9xgvhFHtIdRghbadodI0eA+DrthK/1PebBv3Px8mFSMGKrtaVnleg== - dependencies: - "@jest/environment" "^28.1.1" - "@jest/fake-timers" "^28.1.1" - "@jest/globals" "^28.1.1" - "@jest/source-map" "^28.0.2" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" - jest-message-util "^28.1.1" - jest-mock "^28.1.1" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-snapshot "^28.1.1" - jest-util "^28.1.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.1.tgz#ab825c16c8d8b5e883bd57eee6ca8748c42ab848" - integrity sha512-1KjqHJ98adRcbIdMizjF5DipwZFbvxym/kFO4g4fVZCZRxH/dqV8TiBFCa6rqic3p0karsy8RWS1y4E07b7P0A== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^28.1.1" - graceful-fs "^4.2.9" - jest-diff "^28.1.1" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.1" - jest-matcher-utils "^28.1.1" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - natural-compare "^1.4.0" - pretty-format "^28.1.1" - semver "^7.3.5" - -jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== - dependencies: - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" - -jest-util@^28.0.0, jest-util@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" - integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== - dependencies: - "@jest/types" "^28.1.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8" - integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug== - dependencies: - "@jest/types" "^28.1.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^28.0.2" - leven "^3.1.0" - pretty-format "^28.1.1" - -jest-watcher@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" - integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== - dependencies: - "@jest/test-result" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.1" - string-length "^4.0.1" - jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -4800,60 +1964,17 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" - integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" - integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== - dependencies: - "@jest/core" "^28.1.1" - "@jest/types" "^28.1.1" - import-local "^3.0.2" - jest-cli "^28.1.1" - -joi@^17.4.0: - version "17.4.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.2.tgz#02f4eb5cf88e515e614830239379dcbbe28ce7f7" - integrity sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.0" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -4868,109 +1989,16 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" - integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= - dependencies: - is-buffer "^1.0.2" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lazy-ass@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= - -lazy-cache@^0.2.3: - version "0.2.7" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" - integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4978,26 +2006,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.flow@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loglevel@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== - loglevelnext@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-3.0.1.tgz#e3e4659c4061c09264f6812c33586dc55a009a04" @@ -5024,63 +2037,18 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-limit@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" - integrity sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg== - dependencies: - once "~1.3.0" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.4.3: - version "3.4.6" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.6.tgz#74097983d27c82b973665885dc75f27a65174510" - integrity sha512-rH9mjopto6Wkr7RFuH9l9dk3qb2XGOcYKr7xMhaYqfzuJqOqhRrcFvfD7JMuPj6SLmPreh5+6eAuv36NFAU+Mw== + version "3.4.7" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a" + integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw== dependencies: fs-monkey "^1.0.3" -merge-deep@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" - integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== - dependencies: - arr-union "^3.1.0" - clone-deep "^0.2.4" - kind-of "^3.0.2" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -5091,22 +2059,12 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -mgrs@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mgrs/-/mgrs-1.0.0.tgz#fb91588e78c90025672395cb40b25f7cd6ad1829" - integrity sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA== - -micromatch@^4.0.0: +micromatch@^4.0.0, micromatch@^4.0.2: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -5114,14 +2072,6 @@ micromatch@^4.0.0: braces "^3.0.2" picomatch "^2.3.1" -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - mime-db@1.49.0: version "1.49.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" @@ -5132,7 +2082,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19: +mime-types@^2.1.27: version "2.1.32" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== @@ -5181,84 +2131,6 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mixpanel-browser@2.45.0: - version "2.45.0" - resolved "https://registry.yarnpkg.com/mixpanel-browser/-/mixpanel-browser-2.45.0.tgz#a2973be5b66e6d2799ef95a1e55b8ad8eede57e8" - integrity sha512-PQ1DaTk68yyYtLA0iejmzPA9iNDhT4uIZpqZjRTw7HWpYfl123fydHb2laKanaKjm8YDmrGGz3+xZ4Q6joogyg== - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -moq.ts@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/moq.ts/-/moq.ts-9.0.2.tgz#bd792fe4267bb0a6836ae3b635f5bd4aaf3f23ff" - integrity sha512-Xd8SURuhG0V2uPtNelc5L6Zt6zHrAgOKd9RmDOOO7iRvNYcYAD9Ph69vNMdMjyH5dTBtzjGG3lHzsbg0u4YO9A== - dependencies: - tslib "2.3.1" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5282,11 +2154,6 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -murmurhash-js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" - integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== - nanoid@^2.0.3: version "2.1.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" @@ -5297,11 +2164,6 @@ nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -5320,7 +2182,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-fetch@2.6.7, node-fetch@^2.6.1: +node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -5332,11 +2194,6 @@ node-forge@^1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - node-releases@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" @@ -5361,49 +2218,16 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -5421,20 +2245,13 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w== - dependencies: - wrappy "1" - onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -5451,23 +2268,6 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5475,13 +2275,6 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -5489,13 +2282,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" @@ -5517,21 +2303,6 @@ param-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -5545,11 +2316,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -5580,74 +2346,25 @@ path-to-regexp@^1.7.0: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU= - dependencies: - through "~2.3" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + isarray "0.0.1" picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pixelmatch@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.2.1.tgz#9e4e4f4aa59648208a31310306a5bed5522b0d65" - integrity sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ== - dependencies: - pngjs "^4.0.1" - -pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -pngjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" - integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== - -pngjs@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-4.0.1.tgz#f803869bb2fc1bfe1bf99aa4ec21c108117cfdbe" - integrity sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg== - postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -5703,16 +2420,6 @@ postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.0.2" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier@^2.1.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" - integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== - pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -5731,55 +2438,11 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: ansi-styles "^4.0.0" react-is "^17.0.1" -pretty-format@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" - integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== - dependencies: - "@jest/schemas" "^28.0.2" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -proj4@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/proj4/-/proj4-2.8.0.tgz#b2cb8f3ccd56d4dcc7c3e46155cd02caa804b170" - integrity sha512-baC+YcD4xsSqJ+CpCZljj2gcQDhlKb+J+Zjv/2KSBwWNjk4M0pafgQsE+mWurd84tflMIsP+7j7mtIpFDHzQfQ== - dependencies: - mgrs "1.0.0" - wkt-parser "^1.3.1" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prop-types@^15.6.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -5797,59 +2460,16 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -ps-tree@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" - integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== - dependencies: - event-stream "=3.3.4" - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer@13.5.1: - version "13.5.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-13.5.1.tgz#d0f751bf36120efc2ebf74c7562a204a84e500e9" - integrity sha512-wWxO//vMiqxlvuzHMAJ0pRJeDHvDtM7DQpW1GKdStz2nZo2G42kOXBDgkmQ+zqjwMCFofKGesBeeKxIkX9BO+w== - dependencies: - cross-fetch "3.1.5" - debug "4.3.3" - devtools-protocol "0.0.969999" - extract-zip "2.0.1" - https-proxy-agent "5.0.0" - pkg-dir "4.2.0" - progress "2.0.3" - proxy-from-env "1.1.0" - rimraf "3.0.2" - tar-fs "2.1.1" - unbzip2-stream "1.4.3" - ws "8.5.0" - qs@6.10.3: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" @@ -5857,11 +2477,6 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - query-string@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" @@ -5876,11 +2491,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -5922,11 +2532,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - react-router-dom@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" @@ -5964,17 +2569,7 @@ react@^17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: +readable-stream@^2.0.1: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -5987,7 +2582,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@^3.0.6: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -6023,15 +2618,6 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -6048,37 +2634,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -6096,14 +2651,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -6114,17 +2661,7 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" - integrity sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg== - -resolve@^1.0.0, resolve@^1.1.5, resolve@^1.20.0, resolve@^1.9.0: +resolve@^1.9.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -6138,62 +2675,24 @@ retry@^0.13.1: resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rimraf@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= - -rxjs@7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== - dependencies: - tslib "^2.1.0" - -rxjs@^7.1.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" - integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== - dependencies: - tslib "~2.1.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -6206,7 +2705,7 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -6237,18 +2736,6 @@ selfsigned@^2.0.1: dependencies: node-forge "^1" -semver@7.x: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - semver@^7.3.4, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" @@ -6275,13 +2762,6 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -6322,16 +2802,6 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -shallow-clone@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" - integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= - dependencies: - is-extendable "^0.1.1" - kind-of "^2.0.1" - lazy-cache "^0.2.3" - mixin-object "^2.0.1" - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -6339,11 +2809,6 @@ shallow-clone@^3.0.0: dependencies: kind-of "^6.0.2" -shallow-copy@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - integrity sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw== - shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -6370,31 +2835,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -skmeans@0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/skmeans/-/skmeans-0.11.3.tgz#6d4dafb8058520a792c10bae9d9b953a6b6379f4" - integrity sha512-nccEnlSeOMNAYM9ETMSq+m15u8g0KRCIvH2an/ROTx4Igmci/j3oYHBPGdAeGjhR7knAVoIIQwr/wy2dN/eKQA== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -6404,11 +2849,6 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -6422,14 +2862,6 @@ source-map-resolve@^0.6.0: atob "^2.1.2" decode-uri-component "^0.2.0" -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -6443,21 +2875,11 @@ source-map@^0.5.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -spawnd@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-4.4.0.tgz#bb52c5b34a22e3225ae1d3acb873b2cd58af0886" - integrity sha512-jLPOfB6QOEgMOQY15Z6+lwZEhH3F5ncXxIaZ7WHPIapwNNLyjrs61okj3VJ3K6tmP5TZ6cO0VAu9rEY4MD4YQg== - dependencies: - exit "^0.1.2" - signal-exit "^3.0.2" - tree-kill "^1.2.2" - wait-port "^0.2.7" - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -6481,84 +2903,6 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssim.js@^3.1.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/ssim.js/-/ssim.js-3.5.0.tgz#d7276b9ee99b57a5ff0db34035f02f35197e62df" - integrity sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g== - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stack-trace@0.0.9: - version "0.0.9" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - integrity sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ== - -stack-utils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== - dependencies: - escape-string-regexp "^2.0.0" - -stack-utils@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== - dependencies: - escape-string-regexp "^2.0.0" - -start-server-and-test@^1.12.3: - version "1.13.1" - resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.13.1.tgz#c06eb18c3f31d610724722b7eecbdf2550b03582" - integrity sha512-wZjksmjG5scEHXmV/3HWzImxNzUgaNQ6W8kkqL2GbiOldM+nqiqh7niimlC9ZGNopTGj16kheWZnZtSWgdBZNQ== - dependencies: - bluebird "3.7.2" - check-more-types "2.24.0" - debug "4.3.2" - execa "5.1.1" - lazy-ass "1.6.0" - ps-tree "1.2.0" - wait-on "6.0.0" - -static-eval@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.1.0.tgz#a16dbe54522d7fa5ef1389129d813fd47b148014" - integrity sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw== - dependencies: - escodegen "^1.11.1" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -6569,58 +2913,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= - dependencies: - duplexer "~0.1.1" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6628,11 +2925,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -6640,25 +2932,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -6671,11 +2951,6 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - styled-components@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.0.tgz#e47c3d3e9ddfff539f118a3dd0fd4f8f4fb25727" @@ -6692,11 +2967,6 @@ styled-components@^5.2.0: shallowequal "^1.1.0" supports-color "^5.5.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -6704,7 +2974,7 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -6718,14 +2988,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -6736,47 +2998,6 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - terser-webpack-plugin@^5.1.3: version "5.3.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" @@ -6798,46 +3019,6 @@ terser@^5.10.0, terser@^5.7.2: commander "^2.20.0" source-map-support "~0.5.20" -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -three@0.141.0: - version "0.141.0" - resolved "https://registry.yarnpkg.com/three/-/three-0.141.0.tgz#16677a12b9dd0c3e1568ebad0fd09de15d5a8216" - integrity sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA== - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through2@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg== - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@2, through@^2.3.8, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -6853,11 +3034,6 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -6875,38 +3051,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-jest@^28.0.5: - version "28.0.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.5.tgz#31776f768fba6dfc8c061d488840ed0c8eeac8b9" - integrity sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - ts-loader@^9.3.1: version "9.3.1" resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4" @@ -6917,55 +3066,11 @@ ts-loader@^9.3.1: micromatch "^4.0.0" semver "^7.3.4" -tslib@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.3: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tunnel@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -6974,66 +3079,16 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - typescript@^4.3.2: version "4.3.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unbzip2-stream@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -7054,18 +3109,6 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -7076,25 +3119,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-to-istanbul@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -7105,53 +3134,6 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -wait-on@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7" - integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw== - dependencies: - axios "^0.21.1" - joi "^17.4.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.1.0" - -wait-on@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-3.3.0.tgz#9940981d047a72a9544a97b8b5fca45b2170a082" - integrity sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ== - dependencies: - "@hapi/joi" "^15.0.3" - core-js "^2.6.5" - minimist "^1.2.0" - request "^2.88.0" - rx "^4.1.0" - -wait-port@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/wait-port/-/wait-port-0.2.9.tgz#3905cf271b5dbe37a85c03b85b418b81cb24ee55" - integrity sha512-hQ/cVKsNqGZ/UbZB/oakOGFqic00YAMM5/PEj3Bt4vKarv2jWIWzDbqlwT94qMs/exAQAsvMOq99sZblV92zxQ== - dependencies: - chalk "^2.4.2" - commander "^3.0.2" - debug "^4.1.1" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - watchpack@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -7201,10 +3183,10 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.9.2: - version "4.9.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz#c188db28c7bff12f87deda2a5595679ebbc3c9bc" - integrity sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q== +webpack-dev-server@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz#de270d0009eba050546912be90116e7fd740a9ca" + integrity sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -7218,7 +3200,7 @@ webpack-dev-server@^4.9.2: chokidar "^3.5.3" colorette "^2.0.10" compression "^1.7.4" - connect-history-api-fallback "^1.6.0" + connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" @@ -7253,14 +3235,6 @@ webpack-merge@^5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -7318,36 +3292,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" - integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.20.0" - for-each "^0.3.3" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.9" - -which@^1.2.12: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -7360,95 +3304,17 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -wkt-parser@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/wkt-parser/-/wkt-parser-1.3.2.tgz#deeff04a21edc5b170a60da418e9ed1d1ab0e219" - integrity sha512-A26BOOo7sHAagyxG7iuRhnKMO7Q3mEOiOT4oGUmohtN/Li5wameeU4S6f8vWw6NADTVKljBs8bzA8JPQgSEMVQ== - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - ws@^8.4.2: - version "8.8.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" - integrity sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ== - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -xtend@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" - integrity sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + version "8.8.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" + integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.0.0, yargs-parser@^21.0.1: - version "21.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" - integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== - -yargs@^17.3.1: - version "17.5.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/viewer/.eslintignore b/viewer/.eslintignore index 396bd4f5833..246d9eb2656 100644 --- a/viewer/.eslintignore +++ b/viewer/.eslintignore @@ -1,3 +1,3 @@ dist/* -wasm/target/* -wasm/pkg/* +packages/**/wasm/pkg/* +target/* \ No newline at end of file diff --git a/viewer/internals.ts b/viewer/internals.ts deleted file mode 100644 index 3ab1de8a88b..00000000000 --- a/viewer/internals.ts +++ /dev/null @@ -1,24 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -export { LoadingState } from './packages/model-base'; - -export { CadModelMetadata, SectorMetadata, LevelOfDetail, WantedSector } from './packages/cad-parsers'; - -export { SectorCuller } from './packages/cad-geometry-loaders'; - -export { PotreeGroupWrapper, PotreeNodeWrapper, PointCloudNode, Potree } from './packages/pointclouds'; - -export { CadNode } from './packages/cad-model'; - -export { RevealManager } from './packages/api/src/public/RevealManager'; -export { createLocalRevealManager, createCdfRevealManager } from './packages/api/src/public/createRevealManager'; - -export { LocalModelIdentifier, CdfModelIdentifier } from './packages/modeldata-api'; - -export { RenderOptions, defaultRenderOptions } from './packages/rendering'; - -export { NodeAppearanceProvider } from './packages/cad-styling'; - -export { revealEnv, SceneHandler } from './packages/utilities'; diff --git a/viewer/jest.config.js b/viewer/jest.config.js index 8468ec0a889..09bf52e77f2 100644 --- a/viewer/jest.config.js +++ b/viewer/jest.config.js @@ -30,7 +30,16 @@ module.exports = () => { } }, coverageDirectory: './coverage', - collectCoverageFrom: ['!**/.*.test.ts', '!**/*.d.ts', '!**/*.json', '!**/dist/**/*.*', '!**/app/**'], + collectCoverageFrom: [ + '!**/.*.test.ts', + '!**/*.VisualTest.ts', + '!./visual-tests/**', + '!./test-utilities/**', + '!**/*.d.ts', + '!**/*.json', + '!**/dist/**/*.*', + '!**/app/**' + ], automock: false, setupFiles: [path.resolve(__dirname, './test-utilities/src/setupJest.ts'), 'jest-canvas-mock', 'core-js'], setupFilesAfterEnv: ['jest-extended/all'], diff --git a/viewer/package.json b/viewer/package.json index 316172af747..5bd9f80ab45 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -32,13 +32,13 @@ "clean": "shx rm -rf dist/ && yarn run mkdist", "clean:wasm": "cargo clean --manifest-path ./wasm/Cargo.toml", "retarget-types": "tsc-alias -p tsconfig.webpack.json -v true", - "test": "yarn run test:ts && yarn run test:wasm", + "test": "yarn run test:wasm && yarn run test:ts", "test:ts": "yarn run build:wasm-test && jest --maxWorkers=4", "test:wasm": "yarn workspaces foreach run run-wasm-pack test --headless --chrome ./wasm", - "coverage": "yarn run build:wasm-test && jest --coverage", "test:visual:client": "cross-env JEST_PUPPETEER_CONFIG=visual-tests/jest-puppeteer.config.js jest --config=visual-tests/jest.config.js --verbose", "test:visual:server": "webpack-dev-server --config packages/webpack.config.js", - "test:visual": "concurrently -k -s \"first\" \"yarn run test:visual:client\" \"yarn run test:visual:server\"", + "test:visual": "yarn run build:wasm && concurrently -k -s \"first\" \"yarn run test:visual:client\" \"yarn run test:visual:server\"", + "coverage": "yarn run build:wasm-test && jest --coverage", "lint": "eslint . --ext .ts,.js --max-warnings 0 --cache", "prebump": "yarn version --no-git-tag-version && yarn && cd ../documentation && yarn replace-latest-by-next", "bump": " yarn bump:commit && yarn bump:tag && yarn bump:push", @@ -46,7 +46,7 @@ "bump:tag": "cross-var git tag $npm_package_name@$npm_package_version", "bump:push": "git push -u origin head && git push --tags", "release": "yarn build:prod && cd dist && yarn publish --non-interactive", - "ws:serve": "webpack-dev-server --config packages/webpack.config.js", + "ws:serve": "yarn run build:wasm && webpack-dev-server --config packages/webpack.config.js", "ws:test": "cd $INIT_CWD && jest --runInBand", "ws:test:wasm": "cd $INIT_CWD && wasm-pack test --chrome --headless ./wasm", "ws:lint": "cd $INIT_CWD && eslint . --ext .ts,.js --max-warnings 0 --cache" @@ -72,34 +72,34 @@ "three": "0.141.0" }, "devDependencies": { - "@azure/msal-browser": "2.28.1", - "@cognite/sdk": "7.8.1", + "@azure/msal-browser": "2.28.2", + "@cognite/sdk": "7.8.4", "@cognite/sdk-core": "4.4.0", "@types/dat.gui": "0.7.7", "@types/expect-puppeteer": "5.0.1", - "@types/glob": "7.2.0", - "@types/jest": "28.1.7", + "@types/glob": "8.0.0", + "@types/jest": "29.0.0", "@types/jest-environment-puppeteer": "5.0.2", "@types/jest-image-snapshot": "5.1.0", "@types/jsdom": "20.0.0", - "@types/lodash": "4.14.182", + "@types/lodash": "4.14.184", "@types/mixpanel-browser": "2.38.0", - "@types/node": "16.11.49", + "@types/node": "16.11.57", "@types/offscreencanvas": "2019.7.0", "@types/proj4": "2.5.2", "@types/random-seed": "0.3.3", "@types/skmeans": "0.11.3", "@types/tween.js": "18.5.1", - "@typescript-eslint/eslint-plugin": "5.33.1", - "@typescript-eslint/parser": "5.33.1", + "@typescript-eslint/eslint-plugin": "5.36.2", + "@typescript-eslint/parser": "5.36.2", "concurrently": "7.3.0", "copy-pkg-json-webpack-plugin": "0.0.40", "copy-webpack-plugin": "11.0.0", - "core-js": "3.24.1", + "core-js": "3.25.1", "cross-env": "7.0.3", "cross-var": "1.1.0", "dat.gui": "0.7.9", - "eslint": "8.22.0", + "eslint": "8.23.0", "eslint-config-prettier": "8.5.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-jsdoc": "39.3.6", @@ -112,11 +112,11 @@ "glslify-loader": "2.0.0", "html-webpack-plugin": "5.5.0", "husky": "8.0.1", - "jest": "28.1.3", + "jest": "29.0.2", "jest-canvas-mock": "2.4.0", - "jest-environment-jsdom": "28.1.3", - "jest-extended": "3.0.2", - "jest-image-snapshot": "5.1.0", + "jest-environment-jsdom": "29.0.2", + "jest-extended": "3.1.0", + "jest-image-snapshot": "5.2.0", "jest-puppeteer": "6.1.1", "jsdom": "20.0.0", "lint-staged": "13.0.3", @@ -124,17 +124,18 @@ "nock": "13.2.9", "prettier": "2.7.1", "process": "0.11.10", - "puppeteer": "16.1.0", + "puppeteer": "17.1.2", "random-seed": "0.3.0", - "raw-loader": "^4.0.2", + "raw-loader": "4.0.2", "remove-files-webpack-plugin": "^1.5.0", + "resize-observer-polyfill": "1.5.1", "rimraf": "3.0.2", "run-script-os": "1.1.6", "shx": "0.3.4", "ts-jest": "28.0.8", "ts-loader": "9.3.1", "tsc-alias": "1.7.0", - "typescript": "4.7.4", + "typescript": "4.8.2", "wasm-pack": "^0.10.3", "webpack": "5.74.0", "webpack-bundle-analyzer": "^4.5.0", diff --git a/viewer/packages/api/package.json b/viewer/packages/api/package.json index e461fc16292..69a833d1909 100644 --- a/viewer/packages/api/package.json +++ b/viewer/packages/api/package.json @@ -3,7 +3,7 @@ "private": true, "main": "index.ts", "scripts": { - "start": "yarn ws:start", + "start": "yarn ws:serve --env testFixture=Default.VisualTest.ts", "test": "yarn ws:test --config ./../../jest.config.js", "lint": "yarn ws:lint" }, diff --git a/viewer/packages/api/src/public/RevealManager.test.ts b/viewer/packages/api/src/public/RevealManager.test.ts index fdf8405e717..a8f8cc153df 100644 --- a/viewer/packages/api/src/public/RevealManager.test.ts +++ b/viewer/packages/api/src/public/RevealManager.test.ts @@ -5,12 +5,12 @@ import * as THREE from 'three'; import { createRevealManager } from './createRevealManager'; import { RevealManager } from './RevealManager'; -import { createGlContext } from '../../../../test-utilities'; import { ModelDataProvider, ModelMetadataProvider } from '@reveal/modeldata-api'; import { SectorCuller } from '@reveal/cad-geometry-loaders'; import { SceneHandler } from '@reveal/utilities'; import { LoadingStateChangeListener } from './types'; +import { It, Mock, SetPropertyExpression } from 'moq.ts'; describe('RevealManager', () => { const stubMetadataProvider: ModelMetadataProvider = {} as any; @@ -21,27 +21,34 @@ describe('RevealManager', () => { dispose: jest.fn() }; let manager: RevealManager; - let renderer: THREE.WebGLRenderer; beforeEach(() => { jest.clearAllMocks(); + + const rendererMock = new Mock() + .setup(_ => It.Is((expression: SetPropertyExpression) => expression.name === 'info')) + .returns({}) + .setup(p => p.domElement) + .returns( + new Mock() + .setup(p => p.parentElement) + .returns(new Mock().object()) + .object() + ); + manager = createRevealManager( 'test', 'myAppId', stubMetadataProvider, stubDataProvider, - renderer, + rendererMock.object(), new SceneHandler(), { internal: { cad: { sectorCuller } } } ); - jest.useFakeTimers(); - }); - beforeAll(() => { - const context = createGlContext(64, 64, { preserveDrawingBuffer: true }); - renderer = new THREE.WebGLRenderer({ context }); + jest.useFakeTimers(); }); afterAll(() => { diff --git a/viewer/packages/api/src/public/RevealManager.ts b/viewer/packages/api/src/public/RevealManager.ts index 50ca3287003..c5e6bd8d63b 100644 --- a/viewer/packages/api/src/public/RevealManager.ts +++ b/viewer/packages/api/src/public/RevealManager.ts @@ -35,7 +35,8 @@ export class RevealManager { private readonly _lastCamera = { position: new THREE.Vector3(NaN, NaN, NaN), quaternion: new THREE.Quaternion(NaN, NaN, NaN, NaN), - zoom: NaN + zoom: NaN, + fov: NaN }; private _isDisposed = false; @@ -76,6 +77,7 @@ export class RevealManager { return; } this._cadManager.dispose(); + this._pipelineExecutor.dispose(); this._renderPipeline.dispose(); this._subscriptions.unsubscribe(); this._isDisposed = true; @@ -102,6 +104,7 @@ export class RevealManager { public update(camera: THREE.PerspectiveCamera): void { const hasCameraChanged = this._lastCamera.zoom !== camera.zoom || + this._lastCamera.fov !== camera.fov || !this._lastCamera.position.equals(camera.position) || !this._lastCamera.quaternion.equals(camera.quaternion); @@ -109,6 +112,7 @@ export class RevealManager { this._lastCamera.position.copy(camera.position); this._lastCamera.quaternion.copy(camera.quaternion); this._lastCamera.zoom = camera.zoom; + this._lastCamera.fov = camera.fov; this._cadManager.updateCamera(camera); this._pointCloudManager.updateCamera(camera); diff --git a/viewer/packages/api/src/public/createRevealManager.test.ts b/viewer/packages/api/src/public/createRevealManager.test.ts index 4e57880271e..055e5c0124f 100644 --- a/viewer/packages/api/src/public/createRevealManager.test.ts +++ b/viewer/packages/api/src/public/createRevealManager.test.ts @@ -22,6 +22,13 @@ describe('createRevealManager', () => { new Mock() .setup(_ => It.Is((expression: SetPropertyExpression) => expression.name === 'info')) .returns({}) + .setup(p => p.domElement) + .returns( + new Mock() + .setup(p => p.parentElement) + .returns(new Mock().object()) + .object() + ) .object(), new SceneHandler(), {} diff --git a/viewer/packages/api/src/public/createRevealManager.ts b/viewer/packages/api/src/public/createRevealManager.ts index fb6c7338e11..9944a3b17a3 100644 --- a/viewer/packages/api/src/public/createRevealManager.ts +++ b/viewer/packages/api/src/public/createRevealManager.ts @@ -34,14 +34,12 @@ import { createCadManager } from '@reveal/cad-geometry-loaders'; * @param renderer * @param sceneHandler * @param revealOptions - * @param sdkClient * @returns RevealManager instance. */ export function createLocalRevealManager( renderer: THREE.WebGLRenderer, sceneHandler: SceneHandler, - revealOptions: RevealOptions = {}, - sdkClient?: CogniteClient | undefined + revealOptions: RevealOptions = {} ): RevealManager { const modelMetadataProvider = new LocalModelMetadataProvider(); const modelDataProvider = new LocalModelDataProvider(); @@ -53,7 +51,7 @@ export function createLocalRevealManager( renderer, sceneHandler, revealOptions, - sdkClient + undefined ); } @@ -111,9 +109,12 @@ export function createRevealManager( constructorOptions: revealOptions }); - const renderOptions: RenderOptions = revealOptions.renderOptions || {}; + const renderOptions: RenderOptions = revealOptions?.renderOptions ?? {}; const materialManager = new CadMaterialManager(); - const pipelineExecutor = new BasicPipelineExecutor(renderer); + const pipelineExecutor = new BasicPipelineExecutor(renderer, { + autoResizeRenderer: true, + resolutionThreshold: revealOptions.rendererResolutionThreshold + }); const defaultRenderPipeline = new DefaultRenderPipelineProvider( materialManager, sceneHandler, @@ -154,5 +155,5 @@ export function createRevealManager( */ function getSdkApplicationId(sdk: CogniteClient): string { const headers = sdk.getDefaultRequestHeaders(); - return headers['x-cdp-app'] || 'unknown'; + return headers['x-cdp-app'] ?? 'unknown'; } diff --git a/viewer/packages/api/src/public/migration/Cognite3DViewer.ts b/viewer/packages/api/src/public/migration/Cognite3DViewer.ts index 0eb03256d92..3882425499b 100644 --- a/viewer/packages/api/src/public/migration/Cognite3DViewer.ts +++ b/viewer/packages/api/src/public/migration/Cognite3DViewer.ts @@ -40,7 +40,6 @@ import { IntersectionFromPixelOptions, CadIntersection } from './types'; -import RenderController from './RenderController'; import { RevealManager } from '../RevealManager'; import { RevealOptions } from '../types'; @@ -71,6 +70,7 @@ type Cognite3DViewerEvents = 'click' | 'hover' | 'cameraChange' | 'sceneRendered * @module @cognite/reveal */ export class Cognite3DViewer { + private readonly _domElementResizeObserver: ResizeObserver; private get canvas(): HTMLCanvasElement { return this.renderer.domElement; } @@ -103,9 +103,8 @@ export class Cognite3DViewer { private readonly _cdfSdkClient: CogniteClient | undefined; private readonly _dataSource: DataSource; - private readonly camera: THREE.PerspectiveCamera; private readonly _sceneHandler: SceneHandler; - private readonly _cameraManager: CameraManager; + private _cameraManager: CameraManager; private readonly _subscription = new Subscription(); private readonly _revealManagerHelper: RevealManagerHelper; private readonly _domElement: HTMLElement; @@ -130,7 +129,6 @@ export class Cognite3DViewer { private isDisposed = false; - private readonly renderController: RenderController; private latestRequestId: number = -1; private readonly clock = new THREE.Clock(); private _clippingNeedsUpdate: boolean = false; @@ -200,7 +198,7 @@ export class Cognite3DViewer { } constructor(options: Cognite3DViewerOptions) { - this._renderer = options.renderer ?? new THREE.WebGLRenderer(); + this._renderer = options.renderer ?? createRenderer(); this._renderer.localClippingEnabled = true; this.canvas.style.width = '640px'; @@ -209,8 +207,10 @@ export class Cognite3DViewer { this.canvas.style.minHeight = '100%'; this.canvas.style.maxWidth = '100%'; this.canvas.style.maxHeight = '100%'; + this._domElement = options.domElement ?? createCanvasWrapper(); this._domElement.appendChild(this.canvas); + this._domElementResizeObserver = this.setupDomElementResizeListener(this._domElement); this.spinner = new Spinner(this.domElement); this.spinner.placement = options.loadingIndicatorStyle?.placement ?? 'topLeft'; @@ -223,7 +223,6 @@ export class Cognite3DViewer { this._cameraManager = options.cameraManager ?? new DefaultCameraManager(this.canvas, this._mouseHandler, this.modelIntersectionCallback.bind(this)); - this.camera = this._cameraManager.getCamera(); this._cameraManager.on('cameraChange', (position: THREE.Vector3, target: THREE.Vector3) => { this._events.cameraChange.fire(position.clone(), target.clone()); @@ -236,8 +235,7 @@ export class Cognite3DViewer { this._revealManagerHelper = RevealManagerHelper.createLocalHelper( this._renderer, this._sceneHandler, - revealOptions, - options.sdk + revealOptions ); } else if (options.customDataSource !== undefined) { this._dataSource = options.customDataSource; @@ -260,7 +258,6 @@ export class Cognite3DViewer { ); } - this.renderController = new RenderController(this.camera); this.startPointerEventListeners(); this._pickingHandler = new PickingHandler( @@ -352,11 +349,11 @@ export class Cognite3DViewer { this.removeModel(model); } - this.renderController.dispose(); this._subscription.unsubscribe(); this._cameraManager.dispose(); this.revealManager.dispose(); this.domElement.removeChild(this.canvas); + this._domElementResizeObserver.disconnect(); this.renderer.dispose(); this.spinner.dispose(); @@ -499,6 +496,25 @@ export class Cognite3DViewer { return this._cameraManager; } + /** + * Sets camera manager instance for current Cognite3Dviewer. + * @param cameraManager Camera manager instance. + * @param cameraStateUpdate Whether to set current camera state to new camera manager. + */ + setCameraManager(cameraManager: CameraManager, cameraStateUpdate: boolean = true): void { + if (cameraStateUpdate) { + const currentState = this._cameraManager.getCameraState(); + cameraManager.setCameraState({ position: currentState.position, target: currentState.target }); + } + cameraManager.getCamera().aspect = this.getCamera().aspect; + + this._cameraManager.enabled = false; + cameraManager.enabled = true; + + this._cameraManager = cameraManager; + this.requestRedraw(); + } + /** * Gets the current viewer state which includes the camera pose as well as applied styling. * @returns JSON object containing viewer state. @@ -610,8 +626,7 @@ export class Cognite3DViewer { const model = new CognitePointCloudModel(modelId, revisionId, pointCloudNode); this._models.push(model); - this._sceneHandler.addCustomObject(model); - this._extraObjects.push(model); + this._sceneHandler.addPointCloudModel(model, pointCloudNode.potreeNode.modelIdentifier); return model; } @@ -644,7 +659,7 @@ export class Cognite3DViewer { case 'pointcloud': const pcModel = model as CognitePointCloudModel; - this._sceneHandler.removeCustomObject(pcModel); + this._sceneHandler.removePointCloudModel(pcModel); this.revealManager.removeModel(model.type, pcModel.pointCloudNode); break; @@ -652,7 +667,7 @@ export class Cognite3DViewer { assertNever(model.type, `Model type ${model.type} cannot be removed`); } - this.renderController.redraw(); + this.revealManager.requestRedraw(); } /** @@ -720,7 +735,7 @@ export class Cognite3DViewer { object.updateMatrixWorld(true); this._extraObjects.push(object); this._sceneHandler.addCustomObject(object); - this.renderController.redraw(); + this.revealManager.requestRedraw(); this.recalculateBoundingBox(); } @@ -743,7 +758,7 @@ export class Cognite3DViewer { if (index >= 0) { this._extraObjects.splice(index, 1); } - this.renderController.redraw(); + this.revealManager.requestRedraw(); this.recalculateBoundingBox(); } @@ -808,7 +823,7 @@ export class Cognite3DViewer { * @returns The THREE.Camera used for rendering. */ getCamera(): THREE.PerspectiveCamera { - return this.camera; + return this._cameraManager.getCamera(); } /** @@ -927,12 +942,12 @@ export class Cognite3DViewer { * ``` */ worldToScreen(point: THREE.Vector3, normalize?: boolean): THREE.Vector2 | null { - this.camera.updateMatrixWorld(); + this.getCamera().updateMatrixWorld(); const screenPosition = new THREE.Vector3(); if (normalize) { - worldToNormalizedViewportCoordinates(this.camera, point, screenPosition); + worldToNormalizedViewportCoordinates(this.getCamera(), point, screenPosition); } else { - worldToViewportCoordinates(this.renderer, this.camera, point, screenPosition); + worldToViewportCoordinates(this.renderer, this.getCamera(), point, screenPosition); } if ( @@ -975,7 +990,7 @@ export class Cognite3DViewer { const { width: originalWidth, height: originalHeight } = this.canvas; - const screenshotCamera = this.camera.clone() as THREE.PerspectiveCamera; + const screenshotCamera = this.getCamera().clone() as THREE.PerspectiveCamera; adjustCamera(screenshotCamera, width, height); this.renderer.setSize(width, height); @@ -984,7 +999,7 @@ export class Cognite3DViewer { const url = this.renderer.domElement.toDataURL(); this.renderer.setSize(originalWidth, originalHeight); - this.renderer.render(this._sceneHandler.scene, this.camera); + this.renderer.render(this._sceneHandler.scene, this.getCamera()); this.requestRedraw(); @@ -1053,7 +1068,7 @@ export class Cognite3DViewer { const input: IntersectInput = { normalizedCoords, - camera: this.camera, + camera: this.getCamera(), renderer: this.renderer, clippingPlanes: this.getClippingPlanes(), domElement: this.renderer.domElement @@ -1130,27 +1145,20 @@ export class Cognite3DViewer { const isVisible = visibility === 'visible' && display !== 'none'; if (isVisible) { - const { renderController } = this; TWEEN.update(time); - const didResize = this.resizeIfNecessary(); - if (didResize) { - this.requestRedraw(); - } this.recalculateBoundingBox(); this._cameraManager.update(this.clock.getDelta(), this._updateNearAndFarPlaneBuffers.combinedBbox); - renderController.update(); - this.revealManager.update(this.camera); + this.revealManager.update(this.getCamera()); - if (renderController.needsRedraw || this.revealManager.needsRedraw || this._clippingNeedsUpdate) { + if (this.revealManager.needsRedraw || this._clippingNeedsUpdate) { const frameNumber = this.renderer.info.render.frame; const start = Date.now(); - this.revealManager.render(this.camera); - renderController.clearNeedsRedraw(); + this.revealManager.render(this.getCamera()); this.revealManager.resetRedraw(); this._clippingNeedsUpdate = false; const renderTime = Date.now() - start; - this._events.sceneRendered.fire({ frameNumber, renderTime, renderer: this.renderer, camera: this.camera }); + this._events.sceneRendered.fire({ frameNumber, renderTime, renderer: this.renderer, camera: this.getCamera() }); } } } @@ -1180,9 +1188,6 @@ export class Cognite3DViewer { }); this._extraObjects.forEach(obj => { - if (obj instanceof CognitePointCloudModel) { - return; - } bbox.setFromObject(obj); if (!bbox.isEmpty()) { combinedBbox.union(bbox); @@ -1191,51 +1196,13 @@ export class Cognite3DViewer { } /** @private */ - private resizeIfNecessary(): boolean { - if (this.isDisposed) { - return false; - } - // The maxTextureSize is chosen from testing on low-powered hardware, - // and could be increased in the future. - // TODO Increase maxTextureSize if SSAO performance is improved - // TODO christjt 03-05-2021: This seems ridiculous, and the number seems to be pulled out of thin air. - // On low end it might not downscale enough, and on high end it looks bad / blurred. - // For the love of God someone move this to the render manager and make it dynamic based on the device. - const maxTextureSize = 1.4e6; - - const rendererSize = this.renderer.getSize(new THREE.Vector2()); - const devicePixelRatio = this.renderer.getPixelRatio(); - const rendererPixelWidth = rendererSize.width; - const rendererPixelHeight = rendererSize.height; - - // client width and height are in virtual pixels and not yet scaled by dpr - // TODO VERSION 5.0.0 remove the test for dom element size once we have removed the getCanvas function - const clientWidth = this.domElement.clientWidth !== 0 ? this.domElement.clientWidth : this.canvas.clientWidth; - const clientHeight = this.domElement.clientHeight !== 0 ? this.domElement.clientHeight : this.canvas.clientHeight; - const clientTextureSize = clientWidth * clientHeight; - - const scale = clientTextureSize > maxTextureSize ? Math.sqrt(maxTextureSize / clientTextureSize) : 1; - - let width = clientWidth * scale; - let height = clientHeight * scale; - - const maxError = 0.1; // pixels - const isOptimalSize = - Math.abs(rendererPixelWidth - width) < maxError && Math.abs(rendererPixelHeight - height) < maxError; - - if (isOptimalSize) { - return false; - } - - // This needs to be done such that users don't unintentionally bypass the - // resolution cap by setting a high device pixel ratio - width /= devicePixelRatio; - height /= devicePixelRatio; - - adjustCamera(this.camera, width, height); - this.renderer.setSize(width, height); + private setupDomElementResizeListener(domElement: HTMLElement): ResizeObserver { + const resizeObserver = new ResizeObserver(() => { + this.revealManager.requestRedraw(); + }); - return true; + resizeObserver.observe(domElement); + return resizeObserver; } private readonly startPointerEventListeners = () => { @@ -1261,6 +1228,12 @@ function createCanvasWrapper(): HTMLElement { return domElement; } +function createRenderer(): THREE.WebGLRenderer { + const renderer = new THREE.WebGLRenderer(); + renderer.setPixelRatio(window.devicePixelRatio); + return renderer; +} + function createRevealManagerOptions(viewerOptions: Cognite3DViewerOptions): RevealOptions { const customTarget = viewerOptions.renderTargetOptions?.target; const outputRenderTarget = customTarget @@ -1273,6 +1246,7 @@ function createRevealManagerOptions(viewerOptions: Cognite3DViewerOptions): Reve const revealOptions: RevealOptions = { continuousModelStreaming: viewerOptions.continuousModelStreaming, outputRenderTarget, + rendererResolutionThreshold: viewerOptions.rendererResolutionThreshold, internal: {} }; @@ -1290,7 +1264,11 @@ function createRevealManagerOptions(viewerOptions: Cognite3DViewerOptions): Reve antiAliasing, multiSampleCountHint: multiSampleCount, ssaoRenderParameters, - edgeDetectionParameters + edgeDetectionParameters, + pointCloudParameters: { + pointBlending: + viewerOptions?.pointCloudEffects?.pointBlending ?? defaultRenderOptions.pointCloudParameters.pointBlending + } }; return revealOptions; } diff --git a/viewer/packages/api/src/public/migration/RenderController.ts b/viewer/packages/api/src/public/migration/RenderController.ts deleted file mode 100644 index fbf04190e7b..00000000000 --- a/viewer/packages/api/src/public/migration/RenderController.ts +++ /dev/null @@ -1,58 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import * as THREE from 'three'; - -/* eslint-disable jsdoc/require-jsdoc */ -/** - * @internal - * @module @cognite/reveal - */ -export default class RenderController { - private _needsRedraw: boolean; - private readonly _camera: THREE.PerspectiveCamera | THREE.OrthographicCamera; - private readonly _lastCameraPosition: THREE.Vector3; - private readonly _lastCameraRotation: THREE.Euler; - private _lastCameraZoom: number; - - constructor(camera: THREE.PerspectiveCamera | THREE.OrthographicCamera) { - this._camera = camera; - this._needsRedraw = true; - - this._lastCameraPosition = new THREE.Vector3(); - this._lastCameraRotation = new THREE.Euler(); - this._lastCameraZoom = 0; - - window.addEventListener('focus', this.redraw); - } - - public get needsRedraw(): boolean { - return this._needsRedraw; - } - - update(): void { - const { _camera, _lastCameraPosition, _lastCameraRotation, _lastCameraZoom } = this; - const { position, rotation, zoom } = _camera; - const hasCameraChanged = - !position.equals(_lastCameraPosition) || !rotation.equals(_lastCameraRotation) || zoom !== _lastCameraZoom; - _lastCameraPosition.copy(position); - _lastCameraRotation.copy(rotation); - this._lastCameraZoom = zoom; - if (hasCameraChanged) { - this._needsRedraw = true; - } - } - - dispose(): void { - window.removeEventListener('focus', this.redraw); - } - - clearNeedsRedraw(): void { - this._needsRedraw = false; - } - - redraw = (): void => { - this._needsRedraw = true; - }; -} diff --git a/viewer/packages/api/src/public/migration/types.ts b/viewer/packages/api/src/public/migration/types.ts index d30c00d16f6..2cb8df413ed 100644 --- a/viewer/packages/api/src/public/migration/types.ts +++ b/viewer/packages/api/src/public/migration/types.ts @@ -65,6 +65,15 @@ export interface Cognite3DViewerOptions { /** Renderer used to visualize model (optional). */ renderer?: THREE.WebGLRenderer; + /** + * Generally Reveal will follow the resolution given by the size + * of the encapsulating DOM element of the Canvas {@link Cognite3DViewerOptions.domElement}. + * To ensure managable performance, Reveal will by default set an upper threshold to limit + * the resolution. Setting the {@link Cognite3DViewerOptions.rendererResolutionThreshold} will + * set this upper limit of what resolution Reveal will allow. + */ + rendererResolutionThreshold?: number; + /** * Hints Reveal to use a given anti-aliasing technique. * @@ -99,6 +108,17 @@ export interface Cognite3DViewerOptions { */ ssaoQualityHint?: 'medium' | 'high' | 'veryhigh' | 'disabled'; + /** + * Point cloud visualisation effects parameteres. + */ + pointCloudEffects?: { + /** + * Point blending effect, creates more "stable" texture on objects surfaces if point sizing is + * big enough. Can cause significant decrease in performance on some machines. + */ + pointBlending?: boolean; + }; + /** * Enables / disables visualizing the edges of geometry. Defaults to true. */ diff --git a/viewer/packages/api/src/public/types.ts b/viewer/packages/api/src/public/types.ts index b7f7fdaed15..cca02e8b6c7 100644 --- a/viewer/packages/api/src/public/types.ts +++ b/viewer/packages/api/src/public/types.ts @@ -18,6 +18,7 @@ export type RevealOptions = { renderOptions?: RenderOptions; continuousModelStreaming?: boolean; outputRenderTarget?: { target: THREE.WebGLRenderTarget; autoSize?: boolean }; + rendererResolutionThreshold?: number; internal?: { cad?: InternalRevealCadOptions; }; diff --git a/viewer/packages/api/src/storage/RevealManagerHelper.ts b/viewer/packages/api/src/storage/RevealManagerHelper.ts index dff9c7fbbd1..9f05202957d 100644 --- a/viewer/packages/api/src/storage/RevealManagerHelper.ts +++ b/viewer/packages/api/src/storage/RevealManagerHelper.ts @@ -55,15 +55,13 @@ export class RevealManagerHelper { * @param renderer * @param sceneHandler * @param revealOptions - * @param sdkClient */ static createLocalHelper( renderer: THREE.WebGLRenderer, sceneHandler: SceneHandler, - revealOptions: RevealOptions, - sdkClient?: CogniteClient | undefined + revealOptions: RevealOptions ): RevealManagerHelper { - const revealManager = createLocalRevealManager(renderer, sceneHandler, revealOptions, sdkClient); + const revealManager = createLocalRevealManager(renderer, sceneHandler, revealOptions); return new RevealManagerHelper('local', revealManager); } diff --git a/viewer/packages/api/src/utilities/ViewStateHelper.ts b/viewer/packages/api/src/utilities/ViewStateHelper.ts index d2411df21a3..345e30e3146 100644 --- a/viewer/packages/api/src/utilities/ViewStateHelper.ts +++ b/viewer/packages/api/src/utilities/ViewStateHelper.ts @@ -36,14 +36,15 @@ export type ModelState = { }; export class ViewStateHelper { - private readonly _cameraManager: CameraManager; private readonly _viewer: Cognite3DViewer; private readonly _cdfClient: CogniteClient; + private get _cameraManager(): CameraManager { + return this._viewer.cameraManager; + } constructor(viewer: Cognite3DViewer, cdfClient: CogniteClient) { this._viewer = viewer; this._cdfClient = cdfClient; - this._cameraManager = viewer.cameraManager; } public getCurrentState(): ViewerState { diff --git a/viewer/packages/api/visual-tests/ClippingPointCloud.VisualTest.ts b/viewer/packages/api/visual-tests/ClippingPointCloud.VisualTest.ts new file mode 100644 index 00000000000..20b3052e2a7 --- /dev/null +++ b/viewer/packages/api/visual-tests/ClippingPointCloud.VisualTest.ts @@ -0,0 +1,32 @@ +/*! + * Copyright 2022 Cognite AS + */ +import * as THREE from 'three'; + +import { CognitePointCloudModel, PotreePointColorType } from '@reveal/pointclouds'; +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +export default class ClippingPointCloudVisualTest extends ViewerVisualTestFixture { + constructor() { + super('pointcloud-bunny'); + } + public setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { models, viewer } = testFixtureComponents; + + const model = models[0]; + + if (!(model instanceof CognitePointCloudModel)) { + return Promise.resolve(); + } + + viewer.setClippingPlanes([ + new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 0, 0)) + ]); + + model.pointColorType = PotreePointColorType.Height; + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/Default.VisualTest.ts b/viewer/packages/api/visual-tests/Default.VisualTest.ts new file mode 100644 index 00000000000..6fcf57089bf --- /dev/null +++ b/viewer/packages/api/visual-tests/Default.VisualTest.ts @@ -0,0 +1,15 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +// Sanity test for loading model +export default class DefaultVisualTest extends ViewerVisualTestFixture { + public setup(_: ViewerTestFixtureComponents): Promise { + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/DefaultPointCloud.VisualTest.ts b/viewer/packages/api/visual-tests/DefaultPointCloud.VisualTest.ts new file mode 100644 index 00000000000..12a1a7389e7 --- /dev/null +++ b/viewer/packages/api/visual-tests/DefaultPointCloud.VisualTest.ts @@ -0,0 +1,28 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { CognitePointCloudModel, PotreePointColorType } from '@reveal/pointclouds'; +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +// Sanity test for loading point cloud model +export default class DefaultPointCloudVisualTest extends ViewerVisualTestFixture { + constructor() { + super('pointcloud-bunny'); + } + public setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { models } = testFixtureComponents; + + const model = models[0]; + + if (!(model instanceof CognitePointCloudModel)) { + return Promise.resolve(); + } + + model.pointColorType = PotreePointColorType.Height; + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/DefaultV8.VisualTest.ts b/viewer/packages/api/visual-tests/DefaultV8.VisualTest.ts new file mode 100644 index 00000000000..ed53d329fb5 --- /dev/null +++ b/viewer/packages/api/visual-tests/DefaultV8.VisualTest.ts @@ -0,0 +1,18 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +// Sanity test for loading v8 model +export default class DefaultV8VisualTest extends ViewerVisualTestFixture { + constructor() { + super('primitives_v8'); + } + public setup(_: ViewerTestFixtureComponents): Promise { + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/HighlightedGhosted.VisualTest.ts b/viewer/packages/api/visual-tests/HighlightedGhosted.VisualTest.ts new file mode 100644 index 00000000000..fe0e9856f8e --- /dev/null +++ b/viewer/packages/api/visual-tests/HighlightedGhosted.VisualTest.ts @@ -0,0 +1,24 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@reveal/cad-styling'; +import { Cognite3DModel } from '..'; +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +export default class HighlightWithDefaultGhostingTestPage extends ViewerVisualTestFixture { + public setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { models } = testFixtureComponents; + + if (models[0] instanceof Cognite3DModel) { + models[0].setDefaultNodeAppearance(DefaultNodeAppearance.Ghosted); + const nodes = new TreeIndexNodeCollection([...Array(15).keys()]); + models[0].assignStyledNodeCollection(nodes, DefaultNodeAppearance.Highlighted); + } + + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts b/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts new file mode 100644 index 00000000000..5c156f94f2a --- /dev/null +++ b/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts @@ -0,0 +1,39 @@ +/*! + * Copyright 2022 Cognite AS + */ +import * as THREE from 'three'; + +import { Cognite3DModel } from '..'; +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +export default class NodeTransformVisualTest extends ViewerVisualTestFixture { + public async setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { models } = testFixtureComponents; + + const model = models[0]; + + if (model instanceof Cognite3DModel) { + const scale = new THREE.Matrix4().makeScale(3, 3, 3); + const rotation = new THREE.Matrix4().makeRotationFromEuler(new THREE.Euler(Math.PI / 2, 0, 0)); + const translation = new THREE.Matrix4().makeTranslation(12, 10, -12); + + const transform = translation.multiply(rotation.multiply(scale)); + await model.setNodeTransformByTreeIndex(1, transform, false); + + await Promise.all( + Array.from({ length: 80 - 2 }, (_, k) => k + 2).map(i => { + return model.setNodeTransformByTreeIndex( + i, + new THREE.Matrix4().makeTranslation(0, ((i % 2) * 2 - 1) * 2, 0), + false + ); + }) + ); + } + + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/Outline.VisualTest.ts b/viewer/packages/api/visual-tests/Outline.VisualTest.ts new file mode 100644 index 00000000000..227d8d6fb2e --- /dev/null +++ b/viewer/packages/api/visual-tests/Outline.VisualTest.ts @@ -0,0 +1,38 @@ +/*! + * Copyright 2022 Cognite AS + */ +import * as THREE from 'three'; +import { NodeOutlineColor, TreeIndexNodeCollection } from '@reveal/cad-styling'; +import { IndexSet, NumericRange } from '@reveal/utilities'; +import { Cognite3DModel } from '..'; + +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; + +export default class OutlineVisualTest extends ViewerVisualTestFixture { + public setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { viewer, models } = testFixtureComponents; + + viewer.setBackgroundColor(new THREE.Color('lightGray')); + + const model = models[0]; + + if (model instanceof Cognite3DModel) { + model.setRotationFromEuler(new THREE.Euler(Math.PI / 4, 0, 0)); + model.updateMatrix(); + model.updateMatrixWorld(); + + const nodesPerColor = 10; + for (let color = 0; color < 8; ++color) { + const indexes = new IndexSet(); + indexes.addRange(new NumericRange(nodesPerColor * color, 10)); + const nodes = new TreeIndexNodeCollection(indexes); + model.assignStyledNodeCollection(nodes, { outlineColor: color as NodeOutlineColor }); + } + } + + return Promise.resolve(); + } +} diff --git a/examples/src/pages/e2e/cad/ReassignNodeStyle.tsx b/viewer/packages/api/visual-tests/ReassignNodeStyle.VisualTest.ts similarity index 56% rename from examples/src/pages/e2e/cad/ReassignNodeStyle.tsx rename to viewer/packages/api/visual-tests/ReassignNodeStyle.VisualTest.ts index 7a45c07bdc6..81188d76024 100644 --- a/examples/src/pages/e2e/cad/ReassignNodeStyle.tsx +++ b/viewer/packages/api/visual-tests/ReassignNodeStyle.VisualTest.ts @@ -1,10 +1,15 @@ /*! - * Copyright 2021 Cognite AS + * Copyright 2022 Cognite AS */ -import { THREE } from '@cognite/reveal'; -import { Cognite3DModel, Cognite3DViewer, DefaultNodeAppearance, IndexSet, TreeIndexNodeCollection } from '@cognite/reveal'; -import { registerVisualTest } from '../../../visual_tests'; -import { Cognite3DTestViewer } from '../Cognite3DTestViewer'; +import * as THREE from 'three'; + +import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@reveal/cad-styling'; +import { IndexSet } from '@reveal/utilities'; +import { Cognite3DModel } from '..'; +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; function createAlternatingIndexSet(nodeCount: number): IndexSet { const indexSet = new IndexSet(); @@ -22,24 +27,30 @@ function createFirstTreeIndicesSet(nodeCount: number): IndexSet { for (let i = 0; i < nodeCount / 2; i++) { indexSet.add(i); } - + return indexSet; } -/** - * Regression issue where ghosting one model made the other invisible (ACEPC-110). - */ -function ReassignNodeStyle() { - function handleModelAdded(model: Cognite3DModel, modelIndex: number) { +export default class ReassignNodeStyleVisualTest extends ViewerVisualTestFixture { + public setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { models } = testFixtureComponents; + + const model = models[0]; + if (!(model instanceof Cognite3DModel)) { + return Promise.resolve(); + } + + model.setRotationFromEuler(new THREE.Euler(Math.PI / 4, 0, 0)); + model.updateMatrix(); + model.updateMatrixWorld(); + const alternatingIndexSet = createAlternatingIndexSet(model.nodeCount); const invertedRanges = alternatingIndexSet.invertedRanges(); const invertedSet = new IndexSet(); const firstTreeIndicesSet = createFirstTreeIndicesSet(model.nodeCount); - console.log("Inserting invertedRanges into new index set"); for (const invertedRange of invertedRanges) { - console.dir(invertedRange); invertedSet.addRange(invertedRange); } @@ -48,22 +59,11 @@ function ReassignNodeStyle() { const firstIndicesNodeCollection = new TreeIndexNodeCollection(firstTreeIndicesSet); model.assignStyledNodeCollection(alternatingNodeCollection, DefaultNodeAppearance.Highlighted); - + model.assignStyledNodeCollection(firstIndicesNodeCollection, DefaultNodeAppearance.Ghosted); model.assignStyledNodeCollection(invertedNodeCollection, DefaultNodeAppearance.Default); model.assignStyledNodeCollection(alternatingNodeCollection, DefaultNodeAppearance.Outlined); + return Promise.resolve(); } - - return ( - { - viewer.cameraManager.setCameraState({position: new THREE.Vector3(30,10,50), - target: new THREE.Vector3()}); - }}/> - ); } - -registerVisualTest('cad', 'reassign-node-style', 'Reassign node style on previously styled node collection', ) diff --git a/viewer/packages/api/visual-tests/TwoModels.VisualTest.ts b/viewer/packages/api/visual-tests/TwoModels.VisualTest.ts new file mode 100644 index 00000000000..775a87bb57e --- /dev/null +++ b/viewer/packages/api/visual-tests/TwoModels.VisualTest.ts @@ -0,0 +1,35 @@ +/*! + * Copyright 2022 Cognite AS + */ +import { Cognite3DModel } from '..'; +import * as THREE from 'three'; + +import { + ViewerTestFixtureComponents, + ViewerVisualTestFixture +} from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; +import { DefaultNodeAppearance } from '@reveal/cad-styling'; + +export default class TwoModelsVisualTest extends ViewerVisualTestFixture { + constructor() { + super('primitives', 'primitives'); + } + public setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { + const { models } = testFixtureComponents; + + const model = models[1]; + + if (!(model instanceof Cognite3DModel)) { + return Promise.resolve(); + } + + model.setDefaultNodeAppearance(DefaultNodeAppearance.Ghosted); + + const translation = new THREE.Matrix4().makeTranslation(0, 0, 5); + const transform = model.getModelTransformation(); + transform.multiply(translation); + model.setModelTransformation(transform); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/ClippingPointCloud.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/ClippingPointCloud.VisualTest.png new file mode 100644 index 00000000000..369743c6287 Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/ClippingPointCloud.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/Default.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/Default.VisualTest.png new file mode 100644 index 00000000000..adcaf23487c Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/Default.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/DefaultPointCloud.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/DefaultPointCloud.VisualTest.png new file mode 100644 index 00000000000..1d64390d9ad Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/DefaultPointCloud.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/DefaultV8.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/DefaultV8.VisualTest.png new file mode 100644 index 00000000000..59a2d2b3a0f Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/DefaultV8.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/HighlightedGhosted.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/HighlightedGhosted.VisualTest.png new file mode 100644 index 00000000000..e2c09c18c3e Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/HighlightedGhosted.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/NodeTransform.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/NodeTransform.VisualTest.png new file mode 100644 index 00000000000..a52f96e5e8d Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/NodeTransform.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/Outline.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/Outline.VisualTest.png new file mode 100644 index 00000000000..a44a038413b Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/Outline.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/ReassignNodeStyle.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/ReassignNodeStyle.VisualTest.png new file mode 100644 index 00000000000..fc4032d9181 Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/ReassignNodeStyle.VisualTest.png differ diff --git a/viewer/packages/api/visual-tests/__image_snapshots__/TwoModels.VisualTest.png b/viewer/packages/api/visual-tests/__image_snapshots__/TwoModels.VisualTest.png new file mode 100644 index 00000000000..7dbd93c4278 Binary files /dev/null and b/viewer/packages/api/visual-tests/__image_snapshots__/TwoModels.VisualTest.png differ diff --git a/viewer/packages/cad-geometry-loaders/app/index.ts b/viewer/packages/cad-geometry-loaders/app/index.ts deleted file mode 100644 index 38bf95e91df..00000000000 --- a/viewer/packages/cad-geometry-loaders/app/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import * as THREE from 'three'; -import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; -import { CadModelFactory } from '@reveal/cad-model'; -import { CadMaterialManager } from '@reveal/rendering'; -import { CdfModelDataProvider, CdfModelIdentifier, CdfModelMetadataProvider } from '@reveal/modeldata-api'; -import { CadModelUpdateHandler } from '../src/CadModelUpdateHandler'; -import { ByScreenSizeSectorCuller } from '../src/sector/culling/ByScreenSizeSectorCuller'; -import { CadManager } from '../src/CadManager'; -import { revealEnv } from '@reveal/utilities'; -import dat from 'dat.gui'; -import { createApplicationSDK } from '../../../test-utilities/src/appUtils'; - -revealEnv.publicPath = 'https://apps-cdn.cogniteapp.com/@cognite/reveal-parser-worker/1.2.0/'; - -init(); - -async function init() { - const scene = new THREE.Scene(); - - const gui = new dat.GUI(); - - const guiData = { drawCalls: 0 }; - gui.add(guiData, 'drawCalls').listen(); - - const client = await createApplicationSDK('reveal.example.simple', { - project: '3d-test', - cluster: 'greenfield', - clientId: 'a03a8caf-7611-43ac-87f3-1d493c085579', - tenantId: '20a88741-8181-4275-99d9-bd4451666d6e' - }); - - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - - // Defaults to all-primitives model on 3d-test - const modelId = parseInt(urlParams.get('modelId') ?? '1791160622840317'); - const revisionId = parseInt(urlParams.get('revisionId') ?? '498427137020189'); - - const modelIdentifier = new CdfModelIdentifier(modelId, revisionId); - const cdfModelMetadataProvider = new CdfModelMetadataProvider(client); - const cdfModelDataProvider = new CdfModelDataProvider(client); - - const materialManager = new CadMaterialManager(); - const cadModelFactory = new CadModelFactory(materialManager, cdfModelMetadataProvider, cdfModelDataProvider); - const cadModelUpdateHandler = new CadModelUpdateHandler(new ByScreenSizeSectorCuller()); - - const cadManager = new CadManager(materialManager, cadModelFactory, cadModelUpdateHandler); - - cadManager.budget = { - highDetailProximityThreshold: cadManager.budget.highDetailProximityThreshold, - maximumRenderCost: cadManager.budget.maximumRenderCost - }; - - const model = await cadManager.addModel(modelIdentifier); - - const camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 3, 1000); - - const renderer = new THREE.WebGLRenderer({ antialias: true }); - renderer.setSize(window.innerWidth, window.innerHeight); - - const grid = new THREE.GridHelper(30, 40); - grid.position.set(14, -1, -14); - scene.add(grid); - - scene.add(model); - - const controls = new OrbitControls(camera, renderer.domElement); - camera.position.copy(new THREE.Vector3(10, 10, 10)); - controls.target.copy(new THREE.Vector3(10, 0, -10)); - controls.update(); - - cadModelUpdateHandler.updateCamera(camera); - cadModelUpdateHandler.getLoadingStateObserver().subscribe({ next: render }); - - document.body.appendChild(renderer.domElement); - - controls.addEventListener('change', () => { - cadModelUpdateHandler.updateCamera(camera); - render(); - }); - - await new Promise(_ => setTimeout(_, 2000)); - - render(); - - function render() { - window.requestAnimationFrame(() => { - controls.update(); - renderer.render(scene, camera); - guiData.drawCalls = renderer.info.render.calls; - }); - } -} diff --git a/viewer/packages/cad-model/package.json b/viewer/packages/cad-model/package.json index ff067d93c65..367f954fb90 100644 --- a/viewer/packages/cad-model/package.json +++ b/viewer/packages/cad-model/package.json @@ -3,7 +3,7 @@ "private": true, "main": "index.ts", "scripts": { - "start": "yarn ws:start", + "start": "yarn ws:serve --env testFixture=CadClipping.VisualTest.ts", "test": "yarn ws:test --config ./../../jest.config.js", "lint": "yarn ws:lint" }, diff --git a/viewer/packages/cad-model/visual-tests/CadClipping.VisualTest.ts b/viewer/packages/cad-model/visual-tests/CadClipping.VisualTest.ts new file mode 100644 index 00000000000..3b674d3b177 --- /dev/null +++ b/viewer/packages/cad-model/visual-tests/CadClipping.VisualTest.ts @@ -0,0 +1,41 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; + +import { BoundingBoxClipper, CadNode } from '..'; +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; + +export default class CadClippingVisualTest extends StreamingVisualTestFixture { + public setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { model, cadManager } = testFixtureComponents; + + if (!(model.geometryNode instanceof CadNode)) { + return Promise.resolve(); + } + + const params = { + width: 10, + height: 10, + depth: 10, + x: 0, + y: 0, + z: 0 + }; + + const boxClipper = new BoundingBoxClipper( + new THREE.Box3( + new THREE.Vector3(params.x - params.width / 2, params.y - params.height / 2, params.z - params.depth / 1.5), + new THREE.Vector3(params.x + params.width / 1.5, params.y + params.height / 2, params.z + params.depth / 2) + ) + ); + + cadManager.clippingPlanes = boxClipper.clippingPlanes; + + return Promise.resolve(); + } +} diff --git a/viewer/packages/cad-model/visual-tests/Rotation.VisualTest.ts b/viewer/packages/cad-model/visual-tests/Rotation.VisualTest.ts new file mode 100644 index 00000000000..c1d766ade26 --- /dev/null +++ b/viewer/packages/cad-model/visual-tests/Rotation.VisualTest.ts @@ -0,0 +1,29 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; + +import { CadNode } from '..'; +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; + +export default class RotationVisualTest extends StreamingVisualTestFixture { + public setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { model } = testFixtureComponents; + + const cadNode = model.geometryNode; + + if (!(cadNode instanceof CadNode)) { + return Promise.resolve(); + } + + const matrix = cadNode.getModelTransformation(); + const newMatrix = new THREE.Matrix4().multiplyMatrices(matrix, new THREE.Matrix4().makeRotationY(Math.PI / 3.0)); + cadNode.setModelTransformation(newMatrix); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/cad-model/visual-tests/Scale.VisualTest.ts b/viewer/packages/cad-model/visual-tests/Scale.VisualTest.ts new file mode 100644 index 00000000000..9e8abc2f9eb --- /dev/null +++ b/viewer/packages/cad-model/visual-tests/Scale.VisualTest.ts @@ -0,0 +1,29 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; + +import { CadNode } from '..'; +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; + +export default class ScaleVisualTest extends StreamingVisualTestFixture { + public setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { model } = testFixtureComponents; + + const cadNode = model.geometryNode; + + if (!(cadNode instanceof CadNode)) { + return Promise.resolve(); + } + + const matrix = cadNode.getModelTransformation(); + const newMatrix = matrix.scale(new THREE.Vector3(5, 5, 5)); + cadNode.setModelTransformation(newMatrix); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/cad-model/visual-tests/__image_snapshots__/CadClipping.VisualTest.png b/viewer/packages/cad-model/visual-tests/__image_snapshots__/CadClipping.VisualTest.png new file mode 100644 index 00000000000..997678205f0 Binary files /dev/null and b/viewer/packages/cad-model/visual-tests/__image_snapshots__/CadClipping.VisualTest.png differ diff --git a/viewer/packages/cad-model/visual-tests/__image_snapshots__/Rotation.VisualTest.png b/viewer/packages/cad-model/visual-tests/__image_snapshots__/Rotation.VisualTest.png new file mode 100644 index 00000000000..56ec8a06f43 Binary files /dev/null and b/viewer/packages/cad-model/visual-tests/__image_snapshots__/Rotation.VisualTest.png differ diff --git a/viewer/packages/cad-model/visual-tests/__image_snapshots__/Scale.VisualTest.png b/viewer/packages/cad-model/visual-tests/__image_snapshots__/Scale.VisualTest.png new file mode 100644 index 00000000000..458a2324da1 Binary files /dev/null and b/viewer/packages/cad-model/visual-tests/__image_snapshots__/Scale.VisualTest.png differ diff --git a/viewer/packages/cad-styling/package.json b/viewer/packages/cad-styling/package.json index 976d057f6f1..02cbe33e754 100644 --- a/viewer/packages/cad-styling/package.json +++ b/viewer/packages/cad-styling/package.json @@ -3,7 +3,7 @@ "private": true, "main": "index.ts", "scripts": { - "start": "yarn ws:start", + "start": "yarn ws:serve --env testFixture=CustomWithStyling.VisualTest.ts", "test": "yarn ws:test --config ./../../jest.config.js", "lint": "yarn ws:lint" }, diff --git a/viewer/packages/cad-styling/visual-tests/CustomWithStyling.VisualTest.ts b/viewer/packages/cad-styling/visual-tests/CustomWithStyling.VisualTest.ts new file mode 100644 index 00000000000..858eea24b67 --- /dev/null +++ b/viewer/packages/cad-styling/visual-tests/CustomWithStyling.VisualTest.ts @@ -0,0 +1,47 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; +import { DefaultNodeAppearance, TreeIndexNodeCollection } from '..'; + +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; + +export default class CustomWithStylingVisualTest extends StreamingVisualTestFixture { + public async setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { sceneHandler, cadMaterialManager, model } = testFixtureComponents; + + const { modelIdentifier } = sceneHandler.cadModels.find( + identifiedObject => identifiedObject.object === model.geometryNode + )!; + + const highlightedNodes = new TreeIndexNodeCollection([0, 2, 4, 6, 8, 10]); + cadMaterialManager + .getModelNodeAppearanceProvider(modelIdentifier) + .assignStyledNodeCollection(highlightedNodes, DefaultNodeAppearance.Highlighted); + + const ghostedNodes = new TreeIndexNodeCollection([1, 3, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]); + cadMaterialManager + .getModelNodeAppearanceProvider(modelIdentifier) + .assignStyledNodeCollection(ghostedNodes, DefaultNodeAppearance.Ghosted); + + const sphere = new THREE.SphereBufferGeometry(5, 32, 16); + const sphereMesh = new THREE.Mesh(sphere, new THREE.MeshBasicMaterial({ color: 'red' })); + sphereMesh.position.set(12, -3, -2); + sceneHandler.addCustomObject(sphereMesh); + + // Styles are not applied immidiatly, so wait a little for styling to take effect + await new Promise(resolve => setTimeout(resolve, 100)); + + model.geometryNode.position.set(25, 0, -15); + model.geometryNode.rotateY(Math.PI); + model.geometryNode.rotateX(-Math.PI / 8); + model.geometryNode.updateMatrix(); + model.geometryNode.updateMatrixWorld(); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/cad-styling/visual-tests/CustomWithStylingV8.VisualTest.ts b/viewer/packages/cad-styling/visual-tests/CustomWithStylingV8.VisualTest.ts new file mode 100644 index 00000000000..86891e48cac --- /dev/null +++ b/viewer/packages/cad-styling/visual-tests/CustomWithStylingV8.VisualTest.ts @@ -0,0 +1,51 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; +import { DefaultNodeAppearance, TreeIndexNodeCollection } from '..'; + +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; + +// Sanity test for loading model +export default class CustomWithStylingV8VisualTest extends StreamingVisualTestFixture { + constructor() { + super('primitives_v8'); + } + public async setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { sceneHandler, cadMaterialManager, model } = testFixtureComponents; + + const { modelIdentifier } = sceneHandler.cadModels.find( + identifiedObject => identifiedObject.object === model.geometryNode + )!; + + const highlightedNodes = new TreeIndexNodeCollection([0, 2, 4, 6, 8, 10]); + cadMaterialManager + .getModelNodeAppearanceProvider(modelIdentifier) + .assignStyledNodeCollection(highlightedNodes, DefaultNodeAppearance.Highlighted); + + const ghostedNodes = new TreeIndexNodeCollection([1, 3, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]); + cadMaterialManager + .getModelNodeAppearanceProvider(modelIdentifier) + .assignStyledNodeCollection(ghostedNodes, DefaultNodeAppearance.Ghosted); + + const sphere = new THREE.SphereBufferGeometry(5, 32, 16); + const sphereMesh = new THREE.Mesh(sphere, new THREE.MeshBasicMaterial({ color: 'red' })); + sphereMesh.position.set(12, 9, -2); + sceneHandler.addCustomObject(sphereMesh); + + // Styles are not applied immidiatly, so wait a little for styling to take effect + await new Promise(resolve => setTimeout(resolve, 100)); + + model.geometryNode.position.set(25, 14, -15); + model.geometryNode.rotateY(Math.PI); + model.geometryNode.rotateX(-Math.PI / 8); + model.geometryNode.updateMatrix(); + model.geometryNode.updateMatrixWorld(); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/cad-styling/visual-tests/Highlighted.VisualTest.ts b/viewer/packages/cad-styling/visual-tests/Highlighted.VisualTest.ts new file mode 100644 index 00000000000..7e57526a965 --- /dev/null +++ b/viewer/packages/cad-styling/visual-tests/Highlighted.VisualTest.ts @@ -0,0 +1,35 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { DefaultNodeAppearance, TreeIndexNodeCollection } from '..'; + +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; + +export default class HighlightedVisualTest extends StreamingVisualTestFixture { + public async setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { sceneHandler, cadMaterialManager, model } = testFixtureComponents; + + const { modelIdentifier } = sceneHandler.cadModels.find( + identifiedObject => identifiedObject.object === model.geometryNode + )!; + + const nodes = new TreeIndexNodeCollection([...Array(15).keys()]); + cadMaterialManager + .getModelNodeAppearanceProvider(modelIdentifier) + .assignStyledNodeCollection(nodes, DefaultNodeAppearance.Highlighted); + + // Styles are not applied immidiatly, so wait a little for styling to take effect + await new Promise(resolve => setTimeout(resolve, 100)); + + model.geometryNode.position.set(25, 0, -15); + model.geometryNode.rotateY(Math.PI); + model.geometryNode.updateMatrix(); + model.geometryNode.updateMatrixWorld(); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/cad-styling/visual-tests/__image_snapshots__/CustomWithStyling.VisualTest.png b/viewer/packages/cad-styling/visual-tests/__image_snapshots__/CustomWithStyling.VisualTest.png new file mode 100644 index 00000000000..fc7c7201c7e Binary files /dev/null and b/viewer/packages/cad-styling/visual-tests/__image_snapshots__/CustomWithStyling.VisualTest.png differ diff --git a/viewer/packages/cad-styling/visual-tests/__image_snapshots__/CustomWithStylingV8.VisualTest.png b/viewer/packages/cad-styling/visual-tests/__image_snapshots__/CustomWithStylingV8.VisualTest.png new file mode 100644 index 00000000000..f0173b2019e Binary files /dev/null and b/viewer/packages/cad-styling/visual-tests/__image_snapshots__/CustomWithStylingV8.VisualTest.png differ diff --git a/viewer/packages/cad-styling/visual-tests/__image_snapshots__/Highlighted.VisualTest.png b/viewer/packages/cad-styling/visual-tests/__image_snapshots__/Highlighted.VisualTest.png new file mode 100644 index 00000000000..54dae1b1816 Binary files /dev/null and b/viewer/packages/cad-styling/visual-tests/__image_snapshots__/Highlighted.VisualTest.png differ diff --git a/viewer/packages/camera-manager/src/CameraManager.ts b/viewer/packages/camera-manager/src/CameraManager.ts index be1ca9e4258..36723054bb8 100644 --- a/viewer/packages/camera-manager/src/CameraManager.ts +++ b/viewer/packages/camera-manager/src/CameraManager.ts @@ -75,4 +75,8 @@ export interface CameraManager { * @obvious */ dispose(): void; + /** + * Enables or disables camera manager. When disabled, camera manager shouldn't consume or react to any DOM events. + */ + enabled?: boolean; } diff --git a/viewer/packages/camera-manager/src/CameraManagerHelper.ts b/viewer/packages/camera-manager/src/CameraManagerHelper.ts index 248083d0e7c..0943173802d 100644 --- a/viewer/packages/camera-manager/src/CameraManagerHelper.ts +++ b/viewer/packages/camera-manager/src/CameraManagerHelper.ts @@ -4,6 +4,7 @@ import * as THREE from 'three'; import range from 'lodash/range'; +import { fitCameraToBoundingBox } from '@reveal/utilities'; /** * Helper methods for implementing a camera manager. @@ -85,6 +86,7 @@ export class CameraManagerHelper { camera.far = far; camera.updateProjectionMatrix(); } + /** * Calculates camera position and target that allows to see the content of provided bounding box. * @param camera Used camera instance. @@ -97,16 +99,7 @@ export class CameraManagerHelper { box: THREE.Box3, radiusFactor: number = 2 ): { position: THREE.Vector3; target: THREE.Vector3 } { - const boundingSphere = box.getBoundingSphere(new THREE.Sphere()); - - const target = boundingSphere.center; - const distance = boundingSphere.radius * radiusFactor; - const direction = new THREE.Vector3(0, 0, -1); - direction.applyQuaternion(camera.quaternion); - - const position = direction.clone().multiplyScalar(-distance).add(target); - - return { position, target }; + return fitCameraToBoundingBox(camera, box, radiusFactor); } private static calculateCameraFar( diff --git a/viewer/packages/camera-manager/src/ComboControls.ts b/viewer/packages/camera-manager/src/ComboControls.ts index 58e7cfd0816..e83abc1414c 100644 --- a/viewer/packages/camera-manager/src/ComboControls.ts +++ b/viewer/packages/camera-manager/src/ComboControls.ts @@ -138,6 +138,9 @@ export class ComboControls extends EventDispatcher { window.removeEventListener('pointerup', this.onMouseUp); window.removeEventListener('pointerdown', this.onFocusChanged); + + // dipose all keyboard events registered. REV-461! + this._keyboard.dispose(); }; } diff --git a/viewer/packages/camera-manager/src/DefaultCameraManager.ts b/viewer/packages/camera-manager/src/DefaultCameraManager.ts index b0646c52ced..3bc968e5555 100644 --- a/viewer/packages/camera-manager/src/DefaultCameraManager.ts +++ b/viewer/packages/camera-manager/src/DefaultCameraManager.ts @@ -13,7 +13,8 @@ import { EventTrigger, InputHandler, disposeOfAllEventListeners, - PointerEventDelegate + PointerEventDelegate, + fitCameraToBoundingBox } from '@reveal/utilities'; /** @@ -125,11 +126,7 @@ export class DefaultCameraManager implements CameraManager { } fitCameraToBoundingBox(box: THREE.Box3, duration?: number, radiusFactor: number = 2): void { - const { position, target } = CameraManagerHelper.calculateCameraStateToFitBoundingBox( - this._camera, - box, - radiusFactor - ); + const { position, target } = fitCameraToBoundingBox(this._camera, box, radiusFactor); this.moveCameraTo(position, target, duration); } @@ -142,6 +139,20 @@ export class DefaultCameraManager implements CameraManager { return this._controls; } + /** + * Sets whether camera controls through mouse, touch and keyboard are enabled. + */ + set enabled(enabled: boolean) { + this._controls.enabled = enabled; + } + + /** + * Gets whether camera controls through mouse, touch and keyboard are enabled. + */ + get enabled(): boolean { + return this._controls.enabled; + } + /** * Sets whether camera controls through mouse, touch and keyboard are enabled. * This can be useful to e.g. temporarily disable navigation when manipulating other diff --git a/viewer/packages/camera-manager/src/Keyboard.ts b/viewer/packages/camera-manager/src/Keyboard.ts index bfb8f7bae15..aa09f2a938f 100644 --- a/viewer/packages/camera-manager/src/Keyboard.ts +++ b/viewer/packages/camera-manager/src/Keyboard.ts @@ -56,6 +56,11 @@ export default class Keyboard { return p; } + public dispose(): void { + this.clearPressedKeys(); + this.removeEventListeners(); + } + private readonly addEventListeners = () => { this.clearPressedKeys(); diff --git a/viewer/packages/pointclouds/index.ts b/viewer/packages/pointclouds/index.ts index d495ebb343a..2bd2c7979d8 100644 --- a/viewer/packages/pointclouds/index.ts +++ b/viewer/packages/pointclouds/index.ts @@ -6,7 +6,12 @@ export { PointCloudPickingHandler } from './src/PointCloudPickingHandler'; export { WellKnownAsprsPointClassCodes } from './src/types'; -export { PotreePointShape, PotreePointColorType, PotreePointSizeType } from './src/potree-three-loader'; +export { + PotreePointShape, + PotreePointColorType, + PotreePointSizeType, + PointCloudMaterial +} from './src/potree-three-loader'; export { PointCloudNode } from './src/PointCloudNode'; export { PointCloudManager } from './src/PointCloudManager'; diff --git a/viewer/packages/pointclouds/package.json b/viewer/packages/pointclouds/package.json index 674cbd7c463..b54e2f2208d 100644 --- a/viewer/packages/pointclouds/package.json +++ b/viewer/packages/pointclouds/package.json @@ -13,6 +13,7 @@ "@reveal/metrics": "workspace:*", "@reveal/model-base": "workspace:*", "@reveal/modeldata-api": "workspace:*", + "@reveal/rendering": "workspace:*", "@reveal/utilities": "workspace:*" } } diff --git a/viewer/packages/pointclouds/src/CognitePointCloudModel.test.ts b/viewer/packages/pointclouds/src/CognitePointCloudModel.test.ts index 395f4db88ee..09242191e96 100644 --- a/viewer/packages/pointclouds/src/CognitePointCloudModel.test.ts +++ b/viewer/packages/pointclouds/src/CognitePointCloudModel.test.ts @@ -4,6 +4,7 @@ import { createPointCloudModel } from '../../../test-utilities/src/createPointCloudModel'; import { CognitePointCloudModel } from './CognitePointCloudModel'; +import { AnnotationIdPointCloudObjectCollection } from './styling/AnnotationListPointCloudObjectCollection'; describe(CognitePointCloudModel.name, () => { let model: CognitePointCloudModel; @@ -15,4 +16,48 @@ describe(CognitePointCloudModel.name, () => { test('default CognitePointCloudModel does not contain annotations', () => { expect(model.stylableObjectCount).toEqual(0); }); + + test('assigned styled object collection is available in styledCollections', () => { + const annotationIds = [1, 2, 3]; + const color: [number, number, number] = [255, 0, 127]; + + model.assignStyledObjectCollection(new AnnotationIdPointCloudObjectCollection(annotationIds), { color }); + + const collections = model.styledCollections; + + expect(collections).toHaveLength(1); + expect(collections[0].style.color).toEqual(color); + expect([...collections[0].objectCollection.getAnnotationIds()]).toEqual(annotationIds); + }); + + test('Removing all styled object collection leaves zero collections', () => { + const annotationIds = [1, 2, 3]; + const color: [number, number, number] = [255, 0, 127]; + + model.assignStyledObjectCollection(new AnnotationIdPointCloudObjectCollection(annotationIds), { color }); + + model.removeAllStyledObjectCollections(); + expect(model.styledCollections).toHaveLength(0); + }); + + test('Unassigning collection removes the right one', () => { + const annotationIds0 = [1, 2, 3]; + const annotationIds1 = [4, 5, 6]; + const color0: [number, number, number] = [127, 0, 255]; + const color1: [number, number, number] = [0, 127, 255]; + + const collection0 = new AnnotationIdPointCloudObjectCollection(annotationIds0); + const collection1 = new AnnotationIdPointCloudObjectCollection(annotationIds1); + + model.assignStyledObjectCollection(collection0, { color: color0 }); + + model.assignStyledObjectCollection(collection1, { color: color1 }); + + expect(model.styledCollections).toHaveLength(2); + + model.unassignStyledObjectCollection(collection0); + + expect(model.styledCollections).toHaveLength(1); + expect([...model.styledCollections[0].objectCollection.getAnnotationIds()]).toEqual(annotationIds1); + }); }); diff --git a/viewer/packages/pointclouds/src/CognitePointCloudModel.ts b/viewer/packages/pointclouds/src/CognitePointCloudModel.ts index da9c0f561df..809474f1508 100644 --- a/viewer/packages/pointclouds/src/CognitePointCloudModel.ts +++ b/viewer/packages/pointclouds/src/CognitePointCloudModel.ts @@ -273,7 +273,7 @@ export class CognitePointCloudModel extends THREE.Object3D implements CogniteMod if (styledCollectionIndex !== -1) { this._styledObjectCollections.splice(styledCollectionIndex, 1); - this.pointCloudNode.removeAllStyledPointCloudOjects(); + this.pointCloudNode.removeAllStyledPointCloudObjects(); for (const styledObjectCollection of this._styledObjectCollections) { this.pointCloudNode.assignStyledPointCloudObjectCollection(styledObjectCollection); @@ -285,7 +285,8 @@ export class CognitePointCloudModel extends THREE.Object3D implements CogniteMod * Removes styling on all object collections in this model */ removeAllStyledObjectCollections(): void { - this.pointCloudNode.removeAllStyledPointCloudOjects(); + this.pointCloudNode.removeAllStyledPointCloudObjects(); + this._styledObjectCollections.splice(0); } /** diff --git a/viewer/packages/pointclouds/src/PointCloudMetadataRepository.ts b/viewer/packages/pointclouds/src/PointCloudMetadataRepository.ts index fd9ad2fcbb5..36015bf50a4 100644 --- a/viewer/packages/pointclouds/src/PointCloudMetadataRepository.ts +++ b/viewer/packages/pointclouds/src/PointCloudMetadataRepository.ts @@ -40,11 +40,11 @@ export class PointCloudMetadataRepository implements MetadataRepository { .setup(p => p.material) .returns(new PointCloudMaterial()) .object(); - const model = new PotreeNodeWrapper(dummyNode, []); + const model = new PotreeNodeWrapper(dummyNode, [], Symbol('dummy')); const manager = new PotreeGroupWrapper(new Potree(mockModelDataProvider), pollLoadingStatusInterval); expectObservable(manager.getLoadingStateObserver().pipe(map(x => x.isLoading)), [false], done); diff --git a/viewer/packages/pointclouds/src/PotreeNodeWrapper.ts b/viewer/packages/pointclouds/src/PotreeNodeWrapper.ts index e9600e4d13a..99b20cf2b73 100644 --- a/viewer/packages/pointclouds/src/PotreeNodeWrapper.ts +++ b/viewer/packages/pointclouds/src/PotreeNodeWrapper.ts @@ -27,21 +27,28 @@ export class PotreeNodeWrapper { readonly octree: PointCloudOctree; private _needsRedraw = false; private readonly _classification: IClassification = {} as IClassification; + private readonly _modelIdentifier: symbol; - private readonly _annotations: PointCloudObjectAnnotation[]; private static readonly pickingWindowSize = 20; + private readonly _annotations: PointCloudObjectAnnotation[]; + get needsRedraw(): boolean { return this._needsRedraw; } - constructor(octree: PointCloudOctree, annotations: PointCloudObjectAnnotation[]) { + constructor(octree: PointCloudOctree, annotations: PointCloudObjectAnnotation[], modelIdentifier: symbol) { this.octree = octree; this.pointSize = 2; this.pointColorType = PotreePointColorType.Rgb; this.pointShape = PotreePointShape.Circle; this._classification = octree.material.classification; this._annotations = annotations; + this._modelIdentifier = modelIdentifier; + } + + get modelIdentifier(): symbol { + return this._modelIdentifier; } get pointSize(): number { diff --git a/viewer/packages/pointclouds/src/factory/CdfPointCloudFactory.ts b/viewer/packages/pointclouds/src/factory/CdfPointCloudFactory.ts index 7f506bb893c..d268cb3dc4f 100644 --- a/viewer/packages/pointclouds/src/factory/CdfPointCloudFactory.ts +++ b/viewer/packages/pointclouds/src/factory/CdfPointCloudFactory.ts @@ -87,6 +87,6 @@ export class CdfPointCloudFactory implements PointCloudFactory { ); pointCloudOctree.name = `PointCloudOctree: ${modelBaseUrl}`; - return new PotreeNodeWrapper(pointCloudOctree, annotationInfo.annotations); + return new PotreeNodeWrapper(pointCloudOctree, annotationInfo.annotations, modelIdentifier.revealInternalId); } } diff --git a/viewer/packages/pointclouds/src/factory/LocalPointCloudFactory.ts b/viewer/packages/pointclouds/src/factory/LocalPointCloudFactory.ts index c47db544859..707d0c61b64 100644 --- a/viewer/packages/pointclouds/src/factory/LocalPointCloudFactory.ts +++ b/viewer/packages/pointclouds/src/factory/LocalPointCloudFactory.ts @@ -27,7 +27,7 @@ export class LocalPointCloudFactory implements PointCloudFactory { } async createModel(modelMetadata: PointCloudMetadata): Promise { - const { modelBaseUrl } = modelMetadata; + const { modelBaseUrl, modelIdentifier } = modelMetadata; const annotationInfo = new PointCloudObjectProvider([]); @@ -38,6 +38,6 @@ export class LocalPointCloudFactory implements PointCloudFactory { ); pointCloudOctree.name = `PointCloudOctree: ${modelBaseUrl}`; - return new PotreeNodeWrapper(pointCloudOctree, annotationInfo.annotations); + return new PotreeNodeWrapper(pointCloudOctree, annotationInfo.annotations, modelIdentifier.revealInternalId); } } diff --git a/viewer/packages/pointclouds/src/potree-three-loader/rendering/PointCloudMaterial.ts b/viewer/packages/pointclouds/src/potree-three-loader/rendering/PointCloudMaterial.ts index f2167d92901..b6b9c221d62 100644 --- a/viewer/packages/pointclouds/src/potree-three-loader/rendering/PointCloudMaterial.ts +++ b/viewer/packages/pointclouds/src/potree-three-loader/rendering/PointCloudMaterial.ts @@ -298,6 +298,7 @@ export class PointCloudMaterial extends RawShaderMaterial { @requiresShaderUpdate() useClipBox: boolean = false; @requiresShaderUpdate() weighted: boolean = false; + @requiresShaderUpdate() hqDepthPass: boolean = false; @requiresShaderUpdate() pointColorType: PotreePointColorType = PotreePointColorType.Rgb; @requiresShaderUpdate() pointSizeType: PotreePointSizeType = PotreePointSizeType.Adaptive; @requiresShaderUpdate() clipMode: ClipMode = ClipMode.DISABLED; @@ -452,6 +453,10 @@ export class PointCloudMaterial extends RawShaderMaterial { define('weighted_splats'); } + if (this.hqDepthPass) { + define('hq_depth_pass'); + } + if (this.numClipBoxes > 0) { define('use_clip_box'); } diff --git a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/normalize.frag b/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/normalize.frag deleted file mode 100644 index 4cc22a92ad0..00000000000 --- a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/normalize.frag +++ /dev/null @@ -1,24 +0,0 @@ - -#extension GL_EXT_frag_depth : enable - -uniform sampler2D depthMap; -uniform sampler2D texture; - -in vec2 vUv; - -out vec4 outputColor - -void main() { - float depth = texture2D(depthMap, vUv).g; - - if(depth <= 0.0){ - discard; - } - - vec4 color = texture2D(texture, vUv); - color = color / color.w; - - outputColor = vec4(color.xyz, 1.0); - - gl_FragDepthEXT = depth; -} diff --git a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/normalize.vert b/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/normalize.vert deleted file mode 100644 index e2d133af32d..00000000000 --- a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/normalize.vert +++ /dev/null @@ -1,8 +0,0 @@ - -in vec2 vUv; - -void main() { - vUv = uv; - - gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0); -} diff --git a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.frag b/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.frag index 29370004fe3..8bd6ed914b0 100644 --- a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.frag +++ b/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.frag @@ -84,21 +84,13 @@ void main() { float v = 2.0 * gl_PointCoord.y - 1.0; #endif - #if defined(circle_point_shape) || defined (weighted_splats) + #if defined(circle_point_shape) float cc = u*u + v*v; if(cc > 1.0){ discard; } #endif - #if defined weighted_splats - vec2 uv = gl_FragCoord.xy / vec2(screenWidth, screenHeight); - float sDepth = texture(depthMap, uv).r; - if(vLinearDepth > sDepth + vRadius + blendDepthSupplement){ - discard; - } - #endif - #if defined color_type_point_index outputColor = vec4(color, pcIndex / 255.0); #else @@ -255,19 +247,6 @@ void main() { #endif - #if defined weighted_splats - //float w = pow(1.0 - (u*u + v*v), blendHardness); - - float wx = 2.0 * length(2.0 * gl_PointCoord - 1.0); - float w = exp(-wx * wx * 0.5); - - //float distance = length(2.0 * gl_PointCoord - 1.0); - //float w = exp( -(distance * distance) / blendHardness); - - outputColor.rgb = outputColor.rgb * w; - outputColor.a = w; - #endif - #if defined paraboloid_point_shape float wi = 0.0 - ( u*u + v*v); vec4 pos = vec4(vViewPosition, 1.0); @@ -294,6 +273,16 @@ void main() { #endif #endif + #if defined weighted_splats + float distance = 2.0 * length(gl_PointCoord.xy - 0.5); + float weight = max(0.0, 1.0 - distance); + weight = pow(weight, 1.5); + + outputColor.a = weight; + outputColor.rgb = outputColor.rgb * weight; + + #endif + #ifdef highlight_point if (vHighlight > 0.0) { outputColor = highlightedPointColor; diff --git a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.vert b/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.vert index 06d4dfc66e1..09de727351d 100644 --- a/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.vert +++ b/viewer/packages/pointclouds/src/potree-three-loader/rendering/shaders/pointcloud.vert @@ -138,7 +138,7 @@ out vec3 vColor; out vec3 vViewPosition; #endif -#if defined(weighted_splats) || defined(paraboloid_point_shape) +#if defined(weighted_splats) || defined(paraboloid_point_shape) || defined(hq_depth_pass) out float vRadius; #endif @@ -421,8 +421,8 @@ vec3 getCompositeColor() { void main() { vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); - vec4 classification = getClassification(); - float outColorAlpha = classification.a; + vec4 classification = getClassification(); + float outColorAlpha = classification.a; gl_Position = projectionMatrix * mvPosition; @@ -462,7 +462,7 @@ void main() { pointSize = max(minSize, pointSize); pointSize = min(maxSize, pointSize); - #if defined(weighted_splats) || defined(paraboloid_point_shape) + #if defined(weighted_splats) || defined(paraboloid_point_shape) || defined(hq_depth_pass) vRadius = pointSize / projFactor; #endif @@ -568,6 +568,15 @@ void main() { return; } + #if defined hq_depth_pass + float originalDepth = gl_Position.w; + float adjustedDepth = originalDepth + 2.0 * vRadius; + float adjust = adjustedDepth / originalDepth; + + mvPosition.xyz = mvPosition.xyz * adjust; + gl_Position = projectionMatrix * mvPosition; + #endif + // --------------------- // CLIPPING // --------------------- diff --git a/viewer/packages/pointclouds/src/potree-three-loader/tree/PointCloudOctree.ts b/viewer/packages/pointclouds/src/potree-three-loader/tree/PointCloudOctree.ts index 23f0462e59c..10f25bac66e 100644 --- a/viewer/packages/pointclouds/src/potree-three-loader/tree/PointCloudOctree.ts +++ b/viewer/packages/pointclouds/src/potree-three-loader/tree/PointCloudOctree.ts @@ -12,6 +12,7 @@ import { IPointCloudTreeNodeBase } from './IPointCloudTreeNodeBase'; import { IPointCloudTreeNode } from './IPointCloudTreeNode'; import { computeTransformedBoundingBox } from '../utils/bounds'; import { PointCloudObjectProvider } from '../../styling/PointCloudObjectProvider'; +import { RenderLayer } from '@reveal/rendering'; export class PointCloudOctree extends PointCloudTree { potree: IPotree; @@ -93,6 +94,7 @@ export class PointCloudOctree extends PointCloudTree { points.position.copy(geometryNode.boundingBox.min); points.frustumCulled = false; points.onBeforeRender = PointCloudMaterial.makeOnBeforeRender(this, node); + points.layers.set(RenderLayer.PointCloud); if (parent) { parent.sceneNode.add(points); diff --git a/viewer/packages/rendering/app/index.ts b/viewer/packages/rendering/app/index.ts deleted file mode 100644 index e9f1cd1f7b0..00000000000 --- a/viewer/packages/rendering/app/index.ts +++ /dev/null @@ -1,320 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ - -import * as THREE from 'three'; -import dat from 'dat.gui'; -import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; -import { TransformControls } from 'three/examples/jsm/controls/TransformControls'; -import { CadModelFactory } from '../../cad-model/src/CadModelFactory'; -import { - AntiAliasingMode, - CadMaterialManager, - defaultRenderOptions, - DefaultRenderPipelineProvider -} from '@reveal/rendering'; -import { - CdfModelDataProvider, - CdfModelIdentifier, - CdfModelMetadataProvider, - LocalModelDataProvider, - LocalModelIdentifier, - LocalModelMetadataProvider, - ModelDataProvider, - ModelIdentifier, - ModelMetadataProvider -} from '../../modeldata-api'; -import { CadManager } from '../../cad-geometry-loaders/src/CadManager'; -import { NumericRange, revealEnv, SceneHandler } from '@reveal/utilities'; -import { createApplicationSDK } from '../../../test-utilities/src/appUtils'; -import { CadModelUpdateHandler, defaultDesktopCadModelBudget } from '../../cad-geometry-loaders'; -import { ByScreenSizeSectorCuller } from '../../cad-geometry-loaders/src/sector/culling/ByScreenSizeSectorCuller'; -import { StepPipelineExecutor } from '../src/pipeline-executors/StepPipelineExecutor'; -import { CognitePointCloudModel, createPointCloudManager } from '../../pointclouds'; -import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@reveal/cad-styling'; - -revealEnv.publicPath = 'https://apps-cdn.cogniteapp.com/@cognite/reveal-parser-worker/1.2.0/'; - -init(); - -async function init() { - const gui = new dat.GUI(); - - const guiData = { - drawCalls: 0, - gpuFrameTime: 1.1, - triangleCount: 0, - steps: 6, - canvasColor: '#50728c', - clearColor: '#444', - clearAlpha: 1 - }; - - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const { metadataProvider, dataProvider, modelIdentifier } = await createModelProviders(urlParams); - - const materialManager = new CadMaterialManager(); - const cadModelFactory = new CadModelFactory(materialManager, metadataProvider, dataProvider); - const cadModelUpdateHandler = new CadModelUpdateHandler(new ByScreenSizeSectorCuller(), false); - - const renderer = new THREE.WebGLRenderer(); - renderer.setPixelRatio(window.devicePixelRatio); - renderer.setSize(window.innerWidth, window.innerHeight); - renderer.setClearColor(guiData.clearColor); - renderer.setClearAlpha(guiData.clearAlpha); - - const sceneHandler = new SceneHandler(); - - const pointCloudManager = createPointCloudManager(metadataProvider, dataProvider, sceneHandler.scene, renderer); - pointCloudManager.pointBudget = 1_000_000; - const cadManager = new CadManager(materialManager, cadModelFactory, cadModelUpdateHandler); - cadManager.budget = defaultDesktopCadModelBudget; - - const modelOutputs = (await metadataProvider.getModelOutputs(modelIdentifier)).map(outputs => outputs.format); - - let model: THREE.Object3D; - let boundingBox: THREE.Box3; - if (modelOutputs.includes('gltf-directory') || modelOutputs.includes('reveal-directory')) { - const cadModel = await cadManager.addModel(modelIdentifier); - sceneHandler.addCadModel(cadModel, cadModel.cadModelIdentifier); - model = cadModel; - boundingBox = (cadModel as any)._cadModelMetadata.scene.getBoundsOfMostGeometry().clone(); - boundingBox.applyMatrix4(model.children[0].matrix); - - const nodeAppearanceProvider = materialManager.getModelNodeAppearanceProvider('0'); - nodeAppearanceProvider.assignStyledNodeCollection( - new TreeIndexNodeCollection(new NumericRange(0, 10)), - DefaultNodeAppearance.Ghosted - ); - - nodeAppearanceProvider.assignStyledNodeCollection( - new TreeIndexNodeCollection(new NumericRange(10, 20)), - DefaultNodeAppearance.Highlighted - ); - - nodeAppearanceProvider.assignStyledNodeCollection(new TreeIndexNodeCollection(new NumericRange(40, 41)), { - ...DefaultNodeAppearance.Default, - outlineColor: 6 - }); - } else if (modelOutputs.includes('ept-pointcloud')) { - const pointCloudNode = await pointCloudManager.addModel(modelIdentifier); - const pointcloudModel = new CognitePointCloudModel(0, 0, pointCloudNode); - boundingBox = pointcloudModel.getModelBoundingBox(); - sceneHandler.addCustomObject(pointCloudNode); - model = pointCloudNode; - } else { - throw Error(`Unknown output format ${modelOutputs}`); - } - - model.updateMatrix(); - model.updateWorldMatrix(true, true); - - const camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000); - - let needsRedraw = false; - - const renderOptions = defaultRenderOptions; - renderOptions.multiSampleCountHint = 4; - - const pipelineExecutor = new StepPipelineExecutor(renderer); - - let defaultRenderPipeline = new DefaultRenderPipelineProvider(materialManager, sceneHandler, defaultRenderOptions); - - setTimeout(() => { - guiData.steps = pipelineExecutor.calcNumSteps(defaultRenderPipeline); - pipelineExecutor.numberOfSteps = guiData.steps; - }, 1000); - - const stepController = gui - .add(guiData, 'steps', 1, pipelineExecutor.calcNumSteps(defaultRenderPipeline), 1) - .onChange(async () => { - pipelineExecutor.numberOfSteps = guiData.steps; - renderer.setClearColor(guiData.clearColor); - renderer.setClearAlpha(guiData.clearAlpha); - needsRedraw = true; - }); - - const stats = gui.addFolder('frame stats'); - const drawCallController = stats.add(guiData, 'drawCalls'); - const gpuFrameTimeController = stats.add(guiData, 'gpuFrameTime'); - const triangleCountController = stats.add(guiData, 'triangleCount'); - stats.open(); - - const grid = new THREE.GridHelper(30, 40); - grid.position.set(14, -1, -14); - sceneHandler.addCustomObject(grid); - - const customBox = new THREE.Mesh( - new THREE.BoxGeometry(10, 10, 30), - new THREE.MeshBasicMaterial({ - color: new THREE.Color(1, 0, 0), - transparent: true, - opacity: 0.5, - depthTest: false - }) - ); - - customBox.position.set(15, 0, -15); - sceneHandler.addCustomObject(customBox); - - const controlsTest = new TransformControls(camera, renderer.domElement); - controlsTest.attach(customBox); - sceneHandler.addCustomObject(controlsTest); - - renderer.domElement.style.backgroundColor = guiData.canvasColor; - - const controls = new OrbitControls(camera, renderer.domElement); - - fitCameraToBoundingBox(boundingBox, camera, controls); - - cadModelUpdateHandler.updateCamera(camera); - - document.body.appendChild(renderer.domElement); - - const updateRenderOptions = async () => { - defaultRenderPipeline.dispose(); - defaultRenderPipeline = new DefaultRenderPipelineProvider(materialManager, sceneHandler, renderOptions); - - needsRedraw = true; - }; - - const renderOptionsGUI = gui.addFolder('Render Options'); - renderOptionsGUI.open(); - - renderOptionsGUI.addColor(guiData, 'clearColor').onChange(async () => { - renderer.setClearColor(guiData.clearColor); - renderer.setClearAlpha(guiData.clearAlpha); - needsRedraw = true; - }); - - renderOptionsGUI.add(guiData, 'clearAlpha', 0, 1).onChange(async () => { - renderer.setClearColor(guiData.clearColor); - renderer.setClearAlpha(guiData.clearAlpha); - needsRedraw = true; - }); - - renderOptionsGUI.addColor(guiData, 'canvasColor').onChange(async () => { - renderer.domElement.style.backgroundColor = guiData.canvasColor; - }); - - const edgeDetectionParametersGUI = renderOptionsGUI.addFolder('Edge Detection'); - edgeDetectionParametersGUI.add(renderOptions.edgeDetectionParameters, 'enabled').onChange(updateRenderOptions); - edgeDetectionParametersGUI.open(); - - const antiAliasingGui = renderOptionsGUI.addFolder('Anti Aliasing'); - antiAliasingGui - .add(renderOptions, 'antiAliasing', { NoAA: AntiAliasingMode.NoAA, FXAA: AntiAliasingMode.FXAA }) - .onChange(updateRenderOptions); - antiAliasingGui - .add(renderOptions, 'multiSampleCountHint', [0, 2, 4, 8, 16]) - .name('MSAA count') - .onChange(async () => { - updateRenderOptions(); - }); - antiAliasingGui.open(); - - const ssaoOptionsGui = renderOptionsGUI.addFolder('SSAO'); - ssaoOptionsGui.add(renderOptions.ssaoRenderParameters, 'sampleRadius', 0, 30).onChange(updateRenderOptions); - ssaoOptionsGui.add(renderOptions.ssaoRenderParameters, 'sampleSize', 0, 256, 1).onChange(updateRenderOptions); - ssaoOptionsGui.add(renderOptions.ssaoRenderParameters, 'depthCheckBias', 0, 1).onChange(updateRenderOptions); - ssaoOptionsGui.open(); - - controls.addEventListener('change', async () => { - cadModelUpdateHandler.updateCamera(camera); - pointCloudManager.updateCamera(camera); - needsRedraw = true; - }); - - let timings: number[] = []; - - const render = () => { - pipelineExecutor.render(defaultRenderPipeline, camera); - guiData.drawCalls = renderer.info.render.calls; - drawCallController.updateDisplay(); - if (pipelineExecutor.timings.length > 0) { - if (timings.length >= 20) { - guiData.gpuFrameTime = timings.reduce((sum, current) => sum + current, 0) / timings.length; - gpuFrameTimeController.updateDisplay(); - timings = []; - } else { - timings.push(pipelineExecutor.timings[pipelineExecutor.timings.length - 1]); - } - } - - const numberOfSteps = pipelineExecutor.calcNumSteps(defaultRenderPipeline); - stepController.max(numberOfSteps); - guiData.steps = Math.min(numberOfSteps, guiData.steps); - stepController.updateDisplay(); - guiData.triangleCount = renderer.info.render.triangles; - triangleCountController.updateDisplay(); - }; - - const animate = () => { - controls.update(); - requestAnimationFrame(animate); - if (!cadManager.needsRedraw && !needsRedraw) { - return; - } - render(); - - cadManager.resetRedraw(); - pointCloudManager.resetRedraw(); - needsRedraw = false; - }; - - animate(); -} - -function fitCameraToBoundingBox( - box: THREE.Box3, - camera: THREE.PerspectiveCamera, - controls: OrbitControls, - radiusFactor: number = 2 -): void { - const center = new THREE.Vector3().lerpVectors(box.min, box.max, 0.5); - const radius = 0.5 * new THREE.Vector3().subVectors(box.max, box.min).length(); - const boundingSphere = new THREE.Sphere(center, radius); - - const target = boundingSphere.center; - const distance = boundingSphere.radius * radiusFactor; - const direction = new THREE.Vector3(0, 0, -1); - direction.applyQuaternion(camera.quaternion); - - const position = new THREE.Vector3(); - position.copy(direction).multiplyScalar(-distance).add(target); - - camera.position.copy(position); - controls.target.copy(target); -} - -async function createModelProviders(urlParams: URLSearchParams): Promise<{ - metadataProvider: ModelMetadataProvider; - dataProvider: ModelDataProvider; - modelIdentifier: ModelIdentifier; -}> { - if (urlParams.has('modelUrl')) { - const modelUrl = urlParams.get('modelUrl')!; - const modelIdentifier = new LocalModelIdentifier(modelUrl); - const metadataProvider = new LocalModelMetadataProvider(); - const dataProvider = new LocalModelDataProvider(); - return { metadataProvider, dataProvider, modelIdentifier }; - } else { - const client = await createApplicationSDK('reveal.example.simple', { - project: '3d-test', - cluster: 'greenfield', - clientId: 'a03a8caf-7611-43ac-87f3-1d493c085579', - tenantId: '20a88741-8181-4275-99d9-bd4451666d6e' - }); - - // Defaults to all-primitives model on 3d-test - const modelId = parseInt(urlParams.get('modelId') ?? '1791160622840317'); - const revisionId = parseInt(urlParams.get('revisionId') ?? '498427137020189'); - - const modelIdentifier = new CdfModelIdentifier(modelId, revisionId); - const metadataProvider = new CdfModelMetadataProvider(client); - const dataProvider = new CdfModelDataProvider(client); - - return { metadataProvider, dataProvider, modelIdentifier }; - } -} diff --git a/viewer/packages/rendering/index.ts b/viewer/packages/rendering/index.ts index 8c845b31542..c084d795161 100644 --- a/viewer/packages/rendering/index.ts +++ b/viewer/packages/rendering/index.ts @@ -19,6 +19,7 @@ export { } from './src/rendering/types'; export { RenderMode } from './src/rendering/RenderMode'; +export { RenderLayer } from './src/utilities/renderUtilities'; export { coverageShaders } from './src/rendering/shaders'; export { Materials } from './src/rendering/materials'; diff --git a/viewer/packages/rendering/package.json b/viewer/packages/rendering/package.json index a05502b2336..665199d824f 100644 --- a/viewer/packages/rendering/package.json +++ b/viewer/packages/rendering/package.json @@ -3,7 +3,7 @@ "private": true, "main": "index.ts", "scripts": { - "start": "yarn ws:start", + "start": "yarn ws:serve --env testFixture=Rendering.VisualTest.ts", "test": "yarn ws:test --config ./../../jest.config.js", "lint": "yarn ws:lint" }, @@ -11,6 +11,7 @@ "@reveal/cad-parsers": "workspace:*", "@reveal/cad-styling": "workspace:*", "@reveal/logger": "workspace:*", + "@reveal/pointclouds": "workspace:*", "@reveal/utilities": "workspace:*" }, "sideEffects": false, diff --git a/viewer/packages/rendering/src/RenderPipelineExecutor.ts b/viewer/packages/rendering/src/RenderPipelineExecutor.ts index f1f129a8500..894742a0cc9 100644 --- a/viewer/packages/rendering/src/RenderPipelineExecutor.ts +++ b/viewer/packages/rendering/src/RenderPipelineExecutor.ts @@ -11,4 +11,5 @@ import { RenderPipelineProvider } from './RenderPipelineProvider'; */ export interface RenderPipelineExecutor { render(renderPipeline: RenderPipelineProvider, camera: THREE.Camera): void; + dispose(): void; } diff --git a/viewer/packages/rendering/src/glsl/base/determineNodeAppearance.glsl b/viewer/packages/rendering/src/glsl/base/determineNodeAppearance.glsl index c8655e71ca4..50d83409ed4 100644 --- a/viewer/packages/rendering/src/glsl/base/determineNodeAppearance.glsl +++ b/viewer/packages/rendering/src/glsl/base/determineNodeAppearance.glsl @@ -1,17 +1,14 @@ #pragma glslify: import('../math/floatBitsSubset.glsl') -NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) { - treeIndex = floor(treeIndex + 0.5); +NodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, highp float treeIndex) { + float dataTextureWidth = textureSize.x; float dataTextureHeight = textureSize.y; - float u = mod(treeIndex, dataTextureWidth); - float v = floor(treeIndex / dataTextureWidth); - float uCoord = (u + 0.5) / dataTextureWidth; - float vCoord = (v + 0.5) / dataTextureHeight; - vec2 treeIndexUv = vec2(uCoord, vCoord); - - vec4 texel = texture(nodeAppearanceTexture, treeIndexUv); + int xTreeIndexTextureCoord = int(mod(treeIndex, dataTextureWidth)); + int yTreeIndexTextureCoord = int(floor(treeIndex / dataTextureWidth)); + + vec4 texel = texelFetch(nodeAppearanceTexture, ivec2(xTreeIndexTextureCoord, yTreeIndexTextureCoord), 0); float alphaUnwrapped = floor((texel.a * 255.0) + 0.5); bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0; diff --git a/viewer/packages/rendering/src/glsl/pointcloud/normalize.frag b/viewer/packages/rendering/src/glsl/pointcloud/normalize.frag new file mode 100644 index 00000000000..40f3f10bc26 --- /dev/null +++ b/viewer/packages/rendering/src/glsl/pointcloud/normalize.frag @@ -0,0 +1,25 @@ +precision highp float; + +uniform sampler2D tDepth; +uniform sampler2D tDiffuse; + +in vec2 vUv; + +out vec4 outputColor; + +void main() { + float depth = texture(tDepth, vUv).r; + + if(depth >= 1.0){ + discard; + } + + vec4 color = texture(tDiffuse, vUv); + #if defined(points_blend) + color = color / color.w; + #endif + + outputColor = vec4(color.xyz, 1.0); + + gl_FragDepth = depth; +} diff --git a/viewer/packages/rendering/src/glsl/pointcloud/normalize.vert b/viewer/packages/rendering/src/glsl/pointcloud/normalize.vert new file mode 100644 index 00000000000..06e5e3b3c46 --- /dev/null +++ b/viewer/packages/rendering/src/glsl/pointcloud/normalize.vert @@ -0,0 +1,14 @@ +uniform mat4 modelMatrix; +uniform mat4 projectionMatrix; + +in vec3 position; +in vec2 uv; + +out vec2 vUv; + +const mat4 unitOrthographicProjection = mat4(1., 0., 0., 0., 0., 1., 0., 0., 0., 0., -1., 0., 0., 0., 0., 1.); + +void main() { + vUv = uv; + gl_Position = unitOrthographicProjection * modelMatrix * vec4(position, 1.0); +} diff --git a/viewer/packages/rendering/src/glsl/sector/instancedMesh.frag b/viewer/packages/rendering/src/glsl/sector/instancedMesh.frag index a240f866c96..82d442ae866 100644 --- a/viewer/packages/rendering/src/glsl/sector/instancedMesh.frag +++ b/viewer/packages/rendering/src/glsl/sector/instancedMesh.frag @@ -13,7 +13,7 @@ uniform sampler2D matCapTexture; uniform vec2 treeIndexTextureSize; uniform int renderMode; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_viewPosition; diff --git a/viewer/packages/rendering/src/glsl/sector/instancedMesh.vert b/viewer/packages/rendering/src/glsl/sector/instancedMesh.vert index be0051102d5..6eb366b534e 100644 --- a/viewer/packages/rendering/src/glsl/sector/instancedMesh.vert +++ b/viewer/packages/rendering/src/glsl/sector/instancedMesh.vert @@ -13,17 +13,17 @@ in mat4 a_instanceMatrix; in float a_treeIndex; in vec3 a_color; -out float v_treeIndex; +flat out float v_treeIndex; out vec3 v_color; out vec3 v_viewPosition; void main() { mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/mesh.frag b/viewer/packages/rendering/src/glsl/sector/mesh.frag index 8be2b2d2cd0..21750f71b64 100644 --- a/viewer/packages/rendering/src/glsl/sector/mesh.frag +++ b/viewer/packages/rendering/src/glsl/sector/mesh.frag @@ -13,7 +13,7 @@ uniform sampler2D matCapTexture; uniform vec2 treeIndexTextureSize; uniform int renderMode; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_viewPosition; diff --git a/viewer/packages/rendering/src/glsl/sector/mesh.vert b/viewer/packages/rendering/src/glsl/sector/mesh.vert index c69974283ff..655cb968996 100644 --- a/viewer/packages/rendering/src/glsl/sector/mesh.vert +++ b/viewer/packages/rendering/src/glsl/sector/mesh.vert @@ -10,10 +10,10 @@ uniform sampler2D transformOverrideTexture; in vec3 position; in vec3 color; -in float treeIndex; +in float treeIndex; out vec3 v_color; -out float v_treeIndex; +flat out float v_treeIndex; out vec3 v_viewPosition; void main() { @@ -21,10 +21,10 @@ void main() { v_treeIndex = treeIndex; mat4 treeIndexWorldTransform = determineMatrixOverride( - treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/circle.frag b/viewer/packages/rendering/src/glsl/sector/primitives/circle.frag index 9a677e1a2f5..be4afb401ec 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/circle.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/circle.frag @@ -12,7 +12,7 @@ uniform sampler2D matCapTexture; uniform vec2 treeIndexTextureSize; uniform int renderMode; -in float v_treeIndex; +flat in float v_treeIndex; in vec2 v_xy; in vec3 v_color; in vec3 v_normal; @@ -23,7 +23,7 @@ void main() { vec3 normal = normalize( v_normal ); if (dist > 0.25) discard; - + NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex); if (!determineVisibility(appearance, renderMode)) { discard; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/circle.vert b/viewer/packages/rendering/src/glsl/sector/primitives/circle.vert index 8a784c0ec3b..3a64c34320a 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/circle.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/circle.vert @@ -19,7 +19,7 @@ in vec3 a_normal; out vec2 v_xy; out vec3 v_color; out vec3 v_normal; -out float v_treeIndex; +flat out float v_treeIndex; out vec3 vViewPosition; void main() { @@ -27,10 +27,10 @@ void main() { v_treeIndex = a_treeIndex; mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/cone.frag b/viewer/packages/rendering/src/glsl/sector/primitives/cone.frag index 54fd6732bbc..612eca21d6f 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/cone.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/cone.frag @@ -24,7 +24,7 @@ in float v_angle; in float v_arcAngle; in vec4 v_centerA; in vec4 v_V; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/cone.vert b/viewer/packages/rendering/src/glsl/sector/primitives/cone.vert index 909d2e056c7..2a2a13a4c93 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/cone.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/cone.vert @@ -25,7 +25,7 @@ in vec3 a_localXAxis; in float a_angle; in float a_arcAngle; -out float v_treeIndex; +flat out float v_treeIndex; // We pack the radii into w-components out vec4 v_centerB; // U, V, axis represent the 3x3 cone basis. @@ -42,10 +42,10 @@ out vec3 v_normal; void main() { mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.frag b/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.frag index c4dbd47bd4d..be54d2bd54b 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.frag @@ -23,7 +23,7 @@ in vec4 axis; in vec4 v_centerA; in vec4 v_centerB; in float height; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.vert b/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.vert index b8fc01ee1d0..b7ff8e85094 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/eccentricCone.vert @@ -22,7 +22,7 @@ in float a_radiusB; in vec3 a_normal; in vec3 a_color; -out float v_treeIndex; +flat out float v_treeIndex; // We pack the radii into w-components out vec4 v_centerA; out vec4 v_centerB; @@ -39,10 +39,10 @@ out vec3 v_normal; void main() { mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.frag b/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.frag index 12456bd4822..be59a6d0cce 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.frag @@ -22,7 +22,7 @@ in float height; in vec4 U; in vec4 V; in vec4 sphereNormal; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.vert b/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.vert index 82b2fdc85aa..395ea924313 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/ellipsoidSegment.vert @@ -22,7 +22,7 @@ in float a_horizontalRadius; in float a_verticalRadius; in float a_height; -out float v_treeIndex; +flat out float v_treeIndex; // We pack vRadius as w-component of center out vec4 center; out float hRadius; @@ -39,10 +39,10 @@ out vec3 v_normal; void main() { mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.frag b/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.frag index b8a5abede4a..ffa6ddd9a98 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.frag @@ -29,7 +29,7 @@ in float v_arcAngle; in float v_surfacePointY; in vec4 v_planeA; in vec4 v_planeB; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; @@ -39,7 +39,7 @@ void main() { discard; } - vec4 color = determineColor(v_color, appearance); + vec4 color = determineColor(v_color, appearance); vec3 normal = normalize( v_normal ); float R1 = v_centerB.w; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.vert b/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.vert index 6aa92bbb1bc..692e0158e7c 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/generalCylinder.vert @@ -27,7 +27,7 @@ in vec3 a_localXAxis; in float a_angle; in float a_arcAngle; -out float v_treeIndex; +flat out float v_treeIndex; // We pack the radii into w-components out vec4 v_centerB; // U, V, axis represent the 3x3 cone basis. @@ -48,13 +48,13 @@ void main() { mat4 modelViewMatrix = viewMatrix * modelMatrix; mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); - + mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix; vec3 centerA = mul3(modelTransformOffset, a_centerA); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/generalring.frag b/viewer/packages/rendering/src/glsl/sector/primitives/generalring.frag index 8e6f263502d..07f77f5cc36 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/generalring.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/generalring.frag @@ -17,7 +17,7 @@ in float v_oneMinusThicknessSqr; in vec2 v_xy; in float v_angle; in float v_arcAngle; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; in vec3 vViewPosition; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/generalring.vert b/viewer/packages/rendering/src/glsl/sector/primitives/generalring.vert index 3fedd6419c7..5b126768360 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/generalring.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/generalring.vert @@ -19,7 +19,7 @@ in float a_arcAngle; in float a_thickness; in vec3 a_normal; -out float v_treeIndex; +flat out float v_treeIndex; out float v_oneMinusThicknessSqr; out vec2 v_xy; out float v_angle; @@ -36,10 +36,10 @@ void main() { v_arcAngle = a_arcAngle; mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.frag b/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.frag index e7b165f6ef2..f03220795af 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.frag @@ -22,7 +22,7 @@ in float height; in vec4 U; in vec4 V; in vec4 sphereNormal; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; @@ -32,7 +32,7 @@ void main() { discard; } - vec4 color = determineColor(v_color, appearance); + vec4 color = determineColor(v_color, appearance); vec3 normal = normalize(sphereNormal.xyz); float vRadius = center.w; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.vert b/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.vert index 4f0cb0c7653..6c48c42f8a7 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/sphericalSegment.vert @@ -17,7 +17,7 @@ in float a_horizontalRadius; in float a_verticalRadius; in float a_height; -out float v_treeIndex; +flat out float v_treeIndex; // We pack vRadius as w-component of center out vec4 center; out float hRadius; diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.frag b/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.frag index 3f9ee06229b..81133c39e96 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.frag @@ -12,7 +12,7 @@ uniform sampler2D matCapTexture; uniform vec2 treeIndexTextureSize; uniform int renderMode; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; in vec3 vViewPosition; @@ -26,7 +26,7 @@ void main() { discard; } - vec4 color = determineColor(v_color, appearance); + vec4 color = determineColor(v_color, appearance); vec3 normal = normalize(v_normal); updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive); } diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.vert b/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.vert index 3f6782a6238..ccde5fa310a 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/torusSegment.vert @@ -18,7 +18,7 @@ in float a_arcAngle; in float a_radius; in float a_tubeRadius; -out float v_treeIndex; +flat out float v_treeIndex; out vec3 v_color; out vec3 v_normal; out vec3 vViewPosition; @@ -36,13 +36,13 @@ void main() { pos3.z = a_tubeRadius * sin(phi); mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); - + vec3 transformed = (a_instanceMatrix * vec4(pos3, 1.0)).xyz; // Calculate normal vectors if we're not picking diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.frag b/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.frag index 3f9ee06229b..81133c39e96 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.frag +++ b/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.frag @@ -12,7 +12,7 @@ uniform sampler2D matCapTexture; uniform vec2 treeIndexTextureSize; uniform int renderMode; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; in vec3 vViewPosition; @@ -26,7 +26,7 @@ void main() { discard; } - vec4 color = determineColor(v_color, appearance); + vec4 color = determineColor(v_color, appearance); vec3 normal = normalize(v_normal); updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive); } diff --git a/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.vert b/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.vert index 4a03a9385af..484a17d0e35 100644 --- a/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.vert +++ b/viewer/packages/rendering/src/glsl/sector/primitives/trapezium.vert @@ -18,7 +18,7 @@ in vec3 a_vertex2; in vec3 a_vertex3; in vec3 a_vertex4; -out float v_treeIndex; +flat out float v_treeIndex; out vec3 v_color; out vec3 v_normal; out vec3 vViewPosition; @@ -33,10 +33,10 @@ void main() { } mat4 treeIndexWorldTransform = determineMatrixOverride( - a_treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + a_treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/glsl/sector/simple.frag b/viewer/packages/rendering/src/glsl/sector/simple.frag index a1fdf46dd2e..6c8cbc89dc9 100644 --- a/viewer/packages/rendering/src/glsl/sector/simple.frag +++ b/viewer/packages/rendering/src/glsl/sector/simple.frag @@ -12,7 +12,7 @@ uniform sampler2D matCapTexture; uniform vec2 treeIndexTextureSize; uniform int renderMode; -in float v_treeIndex; +flat in float v_treeIndex; in vec3 v_color; in vec3 v_normal; in vec3 vViewPosition; diff --git a/viewer/packages/rendering/src/glsl/sector/simple.vert b/viewer/packages/rendering/src/glsl/sector/simple.vert index 6c2e7c76913..cfbf355fad2 100644 --- a/viewer/packages/rendering/src/glsl/sector/simple.vert +++ b/viewer/packages/rendering/src/glsl/sector/simple.vert @@ -19,18 +19,18 @@ in vec4 matrix1; in vec4 matrix2; in vec4 matrix3; -out float v_treeIndex; +flat out float v_treeIndex; out vec3 v_color; out vec3 v_normal; out vec3 vViewPosition; void main() { - + mat4 treeIndexWorldTransform = determineMatrixOverride( - treeIndex, - treeIndexTextureSize, - transformOverrideIndexTexture, - transformOverrideTextureSize, + treeIndex, + treeIndexTextureSize, + transformOverrideIndexTexture, + transformOverrideTextureSize, transformOverrideTexture ); diff --git a/viewer/packages/rendering/src/pipeline-executors/BasicPipelineExecutor.ts b/viewer/packages/rendering/src/pipeline-executors/BasicPipelineExecutor.ts index 15dcf15808b..d7ab7f4c3c4 100644 --- a/viewer/packages/rendering/src/pipeline-executors/BasicPipelineExecutor.ts +++ b/viewer/packages/rendering/src/pipeline-executors/BasicPipelineExecutor.ts @@ -6,18 +6,96 @@ import * as THREE from 'three'; import { RenderPipelineExecutor } from '../RenderPipelineExecutor'; import { RenderPipelineProvider } from '../RenderPipelineProvider'; +export type BasicPipelineExecutorOptions = { + autoResizeRenderer: boolean; + resolutionThreshold?: number; +}; + export class BasicPipelineExecutor implements RenderPipelineExecutor { + private readonly _defaultResolutionThreshold = 1.4e6; + private readonly _renderer: THREE.WebGLRenderer; + private readonly _resolutionThreshold: number; + private readonly _resizeObserver: ResizeObserver | undefined; - constructor(renderer: THREE.WebGLRenderer) { + private _shouldResize: boolean; + + constructor(renderer: THREE.WebGLRenderer, options?: BasicPipelineExecutorOptions) { this._renderer = renderer; + this._resolutionThreshold = options?.resolutionThreshold ?? this._defaultResolutionThreshold; + + const autoResizeRenderer = options?.autoResizeRenderer ?? false; + this._shouldResize = autoResizeRenderer; + + this._resizeObserver = this.setupResizeListener(autoResizeRenderer, renderer); + renderer.info.autoReset = false; } - public render(renderPipeline: RenderPipelineProvider, camera: THREE.Camera): void { + public render(renderPipeline: RenderPipelineProvider, camera: THREE.PerspectiveCamera): void { this._renderer.info.reset(); + + if (this._shouldResize) { + this.resize(camera); + this._shouldResize = false; + } + for (const renderPass of renderPipeline.pipeline(this._renderer)) { renderPass.render(this._renderer, camera); } } + + private setupResizeListener(autoResizeRenderer: boolean, renderer: THREE.WebGLRenderer): ResizeObserver | undefined { + if (!autoResizeRenderer) { + return; + } + const domElement = renderer.domElement.parentElement; + if (!domElement) { + throw new Error('Canvas does not have a parent element'); + } + const resizeObserver = new ResizeObserver(() => (this._shouldResize = true)); + resizeObserver.observe(domElement); + + return resizeObserver; + } + + private resize(camera: THREE.PerspectiveCamera): void { + const canvas = this._renderer.domElement; + const domElement = canvas.parentElement; + + if (!domElement) { + throw new Error('Canvas does not have a parent element'); + } + + const virtualFramebufferSize = this._renderer.getSize(new THREE.Vector2()); + const pixelRatio = this._renderer.getPixelRatio(); + + const virtualDomElementWidth = domElement.clientWidth !== 0 ? domElement.clientWidth : canvas.clientWidth; + + const virtualDomElementHeight = domElement.clientHeight !== 0 ? domElement.clientHeight : canvas.clientHeight; + + const domElementPhysicalWidth = virtualDomElementWidth * pixelRatio; + const domElementPhysicalHeight = virtualDomElementHeight * pixelRatio; + const domElementPhysicalNumberOfPixels = domElementPhysicalWidth * domElementPhysicalHeight; + + const downScale = + domElementPhysicalNumberOfPixels > this._resolutionThreshold + ? Math.sqrt(this._resolutionThreshold / domElementPhysicalNumberOfPixels) + : 1; + + const newVirtualWidth = Math.round(virtualDomElementWidth * downScale); + const newVirtualHeight = Math.round(virtualDomElementHeight * downScale); + + if (newVirtualWidth === virtualFramebufferSize.x && newVirtualHeight === virtualFramebufferSize.y) { + return; + } + + camera.aspect = newVirtualWidth / newVirtualHeight; + camera.updateProjectionMatrix(); + this._renderer.setDrawingBufferSize(newVirtualWidth, newVirtualHeight, pixelRatio); + } + + dispose(): void { + this._resizeObserver?.disconnect(); + } } diff --git a/viewer/packages/rendering/src/pipeline-executors/StepPipelineExecutor.ts b/viewer/packages/rendering/src/pipeline-executors/StepPipelineExecutor.ts index 95aaa8c0da5..60059ac4b48 100644 --- a/viewer/packages/rendering/src/pipeline-executors/StepPipelineExecutor.ts +++ b/viewer/packages/rendering/src/pipeline-executors/StepPipelineExecutor.ts @@ -54,4 +54,6 @@ export class StepPipelineExecutor implements RenderPipelineExecutor { return count; } + + public dispose(): void {} } diff --git a/viewer/packages/rendering/src/render-passes/PointCloudEffectsPass.ts b/viewer/packages/rendering/src/render-passes/PointCloudEffectsPass.ts new file mode 100644 index 00000000000..ad010071400 --- /dev/null +++ b/viewer/packages/rendering/src/render-passes/PointCloudEffectsPass.ts @@ -0,0 +1,70 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { CognitePointCloudModel, PointCloudMaterial } from '@reveal/pointclouds/'; +import { SceneHandler, WebGLRendererStateHelper } from '@reveal/utilities'; +import * as THREE from 'three'; +import { RenderPass } from '../RenderPass'; +import { getLayerMask, RenderLayer } from '../utilities/renderUtilities'; +import { PointCloudPassParameters } from './types'; + +export class PointCloudEffectsPass implements RenderPass { + private readonly _viewerScene: THREE.Object3D; + private readonly _sceneHandler: SceneHandler; + private readonly _passMaterialParameters: PointCloudPassParameters; + + constructor(sceneHandler: SceneHandler, materialParameters?: PointCloudPassParameters) { + this._viewerScene = sceneHandler.scene; + this._sceneHandler = sceneHandler; + this._passMaterialParameters = materialParameters ?? {}; + } + + public render(renderer: THREE.WebGLRenderer, camera: THREE.Camera): void { + const currentCameraMask = camera.layers.mask; + const rendererStateHelper = new WebGLRendererStateHelper(renderer); + try { + camera.layers.mask = getLayerMask(RenderLayer.PointCloud); + + this._sceneHandler.pointCloudModels.forEach(model => + this.setMaterialParameters((model.object as CognitePointCloudModel).pointCloudNode.potreeNode.octree.material) + ); + + this.setRendererParameters(rendererStateHelper); + + renderer.render(this._viewerScene, camera); + } finally { + rendererStateHelper.resetState(); + + camera.layers.mask = currentCameraMask; + } + } + + private setMaterialParameters(material: PointCloudMaterial): void { + const parameters = this._passMaterialParameters?.material; + if (parameters) { + for (const prop of Object.entries(parameters)) { + try { + //@ts-ignore + material[prop[0]] = prop[1]; + } catch { + console.error(`Undefined point cloud material property: ${prop[0]}`); + } + } + } + } + + private setRendererParameters(rendererHelper: WebGLRendererStateHelper): void { + const parameters = this._passMaterialParameters?.renderer; + if (parameters) { + for (const prop of Object.entries(parameters)) { + try { + //@ts-ignore + rendererHelper[prop[0]] = prop[1]; + } catch { + console.error(`Undefined WebGLRendererStateHelper property: ${prop[0]}`); + } + } + } + } +} diff --git a/viewer/packages/rendering/src/render-passes/PostProcessingPass.ts b/viewer/packages/rendering/src/render-passes/PostProcessingPass.ts index 48d87b52ebc..43bf5c9f786 100644 --- a/viewer/packages/rendering/src/render-passes/PostProcessingPass.ts +++ b/viewer/packages/rendering/src/render-passes/PostProcessingPass.ts @@ -3,13 +3,14 @@ */ import * as THREE from 'three'; -import { transparentBlendOptions } from './types'; +import { PostProcessingObjectsVisibilityParameters, transparentBlendOptions } from './types'; import { RenderPass } from '../RenderPass'; import { createFullScreenTriangleMesh, getBlitMaterial, getDepthBlendBlitMaterial, getLayerMask, + getPointCloudPostProcessingMaterial, RenderLayer } from '../utilities/renderUtilities'; import { PostProcessingPipelineOptions } from '../render-pipeline-providers/types'; @@ -24,10 +25,11 @@ export class PostProcessingPass implements RenderPass { private readonly _scene: THREE.Scene; private readonly _postProcessingObjects: THREE.Mesh[]; - public updateRenderObjectsVisability(hasStyling: { back: boolean; inFront: boolean; ghost: boolean }): void { - this._postProcessingObjects[0].visible = hasStyling.back; - this._postProcessingObjects[1].visible = hasStyling.ghost; - this._postProcessingObjects[2].visible = hasStyling.inFront; + public updateRenderObjectsVisibility(visibilityParameters: PostProcessingObjectsVisibilityParameters): void { + this._postProcessingObjects[0].visible = visibilityParameters.cad.back; + this._postProcessingObjects[1].visible = visibilityParameters.cad.ghost; + this._postProcessingObjects[2].visible = visibilityParameters.cad.inFront; + this._postProcessingObjects[3].visible = visibilityParameters.pointCloud; } constructor(scene: THREE.Scene, postProcessingPipelineOptions: PostProcessingPipelineOptions) { @@ -44,9 +46,20 @@ export class PostProcessingPass implements RenderPass { // Normal un-styled opaque geometry const backBlitObject = createFullScreenTriangleMesh(backBlitMaterial); - backBlitObject.name = 'Back Styling'; + backBlitObject.name = 'Back Styling blit object'; backBlitObject.renderOrder = -1; + const pointcloudBlitMaterial = getPointCloudPostProcessingMaterial({ + texture: postProcessingPipelineOptions.pointCloud.texture, + depthTexture: postProcessingPipelineOptions.pointCloud.depthTexture, + pointBlending: postProcessingPipelineOptions?.pointBlending ?? false + }); + + // rendered pointcloud data + const pointcloudBlitObject = createFullScreenTriangleMesh(pointcloudBlitMaterial); + pointcloudBlitObject.name = 'Point Cloud blit object'; + pointcloudBlitObject.renderOrder = 0; + const ghostBlitMaterial = getBlitMaterial({ texture: postProcessingPipelineOptions.ghost.texture, depthTexture: postProcessingPipelineOptions.ghost.depthTexture, @@ -55,7 +68,7 @@ export class PostProcessingPass implements RenderPass { // Ghosted geometry const ghostBlitObject = createFullScreenTriangleMesh(ghostBlitMaterial); - ghostBlitObject.name = 'Ghost Styling'; + ghostBlitObject.name = 'Ghost Styling blit object'; ghostBlitObject.renderOrder = 1; const inFrontBlitMaterial = getDepthBlendBlitMaterial({ @@ -70,14 +83,15 @@ export class PostProcessingPass implements RenderPass { //In front geometry const inFrontBlitObject = createFullScreenTriangleMesh(inFrontBlitMaterial); - inFrontBlitObject.name = 'In-front Styling'; + inFrontBlitObject.name = 'In-front Styling blit object'; inFrontBlitObject.renderOrder = 2; this._scene.add(backBlitObject); + this._scene.add(pointcloudBlitObject); this._scene.add(ghostBlitObject); this._scene.add(inFrontBlitObject); - this._postProcessingObjects = [backBlitObject, ghostBlitObject, inFrontBlitObject]; + this._postProcessingObjects = [backBlitObject, ghostBlitObject, inFrontBlitObject, pointcloudBlitObject]; } public render(renderer: THREE.WebGLRenderer, camera: THREE.Camera): void { diff --git a/viewer/packages/rendering/src/render-passes/types.ts b/viewer/packages/rendering/src/render-passes/types.ts index b1e35c042da..f922e08534a 100644 --- a/viewer/packages/rendering/src/render-passes/types.ts +++ b/viewer/packages/rendering/src/render-passes/types.ts @@ -2,6 +2,7 @@ * Copyright 2022 Cognite AS */ +import { PotreePointShape } from '@reveal/pointclouds'; import * as THREE from 'three'; export type BlendOptions = { @@ -38,6 +39,12 @@ export type DepthBlendBlitOptions = { outline?: boolean; }; +export type PointCloudPostProcessingOptions = { + texture: THREE.Texture; + depthTexture: THREE.DepthTexture; + pointBlending: boolean; +}; + export const transparentBlendOptions: BlendOptions = { blendDestination: THREE.OneMinusSrcAlphaFactor, blendSource: THREE.SrcAlphaFactor, @@ -48,3 +55,28 @@ export const transparentBlendOptions: BlendOptions = { export type ThreeUniforms = { [uniform: string]: THREE.IUniform; }; + +export type PointCloudPassParameters = { + material?: { + weighted?: boolean; + shape?: PotreePointShape; + hqDepthPass?: boolean; + depthWrite?: boolean; + blending?: THREE.Blending; + blendSrc?: THREE.BlendingDstFactor | THREE.BlendingSrcFactor; + blendDst?: THREE.BlendingDstFactor; + colorWrite?: boolean; + }; + renderer?: { + autoClearDepth?: boolean; + }; +}; + +export type PostProcessingObjectsVisibilityParameters = { + cad: { + back: boolean; + ghost: boolean; + inFront: boolean; + }; + pointCloud: boolean; +}; diff --git a/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.test.ts b/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.test.ts index 0f46fc3be81..0ac7960cdb5 100644 --- a/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.test.ts +++ b/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.test.ts @@ -29,6 +29,8 @@ describe(DefaultRenderPipelineProvider.name, () => { .setup(p => p.setRenderTarget(It.IsAny())) .returns() .setup(p => p.clear()) + .returns() + .setup(p => p.clearColor()) .returns(); }); @@ -144,4 +146,55 @@ describe(DefaultRenderPipelineProvider.name, () => { expect(numberOfRenderPasses).toBe(3); //Back, Post, BlitToCanvas }); + + test('Pipeline with one point cloud model returns 3 passes', () => { + const materialManagerMock = new Mock(); + + const sceneHandler = new SceneHandler(); + + sceneHandler.addPointCloudModel(new THREE.Object3D(), Symbol(0)); + + const defaultRenderPipelineProvider = new DefaultRenderPipelineProvider( + materialManagerMock.object(), + sceneHandler, + defaultRenderOptions + ); + + const pipeline = defaultRenderPipelineProvider.pipeline(rendererMock.object()); + + let numberOfRenderPasses = 0; + for (const _ of pipeline) { + numberOfRenderPasses++; + } + + expect(numberOfRenderPasses).toBe(3); // Point cloud, Post, BlitToCanvas + }); + + test('Pipeline with one point cloud model and point blending enabled returns 4 passes', () => { + const materialManagerMock = new Mock(); + + const sceneHandler = new SceneHandler(); + + sceneHandler.addPointCloudModel(new THREE.Object3D(), Symbol(0)); + + const defaultRenderPipelineProvider = new DefaultRenderPipelineProvider( + materialManagerMock.object(), + sceneHandler, + { + ...defaultRenderOptions, + pointCloudParameters: { + pointBlending: true + } + } + ); + + const pipeline = defaultRenderPipelineProvider.pipeline(rendererMock.object()); + + let numberOfRenderPasses = 0; + for (const _ of pipeline) { + numberOfRenderPasses++; + } + + expect(numberOfRenderPasses).toBe(4); // Point cloud, Post, BlitToCanvas + }); }); diff --git a/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.ts b/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.ts index 93e08bd3240..d0b1ba5d1cc 100644 --- a/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.ts +++ b/viewer/packages/rendering/src/render-pipeline-providers/DefaultRenderPipelineProvider.ts @@ -15,19 +15,25 @@ import { PostProcessingPass } from '../render-passes/PostProcessingPass'; import { SSAOPass } from '../render-passes/SSAOPass'; import { blitShaders } from '../rendering/shaders'; import { SceneHandler, WebGLRendererStateHelper } from '@reveal/utilities'; +import { PointCloudRenderPipelineProvider } from './PointCloudRenderPipelineProvider'; export class DefaultRenderPipelineProvider implements RenderPipelineProvider { - private readonly _cadScene: THREE.Scene; + private readonly _viewerScene: THREE.Scene; private readonly _renderTargetData: RenderTargetData; private readonly _cadModels: { object: THREE.Object3D; modelIdentifier: string; }[]; + private readonly _pointCloudModels: { + object: THREE.Object3D; + modelIdentifier: symbol; + }[]; private readonly _customObjects: THREE.Object3D[]; private readonly _autoResizeOutputTarget: boolean; private readonly _outputRenderTarget: THREE.WebGLRenderTarget | null; private readonly _cadGeometryRenderPipeline: CadGeometryRenderPipelineProvider; - private readonly _postProcessingRenderPipeline: PostProcessingPass; + private readonly _pointCloudRenderPipeline: PointCloudRenderPipelineProvider; + private readonly _postProcessingPass: PostProcessingPass; private readonly _ssaoPass: SSAOPass; private readonly _blitToScreenMaterial: THREE.RawShaderMaterial; private readonly _blitToScreenMesh: THREE.Mesh; @@ -65,7 +71,7 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { } ) { this._materialManager = materialManager; - this._cadScene = sceneHandler.scene; + this._viewerScene = sceneHandler.scene; this._autoResizeOutputTarget = outputRenderTarget?.autoSize ?? true; this._outputRenderTarget = outputRenderTarget?.target ?? null; @@ -75,10 +81,12 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { postProcessingRenderTarget: createRenderTarget() }; this._cadModels = sceneHandler.cadModels; + this._pointCloudModels = sceneHandler.pointCloudModels; this._customObjects = sceneHandler.customObjects; const ssaoParameters = renderOptions.ssaoRenderParameters ?? defaultRenderOptions.ssaoRenderParameters; const edges = renderOptions.edgeDetectionParameters ?? defaultRenderOptions.edgeDetectionParameters; + const pointCloudParameters = renderOptions?.pointCloudParameters ?? defaultRenderOptions.pointCloudParameters; this._cadGeometryRenderPipeline = new CadGeometryRenderPipelineProvider( sceneHandler, @@ -90,9 +98,13 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { ssaoParameters ); - this._postProcessingRenderPipeline = new PostProcessingPass(sceneHandler.scene, { + this._pointCloudRenderPipeline = new PointCloudRenderPipelineProvider(sceneHandler, pointCloudParameters); + + this._postProcessingPass = new PostProcessingPass(sceneHandler.scene, { ssaoTexture: this._renderTargetData.ssaoRenderTarget.texture, edges: edges.enabled, + pointBlending: pointCloudParameters.pointBlending, + ...this._pointCloudRenderPipeline.pointCloudRenderTargets, ...this._cadGeometryRenderPipeline.cadGeometryRenderTargets }); @@ -132,11 +144,18 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { yield this._ssaoPass; } - this._postProcessingRenderPipeline.updateRenderObjectsVisability(hasStyling); + if (this.shouldRenderPointClouds()) { + yield* this._pointCloudRenderPipeline.pipeline(renderer); + } + + this._postProcessingPass.updateRenderObjectsVisibility({ + cad: hasStyling, + pointCloud: this.shouldRenderPointClouds() + }); renderer.setRenderTarget(this._renderTargetData.postProcessingRenderTarget); this._rendererStateHelper!.resetState(); this._rendererStateHelper!.autoClear = true; - yield this._postProcessingRenderPipeline; + yield this._postProcessingPass; renderer.setRenderTarget(this._outputRenderTarget); @@ -152,7 +171,8 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { public dispose(): void { this._cadGeometryRenderPipeline.dispose(); - this._postProcessingRenderPipeline.dispose(); + this._pointCloudRenderPipeline.dispose(); + this._postProcessingPass.dispose(); this._renderTargetData.postProcessingRenderTarget.dispose(); @@ -168,7 +188,7 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { this._cadModels.forEach(cadModel => { cadModel.object.matrixAutoUpdate = false; }); - this._cadScene.autoUpdate = false; + this._viewerScene.autoUpdate = false; this._customObjects?.forEach(customObject => customObject.updateMatrixWorld(true)); @@ -201,4 +221,8 @@ export class DefaultRenderPipelineProvider implements RenderPipelineProvider { return ssaoSampleSize > 0 && hasBackStyling; } + + private shouldRenderPointClouds(): boolean { + return this._pointCloudModels.length > 0; + } } diff --git a/viewer/packages/rendering/src/render-pipeline-providers/PointCloudRenderPipelineProvider.ts b/viewer/packages/rendering/src/render-pipeline-providers/PointCloudRenderPipelineProvider.ts new file mode 100644 index 00000000000..9dfde39f27c --- /dev/null +++ b/viewer/packages/rendering/src/render-pipeline-providers/PointCloudRenderPipelineProvider.ts @@ -0,0 +1,122 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; +import { RenderPass } from '../RenderPass'; +import { RenderPipelineProvider } from '../RenderPipelineProvider'; +import { SceneHandler } from '@reveal/utilities'; +import { PointCloudEffectsPass } from '../render-passes/PointCloudEffectsPass'; +import { PointCloudRenderTargets } from './types'; +import { PointCloudPassParameters } from '../render-passes/types'; +import { PointCloudParameters } from '../rendering/types'; +import { PotreePointShape } from '@reveal/pointclouds'; + +export class PointCloudRenderPipelineProvider implements RenderPipelineProvider { + private readonly _renderTargetData: { + currentRenderSize: THREE.Vector2; + output: THREE.WebGLRenderTarget; + }; + private readonly _renderParameters: PointCloudParameters; + private readonly _depthPass: PointCloudEffectsPass; + private readonly _attributePass: PointCloudEffectsPass; + private readonly _standardPass: PointCloudEffectsPass; + private readonly _sceneHandler: SceneHandler; + + private static readonly DepthPassParameters: PointCloudPassParameters = { + material: { + weighted: false, + shape: PotreePointShape.Circle, + hqDepthPass: true, + depthWrite: true, + blending: THREE.NormalBlending, + colorWrite: false + } + }; + private static readonly AttributePassParameters: PointCloudPassParameters = { + material: { + weighted: true, + shape: PotreePointShape.Circle, + hqDepthPass: false, + depthWrite: false, + blending: THREE.CustomBlending, + blendSrc: THREE.SrcAlphaFactor, + blendDst: THREE.OneFactor, + colorWrite: true + }, + renderer: { + autoClearDepth: false + } + }; + + constructor(sceneHandler: SceneHandler, renderParameters: PointCloudParameters) { + this._renderTargetData = { + currentRenderSize: new THREE.Vector2(1, 1), + output: new THREE.WebGLRenderTarget(1, 1, { + minFilter: THREE.NearestFilter, + magFilter: THREE.NearestFilter, + format: THREE.RGBAFormat, + type: THREE.FloatType, + depthTexture: new THREE.DepthTexture(1, 1, THREE.UnsignedIntType) + }) + }; + + this._sceneHandler = sceneHandler; + this._renderParameters = renderParameters; + + this._standardPass = new PointCloudEffectsPass(sceneHandler); + this._depthPass = new PointCloudEffectsPass(sceneHandler, PointCloudRenderPipelineProvider.DepthPassParameters); + this._attributePass = new PointCloudEffectsPass( + sceneHandler, + PointCloudRenderPipelineProvider.AttributePassParameters + ); + } + + get pointCloudRenderTargets(): PointCloudRenderTargets { + return { + pointCloud: this._renderTargetData.output + }; + } + + public *pipeline(renderer: THREE.WebGLRenderer): Generator { + this.updateRenderTargetSizes(renderer); + + // Needs to be updated manually since automatic update is disabled because of CAD pipeline. + this._sceneHandler.pointCloudModels.forEach(model => model.object.updateMatrixWorld(true)); + + try { + renderer.setRenderTarget(this._renderTargetData.output); + + if (this._renderParameters.pointBlending) { + yield this._depthPass; + + renderer.setClearColor('#000000', 0.0); + renderer.clearColor(); + yield this._attributePass; + } else { + yield this._standardPass; + } + } finally { + renderer.setClearColor('#FFFFFF', 0.0); + } + } + + public dispose(): void { + this._renderTargetData.output.dispose(); + } + + private updateRenderTargetSizes(renderer: THREE.WebGLRenderer): void { + const renderSize = new THREE.Vector2(); + renderer.getDrawingBufferSize(renderSize); + + const { x: width, y: height } = renderSize; + + const currentSize = this._renderTargetData.currentRenderSize; + if (width === currentSize.x && height === currentSize.y) { + return; + } + + this._renderTargetData.currentRenderSize.set(width, height); + this._renderTargetData.output.setSize(width, height); + } +} diff --git a/viewer/packages/rendering/src/render-pipeline-providers/types.ts b/viewer/packages/rendering/src/render-pipeline-providers/types.ts index 034f9b4c3be..6a7c57d93fd 100644 --- a/viewer/packages/rendering/src/render-pipeline-providers/types.ts +++ b/viewer/packages/rendering/src/render-pipeline-providers/types.ts @@ -17,7 +17,13 @@ export type CadGeometryRenderTargets = { inFront: THREE.WebGLRenderTarget; }; -export type PostProcessingPipelineOptions = CadGeometryRenderTargets & { - ssaoTexture: THREE.Texture; - edges: boolean; +export type PointCloudRenderTargets = { + pointCloud: THREE.WebGLRenderTarget; }; + +export type PostProcessingPipelineOptions = CadGeometryRenderTargets & + PointCloudRenderTargets & { + ssaoTexture: THREE.Texture; + edges: boolean; + pointBlending?: boolean; + }; diff --git a/viewer/packages/rendering/src/rendering/shaders.ts b/viewer/packages/rendering/src/rendering/shaders.ts index 874e9b9fc47..853d8ac875e 100644 --- a/viewer/packages/rendering/src/rendering/shaders.ts +++ b/viewer/packages/rendering/src/rendering/shaders.ts @@ -80,6 +80,16 @@ export const sectorShaders = { } }; +/** + * Point cloud shaders. + */ +export const pointCloudShaders = { + normalize: { + fragment: glsl(require('../glsl/pointcloud/normalize.frag').default), + vertex: glsl(require('../glsl/pointcloud/normalize.vert').default) + } +}; + /** * Screen space ambient occlusion shader */ diff --git a/viewer/packages/rendering/src/rendering/types.ts b/viewer/packages/rendering/src/rendering/types.ts index 07c94a6bcfa..cc07d58abca 100644 --- a/viewer/packages/rendering/src/rendering/types.ts +++ b/viewer/packages/rendering/src/rendering/types.ts @@ -39,6 +39,10 @@ export type RenderOptions = { * Determines the parameters used for visualizing edges of the geometry. */ edgeDetectionParameters?: EdgeDetectionParameters; + /** + * Point cloud effects parameters. + */ + pointCloudParameters?: PointCloudParameters; }; /** @@ -59,7 +63,8 @@ export const defaultRenderOptions: Required = { antiAliasing: AntiAliasingMode.FXAA, multiSampleCountHint: 1, ssaoRenderParameters: { sampleSize: SsaoSampleQuality.Default, sampleRadius: 1.0, depthCheckBias: 0.0125 }, - edgeDetectionParameters: { enabled: true } + edgeDetectionParameters: { enabled: true }, + pointCloudParameters: { pointBlending: false } }; /** @@ -86,3 +91,13 @@ export type SsaoParameters = { */ depthCheckBias: number; }; + +/** + * Point cloud rendering parameters supported by Reveal. + */ +export type PointCloudParameters = { + /** + * Effect of blending close points together. Creates smoother texture on object surfaces. + */ + pointBlending: boolean; +}; diff --git a/viewer/packages/rendering/src/utilities/renderUtilities.ts b/viewer/packages/rendering/src/utilities/renderUtilities.ts index 5a5ff3fa3ba..97efd126e75 100644 --- a/viewer/packages/rendering/src/utilities/renderUtilities.ts +++ b/viewer/packages/rendering/src/utilities/renderUtilities.ts @@ -7,8 +7,15 @@ import { createRenderTriangle } from '@reveal/utilities'; import { CadMaterialManager } from '../CadMaterialManager'; import { RenderMode } from '../rendering/RenderMode'; import { CogniteColors, RevealColors } from './types'; -import { BlendOptions, BlitEffect, BlitOptions, DepthBlendBlitOptions, ThreeUniforms } from '../render-passes/types'; -import { blitShaders, depthBlendBlitShaders } from '../rendering/shaders'; +import { + BlendOptions, + BlitEffect, + BlitOptions, + DepthBlendBlitOptions, + PointCloudPostProcessingOptions, + ThreeUniforms +} from '../render-passes/types'; +import { blitShaders, depthBlendBlitShaders, pointCloudShaders } from '../rendering/shaders'; import { NodeOutlineColor } from '@reveal/cad-styling'; export const unitOrthographicCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, -1, 1); @@ -99,6 +106,29 @@ export function getBlitMaterial(options: BlitOptions): THREE.RawShaderMaterial { }); } +export function getPointCloudPostProcessingMaterial(options: PointCloudPostProcessingOptions): THREE.RawShaderMaterial { + const { texture, depthTexture, pointBlending } = options; + + const uniforms: ThreeUniforms = { + tDiffuse: { value: texture }, + tDepth: { value: depthTexture } + }; + + const defines: Record = {}; + + if (pointBlending) { + defines['points_blend'] = true; + } + + return new THREE.RawShaderMaterial({ + vertexShader: pointCloudShaders.normalize.vertex, + fragmentShader: pointCloudShaders.normalize.fragment, + uniforms, + defines, + glslVersion: THREE.GLSL3 + }); +} + function createOutlineColorTexture(): THREE.DataTexture { const outlineColorBuffer = new Uint8Array(8 * 4); const outlineColorTexture = new THREE.DataTexture(outlineColorBuffer, 8, 1); @@ -169,6 +199,7 @@ export enum RenderLayer { Back = RenderMode.Color, InFront = RenderMode.Effects, Ghost = RenderMode.Ghost, + PointCloud, Default = 0 } diff --git a/viewer/packages/rendering/visual-tests/RenderTarget.VisualTest.ts b/viewer/packages/rendering/visual-tests/RenderTarget.VisualTest.ts new file mode 100644 index 00000000000..78f9ad46386 --- /dev/null +++ b/viewer/packages/rendering/visual-tests/RenderTarget.VisualTest.ts @@ -0,0 +1,105 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; + +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; +import { DefaultRenderPipelineProvider } from '../src/render-pipeline-providers/DefaultRenderPipelineProvider'; +import { defaultRenderOptions } from '../src/rendering/types'; + +export default class RenderTargetVisualTest extends StreamingVisualTestFixture { + private readonly _orthographicCamera: THREE.OrthographicCamera; + private readonly _testScene: THREE.Scene; + private _glRenderer!: THREE.WebGLRenderer; + + constructor() { + super(); + this._orthographicCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1); + this._testScene = new THREE.Scene(); + } + + public setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { cadMaterialManager, sceneHandler, renderer } = testFixtureComponents; + + this._glRenderer = renderer; + + const renderTarget = new THREE.WebGLRenderTarget(300, 300); + renderTarget.depthTexture = new THREE.DepthTexture(300, 300); + renderTarget.depthTexture.format = THREE.DepthFormat; + renderTarget.depthTexture.type = THREE.UnsignedIntType; + + this.pipelineProvider = new DefaultRenderPipelineProvider(cadMaterialManager, sceneHandler, defaultRenderOptions, { + target: renderTarget, + autoSize: true + }); + + const vShader = ` + uniform mat4 modelMatrix; + + in vec3 position; + in vec2 uv; + + out vec2 vUv; + + const mat4 unitOrthographicProjection = mat4(1., 0., 0., 0., 0., 1., 0., 0., 0., 0., -1., 0., 0., 0., 0., 1.); + + void main() { + vUv = uv; + gl_Position = unitOrthographicProjection * modelMatrix * vec4(position, 1.0); + } + `; + + const fShader = ` + precision highp float; + + uniform sampler2D tDiffuse; + uniform sampler2D tDepth; + + in vec2 vUv; + + out vec4 color; + + void main() { + if(vUv.x > 0.5){ + color = texture(tDiffuse, vUv); + } else { + float d = texture(tDepth, vUv).r; + color = vec4(vec3(1.0 - pow(d, 20.0)), 1.0); + } + } + `; + + const geometry = new THREE.BufferGeometry(); + const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]); + const uvs = new Float32Array([0, 0, 2, 0, 0, 2]); + + geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3)); + geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2)); + + const shaderMaterial = new THREE.RawShaderMaterial({ + vertexShader: vShader, + fragmentShader: fShader, + uniforms: { + tDiffuse: { value: renderTarget.texture }, + tDepth: { value: renderTarget.depthTexture } + }, + glslVersion: THREE.GLSL3, + depthTest: true + }); + + const mesh = new THREE.Mesh(geometry, shaderMaterial); + this._testScene.add(mesh); + + return Promise.resolve(); + } + + public render(): void { + super.render(); + this._glRenderer.setRenderTarget(null); + this._glRenderer.render(this._testScene, this._orthographicCamera); + } +} diff --git a/viewer/packages/rendering/visual-tests/Rendering.VisualTest.ts b/viewer/packages/rendering/visual-tests/Rendering.VisualTest.ts new file mode 100644 index 00000000000..2094d001371 --- /dev/null +++ b/viewer/packages/rendering/visual-tests/Rendering.VisualTest.ts @@ -0,0 +1,211 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { DefaultNodeAppearance, TreeIndexNodeCollection } from '@reveal/cad-styling'; +import { DeferredPromise, NumericRange, SceneHandler } from '@reveal/utilities'; +import * as THREE from 'three'; +import { TransformControls } from 'three/examples/jsm/controls/TransformControls'; +import { AntiAliasingMode, defaultRenderOptions, DefaultRenderPipelineProvider } from '..'; + +import { + StreamingVisualTestFixture, + StreamingTestFixtureComponents +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; +import { CadMaterialManager } from '../src/CadMaterialManager'; +import { StepPipelineExecutor } from '../src/pipeline-executors/StepPipelineExecutor'; + +export default class RenderingVisualTestFixture extends StreamingVisualTestFixture { + private readonly guiData = { + frameTime: 0.1, + steps: 0 + }; + + public async setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { sceneHandler, model, camera, renderer, cadMaterialManager } = testFixtureComponents; + + const stepPipelineExecutor = new StepPipelineExecutor(renderer); + this.pipelineExecutor = stepPipelineExecutor; + + const grid = this.getGridFromBoundingBox(model.boundingBox); + sceneHandler.addCustomObject(grid); + + const customBox = this.getCustomBoxFromBoundingBox(model.boundingBox); + sceneHandler.addCustomObject(customBox); + + const transformControls = this.attachTransformControlsTo(customBox, camera, renderer.domElement); + sceneHandler.addCustomObject(transformControls); + + await this.setupMockCadStyling(cadMaterialManager, model.geometryNode.type); + + this.setupGui(stepPipelineExecutor, renderer, cadMaterialManager, sceneHandler); + } + + private setupGui( + stepPipelineExecutor: StepPipelineExecutor, + renderer: THREE.WebGLRenderer, + cadMaterialManager: CadMaterialManager, + sceneHandler: SceneHandler + ) { + this._frameStatsGUIFolder.add(this.guiData, 'frameTime').listen(); + const executorOptions = this.gui.addFolder('Pipeline Executor Options'); + executorOptions.open(); + + this.guiData.steps = stepPipelineExecutor.calcNumSteps(this.pipelineProvider); + executorOptions.add(this.guiData, 'steps', 1, this.guiData.steps, 1).onChange(async () => { + stepPipelineExecutor.numberOfSteps = this.guiData.steps; + this.render(); + }); + + const renderOptions = defaultRenderOptions; + renderOptions.multiSampleCountHint = 4; + + const updateRenderOptions = () => { + this.pipelineProvider.dispose(); + this.pipelineProvider = new DefaultRenderPipelineProvider(cadMaterialManager, sceneHandler, renderOptions); + this.render(); + }; + + const edgeDetectionParametersGUI = this.gui.addFolder('Edge Detection'); + edgeDetectionParametersGUI.add(renderOptions.edgeDetectionParameters, 'enabled').onChange(updateRenderOptions); + edgeDetectionParametersGUI.open(); + + const antiAliasingGui = this.gui.addFolder('Anti Aliasing'); + antiAliasingGui + .add(renderOptions, 'antiAliasing', { NoAA: AntiAliasingMode.NoAA, FXAA: AntiAliasingMode.FXAA }) + .onChange(updateRenderOptions); + antiAliasingGui + .add(renderOptions, 'multiSampleCountHint', [0, 2, 4, 8, 16]) + .name('MSAA count') + .onChange(async () => { + updateRenderOptions(); + }); + antiAliasingGui.open(); + + const ssaoOptionsGui = this.gui.addFolder('SSAO'); + ssaoOptionsGui.add(renderOptions.ssaoRenderParameters, 'sampleRadius', 0, 30).onChange(updateRenderOptions); + ssaoOptionsGui.add(renderOptions.ssaoRenderParameters, 'sampleSize', 0, 256, 1).onChange(updateRenderOptions); + ssaoOptionsGui.add(renderOptions.ssaoRenderParameters, 'depthCheckBias', 0, 1).onChange(updateRenderOptions); + ssaoOptionsGui.open(); + + this.setupBackgroundColorGUI(renderer); + } + + private timings: number[] = []; + public render(): void { + const stepPipelineExecutor = this.pipelineExecutor as StepPipelineExecutor; + + if (stepPipelineExecutor === undefined) { + super.render(); + return; + } + + if (stepPipelineExecutor.timings.length > 0) { + if (this.timings.length >= 20) { + const frameTime = this.timings.reduce((sum, current) => sum + current, 0) / this.timings.length; + this.guiData.frameTime = frameTime; + this.timings = []; + } else { + this.timings.push(stepPipelineExecutor.timings[stepPipelineExecutor.timings.length - 1]); + } + } + super.render(); + } + + private setupBackgroundColorGUI(renderer: THREE.WebGLRenderer) { + const backgroundGuiData = { + canvasColor: '#50728c', + clearColor: '#444', + clearAlpha: 1 + }; + + renderer.setClearColor(backgroundGuiData.clearColor); + renderer.setClearAlpha(backgroundGuiData.clearAlpha); + renderer.domElement.style.backgroundColor = backgroundGuiData.canvasColor; + + const renderOptionsGUI = this.gui.addFolder('Render Options'); + renderOptionsGUI.open(); + + renderOptionsGUI.addColor(backgroundGuiData, 'clearColor').onChange(async () => { + renderer.setClearColor(backgroundGuiData.clearColor); + renderer.setClearAlpha(backgroundGuiData.clearAlpha); + this.render(); + }); + + renderOptionsGUI.add(backgroundGuiData, 'clearAlpha', 0, 1).onChange(async () => { + renderer.setClearColor(backgroundGuiData.clearColor); + renderer.setClearAlpha(backgroundGuiData.clearAlpha); + this.render(); + }); + + renderOptionsGUI.addColor(backgroundGuiData, 'canvasColor').onChange(async () => { + renderer.domElement.style.backgroundColor = backgroundGuiData.canvasColor; + }); + } + + private setupMockCadStyling(materialManager: CadMaterialManager, modelType: string): Promise { + if (modelType !== 'CadNode') { + return Promise.resolve(); + } + + const nodeAppearanceProvider = materialManager.getModelNodeAppearanceProvider('0'); + nodeAppearanceProvider.assignStyledNodeCollection( + new TreeIndexNodeCollection(new NumericRange(0, 10)), + DefaultNodeAppearance.Ghosted + ); + + nodeAppearanceProvider.assignStyledNodeCollection( + new TreeIndexNodeCollection(new NumericRange(10, 20)), + DefaultNodeAppearance.Highlighted + ); + + nodeAppearanceProvider.assignStyledNodeCollection(new TreeIndexNodeCollection(new NumericRange(40, 41)), { + ...DefaultNodeAppearance.Default, + outlineColor: 6 + }); + + return resolveOnNodeAppearanceChanged(); + + function resolveOnNodeAppearanceChanged(): Promise { + const deferredPromise = new DeferredPromise(); + nodeAppearanceProvider.on('changed', () => deferredPromise.resolve()); + return deferredPromise; + } + } + + private getGridFromBoundingBox(boundingBox: THREE.Box3): THREE.GridHelper { + const gridSize = new THREE.Vector2(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z); + const grid = new THREE.GridHelper(gridSize.x, 20); //THIS IS WRONG + grid.position.copy(boundingBox.getCenter(new THREE.Vector3())); + grid.position.setY(boundingBox.min.y); + + return grid; + } + + private getCustomBoxFromBoundingBox(boundingBox: THREE.Box3): THREE.Mesh { + const customBox = new THREE.Mesh( + new THREE.BoxGeometry(10, 10, 30), + new THREE.MeshBasicMaterial({ + color: new THREE.Color(1, 0, 0), + transparent: true, + opacity: 0.5, + depthTest: false + }) + ); + + const boxCenter = boundingBox.getCenter(new THREE.Vector3()); + customBox.position.copy(boxCenter); + + return customBox; + } + + private attachTransformControlsTo( + object: THREE.Object3D, + camera: THREE.PerspectiveCamera, + canvas: HTMLCanvasElement + ) { + const transformControls = new TransformControls(camera, canvas); + transformControls.attach(object); + return transformControls; + } +} diff --git a/viewer/packages/rendering/visual-tests/Resize.VisualTest.ts b/viewer/packages/rendering/visual-tests/Resize.VisualTest.ts new file mode 100644 index 00000000000..fc8294f7313 --- /dev/null +++ b/viewer/packages/rendering/visual-tests/Resize.VisualTest.ts @@ -0,0 +1,30 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { StreamingTestFixtureComponents } from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; +import { StreamingVisualTestFixture } from '../../../visual-tests'; +import { BasicPipelineExecutor } from '../src/pipeline-executors/BasicPipelineExecutor'; + +export default class ResizeVisualTestFixture extends StreamingVisualTestFixture { + public setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { renderer } = testFixtureComponents; + this.pipelineExecutor = new BasicPipelineExecutor(renderer, { + autoResizeRenderer: true, + resolutionThreshold: 100_000 + }); + const domElement = renderer.domElement.parentElement!; + domElement.style.width = '50vw'; + domElement.style.height = '50vh'; + domElement.style.position = 'absolute'; + domElement.style.margin = 'auto'; + domElement.style.left = '0px'; + domElement.style.right = '0px'; + domElement.style.top = '0px'; + domElement.style.bottom = '0px'; + + document.body.style.backgroundColor = 'gray'; + + return Promise.resolve(); + } +} diff --git a/viewer/packages/rendering/visual-tests/Ssao.VisualTest.ts b/viewer/packages/rendering/visual-tests/Ssao.VisualTest.ts new file mode 100644 index 00000000000..fae0e94a6e4 --- /dev/null +++ b/viewer/packages/rendering/visual-tests/Ssao.VisualTest.ts @@ -0,0 +1,42 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { NumericRange } from '@reveal/utilities'; +import * as THREE from 'three'; +import { + StreamingTestFixtureComponents, + StreamingVisualTestFixture +} from '../../../visual-tests/test-fixtures/StreamingVisualTestFixture'; +import { DefaultRenderPipelineProvider } from '../src/render-pipeline-providers/DefaultRenderPipelineProvider'; +import { defaultRenderOptions } from '../src/rendering/types'; + +export default class SsaoVisualTest extends StreamingVisualTestFixture { + public setup(testFixtureComponents: StreamingTestFixtureComponents): Promise { + const { model, sceneHandler, cadMaterialManager } = testFixtureComponents; + + const { modelIdentifier } = sceneHandler.cadModels.find( + identifiedObject => identifiedObject.object === model.geometryNode + )!; + + const transformProvider = cadMaterialManager.getModelNodeTransformProvider(modelIdentifier); + transformProvider.setNodeTransform(new NumericRange(1, 1), new THREE.Matrix4().makeTranslation(4, 0, 0)); + + const renderOptions = defaultRenderOptions; + renderOptions.ssaoRenderParameters = { + sampleSize: 256, + sampleRadius: 1.0, + depthCheckBias: 0.0125 + }; + + (this.pipelineProvider as DefaultRenderPipelineProvider).renderOptions = renderOptions; + + const matrix = new THREE.Matrix4() + .makeTranslation(10.5, -1, 15) + .multiply(model.geometryNode.getModelTransformation()); + + model.geometryNode.setModelTransformation(matrix); + + return Promise.resolve(); + } +} diff --git a/viewer/packages/rendering/visual-tests/__image_snapshots__/RenderTarget.VisualTest.png b/viewer/packages/rendering/visual-tests/__image_snapshots__/RenderTarget.VisualTest.png new file mode 100644 index 00000000000..2c7d0168589 Binary files /dev/null and b/viewer/packages/rendering/visual-tests/__image_snapshots__/RenderTarget.VisualTest.png differ diff --git a/viewer/packages/rendering/visual-tests/__image_snapshots__/Rendering.VisualTest.png b/viewer/packages/rendering/visual-tests/__image_snapshots__/Rendering.VisualTest.png new file mode 100644 index 00000000000..b146274c7d0 Binary files /dev/null and b/viewer/packages/rendering/visual-tests/__image_snapshots__/Rendering.VisualTest.png differ diff --git a/viewer/packages/rendering/visual-tests/__image_snapshots__/Resize.VisualTest.png b/viewer/packages/rendering/visual-tests/__image_snapshots__/Resize.VisualTest.png new file mode 100644 index 00000000000..b97f1242eee Binary files /dev/null and b/viewer/packages/rendering/visual-tests/__image_snapshots__/Resize.VisualTest.png differ diff --git a/viewer/packages/rendering/visual-tests/__image_snapshots__/Ssao.VisualTest.png b/viewer/packages/rendering/visual-tests/__image_snapshots__/Ssao.VisualTest.png new file mode 100644 index 00000000000..12ba7efa2bd Binary files /dev/null and b/viewer/packages/rendering/visual-tests/__image_snapshots__/Ssao.VisualTest.png differ diff --git a/viewer/packages/sector-loader/app/__image_snapshots__/SectorLoader.VisualTest-snap.png b/viewer/packages/sector-loader/app/__image_snapshots__/SectorLoader.VisualTest-snap.png deleted file mode 100644 index 5447a80fcf7..00000000000 Binary files a/viewer/packages/sector-loader/app/__image_snapshots__/SectorLoader.VisualTest-snap.png and /dev/null differ diff --git a/viewer/packages/sector-loader/app/SectorLoader.VisualTest.ts b/viewer/packages/sector-loader/visual-tests/SectorLoader.VisualTest.ts similarity index 100% rename from viewer/packages/sector-loader/app/SectorLoader.VisualTest.ts rename to viewer/packages/sector-loader/visual-tests/SectorLoader.VisualTest.ts diff --git a/viewer/packages/sector-loader/visual-tests/__image_snapshots__/SectorLoader.VisualTest.png b/viewer/packages/sector-loader/visual-tests/__image_snapshots__/SectorLoader.VisualTest.png new file mode 100644 index 00000000000..06d2573d3a3 Binary files /dev/null and b/viewer/packages/sector-loader/visual-tests/__image_snapshots__/SectorLoader.VisualTest.png differ diff --git a/viewer/packages/sector-parser/app/__image_snapshots__/SectorParser.VisualTest-snap.png b/viewer/packages/sector-parser/app/__image_snapshots__/SectorParser.VisualTest-snap.png deleted file mode 100644 index 1634d7cdc59..00000000000 Binary files a/viewer/packages/sector-parser/app/__image_snapshots__/SectorParser.VisualTest-snap.png and /dev/null differ diff --git a/viewer/packages/sector-parser/app/testMaterials.ts b/viewer/packages/sector-parser/app/testMaterials.ts deleted file mode 100644 index ae12178bb82..00000000000 --- a/viewer/packages/sector-parser/app/testMaterials.ts +++ /dev/null @@ -1,352 +0,0 @@ -/*! - * Copyright 2021 Cognite AS - */ -import * as THREE from 'three'; - -// TODO: Fix dependencies such that test app doesn't depend on core internals -import matCapTextureImage from '../../../packages/rendering/src/rendering/matCapTextureData'; -import { sectorShaders } from '../../../packages/rendering/src/rendering/shaders'; - -const matCapTexture = new THREE.Texture(matCapTextureImage); -matCapTexture.needsUpdate = true; - -const blendingOptions = { - blending: THREE.CustomBlending, - blendDst: THREE.ZeroFactor, - blendDstAlpha: THREE.OneFactor, - blendSrc: THREE.OneFactor, - blendSrcAlpha: THREE.ZeroFactor -}; - -export function createInstancedMeshMaterial(): THREE.RawShaderMaterial { - return new THREE.RawShaderMaterial({ - name: 'Instanced meshes', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - extensions: { - derivatives: true - }, - side: THREE.DoubleSide, - fragmentShader: sectorShaders.instancedMesh.fragment, - vertexShader: sectorShaders.instancedMesh.vertex, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); -} - -export function createGeneralCylinderMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (General cylinder)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - cameraPosition: { - value: new THREE.Vector3() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.generalCylinderPrimitive.vertex, - fragmentShader: sectorShaders.generalCylinderPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createTriangleMeshMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Triangle meshes', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - extensions: { - derivatives: true - }, - side: THREE.DoubleSide, - fragmentShader: sectorShaders.detailedMesh.fragment, - vertexShader: sectorShaders.detailedMesh.vertex, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createBoxMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Box)', - clipping: false, - vertexShader: sectorShaders.boxPrimitive.vertex, - fragmentShader: sectorShaders.boxPrimitive.fragment, - side: THREE.DoubleSide, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createCircleMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Circle)', - clipping: false, - vertexShader: sectorShaders.circlePrimitive.vertex, - fragmentShader: sectorShaders.circlePrimitive.fragment, - side: THREE.DoubleSide, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createConeMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Cone)', - clipping: false, - vertexShader: sectorShaders.conePrimitive.vertex, - fragmentShader: sectorShaders.conePrimitive.fragment, - side: THREE.DoubleSide, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createEccentricConeMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Eccentric cone)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.eccentricConePrimitive.vertex, - fragmentShader: sectorShaders.eccentricConePrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createGeneralRingMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (General rings)', - clipping: false, - uniforms: { - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - renderMode: { value: 1 }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.generalRingPrimitive.vertex, - fragmentShader: sectorShaders.generalRingPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createEllipsoidSegmentMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Ellipsoid segments)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.ellipsoidSegmentPrimitive.vertex, - fragmentShader: sectorShaders.ellipsoidSegmentPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createNutMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Nuts)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.nutPrimitive.vertex, - fragmentShader: sectorShaders.nutPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createQuadMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Quads)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.quadPrimitive.vertex, - fragmentShader: sectorShaders.quadPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createTrapeziumMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Trapezium)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - vertexShader: sectorShaders.trapeziumPrimitive.vertex, - fragmentShader: sectorShaders.trapeziumPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} - -export function createTorusSegmentMaterial(): THREE.RawShaderMaterial { - const material = new THREE.RawShaderMaterial({ - name: 'Primitives (Torus segment)', - clipping: false, - uniforms: { - renderMode: { value: 1 }, - inverseModelMatrix: { - value: new THREE.Matrix4() - }, - matCapTexture: { value: matCapTexture }, - treeIndexTextureSize: { value: new THREE.Vector2(1, 1) }, - colorDataTexture: { value: new THREE.DataTexture(new Uint8ClampedArray([0, 0, 0, 1]), 1, 1) } - }, - extensions: { - derivatives: true - }, - vertexShader: sectorShaders.torusSegmentPrimitive.vertex, - fragmentShader: sectorShaders.torusSegmentPrimitive.fragment, - side: THREE.DoubleSide, - glslVersion: THREE.GLSL3, - ...blendingOptions - }); - - material.uniforms.colorDataTexture.value.needsUpdate = true; - - return material; -} diff --git a/viewer/packages/sector-parser/app/SectorParser.VisualTest.ts b/viewer/packages/sector-parser/visual-tests/SectorParser.VisualTest.ts similarity index 67% rename from viewer/packages/sector-parser/app/SectorParser.VisualTest.ts rename to viewer/packages/sector-parser/visual-tests/SectorParser.VisualTest.ts index 6631aa90a7c..ad707340b41 100644 --- a/viewer/packages/sector-parser/app/SectorParser.VisualTest.ts +++ b/viewer/packages/sector-parser/visual-tests/SectorParser.VisualTest.ts @@ -16,8 +16,6 @@ export default class SectorParserVisualTestFixture extends SimpleVisualTestFixtu const group = this.initializeGroup(scene); - const materialMap = this.setMaterialMap(); - const loader = new GltfSectorParser(); const gltfOutput = (await modelMetadataProvider.getModelOutputs(modelIdentifier)).find( @@ -26,6 +24,8 @@ export default class SectorParserVisualTestFixture extends SimpleVisualTestFixtu const modelUri = await modelMetadataProvider.getModelUri(modelIdentifier, gltfOutput); const sceneJson = await modelDataProvider.getJsonFile(modelUri, 'scene.json'); + const materialMap = TestMaterials.getMaterialsMap((sceneJson.maxTreeIndex as number) + 1); + const sectors = sceneJson.sectors as [ { sectorFileName: string; @@ -75,24 +75,6 @@ export default class SectorParserVisualTestFixture extends SimpleVisualTestFixtu ); } - private setMaterialMap(): Map { - return new Map([ - [RevealGeometryCollectionType.BoxCollection, TestMaterials.createBoxMaterial()], - [RevealGeometryCollectionType.CircleCollection, TestMaterials.createCircleMaterial()], - [RevealGeometryCollectionType.ConeCollection, TestMaterials.createConeMaterial()], - [RevealGeometryCollectionType.EccentricConeCollection, TestMaterials.createEccentricConeMaterial()], - [RevealGeometryCollectionType.EllipsoidSegmentCollection, TestMaterials.createEllipsoidSegmentMaterial()], - [RevealGeometryCollectionType.GeneralCylinderCollection, TestMaterials.createGeneralCylinderMaterial()], - [RevealGeometryCollectionType.GeneralRingCollection, TestMaterials.createGeneralRingMaterial()], - [RevealGeometryCollectionType.QuadCollection, TestMaterials.createQuadMaterial()], - [RevealGeometryCollectionType.TorusSegmentCollection, TestMaterials.createTorusSegmentMaterial()], - [RevealGeometryCollectionType.TrapeziumCollection, TestMaterials.createTrapeziumMaterial()], - [RevealGeometryCollectionType.NutCollection, TestMaterials.createNutMaterial()], - [RevealGeometryCollectionType.TriangleMesh, TestMaterials.createTriangleMeshMaterial()], - [RevealGeometryCollectionType.InstanceMesh, TestMaterials.createInstancedMeshMaterial()] - ]); - } - private initializeGroup(scene: THREE.Scene) { const group = new THREE.Group(); group.frustumCulled = false; diff --git a/viewer/packages/sector-parser/visual-tests/__image_snapshots__/SectorParser.VisualTest.png b/viewer/packages/sector-parser/visual-tests/__image_snapshots__/SectorParser.VisualTest.png new file mode 100644 index 00000000000..e2076489984 Binary files /dev/null and b/viewer/packages/sector-parser/visual-tests/__image_snapshots__/SectorParser.VisualTest.png differ diff --git a/viewer/packages/sector-parser/app/test-models/anders-test-draco/anders-test-scene.glb b/viewer/packages/sector-parser/visual-tests/test-models/anders-test-draco/anders-test-scene.glb similarity index 100% rename from viewer/packages/sector-parser/app/test-models/anders-test-draco/anders-test-scene.glb rename to viewer/packages/sector-parser/visual-tests/test-models/anders-test-draco/anders-test-scene.glb diff --git a/viewer/packages/sector-parser/app/test-models/anders-test-draco/scene.json b/viewer/packages/sector-parser/visual-tests/test-models/anders-test-draco/scene.json similarity index 100% rename from viewer/packages/sector-parser/app/test-models/anders-test-draco/scene.json rename to viewer/packages/sector-parser/visual-tests/test-models/anders-test-draco/scene.json diff --git a/viewer/packages/sector-parser/app/test-models/primitives-gltf/0.glb b/viewer/packages/sector-parser/visual-tests/test-models/primitives-gltf/0.glb similarity index 100% rename from viewer/packages/sector-parser/app/test-models/primitives-gltf/0.glb rename to viewer/packages/sector-parser/visual-tests/test-models/primitives-gltf/0.glb diff --git a/viewer/packages/sector-parser/app/test-models/primitives-gltf/scene.json b/viewer/packages/sector-parser/visual-tests/test-models/primitives-gltf/scene.json similarity index 100% rename from viewer/packages/sector-parser/app/test-models/primitives-gltf/scene.json rename to viewer/packages/sector-parser/visual-tests/test-models/primitives-gltf/scene.json diff --git a/viewer/packages/sector-parser/visual-tests/testMaterials.ts b/viewer/packages/sector-parser/visual-tests/testMaterials.ts new file mode 100644 index 00000000000..81babdc7eff --- /dev/null +++ b/viewer/packages/sector-parser/visual-tests/testMaterials.ts @@ -0,0 +1,197 @@ +/*! + * Copyright 2021 Cognite AS + */ +import * as THREE from 'three'; + +// TODO: Fix dependencies such that test app doesn't depend on core internals +import matCapTextureImage from '../../../packages/rendering/src/rendering/matCapTextureData'; +import { sectorShaders } from '../../../packages/rendering/src/rendering/shaders'; +import { RevealGeometryCollectionType } from '../src/types'; + +const matCapTexture = new THREE.Texture(matCapTextureImage); +matCapTexture.needsUpdate = true; + +function getColorDataTexture(treeIndexCount: number) { + const { width, height } = determinePowerOfTwoDimensions(treeIndexCount); + const textureElementCount = width * height; + + const buffer = new Uint8ClampedArray(4 * textureElementCount); + for (let i = 0; i < textureElementCount; i++) { + buffer[i * 4 + 3] = 1; + } + // Color and style override texture + const overrideColorPerTreeIndexTexture = new THREE.DataTexture(buffer, width, height); + + return { colorDataTexture: overrideColorPerTreeIndexTexture, width, height }; + + function determinePowerOfTwoDimensions(elementCount: number): { width: number; height: number } { + const width = Math.max(1, ceilToPowerOfTwo(Math.sqrt(elementCount))); + const height = Math.max(1, ceilToPowerOfTwo(elementCount / width)); + return { width, height }; + } + + function ceilToPowerOfTwo(v: number): number { + return Math.pow(2, Math.ceil(Math.log(v) / Math.log(2))); + } +} + +export function getMaterialsMap(treeIndexCount: number): Map { + const { colorDataTexture, width, height } = getColorDataTexture(treeIndexCount); + colorDataTexture.needsUpdate = true; + + const sharedParams = { + clipping: false, + uniforms: { + renderMode: { value: 1 }, + inverseModelMatrix: { + value: new THREE.Matrix4() + }, + matCapTexture: { value: matCapTexture }, + treeIndexTextureSize: { value: new THREE.Vector2(width, height) }, + colorDataTexture: { value: colorDataTexture } + }, + extensions: { + derivatives: true + }, + side: THREE.DoubleSide, + glslVersion: THREE.GLSL3, + blending: THREE.CustomBlending, + blendDst: THREE.ZeroFactor, + blendDstAlpha: THREE.OneFactor, + blendSrc: THREE.OneFactor, + blendSrcAlpha: THREE.ZeroFactor + }; + return new Map([ + [ + RevealGeometryCollectionType.BoxCollection, + createMaterial( + 'Primitives (Box)', + sectorShaders.boxPrimitive.vertex, + sectorShaders.boxPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.CircleCollection, + createMaterial( + 'Primitives (Circle)', + sectorShaders.circlePrimitive.vertex, + sectorShaders.circlePrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.ConeCollection, + createMaterial( + 'Primitives (Cone)', + sectorShaders.conePrimitive.vertex, + sectorShaders.conePrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.EccentricConeCollection, + createMaterial( + 'Primitives (EccentricCone)', + sectorShaders.eccentricConePrimitive.vertex, + sectorShaders.eccentricConePrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.EllipsoidSegmentCollection, + createMaterial( + 'Primitives (EllipsoidSegment)', + sectorShaders.ellipsoidSegmentPrimitive.vertex, + sectorShaders.ellipsoidSegmentPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.GeneralCylinderCollection, + createMaterial( + 'Primitives (GeneralCylinder)', + sectorShaders.generalCylinderPrimitive.vertex, + sectorShaders.generalCylinderPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.GeneralRingCollection, + createMaterial( + 'Primitives (GeneralRing)', + sectorShaders.generalRingPrimitive.vertex, + sectorShaders.generalRingPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.QuadCollection, + createMaterial( + 'Primitives (Quad)', + sectorShaders.quadPrimitive.vertex, + sectorShaders.quadPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.TorusSegmentCollection, + createMaterial( + 'Primitives (TorusSegment)', + sectorShaders.torusSegmentPrimitive.vertex, + sectorShaders.torusSegmentPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.TrapeziumCollection, + createMaterial( + 'Primitives (Trapezium)', + sectorShaders.trapeziumPrimitive.vertex, + sectorShaders.trapeziumPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.NutCollection, + createMaterial( + 'Primitives (Nut)', + sectorShaders.nutPrimitive.vertex, + sectorShaders.nutPrimitive.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.TriangleMesh, + createMaterial( + 'Primitives (TriangleMesh)', + sectorShaders.detailedMesh.vertex, + sectorShaders.detailedMesh.fragment, + sharedParams + ) + ], + [ + RevealGeometryCollectionType.InstanceMesh, + createMaterial( + 'Primitives (InstancedMesh)', + sectorShaders.instancedMesh.vertex, + sectorShaders.instancedMesh.fragment, + sharedParams + ) + ] + ]); +} + +function createMaterial( + name: string, + vertexShader: string, + fragmentShader: string, + sharedParams: THREE.ShaderMaterialParameters +): THREE.RawShaderMaterial { + return new THREE.RawShaderMaterial({ + ...sharedParams, + name, + vertexShader, + fragmentShader + }); +} diff --git a/viewer/packages/tools/index.ts b/viewer/packages/tools/index.ts index 272b30feff6..5df08e9e910 100644 --- a/viewer/packages/tools/index.ts +++ b/viewer/packages/tools/index.ts @@ -40,3 +40,11 @@ export { Keyframe } from './src/Timeline/Keyframe'; export { TimelineDateUpdateDelegate } from './src/Timeline/types'; export { Cognite3DViewerToolBase } from './src/Cognite3DViewerToolBase'; export { DebugLoadedSectorsTool, DebugLoadedSectorsToolOptions } from './src/DebugLoadedSectorsTool'; +export { MeasurementTool } from './src/Measurement/MeasurementTool'; +export { Measurement } from './src/Measurement/MeasurementManager'; +export { + MeasurementOptions, + MeasurementAddedDelegate, + MeasurementStartedDelegate, + MeasurementEndedDelegate +} from './src/Measurement/types'; diff --git a/viewer/packages/tools/src/Measurement/MeasurementLabels.ts b/viewer/packages/tools/src/Measurement/MeasurementLabels.ts new file mode 100644 index 00000000000..9946e187266 --- /dev/null +++ b/viewer/packages/tools/src/Measurement/MeasurementLabels.ts @@ -0,0 +1,40 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import labelCSS from './styles/Label.css'; + +export class MeasurementLabels { + static readonly stylesId = 'reveal-measurement-label'; + + constructor() { + MeasurementLabels.ensureStylesLoaded(); + } + + /** + * Create a HTML element with a string and return the element. + * @param label String on the label. + * @returns HTMLDivElement. + */ + createLabel(label: string): HTMLDivElement { + const element = document.createElement('div'); + element.innerText = label; + element.className = MeasurementLabels.stylesId; + return element; + } + + /** + * Load the the styles from the CSS and appends them to the label. + * @returns Return if styles already loaded. + */ + private static ensureStylesLoaded() { + if (document.getElementById(MeasurementLabels.stylesId)) { + return; + } + + const style = document.createElement('style'); + style.id = MeasurementLabels.stylesId; + style.appendChild(document.createTextNode(labelCSS)); + document.head.appendChild(style); + } +} diff --git a/viewer/packages/tools/src/Measurement/MeasurementLine.ts b/viewer/packages/tools/src/Measurement/MeasurementLine.ts new file mode 100644 index 00000000000..7368ea39621 --- /dev/null +++ b/viewer/packages/tools/src/Measurement/MeasurementLine.ts @@ -0,0 +1,144 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; +import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry'; +import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial'; +import { Line2 } from 'three/examples/jsm/lines/Line2'; + +export class MeasurementLine { + private readonly _geometry: LineGeometry; + private readonly _meshes: THREE.Group; + private readonly _fixedWidthLineMaterial: LineMaterial; + private readonly _adaptiveWidthLineMaterial: LineMaterial; + private readonly _position: Float32Array; + + constructor(lineWidth: number, lineColor: THREE.Color, startPoint: THREE.Vector3) { + this._position = new Float32Array(6); + this._geometry = new LineGeometry(); + + //Adaptive Line width + this._adaptiveWidthLineMaterial = new LineMaterial({ + color: lineColor.getHex(), + linewidth: lineWidth, + worldUnits: true, + depthTest: false + }); + + //Fixed line Width. + this._fixedWidthLineMaterial = new LineMaterial({ + color: lineColor.getHex(), + linewidth: 2, // Tests have shown this to work reasonable on tested devices + worldUnits: false, + depthTest: false + }); + + this._meshes = new THREE.Group(); + this._meshes.name = 'Measurement'; + + const onBeforeRenderTrigger = new THREE.Mesh(new THREE.BufferGeometry()); + onBeforeRenderTrigger.name = 'onBeforeRenderTrigger trigger (no geometry)'; + onBeforeRenderTrigger.frustumCulled = false; + const resolution = new THREE.Vector2(); + onBeforeRenderTrigger.onBeforeRender = renderer => { + const { width, height } = renderer.domElement.getBoundingClientRect(); + resolution.set(width, height); + this._adaptiveWidthLineMaterial.resolution = this._fixedWidthLineMaterial.resolution = resolution; + }; + this._meshes.add(onBeforeRenderTrigger); + this.startLine(startPoint); + } + + dispose(): void { + if (this._geometry) { + this._geometry.dispose(); + } + this._adaptiveWidthLineMaterial.dispose(); + this._fixedWidthLineMaterial.dispose(); + this._meshes.clear(); + this._meshes.removeFromParent(); + } + + get meshes(): THREE.Group { + return this._meshes; + } + + /** + * Update the measuring line end point. + * @param endPoint Second point of the line to end the measurement. + */ + updateLine(endPoint: THREE.Vector3): void { + this._position[3] = endPoint.x; + this._position[4] = endPoint.y; + this._position[5] = endPoint.z; + //Update the line geometry end point. + this._geometry.setPositions(this._position); + } + + /** + * Get the distance between the measuring line start point & end point. + * @returns Return distance between start & end point of the line. + */ + getMeasuredDistance(): number { + const startPoint = new THREE.Vector3(this._position[0], this._position[1], this._position[2]); + const endPoint = new THREE.Vector3(this._position[3], this._position[4], this._position[5]); + return endPoint.distanceTo(startPoint); + } + + /** + * Calculate mid point on the Line. + * @returns Returns mid point between start and end points. + */ + getMidPointOnLine(): THREE.Vector3 { + const startPoint = new THREE.Vector3(this._position[0], this._position[1], this._position[2]); + const endPoint = new THREE.Vector3(this._position[3], this._position[4], this._position[5]); + let direction = endPoint.clone().sub(startPoint); + const length = direction.length(); + direction = direction.normalize().multiplyScalar(length * 0.5); + + return startPoint.clone().add(direction); + } + + /** + * Update current line width. + * @param lineWidth Width of the measuring line mesh. + */ + updateLineWidth(lineWidth: number): void { + this._adaptiveWidthLineMaterial.linewidth = lineWidth; + } + + /** + * Update current line color. + * @param color Color of the measuring line mesh. + */ + updateLineColor(color: THREE.Color): void { + this._fixedWidthLineMaterial.color = this._adaptiveWidthLineMaterial.color = color; + } + + /** + * Generate line geometry and create the mesh. + * @param point Point from where the line will be generated. + */ + private startLine(point: THREE.Vector3): void { + this._position[0] = this._position[3] = point.x; + this._position[1] = this._position[4] = point.y; + this._position[2] = this._position[5] = point.z; + + this._geometry.setPositions(this._position); + + const adaptiveMesh = new Line2(this._geometry, this._adaptiveWidthLineMaterial); + //Assign bounding sphere & box for the line to support raycasting. + adaptiveMesh.computeLineDistances(); + //Make sure line are rendered in-front of other objects. + adaptiveMesh.renderOrder = 100; + + //Fixed line width when camera is zoom out or far away from the line. + const fixedMesh = new Line2(this._geometry, this._fixedWidthLineMaterial); + fixedMesh.computeLineDistances(); + fixedMesh.renderOrder = 100; + + this._meshes.add(adaptiveMesh); + this._meshes.add(fixedMesh); + } +} diff --git a/viewer/packages/tools/src/Measurement/MeasurementManager.ts b/viewer/packages/tools/src/Measurement/MeasurementManager.ts new file mode 100644 index 00000000000..8522b3ddeaf --- /dev/null +++ b/viewer/packages/tools/src/Measurement/MeasurementManager.ts @@ -0,0 +1,160 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; +import { HtmlOverlayTool } from '../HtmlOverlay/HtmlOverlayTool'; +import { MeasurementLabels } from './MeasurementLabels'; +import { MeasurementLine } from './MeasurementLine'; +import { MeasurementOptions } from './types'; + +export type Measurement = { + readonly measurementId: number; + readonly startPoint: THREE.Vector3; + readonly endPoint: THREE.Vector3; + readonly distanceInMeters: number; +}; + +export class MeasurementManager { + private readonly _measurementLabel: MeasurementLabels; + private readonly _line: MeasurementLine; + private readonly _options: Required; + private readonly _domElement: HTMLElement; + private readonly _camera: THREE.Camera; + private readonly _meshGroup: THREE.Group; + private readonly _htmlOverlay: HtmlOverlayTool; + private _labelElement: HTMLDivElement | undefined; + private readonly _distanceToCamera: number; + private readonly _startPoint: THREE.Vector3; + private _measurement: Measurement = { + measurementId: 0, + startPoint: new THREE.Vector3(), + endPoint: new THREE.Vector3(), + distanceInMeters: 0 + }; + + constructor( + viewerDomElement: HTMLElement, + camera: THREE.Camera, + meshGroup: THREE.Group, + options: Required, + overlay: HtmlOverlayTool, + startPoint: THREE.Vector3 + ) { + this._options = options; + this._measurementLabel = new MeasurementLabels(); + this._htmlOverlay = overlay; + this._domElement = viewerDomElement; + this._camera = camera; + this._meshGroup = meshGroup; + this._startPoint = startPoint; + this._distanceToCamera = this._camera.getWorldPosition(new THREE.Vector3()).distanceTo(startPoint); + this._line = this.startMeasurement(startPoint); + this._meshGroup.add(this._line.meshes); + } + + /** + * Update the measurement line end point to the provided mouse coordinates + */ + update(mouseEvent: { offsetX: number; offsetY: number }): void { + const { offsetX, offsetY } = mouseEvent; + this._line.updateLine(this.pointerTo3DPosition(offsetX, offsetY)); + } + + /** + * End the measurement. + * @param point World position at which measuring line ends. + */ + endMeasurement(point: THREE.Vector3): void { + const { distanceToLabelCallback } = this._options; + //Update the line with final end point. + this._line.updateLine(point); + const label = distanceToLabelCallback(this._line.getMeasuredDistance()); + //Add the measurement label. + this._labelElement = this.addLabel(this._line.getMidPointOnLine(), label); + this._measurement = { + measurementId: Date.now(), + startPoint: this._startPoint, + endPoint: point, + distanceInMeters: this._line.getMeasuredDistance() + }; + } + + /** + * Remove the measurement. + */ + removeMeasurement(): void { + this._meshGroup.remove(this._line.meshes); + + if (this._labelElement) { + this._htmlOverlay.remove(this._labelElement); + } + + if (this._line) { + this._line.dispose(); + } + } + + getMeasurement(): Readonly { + return this._measurement; + } + + /** + * Update current line width. + * @param lineWidth Width of the measuring line mesh. + */ + updateLineWidth(lineWidth: number): void { + this._line.updateLineWidth(lineWidth); + } + + /** + * Update current line color. + * @param color Color of the measuring line mesh. + */ + updateLineColor(color: THREE.Color): void { + this._line.updateLineColor(color); + } + + /** + * Start the measurement. + * @param point World position to start measurement operation from. + */ + private startMeasurement(point: THREE.Vector3): MeasurementLine { + return new MeasurementLine(this._options.lineWidth, this._options.color, point); + } + + /** + * Creates a measurement label, add it to HTMLOverlay and return the created label element. + * @param position Label position. + * @param label Label text. + * @returns HTML element. + */ + private addLabel(position: THREE.Vector3, label: string): HTMLDivElement { + const labelElement = this._measurementLabel.createLabel(label); + this._htmlOverlay.add(labelElement, position); + return labelElement; + } + + private pointerTo3DPosition(offsetX: number, offsetY: number) { + const position = new THREE.Vector3(); + //Get position based on the mouse pointer X and Y value. + const mouse = new THREE.Vector2(); + mouse.x = (offsetX / this._domElement.clientWidth) * 2 - 1; + mouse.y = -(offsetY / this._domElement.clientHeight) * 2 + 1; + + const direction = new THREE.Vector3(); + const ray = new THREE.Ray(); + const origin = new THREE.Vector3(); + + //Set the origin of the Ray to camera. + origin.setFromMatrixPosition(this._camera.matrixWorld); + ray.origin.copy(origin); + //Calculate the camera direction. + direction.set(mouse.x, mouse.y, 0.5).unproject(this._camera).sub(ray.origin).normalize(); + ray.direction.copy(direction); + //Note: Using the initial/start point as reference for ray to emit till that distance from camera. + ray.at(this._distanceToCamera, position); + + return position; + } +} diff --git a/viewer/packages/tools/src/Measurement/MeasurementTool.ts b/viewer/packages/tools/src/Measurement/MeasurementTool.ts new file mode 100644 index 00000000000..24b58ba1f89 --- /dev/null +++ b/viewer/packages/tools/src/Measurement/MeasurementTool.ts @@ -0,0 +1,440 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { Cognite3DViewer } from '@reveal/api'; +import { Cognite3DViewerToolBase } from '../Cognite3DViewerToolBase'; +import { assertNever, DisposedDelegate, EventTrigger } from '@reveal/utilities'; +import * as THREE from 'three'; +import { + MeasurementAddedDelegate, + MeasurementStartedDelegate, + MeasurementEndedDelegate, + MeasurementOptions +} from './types'; +import { MeasurementManager, Measurement } from './MeasurementManager'; +import { MeasurementLabels } from './MeasurementLabels'; +import { HtmlOverlayTool, HtmlOverlayToolOptions } from '../HtmlOverlay/HtmlOverlayTool'; +import rulerSvg from '!!raw-loader!./styles/ruler.svg'; + +type MeasurementEvents = 'added' | 'started' | 'ended' | 'disposed'; + +/** + * Enables {@see Cognite3DViewer} to perform a point to point measurement. + * This can be achieved by selecting a point on the 3D Object and drag the pointer to + * required point to get measurement of the distance. + * The tools default measurement is in "Meters" as supported in Reveal, but it also provides + * user to customise the measuring units based on their convinience with the callback. + * + * @example + * ```js + * const measurementTool = new MeasurementTool(viewer); + * measurementTool.enterMeasurementMode(); + * // ... + * measurementTool.exitMeasurementMode(); + * + * // detach the tool from the viewer + * measurementTool.dispose(); + * ``` + * @example + * ```jsx runnable + * const measurementTool = new MeasurementTool(viewer, {distanceToLabelCallback: (distanceInMeters) => { + * // 1 meters = 3.281 feet + * const distancesInFeet = distanceInMeters * 3.281; + * return { distanceInMeters: distancesInFeet, units: 'ft'}; + * }}); + * measurementTool.enterMeasurementMode(); +``` + */ +export class MeasurementTool extends Cognite3DViewerToolBase { + /** + * Returns measurement mode state, is measurement mode started or ended. + */ + get isInMeasurementMode(): boolean { + return this._measurementMode; + } + + private _options: Required; + private readonly _viewer: Cognite3DViewer; + private readonly _geometryGroup = new THREE.Group(); + private readonly _measurements: MeasurementManager[]; + private _activeMeasurement: MeasurementManager | undefined; + private readonly _htmlOverlay: HtmlOverlayTool; + private _measurementMode: boolean; + + private readonly _handleLabelClustering = this.createCombineClusterElement.bind(this); + private readonly _handlePointerClick = this.onPointerClick.bind(this); + private readonly _handlePointerMove = this.onPointerMove.bind(this); + private readonly _handleMeasurementCancel = this.onKeyDown.bind(this); + + private readonly _events = { + measurementAdded: new EventTrigger(), + measurementStarted: new EventTrigger(), + measurementEnded: new EventTrigger(), + disposed: new EventTrigger() + }; + + private readonly _overlayOptions: HtmlOverlayToolOptions = { + clusteringOptions: { mode: 'overlapInScreenSpace', createClusterElementCallback: this._handleLabelClustering } + }; + + private static readonly defaultLineOptions: Required = { + distanceToLabelCallback: d => MeasurementTool.metersLabelCallback(d), + lineWidth: 0.01, + color: new THREE.Color(0xff8746) + }; + + constructor(viewer: Cognite3DViewer, options?: MeasurementOptions) { + super(); + this._viewer = viewer; + this._options = { + ...MeasurementTool.defaultLineOptions, + ...options + }; + this._measurements = []; + this._measurementMode = false; + this._htmlOverlay = new HtmlOverlayTool(this._viewer, this._overlayOptions); + + this._geometryGroup.name = MeasurementTool.name; + this._viewer.addObject3D(this._geometryGroup); + } + + /** + * Triggered when the tool is disposed. Listeners should clean up any + * resources held and remove the reference to the tool. + * @example + * ```js + * measurementTool.on('disposed', onMeasurementDispose); + * ``` + */ + on(event: 'disposed', callback: DisposedDelegate): void; + + /** + * Triggered when a measurement is added into the Cognite3DViewer. + * @example + * ```js + * measurementTool.on('added', onMeasurementAdded); + * ``` + */ + on(event: 'added', callback: MeasurementAddedDelegate): void; + + /** + * Triggered when a measurement mode is started. + * @example + * ```js + * measurementTool.on('started', onMeasurementStarted); + * ``` + */ + on(event: 'started', callback: MeasurementStartedDelegate): void; + + /** + * Triggered when measurement mode is ended. + * @example + * ```js + * measurementTool.on('ended', onMeasurementEnded); + * ``` + */ + on(event: 'ended', callback: MeasurementEndedDelegate): void; + + /** + * Subscribe to the Measurement events + * @param event `MeasurementEvents` event + * @param callback Callback to measurements events + */ + on( + event: MeasurementEvents, + callback: MeasurementAddedDelegate | MeasurementStartedDelegate | MeasurementEndedDelegate | DisposedDelegate + ): void { + switch (event) { + case 'added': + this._events.measurementAdded.subscribe(callback as MeasurementAddedDelegate); + break; + case 'started': + this._events.measurementStarted.subscribe(callback as MeasurementStartedDelegate); + break; + case 'ended': + this._events.measurementEnded.subscribe(callback as MeasurementEndedDelegate); + break; + case 'disposed': + this._events.disposed.subscribe(callback as DisposedDelegate); + break; + default: + assertNever(event, `Unsupported event: '${event}'`); + } + } + + /** + * @example + * ```js + * measurementTool.off('disposed', onMeasurementDispose); + * ``` + */ + off(event: 'disposed', callback: DisposedDelegate): void; + + /** + * @example + * ```js + * measurementTool.off('added', onMeasurementAdded); + * ``` + */ + off(event: 'added', callback: MeasurementAddedDelegate): void; + + /** + * @example + * ```js + * measurementTool.off('started', onMeasurementStarted); + * ``` + */ + off(event: 'started', callback: MeasurementStartedDelegate): void; + + /** + * @example + * ```js + * measurementTool.off('ended', onMeasurementEnded); + * ``` + */ + off(event: 'ended', callback: MeasurementEndedDelegate): void; + + /** + * Unsubscribe to the Measurement event + * @param event `MeasurementEvents` event + * @param callback Callback to measurements events + */ + off( + event: MeasurementEvents, + callback: MeasurementAddedDelegate | MeasurementStartedDelegate | MeasurementEndedDelegate | DisposedDelegate + ): void { + switch (event) { + case 'added': + this._events.measurementAdded.unsubscribe(callback as MeasurementAddedDelegate); + break; + case 'started': + this._events.measurementStarted.unsubscribe(callback as MeasurementStartedDelegate); + break; + case 'ended': + this._events.measurementEnded.unsubscribe(callback as MeasurementEndedDelegate); + break; + case 'disposed': + this._events.disposed.unsubscribe(callback as DisposedDelegate); + break; + default: + assertNever(event, `Unsupported event: '${event}'`); + } + } + + /** + * Enter into point to point measurement mode. + */ + enterMeasurementMode(): void { + if (this._measurementMode) { + throw new Error('Measurement mode is active, call exitMeasurementMode()'); + } + this._viewer.on('click', this._handlePointerClick); + this._events.measurementStarted.fire(); + this._measurementMode = true; + } + + /** + * Exit measurement mode. + */ + exitMeasurementMode(): void { + if (!this._measurementMode) { + throw new Error('Measurement mode is not active, call enterMeasurementMode()'); + } + this.cancelActiveMeasurement(); + this._viewer.off('click', this._handlePointerClick); + this._events.measurementEnded.fire(); + this._measurementMode = false; + } + + /** + * Removes a measurement from the Cognite3DViewer. + * @param measurement Measurement to be removed from Cognite3DViewer. + */ + removeMeasurement(measurement: Measurement): void { + const index = this._measurements.findIndex( + measurementManager => measurementManager.getMeasurement() === measurement + ); + if (index === -1) { + throw new Error('Measurement not found'); + } + this._measurements[index].removeMeasurement(); + this._measurements.splice(index, 1); + this._viewer.requestRedraw(); + } + + /** + * Removes all measurements from the Cognite3DViewer. + */ + removeAllMeasurements(): void { + //clear all mesh, geometry & labels. + this._measurements.forEach(measurement => { + measurement.removeMeasurement(); + }); + this._measurements.splice(0); + this._viewer.requestRedraw(); + } + + /** + * Sets the visiblity of labels in the Measurement. + * @param enable + */ + setMeasurementLabelsVisible(enable: boolean): void { + this._htmlOverlay.visible(enable); + } + + /** + * Sets Measurement line width, color and label units value for the next measurment. + * @param options MeasurementOptions to set line width, color and callback for custom operation on measurement labels. + */ + setLineOptions(options: MeasurementOptions): void { + this._options = { + ...this._options, + ...options + }; + } + + /** + * Update selected line width. + * @param measurement Measurement to be updated. + * @param lineWidth Width of the measuring line. + */ + updateLineWidth(measurement: Measurement, lineWidth: number): void { + const index = this._measurements.findIndex( + measurementManager => measurementManager.getMeasurement() === measurement + ); + if (index === -1) { + throw new Error('Measurement not found'); + } + this._measurements[index].updateLineWidth(lineWidth); + this._viewer.requestRedraw(); + } + + /** + * Update selected line color. + * @param measurement Measurement to be updated. + * @param color Color of the measuring line. + */ + updateLineColor(measurement: Measurement, color: THREE.Color): void { + const index = this._measurements.findIndex( + measurementManager => measurementManager.getMeasurement() === measurement + ); + if (index === -1) { + throw new Error('Measurement not found'); + } + this._measurements[index].updateLineColor(color); + this._viewer.requestRedraw(); + } + + /** + * Get all measurements from {@link Cognite3DViewer}. + * @returns Array of Measurements containing Id, start point, end point & measured distance. + */ + getAllMeasurements(): Measurement[] { + return this._measurements.map(measurement => measurement.getMeasurement()); + } + + /** + * Dispose Measurement Tool. + */ + dispose(): void { + this.removeAllMeasurements(); + this.exitMeasurementMode(); + this._activeMeasurement?.removeMeasurement(); + this._htmlOverlay.dispose(); + this._geometryGroup.clear(); + this._viewer.removeObject3D(this._geometryGroup); + this._events.measurementAdded.unsubscribeAll(); + this._events.measurementStarted.unsubscribeAll(); + this._events.measurementEnded.unsubscribeAll(); + super.dispose(); + } + + private async onPointerClick(event: { offsetX: number; offsetY: number }): Promise { + const { offsetX, offsetY } = event; + + const intersection = await this._viewer.getIntersectionFromPixel(offsetX, offsetY); + + if (!intersection) { + return; + } + + if (!this._activeMeasurement) { + const camera = this._viewer.getCamera(); + const domElement = this._viewer.domElement; + this._activeMeasurement = new MeasurementManager( + domElement, + camera, + this._geometryGroup, + this._options, + this._htmlOverlay, + intersection.point + ); + this._viewer.domElement.addEventListener('pointermove', this._handlePointerMove); + window.addEventListener('keydown', this._handleMeasurementCancel); + } else { + this._activeMeasurement.endMeasurement(intersection.point); + this._measurements.push(this._activeMeasurement); + this._activeMeasurement = undefined; + // To avoid issue when exiting measurement mode when a measurement 'added' event called + this._events.measurementAdded.fire(this._measurements[this._measurements.length - 1].getMeasurement()); + this._viewer.domElement.removeEventListener('pointermove', this._handlePointerMove); + window.removeEventListener('keydown', this._handleMeasurementCancel); + } + this._viewer.requestRedraw(); + } + + private onPointerMove(event: { offsetX: number; offsetY: number }) { + if (this._activeMeasurement) { + this._activeMeasurement!.update(event); + this._viewer.requestRedraw(); + } + } + + /** + * Create and return combine ruler icon as HTMLDivElement. + * @returns HTMLDivElement. + */ + private createCombineClusterElement() { + // TODO 2022-07-05 larsmoa: Move all ownership of labels here - currently responsibility is split + // between several classes which is *bad* + // pramodcog: as clustering is related to tool, it would be ideal to have it here. + const combineElement = document.createElement('div'); + combineElement.className = MeasurementLabels.stylesId; + combineElement.innerHTML = rulerSvg; + + return combineElement; + } + + private static metersLabelCallback(distanceInMeters: number): string { + return `${distanceInMeters.toFixed(2)} m`; + } + + /** + * To cancel an active measurement `Escape` key is processed and remove all its related data & events. + * @param event Keyboard event to process for `Escape` key + */ + private onKeyDown(event: KeyboardEvent) { + if (event.metaKey || event.altKey || event.ctrlKey) { + return; + } + + if (event.key === 'Escape') { + //Cancel active measurement + this.cancelActiveMeasurement(); + event.preventDefault(); + } + } + + /** + * Cancel the active measurement. + */ + private cancelActiveMeasurement() { + if (this._activeMeasurement) { + this._activeMeasurement.removeMeasurement(); + this._activeMeasurement = undefined; + this._viewer.requestRedraw(); + this._viewer.domElement.removeEventListener('pointermove', this._handlePointerMove); + } + } +} diff --git a/viewer/packages/tools/src/Measurement/styles/Label.css b/viewer/packages/tools/src/Measurement/styles/Label.css new file mode 100644 index 00000000000..8ae1186cfa8 --- /dev/null +++ b/viewer/packages/tools/src/Measurement/styles/Label.css @@ -0,0 +1,23 @@ +.reveal-measurement-label { + position: absolute; + + /* Anchor to the center of the element and ignore events */ + transform: translate(-50%, -50%); + pointer-events: none; + touch-action: none; + user-select: none; + border-radius: 6px; + + /* Make it look nice */ + padding: 6px; + color: #fff; + background: #232323da; + border: #ffffff22 solid 1px; + overflow: hidden; + white-space: nowrap; + + /*Font - fallback to generic font if Inter not available*/ + font-family: 'Inter', sans-serif; + font-style: normal; + font-weight: 500; +} diff --git a/viewer/packages/tools/src/Measurement/styles/ruler.svg b/viewer/packages/tools/src/Measurement/styles/ruler.svg new file mode 100644 index 00000000000..6d6fbd155fa --- /dev/null +++ b/viewer/packages/tools/src/Measurement/styles/ruler.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/viewer/packages/tools/src/Measurement/types.ts b/viewer/packages/tools/src/Measurement/types.ts new file mode 100644 index 00000000000..499b2415428 --- /dev/null +++ b/viewer/packages/tools/src/Measurement/types.ts @@ -0,0 +1,43 @@ +/*! + * Copyright 2022 Cognite AS + */ + +/** + * Custom callback for users to change measurement label content. + */ +export type DistanceToLabelDelegate = (distanceInMeters: number) => string; + +/** + * Delegate for measurement added events. + */ +export type MeasurementAddedDelegate = (event: { + measurementId: number; + startPoint: THREE.Vector3; + endPoint: THREE.Vector3; + distanceInMeters: number; +}) => void; + +/** + * Delegate for measurement started events. + */ +export type MeasurementStartedDelegate = () => void; + +/** + * Delegate for measurement ended events. + */ +export type MeasurementEndedDelegate = () => void; + +/** + * Measurement tool option with user custom callback, line width & color. + */ +export type MeasurementOptions = { + distanceToLabelCallback?: DistanceToLabelDelegate | undefined; + /** + * Line width in cm. Note that the minium drawn line will be ~2 pixels. + */ + lineWidth?: number; + /** + * Line color in 32 bit hex. + */ + color?: THREE.Color; +}; diff --git a/viewer/packages/utilities/index.ts b/viewer/packages/utilities/index.ts index daedf2b8733..7895bd57955 100644 --- a/viewer/packages/utilities/index.ts +++ b/viewer/packages/utilities/index.ts @@ -22,6 +22,7 @@ export { unionBoxes } from './src/three/unionBoxes'; export { determineCurrentDevice, DeviceDescriptor } from './src/device'; export { createRenderTriangle } from './src/three/createFullScreenTriangleGeometry'; +export { fitCameraToBoundingBox } from './src/three/fitCameraToBoundingBox'; export { isBox3OnPositiveSideOfPlane } from './src/three/isBox3OnPositiveSideOfPlane'; export { visitBox3CornerPoints } from './src/three/visitBox3CornerPoints'; export { isMobileOrTablet } from './src/isMobileOrTablet'; diff --git a/viewer/packages/utilities/src/SceneHandler.ts b/viewer/packages/utilities/src/SceneHandler.ts index 2d2feefe113..4a8a018e572 100644 --- a/viewer/packages/utilities/src/SceneHandler.ts +++ b/viewer/packages/utilities/src/SceneHandler.ts @@ -8,6 +8,7 @@ import remove from 'lodash/remove'; export class SceneHandler { private readonly _scene: THREE.Scene; private readonly _cadModels: { object: THREE.Object3D; modelIdentifier: string }[]; + private readonly _pointCloudModels: { object: THREE.Object3D; modelIdentifier: symbol }[]; private readonly _customObjects: THREE.Object3D[]; get scene(): THREE.Scene { @@ -18,12 +19,17 @@ export class SceneHandler { return this._cadModels; } + get pointCloudModels(): { object: THREE.Object3D; modelIdentifier: symbol }[] { + return this._pointCloudModels; + } + get customObjects(): THREE.Object3D[] { return this._customObjects; } constructor() { this._cadModels = []; + this._pointCloudModels = []; this._customObjects = []; this._scene = new THREE.Scene(); @@ -35,6 +41,16 @@ export class SceneHandler { this._scene.add(object); } + public addPointCloudModel(object: THREE.Object3D, modelIdentifier: symbol): void { + this._pointCloudModels.push({ object, modelIdentifier }); + this._scene.add(object); + } + + public removePointCloudModel(object: THREE.Object3D): void { + this.scene.remove(object); + remove(this._pointCloudModels, { object }); + } + public removeCadModel(object: THREE.Object3D): void { this.scene.remove(object); remove(this._cadModels, { object }); @@ -52,6 +68,7 @@ export class SceneHandler { public dispose(): void { this._cadModels.splice(0); + this._pointCloudModels.splice(0); this._customObjects.splice(0); this.scene.traverse(object => { diff --git a/viewer/packages/utilities/src/WebGLRendererStateHelper.ts b/viewer/packages/utilities/src/WebGLRendererStateHelper.ts index 693c35bce71..5797204d0b8 100644 --- a/viewer/packages/utilities/src/WebGLRendererStateHelper.ts +++ b/viewer/packages/utilities/src/WebGLRendererStateHelper.ts @@ -6,6 +6,7 @@ import { Vector4 } from 'three'; type WebGLRendererState = { autoClear?: boolean; + autoClearDepth?: boolean; clearColor?: THREE.Color | string | number; clearAlpha?: number; size?: THREE.Vector2; @@ -100,6 +101,11 @@ export class WebGLRendererStateHelper { this._renderer.autoClear = enabled; } + set autoClearDepth(enabled: boolean) { + this._originalState = { autoClearDepth: this._renderer.autoClearDepth, ...this._originalState }; + this._renderer.autoClearDepth = enabled; + } + setRenderTarget(renderTarget: THREE.WebGLRenderTarget | null): void { this._originalState = { renderTarget: this._renderer.getRenderTarget(), ...this._originalState }; this._renderer.setRenderTarget(renderTarget); @@ -109,6 +115,9 @@ export class WebGLRendererStateHelper { if (this._originalState.autoClear !== undefined) { this._renderer.autoClear = this._originalState.autoClear; } + if (this._originalState.autoClearDepth !== undefined) { + this._renderer.autoClearDepth = this._originalState.autoClearDepth; + } if (this._originalState.clearColor !== undefined) { this._renderer.setClearColor(this._originalState.clearColor, this._originalState.clearAlpha); } diff --git a/viewer/packages/utilities/src/three/fitCameraToBoundingBox.ts b/viewer/packages/utilities/src/three/fitCameraToBoundingBox.ts new file mode 100644 index 00000000000..b29bf7dfc29 --- /dev/null +++ b/viewer/packages/utilities/src/three/fitCameraToBoundingBox.ts @@ -0,0 +1,29 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; + +/** + * Calculates camera position and target that allows to see the content of provided bounding box. + * @param camera Used camera instance. + * @param box Bounding box to be fitted. + * @param radiusFactor The ratio of the distance from camera to center of box and radius of the box. + * @returns + */ +export function fitCameraToBoundingBox( + camera: THREE.PerspectiveCamera, + box: THREE.Box3, + radiusFactor: number = 2 +): { position: THREE.Vector3; target: THREE.Vector3 } { + const boundingSphere = box.getBoundingSphere(new THREE.Sphere()); + + const target = boundingSphere.center; + const distance = boundingSphere.radius * radiusFactor; + const direction = new THREE.Vector3(0, 0, -1); + direction.applyQuaternion(camera.quaternion); + + const position = direction.clone().multiplyScalar(-distance).add(target); + + return { position, target }; +} diff --git a/viewer/packages/webpack.config.js b/viewer/packages/webpack.config.js index d1bca526986..815b02fcc17 100644 --- a/viewer/packages/webpack.config.js +++ b/viewer/packages/webpack.config.js @@ -65,9 +65,9 @@ module.exports = env => { rules: [ { test: /\.worker\.ts$/, - loader: 'worker-loader', + loader: 'workerize-loader', options: { - inline: 'no-fallback' + inline: true } }, { @@ -92,6 +92,14 @@ module.exports = env => { test: /\.(glsl|vert|frag)$/, exclude: '/node_modules/', use: ['raw-loader', 'glslify-loader'] + }, + { + test: /\.css$/, + use: ['raw-loader'] + }, + { + test: /\.wasm$/, + type: 'asset/inline' } ] }, diff --git a/viewer/test-utilities/src/createPointCloudModel.ts b/viewer/test-utilities/src/createPointCloudModel.ts index 5aeccc0f74b..49b6b93287d 100644 --- a/viewer/test-utilities/src/createPointCloudModel.ts +++ b/viewer/test-utilities/src/createPointCloudModel.ts @@ -34,7 +34,7 @@ export function createPointCloudModel(modelId: number, revisionId: number): Cogn .returns(new PointCloudMaterial()) .object(); - const nodeWrapper = new PotreeNodeWrapper(dummyNode, []); + const nodeWrapper = new PotreeNodeWrapper(dummyNode, [], Symbol('dummy')); const pointCloudNode = new PointCloudNode(potreeGroup, nodeWrapper); diff --git a/viewer/test-utilities/src/setupJest.ts b/viewer/test-utilities/src/setupJest.ts index bccc5c4e5b8..dabd5678899 100644 --- a/viewer/test-utilities/src/setupJest.ts +++ b/viewer/test-utilities/src/setupJest.ts @@ -5,6 +5,7 @@ // fetch() polyfill import 'whatwg-fetch'; import { TextDecoder } from 'util'; +import ResizeObserver from 'resize-observer-polyfill'; // Create document.currentScript required by potree-core Object.defineProperty(document, 'currentScript', { @@ -31,6 +32,7 @@ class StubWorker { public postMessage(_: any) {} } (window as any).Worker = StubWorker; +(window as any).ResizeObserver = ResizeObserver; // Filter away warning from ThreeJS about "THREE.WebGLRenderer: EXT_xxx extension not supported." // which is caused by using a mock WebGL implementation for unit testing diff --git a/viewer/tsconfig.json b/viewer/tsconfig.json index b857fb4e9ee..ecd889a332d 100644 --- a/viewer/tsconfig.json +++ b/viewer/tsconfig.json @@ -10,6 +10,7 @@ ], "stripInternal": true, "noUnusedLocals": true, + "sourceMap": true, "noUnusedParameters": true, // Strict Type-Checking Options "strict": true, diff --git a/viewer/tsconfig.typedoc.json b/viewer/tsconfig.typedoc.json index f3b4bf6d6e8..64bb22d1e37 100644 --- a/viewer/tsconfig.typedoc.json +++ b/viewer/tsconfig.typedoc.json @@ -9,7 +9,8 @@ ], "target": "ES2019", "esModuleInterop": true, - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true }, "exclude": [ "./**/*.test.ts", diff --git a/viewer/visual-tests/.cdf-environments.json b/viewer/visual-tests/.cdf-environments.json new file mode 100644 index 00000000000..a54923b2189 --- /dev/null +++ b/viewer/visual-tests/.cdf-environments.json @@ -0,0 +1,8 @@ +{ + "environments": { + "cog-3d": { + "tenantId": "...", + "clientId": "..." + } + } +} \ No newline at end of file diff --git a/viewer/visual-tests/README.md b/viewer/visual-tests/README.md new file mode 100644 index 00000000000..7c1705e4603 --- /dev/null +++ b/viewer/visual-tests/README.md @@ -0,0 +1,65 @@ +# Visual Regression Tests + +Reveal uses visual tests as a form of regression testing and smoke tests. +The underlying stack leverages [puppeteer](https://www.npmjs.com/package/puppeteer) and [jest](https://www.npmjs.com/package/jest). + +The way it works is that we use [webpack-dev-server](https://www.npmjs.com/package/webpack-dev-server) to serve the contents of the visual tests (visual tests server) and have an instance of jest (visual tests client) play through the different visual tests using puppeteer. + +To run the visual tests on your local environment, simply run `yarn run test:visual` from the `/viewer` directory. + +This will initiate a two-step process of hosting the visual tests server and running the visual tests client. +In case you want to run the visual tests multiple times, you can run these processes separately such that you do not have to spin up the server on each run, which will shorten the feedback cycle. To do this, simply run `yarn run test:visual:server` and `yarn run test:visual:client` in two separate terminals. Once the visual tests complete, the test server will still keep running, and you can run the visual test client again. If you want to only test a subset of the visual tests, you can start them in watch mode with `yarn run test:visual:client --watch` and then use the standard jest terminal GUI to filter tests. Note that tests will not auto-run when you change visual tests since the watch mode is only on the test runner, so you will have to trigger a new run manually through the jest watch GUI. + + +## Running visual test in browser +Often it can be useful to locally develop against a visual test or simply inspect the result of visual tests. +There are currently multiple ways to do this based on your need. +The simplest way is to start the visual tests server with `yarn run test:visual:server` and navigate to the hosted location. +You will notice only a blank screen due to not specifying which test should be run. +To specify the visual test to run add the `testfixture` url parameter with the value being the file name (without extension) of the test you want to run (f.ex. `https://localhost:8080/?testfixture=Rendering.VisualTest`). +Changes made to the visual test will automatically rebuild the test server and reload the test. + +It is also possible to programatically start a visual test from the blank root page (`https://localhost:8080`) with `window.render` method (f.ex. `window.render('Rendering.VisualTest')`). + +For packages in Reveal you might want to create an visual test entrypoint in a `yarn start` command. +This can be done by simply specifying and passing environment variable to webpack in the command call. + + +An example script for a package.json would be something like this: +``` +"start": "yarn ws:serve --env testFixture=Rendering.VisualTest.ts", +``` +Where the `testFixture` variable points to whatever you would like the entrypoint to be. + +### Loading a specific 3D Model + +Visual tests also supports loading different 3d-models than the basic primitives scene. +To load a local model in a visual test, simply specify a `modelUrl` url param that points to the 3d model you wish to use (f.ex. `https://localhost:8080/?testfixture=Rendering.VisualTest&modelUrl=[Path/to/my/3dmodel]`). + +If you wish to use a 3D model hosted by [Cognite Data Fusion](https://www.cognite.com/en/product/cognite_data_fusion_industrial_dataops_platform) you first have to fill out the `/viewer/visual-tests/.cdf-environments.json` config file with the environment you wish to target (tenant ID and client ID). +Once this is done you can specify additional URL parameters to target the specific environment (`env`) as well as the project, model, and revision ID. An example of the full URL will look something like this: + +``` +https://localhost:8080/?testfixture=Rendering.VisualTest&env=cog-3d&project=3d-test&cluster=greenfield&modelId=123456789&revisionId=987654321 +``` +Note that for Cognite developers, default values of `env`, `project` and `cluster` have been set to target the `3d-test` project, so only `modelId` and `revisionId` need to be specified when targeting that project like such: + ``` +https://localhost:8080/?testfixture=Rendering.VisualTest&modelId=123456789&revisionId=987654321 +``` + +## Creating your own Visual Test +Reveal requires no form of registration of visual tests and simply detects a visual test based on the filename suffix similar to how normal unit tests work. +For the testing framework to recognize a visual test it must have the `.VisualTest.ts` suffix, so for example `Colors.VisualTest.ts` is a valid name. +The visual test must have a default export of a class that extends the `VisualTestFixture` interface. +Other than that there are no restrictions placed and successfully doing this will automatically register the visual test to be run using the `yarn run test:visual` command. + +For convenience, there exists base classes that can be used to handle a lot of the common boilerplate code for a visual tests (model loading, instantiating common components and authentication). +Most usecases should be covered by the following abstraction levels: +- SimpleVisualTestFixture: Basic setup with a WebGLRenderer, scene, camera etc. +- StreamingVisualTestFixture: Component-level abstraction with CadMaterialManager, UpdateHandler, RenderPipeline etc. +- ViewerVisualTestFixture: API-level abstraction on top of Cognite3DViewer. + +When creating new visual tests you should almost always use one of these abstractions. +If they do not cover a certain use-case or you create something that you think could be useful for other tests, consider either adding a new base VisualTestFixture or extend the current ones. + + diff --git a/viewer/visual-tests/VisualTest.browser.ts b/viewer/visual-tests/VisualTest.browser.ts index 064e3150c56..0f42fef9c1c 100644 --- a/viewer/visual-tests/VisualTest.browser.ts +++ b/viewer/visual-tests/VisualTest.browser.ts @@ -5,12 +5,17 @@ // @ts-ignore import visualTestsFixtures from '**/*.VisualTest.ts'; -async function testGenerator(): Promise Promise>> { - const testMap = new Map Promise>(); +//TODO: remove for Reveal 4.0 +import { revealEnv } from '../packages/utilities'; +import { VisualTestFixture } from './test-fixtures/VisualTestFixture'; +revealEnv.publicPath = 'https://apps-cdn.cogniteapp.com/@cognite/reveal-parser-worker/1.3.0/'; + +async function testGenerator(): Promise> { + const testMap = new Map(); visualTestsFixtures.forEach((visualTestsFixture: any) => { - const testFixture = new visualTestsFixture.module(); - testMap.set(visualTestsFixture.fileName, () => testFixture.run()); + const testFixture: VisualTestFixture = new visualTestsFixture.module(); + testMap.set(visualTestsFixture.fileName, testFixture); }); return testMap; @@ -18,9 +23,14 @@ async function testGenerator(): Promise Promise>> { const tests = testGenerator(); +let activeTest: VisualTestFixture; (window as any).render = async (testName: string) => { + if (activeTest) { + activeTest.dispose(); + } document.body.innerHTML = ''; - return (await tests).get(testName)!(); + activeTest = (await tests).get(testName)!; + return activeTest!.run(); }; const urlParams = new URLSearchParams(window.location.search); @@ -29,6 +39,6 @@ const testFixtureInstance = urlParams.get('testfixture'); if (testFixtureInstance !== null) { (async function () { const testMap = await tests; - testMap.get(testFixtureInstance)!(); + testMap.get(testFixtureInstance)!.run(); })(); } diff --git a/viewer/visual-tests/VisualTest.jest.ts b/viewer/visual-tests/VisualTest.jest.ts index 4377c682285..daa7dc2acc0 100644 --- a/viewer/visual-tests/VisualTest.jest.ts +++ b/viewer/visual-tests/VisualTest.jest.ts @@ -9,6 +9,9 @@ import { Page } from 'puppeteer'; describe('Visual tests', () => { let testPage: Page; + const red = '\x1b[31m'; + const green = '\x1b[32m'; + beforeAll(async () => { testPage = await browser.newPage(); @@ -20,7 +23,9 @@ describe('Visual tests', () => { }); test.each(glob.sync('**/*.VisualTest.ts').map(filePath => path.parse(filePath)))('%p', async testFilePath => { - return runTest(testFilePath); + const start = Date.now(); + await runTest(testFilePath); + console.log(green, testFilePath.name, red, `${(Date.now() - start) / 1000}s`); // eslint-disable-line }); afterAll(() => { @@ -33,9 +38,9 @@ describe('Visual tests', () => { return (window as any).render(testName) as Promise; }, name); - const canvas = await testPage.$('canvas'); + await testPage.$('canvas'); - const image = await canvas!.screenshot(); + const image = await testPage!.screenshot(); expect(image).toMatchImageSnapshot({ failureThreshold: 0.005, diff --git a/viewer/visual-tests/index.ts b/viewer/visual-tests/index.ts index 921aa68b8aa..db5a3928167 100644 --- a/viewer/visual-tests/index.ts +++ b/viewer/visual-tests/index.ts @@ -2,3 +2,4 @@ * Copyright 2022 Cognite AS */ export { SimpleVisualTestFixture, SimpleTestFixtureComponents } from './test-fixtures/SimpleVisualTestFixture'; +export { StreamingVisualTestFixture } from './test-fixtures/StreamingVisualTestFixture'; diff --git a/viewer/visual-tests/test-fixtures/SimpleVisualTestFixture.ts b/viewer/visual-tests/test-fixtures/SimpleVisualTestFixture.ts index 353d5197898..f7e0ef08b02 100644 --- a/viewer/visual-tests/test-fixtures/SimpleVisualTestFixture.ts +++ b/viewer/visual-tests/test-fixtures/SimpleVisualTestFixture.ts @@ -4,18 +4,9 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; -import { - ModelMetadataProvider, - ModelDataProvider, - ModelIdentifier, - LocalModelMetadataProvider, - LocalModelDataProvider, - CdfModelMetadataProvider, - CdfModelDataProvider, - LocalModelIdentifier, - CdfModelIdentifier -} from '../../packages/modeldata-api'; -import { createApplicationSDK } from '../../test-utilities/src/appUtils'; +import { ModelMetadataProvider, ModelDataProvider, ModelIdentifier } from '../../packages/modeldata-api'; +import { createDataProviders } from './utilities/createDataProviders'; +import { VisualTestFixture } from './VisualTestFixture'; export type SimpleTestFixtureComponents = { renderer: THREE.WebGLRenderer; @@ -29,7 +20,7 @@ export type SimpleTestFixtureComponents = { }; }; -export abstract class SimpleVisualTestFixture { +export abstract class SimpleVisualTestFixture implements VisualTestFixture { public readonly cadFromCdfToThreeMatrix = new THREE.Matrix4().set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1); private readonly _perspectiveCamera: THREE.PerspectiveCamera; @@ -62,7 +53,7 @@ export abstract class SimpleVisualTestFixture { cameraControls: this._controls, renderer: this._renderer, scene: this._scene, - dataProviders: await this.createDataProviders() + dataProviders: await createDataProviders() }; await this.setup(components); @@ -92,43 +83,9 @@ export abstract class SimpleVisualTestFixture { this._controls.target.copy(target); } - private async createDataProviders(): Promise<{ - modelMetadataProvider: ModelMetadataProvider; - modelDataProvider: ModelDataProvider; - modelIdentifier: ModelIdentifier; - }> { - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - - if (urlParams.has('modelId') && urlParams.has('revisionId')) { - return this.createCdfDataProviders(urlParams); - } - - return this.createLocalDataProviders(urlParams); - } - - private createLocalDataProviders(urlParams: URLSearchParams) { - const modelUrl = urlParams.get('modelUrl') ?? 'primitives'; - const modelIdentifier = new LocalModelIdentifier(modelUrl); - const modelMetadataProvider = new LocalModelMetadataProvider(); - const modelDataProvider = new LocalModelDataProvider(); - return { modelMetadataProvider, modelDataProvider, modelIdentifier }; - } - - private async createCdfDataProviders(urlParams: URLSearchParams) { - const client = await createApplicationSDK('reveal.example.simple', { - project: '3d-test', - cluster: 'greenfield', - clientId: 'a03a8caf-7611-43ac-87f3-1d493c085579', - tenantId: '20a88741-8181-4275-99d9-bd4451666d6e' - }); - - const modelId = parseInt(urlParams.get('modelId')!); - const revisionId = parseInt(urlParams.get('revisionId')!); - - const modelIdentifier = new CdfModelIdentifier(modelId, revisionId); - const modelMetadataProvider = new CdfModelMetadataProvider(client); - const modelDataProvider = new CdfModelDataProvider(client); - return { modelMetadataProvider, modelDataProvider, modelIdentifier }; + public dispose(): void { + this._controls.dispose(); + this._renderer.dispose(); + this._renderer.forceContextLoss(); } } diff --git a/viewer/visual-tests/test-fixtures/StreamingVisualTestFixture.ts b/viewer/visual-tests/test-fixtures/StreamingVisualTestFixture.ts new file mode 100644 index 00000000000..0281a572acd --- /dev/null +++ b/viewer/visual-tests/test-fixtures/StreamingVisualTestFixture.ts @@ -0,0 +1,306 @@ +/*! + * Copyright 2022 Cognite AS + */ +import * as THREE from 'three'; +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'; + +import { CadManager, CadModelUpdateHandler, createV8SectorCuller } from '../../packages/cad-geometry-loaders'; +import { CadModelFactory, CadNode } from '../../packages/cad-model'; +import { + BasicPipelineExecutor, + CadGeometryRenderModePipelineProvider, + CadMaterialManager, + defaultRenderOptions, + DefaultRenderPipelineProvider, + RenderMode, + RenderPipelineExecutor, + RenderPipelineProvider +} from '../../packages/rendering'; +import { createDataProviders } from './utilities/createDataProviders'; +import { VisualTestFixture } from './VisualTestFixture'; +import { DeferredPromise, fitCameraToBoundingBox, SceneHandler } from '../../packages/utilities'; +import { ModelIdentifier, ModelMetadataProvider } from '../../packages/modeldata-api'; +import { LoadingState } from '../../packages/model-base'; +import { PointCloudManager, PointCloudNode, Potree, PotreePointColorType } from '../../packages/pointclouds'; +import { PointCloudMetadataRepository } from '../../packages/pointclouds/src/PointCloudMetadataRepository'; +import { LocalPointCloudFactory } from '../../packages/pointclouds/src/factory/LocalPointCloudFactory'; +import dat from 'dat.gui'; + +export type StreamingTestFixtureComponents = { + renderer: THREE.WebGLRenderer; + sceneHandler: SceneHandler; + model: { + geometryNode: CadNode | PointCloudNode; + boundingBox: THREE.Box3; + }; + camera: THREE.PerspectiveCamera; + cameraControls: OrbitControls; + cadMaterialManager: CadMaterialManager; + cadModelUpdateHandler: CadModelUpdateHandler; + cadManager: CadManager; +}; + +export abstract class StreamingVisualTestFixture implements VisualTestFixture { + private readonly _perspectiveCamera: THREE.PerspectiveCamera; + private readonly _sceneHandler: SceneHandler; + private readonly _renderer: THREE.WebGLRenderer; + private readonly _controls: OrbitControls; + private readonly _materialManager: CadMaterialManager; + private readonly _localModelUrl: string; + private _gui!: dat.GUI; + + protected readonly _frameStatisticsGUIData = { + drawCalls: 0, + pointCount: 0, + triangleCount: 0 + }; + protected _frameStatsGUIFolder!: dat.GUI; + + private _renderPipelineProvider: RenderPipelineProvider; + private _pipelineExecutor: RenderPipelineExecutor; + private _cadManager!: CadManager; + private readonly _depthRenderPipeline: CadGeometryRenderModePipelineProvider; + private readonly _resizeObserver: ResizeObserver; + + get gui(): dat.GUI { + return this._gui; + } + + set pipelineExecutor(pipelineExecutor: RenderPipelineExecutor) { + this._pipelineExecutor = pipelineExecutor; + } + + get pipelineExecutor(): RenderPipelineExecutor { + return this._pipelineExecutor; + } + + set pipelineProvider(pipelineProvider: RenderPipelineProvider) { + if (pipelineProvider !== this._renderPipelineProvider) { + this._renderPipelineProvider.dispose(); + } + + this._renderPipelineProvider = pipelineProvider; + } + + get pipelineProvider(): RenderPipelineProvider { + return this._renderPipelineProvider; + } + + constructor(localModelUrl = 'primitives') { + this._localModelUrl = localModelUrl; + + this._perspectiveCamera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000); + + this._sceneHandler = new SceneHandler(); + + this._renderer = new THREE.WebGLRenderer(); + this._renderer.setPixelRatio(window.devicePixelRatio); + this._renderer.localClippingEnabled = true; + + this._controls = new OrbitControls(this._perspectiveCamera, this._renderer.domElement); + + this._materialManager = new CadMaterialManager(); + this._pipelineExecutor = new BasicPipelineExecutor(this._renderer); + this._renderPipelineProvider = new DefaultRenderPipelineProvider( + this._materialManager, + this._sceneHandler, + defaultRenderOptions + ); + + this._depthRenderPipeline = new CadGeometryRenderModePipelineProvider( + RenderMode.DepthBufferOnly, + this._materialManager, + this._sceneHandler + ); + + this._resizeObserver = new ResizeObserver(() => this.render()); + } + + public async run(): Promise { + this.setupDatGui(); + + this.updateRenderer(); + + const { modelDataProvider, modelIdentifier, modelMetadataProvider } = await createDataProviders( + this._localModelUrl + ); + + const cadModelFactory = new CadModelFactory(this._materialManager, modelMetadataProvider, modelDataProvider); + const cadModelUpdateHandler = new CadModelUpdateHandler( + createV8SectorCuller(this._renderer, this._depthRenderPipeline), + false + ); + this._cadManager = new CadManager(this._materialManager, cadModelFactory, cadModelUpdateHandler); + + const pointCloudMetadataRepository = new PointCloudMetadataRepository(modelMetadataProvider, modelDataProvider); + const potreeInstance = new Potree(modelDataProvider); + const pointCloudFactory = new LocalPointCloudFactory(potreeInstance); + const pointCloudManager = new PointCloudManager( + pointCloudMetadataRepository, + pointCloudFactory, + potreeInstance, + this._sceneHandler.scene, + this._renderer + ); + + const model = await this.addModel(modelIdentifier, modelMetadataProvider, this._cadManager, pointCloudManager); + + const modelLoadedPromise = this.getModelLoadedPromise(model, this._cadManager, pointCloudManager); + + const boundingBox = this.getModelBoundingBox(model); + + const { position, target } = fitCameraToBoundingBox(this._perspectiveCamera, boundingBox, 1.5); + this._perspectiveCamera.position.copy(position); + + this._controls.target.copy(target); + this._perspectiveCamera.updateMatrixWorld(); + + this._cadManager.updateCamera(this._perspectiveCamera); + pointCloudManager.updateCamera(this._perspectiveCamera); + + this._controls.addEventListener('change', () => { + this._cadManager.updateCamera(this._perspectiveCamera); + pointCloudManager.updateCamera(this._perspectiveCamera); + this.render(); + }); + + await modelLoadedPromise; + + await this.setup({ + renderer: this._renderer, + sceneHandler: this._sceneHandler, + model: { + geometryNode: model, + boundingBox + }, + camera: this._perspectiveCamera, + cameraControls: this._controls, + cadMaterialManager: this._materialManager, + cadModelUpdateHandler, + cadManager: this._cadManager + }); + + this._gui.close(); + + this.render(); + } + + private setupDatGui() { + this._gui = new dat.GUI({ autoPlace: false }); + this._gui.domElement.style.position = 'absolute'; + this._gui.domElement.style.right = '0px'; + document.body.appendChild(this._gui.domElement); + + this._frameStatsGUIFolder = this._gui.addFolder('frameStats'); + this._frameStatsGUIFolder.open(); + this._frameStatsGUIFolder.name = 'Frame Statistics'; + this._frameStatsGUIFolder.add(this._frameStatisticsGUIData, 'drawCalls').listen(); + this._frameStatsGUIFolder.add(this._frameStatisticsGUIData, 'pointCount').listen(); + this._frameStatsGUIFolder.add(this._frameStatisticsGUIData, 'triangleCount').listen(); + } + + public abstract setup(testFixtureComponents: StreamingTestFixtureComponents): Promise; + + public render(): void { + this._pipelineExecutor.render(this._renderPipelineProvider, this._perspectiveCamera); + this._frameStatisticsGUIData.drawCalls = this._renderer.info.render.calls; + this._frameStatisticsGUIData.triangleCount = this._renderer.info.render.triangles; + this._frameStatisticsGUIData.pointCount = this._renderer.info.render.points; + } + + protected updateRenderer(): void { + const domElement = document.createElement('div'); + + document.body.style.margin = '0px 0px 0px 0px'; + + domElement.style.width = '100vw'; + domElement.style.height = '100vh'; + + this._renderer.domElement.style.minHeight = '100%'; + this._renderer.domElement.style.minWidth = '100%'; + this._renderer.domElement.style.maxHeight = '100%'; + this._renderer.domElement.style.maxWidth = '100%'; + + domElement.appendChild(this._renderer.domElement); + document.body.appendChild(domElement); + + this._renderer.setSize(domElement.clientWidth, domElement.clientHeight); + + this._resizeObserver.observe(domElement); + } + + private getModelLoadedPromise( + model: CadNode | PointCloudNode, + cadManager: CadManager, + pointCloudManager: PointCloudManager + ): Promise { + const modelLoadedPromise = new DeferredPromise(); + + if (model instanceof CadNode) { + const subscriber = cadManager.getLoadingStateObserver().subscribe(onLoadingStateChange); + modelLoadedPromise.then(() => subscriber.unsubscribe()); + } else if (model instanceof PointCloudNode) { + const subscriber = pointCloudManager.getLoadingStateObserver().subscribe(onLoadingStateChange); + modelLoadedPromise.then(() => subscriber.unsubscribe()); + + // TODO: This is a workaround to deal with point cloud loading state currently not working as intended + // remove this in the future + setTimeout(() => modelLoadedPromise.resolve(), 1000); + } + + return modelLoadedPromise; + + function onLoadingStateChange(loadingState: LoadingState) { + if (loadingState.itemsRequested > 0 && loadingState.itemsRequested === loadingState.itemsLoaded) { + modelLoadedPromise.resolve(); + } + } + } + + private getModelBoundingBox(model: CadNode | PointCloudNode): THREE.Box3 { + if (model instanceof CadNode) { + const boundingBox = model.sectorScene.getBoundsOfMostGeometry(); + const cadFromCdfToThreeMatrix = new THREE.Matrix4().set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1); + boundingBox.applyMatrix4(cadFromCdfToThreeMatrix); + return boundingBox; + } else if (model instanceof PointCloudNode) { + return model.potreeNode.boundingBox.clone(); + } else { + throw new Error(`Unkown type of model(${model})`); + } + } + + private async addModel( + modelIdentifier: ModelIdentifier, + modelMetadataProvider: ModelMetadataProvider, + cadManager: CadManager, + pointCloudManager: PointCloudManager + ): Promise { + const modelOutputs = (await modelMetadataProvider.getModelOutputs(modelIdentifier)).map(outputs => outputs.format); + + if (modelOutputs.includes('gltf-directory') || modelOutputs.includes('reveal-directory')) { + const cadModel = await cadManager.addModel(modelIdentifier); + this._sceneHandler.addCadModel(cadModel, cadModel.cadModelIdentifier); + return cadModel; + } else if (modelOutputs.includes('ept-pointcloud')) { + const pointCloudNode = await pointCloudManager.addModel(modelIdentifier); + pointCloudNode.pointColorType = PotreePointColorType.Height; + this._sceneHandler.addCustomObject(pointCloudNode); + return pointCloudNode; + } else { + throw Error(`Unknown output format ${modelOutputs}`); + } + } + + public dispose(): void { + this._resizeObserver.disconnect(); + this._controls.dispose(); + this._sceneHandler.dispose(); + this._depthRenderPipeline.dispose(); + this.pipelineProvider.dispose(); + this.pipelineExecutor.dispose(); + this._cadManager.dispose(); + this._renderer.dispose(); + this._renderer.forceContextLoss(); + } +} diff --git a/viewer/visual-tests/test-fixtures/ViewerVisualTestFixture.ts b/viewer/visual-tests/test-fixtures/ViewerVisualTestFixture.ts new file mode 100644 index 00000000000..f131a16d08a --- /dev/null +++ b/viewer/visual-tests/test-fixtures/ViewerVisualTestFixture.ts @@ -0,0 +1,69 @@ +/*! + * Copyright 2022 Cognite AS + */ +import { Cognite3DViewer, Cognite3DModel } from '../../packages/api'; +import { VisualTestFixture } from './VisualTestFixture'; +import { addModels, createCognite3DViewer } from './utilities/cognite3DViewerHelpers'; +import { DeferredPromise } from '../../packages/utilities'; +import { CognitePointCloudModel } from '../../packages/pointclouds'; +import { AxisViewTool } from '../../packages/tools'; + +export type ViewerTestFixtureComponents = { + viewer: Cognite3DViewer; + models: (Cognite3DModel | CognitePointCloudModel)[]; +}; + +export abstract class ViewerVisualTestFixture implements VisualTestFixture { + private readonly _localModelUrls: string[]; + private _viewer!: Cognite3DViewer; + + constructor(...localModelUrls: string[]) { + this._localModelUrls = localModelUrls.length > 0 ? localModelUrls : ['primitives']; + } + + public async run(): Promise { + const modelLoadedPromise = new DeferredPromise(); + this._viewer = await createCognite3DViewer(modelLoadingCallback); + + this.setupDom(this._viewer); + + const models = await addModels(this._viewer, this._localModelUrls); + new AxisViewTool(this._viewer); + + this._viewer.fitCameraToModel(models[0]); + + await this.modelLoaded(models[0], modelLoadedPromise); + + await this.setup({ viewer: this._viewer, models }); + + function modelLoadingCallback(itemsLoaded: number, itemsRequested: number, _: number) { + if (itemsRequested > 0 && itemsLoaded === itemsRequested) { + modelLoadedPromise.resolve(); + } + } + } + private modelLoaded( + model: Cognite3DModel | CognitePointCloudModel, + modelLoadedPromise: DeferredPromise + ): Promise { + // Model loading callback does not work as expected for Point clouds + if (model instanceof CognitePointCloudModel) { + return new Promise(resolve => setTimeout(resolve, 5000)); + } + + return modelLoadedPromise; + } + + private setupDom(viewer: Cognite3DViewer) { + document.body.append(viewer.domElement); + viewer.domElement.style.height = '100vh'; + document.body.style.margin = '0px 0px 0px 0px'; + } + + public abstract setup(testFixtureComponents: ViewerTestFixtureComponents): Promise; + + public dispose(): void { + this._viewer.renderer.forceContextLoss(); + this._viewer.dispose(); + } +} diff --git a/viewer/visual-tests/test-fixtures/VisualTestFixture.ts b/viewer/visual-tests/test-fixtures/VisualTestFixture.ts new file mode 100644 index 00000000000..cd4848420f4 --- /dev/null +++ b/viewer/visual-tests/test-fixtures/VisualTestFixture.ts @@ -0,0 +1,7 @@ +/*! + * Copyright 2022 Cognite AS + */ +export interface VisualTestFixture { + run(): Promise; + dispose(): void; +} diff --git a/viewer/visual-tests/test-fixtures/utilities/cognite3DViewerHelpers.ts b/viewer/visual-tests/test-fixtures/utilities/cognite3DViewerHelpers.ts new file mode 100644 index 00000000000..be19581182e --- /dev/null +++ b/viewer/visual-tests/test-fixtures/utilities/cognite3DViewerHelpers.ts @@ -0,0 +1,86 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { createApplicationSDK } from '../../../test-utilities/src/appUtils'; +import { AddModelOptions, Cognite3DModel, Cognite3DViewer, OnLoadingCallback } from '../../../packages/api'; +import { CogniteClient } from '@cognite/sdk'; +import { CognitePointCloudModel } from '../../../packages/pointclouds'; + +export async function createCognite3DViewer(onLoading: OnLoadingCallback = () => {}): Promise { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + + if (urlParams.has('modelId') && urlParams.has('revisionId')) { + const client = await createApplicationSDK('reveal.example.simple', { + project: '3d-test', + cluster: 'greenfield', + clientId: 'a03a8caf-7611-43ac-87f3-1d493c085579', + tenantId: '20a88741-8181-4275-99d9-bd4451666d6e' + }); + + return new Cognite3DViewer({ sdk: client, logMetrics: false, onLoading }); + } + + const client = new CogniteClient({ + appId: 'reveal-visual-tests', + project: 'dummy', + getToken: async () => 'dummy' + }); + + return new Cognite3DViewer({ sdk: client, _localModels: true, logMetrics: false, onLoading }); +} + +export async function addModels( + viewer: Cognite3DViewer, + localModelUrls: string[] +): Promise<(Cognite3DModel | CognitePointCloudModel)[]> { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + + if (urlParams.has('modelId') && urlParams.has('revisionId')) { + return [ + await viewer.addModel({ + modelId: parseInt(urlParams.get('modelId')!), + revisionId: parseInt(urlParams.get('revisionId')!) + }) + ]; + } + + const modelNames = urlParams.has('modelUrl') ? [urlParams.get('modelUrl')!] : localModelUrls; + + return Promise.all( + modelNames + .map(modelName => { + const fullModelUrl = `${window.location.origin}/${modelName}`; + return { + modelId: -1, + revisionId: -1, + localPath: fullModelUrl + } as AddModelOptions; + }) + .map(async modelOptions => { + if (await isLocalUrlPointCloudModel(modelOptions.localPath!)) { + return viewer.addPointCloudModel(modelOptions); + } else { + return viewer.addCadModel(modelOptions); + } + }) + ); + + async function isLocalUrlPointCloudModel(modelBaseUrl: string) { + // The hacky check below is due to webpack-dev-server returning 200 for non-existing files. We therefore check if the + // response is a valid json. + const eptJsonRequest = await fetch(modelBaseUrl + '/ept.json'); + try { + if (eptJsonRequest.ok) { + await eptJsonRequest.json(); + } else { + return false; + } + } catch (_e) { + return false; + } + return true; + } +} diff --git a/viewer/visual-tests/test-fixtures/utilities/createDataProviders.ts b/viewer/visual-tests/test-fixtures/utilities/createDataProviders.ts new file mode 100644 index 00000000000..5e5bd9495ed --- /dev/null +++ b/viewer/visual-tests/test-fixtures/utilities/createDataProviders.ts @@ -0,0 +1,68 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import { createApplicationSDK } from '../../../test-utilities/src/appUtils'; +import { + ModelMetadataProvider, + ModelDataProvider, + ModelIdentifier, + LocalModelMetadataProvider, + LocalModelDataProvider, + CdfModelMetadataProvider, + CdfModelDataProvider, + LocalModelIdentifier, + CdfModelIdentifier +} from '../../../packages/modeldata-api'; +import cdfEnvironments from '../../.cdf-environments.json'; + +export function createDataProviders(defaultModelLocalUrl = 'primitives'): Promise<{ + modelMetadataProvider: ModelMetadataProvider; + modelDataProvider: ModelDataProvider; + modelIdentifier: ModelIdentifier; +}> { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + + if (urlParams.has('modelId') && urlParams.has('revisionId')) { + return createCdfDataProviders(urlParams); + } + + return Promise.resolve(createLocalDataProviders(urlParams, defaultModelLocalUrl)); +} + +function createLocalDataProviders(urlParams: URLSearchParams, defaultModelLocalUrl: string) { + const modelUrl = urlParams.get('modelUrl') ?? defaultModelLocalUrl; + const modelIdentifier = new LocalModelIdentifier(modelUrl); + const modelMetadataProvider = new LocalModelMetadataProvider(); + const modelDataProvider = new LocalModelDataProvider(); + return { modelMetadataProvider, modelDataProvider, modelIdentifier }; +} + +async function createCdfDataProviders(urlParams: URLSearchParams): Promise<{ + modelMetadataProvider: ModelMetadataProvider; + modelDataProvider: ModelDataProvider; + modelIdentifier: ModelIdentifier; +}> { + const tenant = urlParams.get('env') as keyof typeof cdfEnvironments.environments; + + const tenantInfo = cdfEnvironments.environments[tenant ?? 'cog-3d']; + + const project = urlParams.get('project') ?? '3d-test'; + const cluster = urlParams.get('cluster') ?? 'greenfield'; + + const client = await createApplicationSDK('reveal.example.simple', { + project, + cluster, + clientId: tenantInfo.clientId, + tenantId: tenantInfo.tenantId + }); + + const modelId = parseInt(urlParams.get('modelId')!); + const revisionId = parseInt(urlParams.get('revisionId')!); + + const modelIdentifier = new CdfModelIdentifier(modelId, revisionId); + const modelMetadataProvider = new CdfModelMetadataProvider(client); + const modelDataProvider = new CdfModelDataProvider(client); + return { modelMetadataProvider, modelDataProvider, modelIdentifier }; +} diff --git a/viewer/visual-tests/test-fixtures/utilities/fitCameraToBoundingBox.ts b/viewer/visual-tests/test-fixtures/utilities/fitCameraToBoundingBox.ts new file mode 100644 index 00000000000..4a6a07b38c2 --- /dev/null +++ b/viewer/visual-tests/test-fixtures/utilities/fitCameraToBoundingBox.ts @@ -0,0 +1,27 @@ +/*! + * Copyright 2022 Cognite AS + */ + +import * as THREE from 'three'; + +export function fitCameraToBoundingBox( + camera: THREE.Camera, + box: THREE.Box3, + radiusFactor: number = 2 +): { position: THREE.Vector3; target: THREE.Vector3 } { + const center = new THREE.Vector3().lerpVectors(box.min, box.max, 0.5); + const radius = 0.5 * new THREE.Vector3().subVectors(box.max, box.min).length(); + const boundingSphere = new THREE.Sphere(center, radius); + + const target = boundingSphere.center; + const distance = boundingSphere.radius * radiusFactor; + const direction = new THREE.Vector3(0, 0, -1); + direction.applyQuaternion(camera.quaternion); + + const position = new THREE.Vector3(); + position.copy(direction).multiplyScalar(-distance).add(target); + + camera.position.copy(position); + + return { position, target }; +} diff --git a/viewer/webpack.config.js b/viewer/webpack.config.js index 819886f8b28..591cb92b42b 100644 --- a/viewer/webpack.config.js +++ b/viewer/webpack.config.js @@ -32,19 +32,11 @@ module.exports = env => { return { mode: development ? 'development' : 'production', - // Internals is not part of prod builds - entry: development - ? { - index: './index.ts', - tools: './tools.ts', - 'extensions/datasource': './extensions/datasource.ts', - internals: './internals.ts' - } - : { - index: './index.ts', - tools: './tools.ts', - 'extensions/datasource': './extensions/datasource.ts' - }, + entry: { + index: './index.ts', + tools: './tools.ts', + 'extensions/datasource': './extensions/datasource.ts' + }, target: 'web', resolve: { fallback: { @@ -118,7 +110,7 @@ module.exports = env => { type: 'umd' } }, - devtool: development ? 'inline-source-map' : 'source-map', + devtool: development ? 'eval-source-map' : 'source-map', watchOptions: { aggregateTimeout: 1500, ignored: /node_modules/ diff --git a/viewer/yarn.lock b/viewer/yarn.lock index 3c032769b8b..480dde539a2 100644 --- a/viewer/yarn.lock +++ b/viewer/yarn.lock @@ -14,19 +14,19 @@ __metadata: languageName: node linkType: hard -"@azure/msal-browser@npm:2.28.1": - version: 2.28.1 - resolution: "@azure/msal-browser@npm:2.28.1" +"@azure/msal-browser@npm:2.28.2": + version: 2.28.2 + resolution: "@azure/msal-browser@npm:2.28.2" dependencies: - "@azure/msal-common": ^7.3.0 - checksum: 051cdf5ded5664209da7fca30fdad750773027905fa6a75de6711a203dc5eef15cfcad64744ad7b659888f8c0150b2ef759d2d2fa949f9f494fe5d9328e1415b + "@azure/msal-common": ^7.4.0 + checksum: 9e8619f1dd68b040bb28cccffb603a0ee3fad5bd164ba2bdcc219b0442c78f737ce89eaa45bb63079b38cfe09cb36842cd752f21551004dee22b8b6059d53b5e languageName: node linkType: hard -"@azure/msal-common@npm:^7.3.0": - version: 7.3.0 - resolution: "@azure/msal-common@npm:7.3.0" - checksum: 32dd4e3b97af269d6ba1e3432adcba014e51d1b5ecda759bb9c540598132ca7fe328c68deb979a2a44eefaa08dac15bf85f5f589b2a3bca3da3dda0bbe52e057 +"@azure/msal-common@npm:^7.4.0": + version: 7.4.0 + resolution: "@azure/msal-common@npm:7.4.0" + checksum: 329c46ccd30315ebd62389e93c29fe5ade181bdbede11fe4d2feab5b47ad7a7b4f9620230c4af01d05a814af930c8afefa13adfc9cfe2e4195e3a2bdc0d24050 languageName: node linkType: hard @@ -295,6 +295,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.18.6": + version: 7.18.9 + resolution: "@babel/helper-plugin-utils@npm:7.18.9" + checksum: ebae876cd60f1fe238c7210986093845fa5c4cad5feeda843ea4d780bf068256717650376d3af2a5e760f2ed6a35c065ae144f99c47da3e54aa6cba99d8804e0 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.17.7": version: 7.17.7 resolution: "@babel/helper-simple-access@npm:7.17.7" @@ -503,6 +510,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.18.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -721,41 +739,41 @@ __metadata: version: 0.0.0-use.local resolution: "@cognite/reveal@workspace:." dependencies: - "@azure/msal-browser": 2.28.1 + "@azure/msal-browser": 2.28.2 "@cognite/reveal-parser-worker": 1.3.0 - "@cognite/sdk": 7.8.1 + "@cognite/sdk": 7.8.4 "@cognite/sdk-core": 4.4.0 "@tweenjs/tween.js": 18.6.4 "@types/dat.gui": 0.7.7 "@types/draco3dgltf": 1.4.0 "@types/expect-puppeteer": 5.0.1 "@types/geojson": 7946.0.10 - "@types/glob": 7.2.0 - "@types/jest": 28.1.7 + "@types/glob": 8.0.0 + "@types/jest": 29.0.0 "@types/jest-environment-puppeteer": 5.0.2 "@types/jest-image-snapshot": 5.1.0 "@types/jsdom": 20.0.0 - "@types/lodash": 4.14.182 + "@types/lodash": 4.14.184 "@types/mixpanel-browser": 2.38.0 - "@types/node": 16.11.49 + "@types/node": 16.11.57 "@types/offscreencanvas": 2019.7.0 "@types/proj4": 2.5.2 "@types/random-seed": 0.3.3 "@types/skmeans": 0.11.3 "@types/three": 0.141.0 "@types/tween.js": 18.5.1 - "@typescript-eslint/eslint-plugin": 5.33.1 - "@typescript-eslint/parser": 5.33.1 + "@typescript-eslint/eslint-plugin": 5.36.2 + "@typescript-eslint/parser": 5.36.2 assert: 2.0.0 comlink: 4.3.1 concurrently: 7.3.0 copy-pkg-json-webpack-plugin: 0.0.40 copy-webpack-plugin: 11.0.0 - core-js: 3.24.1 + core-js: 3.25.1 cross-env: 7.0.3 cross-var: 1.1.0 dat.gui: 0.7.9 - eslint: 8.22.0 + eslint: 8.23.0 eslint-config-prettier: 8.5.0 eslint-plugin-header: 3.1.1 eslint-plugin-jsdoc: 39.3.6 @@ -771,11 +789,11 @@ __metadata: glslify-loader: 2.0.0 html-webpack-plugin: 5.5.0 husky: 8.0.1 - jest: 28.1.3 + jest: 29.0.2 jest-canvas-mock: 2.4.0 - jest-environment-jsdom: 28.1.3 - jest-extended: 3.0.2 - jest-image-snapshot: 5.1.0 + jest-environment-jsdom: 29.0.2 + jest-extended: 3.1.0 + jest-image-snapshot: 5.2.0 jest-puppeteer: 6.1.1 jsdom: 20.0.0 lint-staged: 13.0.3 @@ -788,10 +806,11 @@ __metadata: prettier: 2.7.1 process: 0.11.10 proj4: ^2.8.0 - puppeteer: 16.1.0 + puppeteer: 17.1.2 random-seed: 0.3.0 - raw-loader: ^4.0.2 + raw-loader: 4.0.2 remove-files-webpack-plugin: ^1.5.0 + resize-observer-polyfill: 1.5.1 rimraf: 3.0.2 run-script-os: 1.1.6 rxjs: 7.5.6 @@ -801,7 +820,7 @@ __metadata: ts-jest: 28.0.8 ts-loader: 9.3.1 tsc-alias: 1.7.0 - typescript: 4.7.4 + typescript: 4.8.2 wasm-pack: ^0.10.3 webpack: 5.74.0 webpack-bundle-analyzer: ^4.5.0 @@ -830,27 +849,27 @@ __metadata: languageName: node linkType: hard -"@cognite/sdk-core@npm:^4.6.0": - version: 4.6.0 - resolution: "@cognite/sdk-core@npm:4.6.0" +"@cognite/sdk-core@npm:^4.6.2": + version: 4.6.2 + resolution: "@cognite/sdk-core@npm:4.6.2" dependencies: cross-fetch: ^3.0.4 is-buffer: ^2.0.5 lodash: ^4.17.11 query-string: ^5.1.1 url: ^0.11.0 - checksum: c3baad90ed6293ba72957134a817992f35ed1a437495c156fb8c870805f497c41c4efa5607d94f496664fab5ccaa3ca9c76888f56775b86689438ca619c39427 + checksum: a8f64428e40ad98b8cf5a1fc93dc030882b68b13b13c0a9af9b5be234747d8880dddeaab88601f677f121319d3d3e2d6d36b045cf27a4ca2a01d2a51d417056e languageName: node linkType: hard -"@cognite/sdk@npm:7.8.1": - version: 7.8.1 - resolution: "@cognite/sdk@npm:7.8.1" +"@cognite/sdk@npm:7.8.4": + version: 7.8.4 + resolution: "@cognite/sdk@npm:7.8.4" dependencies: - "@cognite/sdk-core": ^4.6.0 + "@cognite/sdk-core": ^4.6.2 geojson: ^0.5.0 lodash: ^4.17.11 - checksum: e6f2d05a915625045d0e0f7222ae08ba537e2cda810cbe30fa273c89580ed4799e5e2111de42ee00b1fb84a1870fc7cc79edd41d85bac3d79adaeecad9de0a66 + checksum: 4398096f2f0b4880845dc562b9f517f4928d4bd6a8c1a20708d6f889ebb4dbd6193c723de7a55717c7ae11c06c2320cec11eab26f55b9418c424e571a50891cb languageName: node linkType: hard @@ -872,20 +891,20 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.0": - version: 1.3.0 - resolution: "@eslint/eslintrc@npm:1.3.0" +"@eslint/eslintrc@npm:^1.3.1": + version: 1.3.1 + resolution: "@eslint/eslintrc@npm:1.3.1" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.3.2 + espree: ^9.4.0 globals: ^13.15.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: a1e734ad31a8b5328dce9f479f185fd4fc83dd7f06c538e1fa457fd8226b89602a55cc6458cd52b29573b01cdfaf42331be8cfc1fec732570086b591f4ed6515 + checksum: 9844dcc58a44399649926d5a17a2d53d529b80d3e8c3e9d0964ae198bac77ee6bb1cf44940f30cd9c2e300f7568ec82500be42ace6cacefb08aebf9905fe208e languageName: node linkType: hard @@ -930,6 +949,13 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + "@humanwhocodes/object-schema@npm:^1.2.1": version: 1.2.1 resolution: "@humanwhocodes/object-schema@npm:1.2.1" @@ -957,51 +983,50 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/console@npm:28.1.3" +"@jest/console@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/console@npm:29.0.2" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.2 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 + jest-message-util: ^29.0.2 + jest-util: ^29.0.2 slash: ^3.0.0 - checksum: fe50d98d26d02ce2901c76dff4bd5429a33c13affb692c9ebf8a578ca2f38a5dd854363d40d6c394f215150791fd1f692afd8e730a4178dda24107c8dfd9750a + checksum: 83cf779973b4bf5a3ff66bf206b705f588e339627222bbd3c60c40a37d663f5ea36dce1a9642aebf703c3802e9669141c2c36e9477f2f3637f612b0cc5617498 languageName: node linkType: hard -"@jest/core@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/core@npm:28.1.3" +"@jest/core@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/core@npm:29.0.2" dependencies: - "@jest/console": ^28.1.3 - "@jest/reporters": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/console": ^29.0.2 + "@jest/reporters": ^29.0.2 + "@jest/test-result": ^29.0.2 + "@jest/transform": ^29.0.2 + "@jest/types": ^29.0.2 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 ci-info: ^3.2.0 exit: ^0.1.2 graceful-fs: ^4.2.9 - jest-changed-files: ^28.1.3 - jest-config: ^28.1.3 - jest-haste-map: ^28.1.3 - jest-message-util: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-resolve-dependencies: ^28.1.3 - jest-runner: ^28.1.3 - jest-runtime: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - jest-watcher: ^28.1.3 + jest-changed-files: ^29.0.0 + jest-config: ^29.0.2 + jest-haste-map: ^29.0.2 + jest-message-util: ^29.0.2 + jest-regex-util: ^29.0.0 + jest-resolve: ^29.0.2 + jest-resolve-dependencies: ^29.0.2 + jest-runner: ^29.0.2 + jest-runtime: ^29.0.2 + jest-snapshot: ^29.0.2 + jest-util: ^29.0.2 + jest-validate: ^29.0.2 + jest-watcher: ^29.0.2 micromatch: ^4.0.4 - pretty-format: ^28.1.3 - rimraf: ^3.0.0 + pretty-format: ^29.0.2 slash: ^3.0.0 strip-ansi: ^6.0.0 peerDependencies: @@ -1009,7 +1034,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: cb79f34bafc4637e7130df12257f5b29075892a2be2c7f45c6d4c0420853e80b5dae11016e652530eb234f4c44c00910cdca3c2cd86275721860725073f7d9b4 + checksum: b6c9bd3d3a54ba7fe1fcedf6ff78ece7ce56fda9346d63f886341d503757ff632c95d19765ae777fd01a0cf57665d0108747be7d9e250366c6980d3bddbce10b languageName: node linkType: hard @@ -1025,34 +1050,43 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/environment@npm:28.1.3" +"@jest/environment@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/environment@npm:29.0.2" dependencies: - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/fake-timers": ^29.0.2 + "@jest/types": ^29.0.2 "@types/node": "*" - jest-mock: ^28.1.3 - checksum: 14c496b84aef951df33128cea68988e9de43b2e9d62be9f9c4308d4ac307fa345642813679f80d0a4cedeb900cf6f0b6bb2b92ce089528e8721f72295fdc727f + jest-mock: ^29.0.2 + checksum: 2ab0cd404e34f649c6534035f93f2a6660cd7b6ab136c85035af7923e4b0511fcc0b18123e69c9c5fc4ee4e4645f8af5efde5eb53c704f011e264ff34bcacb6e languageName: node linkType: hard -"@jest/expect-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect-utils@npm:28.1.3" +"@jest/expect-utils@npm:^29.0.1": + version: 29.0.1 + resolution: "@jest/expect-utils@npm:29.0.1" dependencies: - jest-get-type: ^28.0.2 - checksum: 808ea3a68292a7e0b95490fdd55605c430b4cf209ea76b5b61bfb2a1badcb41bc046810fe4e364bd5fe04663978aa2bd73d8f8465a761dd7c655aeb44cf22987 + jest-get-type: ^29.0.0 + checksum: d2cfe72f91fcb86a3f2ffc7c09e02cba7e9da0c41705a98e7fbed016b2141ab29764b15615806ece4ed6a21b60252f024b121be68c2bd66d055305a1d34b10f8 languageName: node linkType: hard -"@jest/expect@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect@npm:28.1.3" +"@jest/expect-utils@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/expect-utils@npm:29.0.2" + dependencies: + jest-get-type: ^29.0.0 + checksum: 12bb317b1dc0afe7cd0a0c4e1281dee6a7f1a5d74f85154e54bef79ad983da0c2adba9998b65d95bc8655bc0a535f566b0a83ea068bbdca33c33c1dd6fdae195 + languageName: node + linkType: hard + +"@jest/expect@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/expect@npm:29.0.2" dependencies: - expect: ^28.1.3 - jest-snapshot: ^28.1.3 - checksum: 4197f6fdddc33dc45ba4e838f992fc61839c421d7aed0dfe665ef9c2f172bb1df8a8cac9cecee272b40e744a326da521d5e182709fe82a0b936055bfffa3b473 + expect: ^29.0.2 + jest-snapshot: ^29.0.2 + checksum: 03a4d3b5995d2c92c6a7b25ac914147e5cf325b5e054f7364ea8d879da2b40d7c7e1e941dcf65c7f0f38805e4dc83eb861d309bbf4e727f99f41f89b9dcb9185 languageName: node linkType: hard @@ -1070,41 +1104,42 @@ __metadata: languageName: node linkType: hard -"@jest/fake-timers@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/fake-timers@npm:28.1.3" +"@jest/fake-timers@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/fake-timers@npm:29.0.2" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.2 "@sinonjs/fake-timers": ^9.1.2 "@types/node": "*" - jest-message-util: ^28.1.3 - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - checksum: cec14d5b14913a54dce64a62912c5456235f5d90b509ceae19c727565073114dae1aaf960ac6be96b3eb94789a3a758b96b72c8fca7e49a6ccac415fbc0321e1 + jest-message-util: ^29.0.2 + jest-mock: ^29.0.2 + jest-util: ^29.0.2 + checksum: 995b76a099707e91b0851c7c52d91beed3b8bbedca28faf88ff257af7f17d5e752e0fd901676fe2db0d917491b9557d6ca1a1a07ad992b02346275af7cafdd18 languageName: node linkType: hard -"@jest/globals@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/globals@npm:28.1.3" +"@jest/globals@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/globals@npm:29.0.2" dependencies: - "@jest/environment": ^28.1.3 - "@jest/expect": ^28.1.3 - "@jest/types": ^28.1.3 - checksum: 3504bb23de629d466c6f2b6b75d2e1c1b10caccbbcfb7eaa82d22cc37711c8e364c243929581184846605c023b475ea6c42c2e3ea5994429a988d8d527af32cd + "@jest/environment": ^29.0.2 + "@jest/expect": ^29.0.2 + "@jest/types": ^29.0.2 + jest-mock: ^29.0.2 + checksum: becea3f7fef9a6bf45d1f9cb280ab590c03bdd07e6276fc9aa99ff0800fae2fd9030f13dd1f18192c084b48871e33accfaf5e88ec9903bd727df9b0965356bcd languageName: node linkType: hard -"@jest/reporters@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/reporters@npm:28.1.3" +"@jest/reporters@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/reporters@npm:29.0.2" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@jridgewell/trace-mapping": ^0.3.13 + "@jest/console": ^29.0.2 + "@jest/test-result": ^29.0.2 + "@jest/transform": ^29.0.2 + "@jest/types": ^29.0.2 + "@jridgewell/trace-mapping": ^0.3.15 "@types/node": "*" chalk: ^4.0.0 collect-v8-coverage: ^1.0.0 @@ -1116,9 +1151,9 @@ __metadata: istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - jest-worker: ^28.1.3 + jest-message-util: ^29.0.2 + jest-util: ^29.0.2 + jest-worker: ^29.0.2 slash: ^3.0.0 string-length: ^4.0.1 strip-ansi: ^6.0.0 @@ -1129,7 +1164,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: a7440887ce837922cbeaa64c3232eb48aae02aa9123f29fc4280ad3e1afe4b35dcba171ba1d5fd219037c396c5152d9c2d102cff1798dd5ae3bd33ac4759ae0a + checksum: e5378e0d6ea30d9a1d5fa3126638eae7316ecfdf67fa95e3449b6698c73c1437a7565dbffaf93becc4d6647f3042db6497d77c10431e1f492b33f1fb7c3b3dc0 languageName: node linkType: hard @@ -1151,61 +1186,70 @@ __metadata: languageName: node linkType: hard -"@jest/source-map@npm:^28.1.2": - version: 28.1.2 - resolution: "@jest/source-map@npm:28.1.2" +"@jest/schemas@npm:^29.0.0": + version: 29.0.0 + resolution: "@jest/schemas@npm:29.0.0" + dependencies: + "@sinclair/typebox": ^0.24.1 + checksum: 41355c78f09eb1097e57a3c5d0ca11c9099e235e01ea5fa4e3953562a79a6a9296c1d300f1ba50ca75236048829e056b00685cd2f1ff8285e56fd2ce01249acb + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.0.0": + version: 29.0.0 + resolution: "@jest/source-map@npm:29.0.0" dependencies: - "@jridgewell/trace-mapping": ^0.3.13 + "@jridgewell/trace-mapping": ^0.3.15 callsites: ^3.0.0 graceful-fs: ^4.2.9 - checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a + checksum: dd97bc5826cf68d6eb5565383816332f800476232fd12800bd027a259cbf3ef216f1633405f3ad0861dde3b12a7886301798c078b334f6d3012044d43abcf4f6 languageName: node linkType: hard -"@jest/test-result@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-result@npm:28.1.3" +"@jest/test-result@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/test-result@npm:29.0.2" dependencies: - "@jest/console": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/console": ^29.0.2 + "@jest/types": ^29.0.2 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: 957a5dd2fd2e84aabe86698f93c0825e96128ccaa23abf548b159a9b08ac74e4bde7acf4bec48479243dbdb27e4ea1b68c171846d21fb64855c6b55cead9ef27 + checksum: be375eb8c2daf6dba46434a8a0339ee1a0d08c6c8c2ad2062b6c60a310bb6dc8242a7cfdec1536e883a0016889d159b0ddb909772f13b10e8bd45b7322aeabde languageName: node linkType: hard -"@jest/test-sequencer@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-sequencer@npm:28.1.3" +"@jest/test-sequencer@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/test-sequencer@npm:29.0.2" dependencies: - "@jest/test-result": ^28.1.3 + "@jest/test-result": ^29.0.2 graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 + jest-haste-map: ^29.0.2 slash: ^3.0.0 - checksum: 13f8905e6d1ec8286694146f7be3cf90eff801bbdea5e5c403e6881444bb390ed15494c7b9948aa94bd7e9c9a851e0d3002ed6e7371d048b478596e5b23df953 + checksum: 718b839eb711f660e44e585a8cc859650b33f32622710cd7bc4ee91fab9a35775fb271faaf6dde24012af062c8831a1ec239224134b99d9b913bb06ea07fb4f9 languageName: node linkType: hard -"@jest/transform@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/transform@npm:28.1.3" +"@jest/transform@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/transform@npm:29.0.2" dependencies: "@babel/core": ^7.11.6 - "@jest/types": ^28.1.3 - "@jridgewell/trace-mapping": ^0.3.13 + "@jest/types": ^29.0.2 + "@jridgewell/trace-mapping": ^0.3.15 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^1.4.0 - fast-json-stable-stringify: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-util: ^28.1.3 + jest-haste-map: ^29.0.2 + jest-regex-util: ^29.0.0 + jest-util: ^29.0.2 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 write-file-atomic: ^4.0.1 - checksum: dadf618936e0aa84342f07f532801d5bed43cdf95d1417b929e4f8782c872cff1adc84096d5a287a796d0039a2691c06d8450cce5a713a8b52fbb9f872a1e760 + checksum: 4a8fdd6e7fc48b0d211912428e0731027cc653507c05040b974a338d06b53238a2e1629dbd13a196d9562983291b2e0fd80790514fb2b8e80557cd33437e6be1 languageName: node linkType: hard @@ -1236,17 +1280,31 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/types@npm:28.1.3" +"@jest/types@npm:^29.0.1": + version: 29.0.1 + resolution: "@jest/types@npm:29.0.1" dependencies: - "@jest/schemas": ^28.1.3 + "@jest/schemas": ^29.0.0 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 + checksum: 50a3658d69cad32fe270ef22e9a21cbad38c387d0b17cb1f23b144f9c9081e81623feda940b6b23459df656f88153ffe7765f36cd3bc3f3b2d8cd0ca246d75b2 + languageName: node + linkType: hard + +"@jest/types@npm:^29.0.2": + version: 29.0.2 + resolution: "@jest/types@npm:29.0.2" + dependencies: + "@jest/schemas": ^29.0.0 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: f093f4548f8022f5ac9d1edf712edbb5c8edb101017f4afd95b9f9eb978328d099dcb77e2f1893a6dfeb9a7dfdd6cc589b2d83829490cee7e9afa9166c2945bd languageName: node linkType: hard @@ -1320,7 +1378,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13": +"@jridgewell/trace-mapping@npm:^0.3.12": version: 0.3.14 resolution: "@jridgewell/trace-mapping@npm:0.3.14" dependencies: @@ -1330,6 +1388,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.15": + version: 0.3.15 + resolution: "@jridgewell/trace-mapping@npm:0.3.15" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 38917e9c2b014d469a9f51c016ed506acbe44dd16ec2f6f99b553ebf3764d22abadbf992f2367b6d2b3511f3eae8ed3a8963f6c1030093fda23efd35ecab2bae + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.13 resolution: "@jridgewell/trace-mapping@npm:0.3.13" @@ -1546,6 +1614,7 @@ __metadata: "@reveal/metrics": "workspace:*" "@reveal/model-base": "workspace:*" "@reveal/modeldata-api": "workspace:*" + "@reveal/rendering": "workspace:*" "@reveal/utilities": "workspace:*" languageName: unknown linkType: soft @@ -1557,6 +1626,7 @@ __metadata: "@reveal/cad-parsers": "workspace:*" "@reveal/cad-styling": "workspace:*" "@reveal/logger": "workspace:*" + "@reveal/pointclouds": "workspace:*" "@reveal/utilities": "workspace:*" languageName: unknown linkType: soft @@ -1880,13 +1950,13 @@ __metadata: languageName: node linkType: hard -"@types/glob@npm:7.2.0": - version: 7.2.0 - resolution: "@types/glob@npm:7.2.0" +"@types/glob@npm:8.0.0": + version: 8.0.0 + resolution: "@types/glob@npm:8.0.0" dependencies: "@types/minimatch": "*" "@types/node": "*" - checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 + checksum: 1817b05f5a8aed851d102a65b5e926d5c777bef927ea62b36d635860eef5364f2046bb5a692d135b6f2b28f34e4a9d44ade9396122c0845bcc7636d35f624747 languageName: node linkType: hard @@ -1972,17 +2042,17 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:28.1.7": - version: 28.1.7 - resolution: "@types/jest@npm:28.1.7" +"@types/jest@npm:29.0.0": + version: 29.0.0 + resolution: "@types/jest@npm:29.0.0" dependencies: - expect: ^28.0.0 - pretty-format: ^28.0.0 - checksum: 17c9bf9667cd4f062eba5aa9eaea248927bf6479da1cc009e0b7d26d501f460f068dd23eddb67d2602264e915a30b63ae7c9cbb516723ffd18589f6f9d267d43 + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: b20c4b38c7c963862d82c21c0a1ae2b96015afb1511c835da43e8fd53659ca884f8103a2159be2ce74d2888472a1ac93d20d08ec1ac0970385cbb74c46d47585 languageName: node linkType: hard -"@types/jsdom@npm:20.0.0": +"@types/jsdom@npm:20.0.0, @types/jsdom@npm:^20.0.0": version: 20.0.0 resolution: "@types/jsdom@npm:20.0.0" dependencies: @@ -1993,17 +2063,6 @@ __metadata: languageName: node linkType: hard -"@types/jsdom@npm:^16.2.4": - version: 16.2.14 - resolution: "@types/jsdom@npm:16.2.14" - dependencies: - "@types/node": "*" - "@types/parse5": "*" - "@types/tough-cookie": "*" - checksum: 12bb926fa74ea07c0ba0bfd5bf185ac0fd771b28666a5e8784b9af4bb96bb0c51fc5f494eff7da1d3cd804e4757f640a23c344c1cd5d188f95ab0ab51770d88b - languageName: node - linkType: hard - "@types/json-schema@npm:*": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" @@ -2018,10 +2077,10 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:4.14.182": - version: 4.14.182 - resolution: "@types/lodash@npm:4.14.182" - checksum: 7dd137aa9dbabd632408bd37009d984655164fa1ecc3f2b6eb94afe35bf0a5852cbab6183148d883e9c73a958b7fec9a9bcf7c8e45d41195add6a18c34958209 +"@types/lodash@npm:4.14.184": + version: 4.14.184 + resolution: "@types/lodash@npm:4.14.184" + checksum: 6d9a4d67f7f9d0ec3fd21174f3dd3d00629dc1227eb469450eace53adbc1f7e2330699c28d0fe093e5f0fef0f0e763098be1f779268857213224af082b62be21 languageName: node linkType: hard @@ -2053,10 +2112,10 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:16.11.49": - version: 16.11.49 - resolution: "@types/node@npm:16.11.49" - checksum: 05545ee49da3b783ab77cddca45db6f4d47861c2bb148a17b774688e1082f20f27177591d140923724bcd8643b32291203f6f1eadba397e394232d4a1e28e07a +"@types/node@npm:16.11.57": + version: 16.11.57 + resolution: "@types/node@npm:16.11.57" + checksum: 7c34f5e50e38460fd0f18ae939ad62d5ecf992be7b9db7b1b86b9cc76a4d153b55bf3a94c6379da23df0803c11ad1a96be54c45d3ce612206cb8a18ce433028b languageName: node linkType: hard @@ -2067,13 +2126,6 @@ __metadata: languageName: node linkType: hard -"@types/parse5@npm:*": - version: 6.0.1 - resolution: "@types/parse5@npm:6.0.1" - checksum: 752d4968b03084b783995c50280707f64c149b7e3d59e9fcdaa82c8c54b37dc56023a8b11c7d60dbb359f2277ef165970bfc7d79231863456bf25d102c09b33f - languageName: node - linkType: hard - "@types/pixelmatch@npm:*": version: 5.2.4 resolution: "@types/pixelmatch@npm:5.2.4" @@ -2260,13 +2312,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.33.1" +"@typescript-eslint/eslint-plugin@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/eslint-plugin@npm:5.36.2" dependencies: - "@typescript-eslint/scope-manager": 5.33.1 - "@typescript-eslint/type-utils": 5.33.1 - "@typescript-eslint/utils": 5.33.1 + "@typescript-eslint/scope-manager": 5.36.2 + "@typescript-eslint/type-utils": 5.36.2 + "@typescript-eslint/utils": 5.36.2 debug: ^4.3.4 functional-red-black-tree: ^1.0.1 ignore: ^5.2.0 @@ -2279,42 +2331,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: d9b6b038f70e4959ad211c84f50a38de2d00b54f0636ad76eea414fb070fa616933690da80de6668e62c8fbbeb227086322001b7d7ad1924421a232547c97936 + checksum: edcd9fcecdeb22a689b421cafe3b7adc859bf2fd6227aecdd7412c319c808e7bab063c8f94af32116cfc971962f9780d181cb0a4aa999951c2d2be1f84c6c376 languageName: node linkType: hard -"@typescript-eslint/parser@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/parser@npm:5.33.1" +"@typescript-eslint/parser@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/parser@npm:5.36.2" dependencies: - "@typescript-eslint/scope-manager": 5.33.1 - "@typescript-eslint/types": 5.33.1 - "@typescript-eslint/typescript-estree": 5.33.1 + "@typescript-eslint/scope-manager": 5.36.2 + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/typescript-estree": 5.36.2 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: fb3a4e000ce6d9583656fc3b3fb80f127a0ec1b7c3872ea469164516d993a588859ded4ec1338e6bbf2151168380d8aa29ec31027af23b50f5107949f8e7b438 + checksum: d6cc22cbc7aacb5ecebf55eb1d681cb6b964b108e147b418295c3e48701a77768cff128c16da421ae50eabb9f1296ecec7fa3cc5f2ccb63a3febf79f98b4195f languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/scope-manager@npm:5.33.1" +"@typescript-eslint/scope-manager@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/scope-manager@npm:5.36.2" dependencies: - "@typescript-eslint/types": 5.33.1 - "@typescript-eslint/visitor-keys": 5.33.1 - checksum: b9918d8320ea59081d19070ce952b56984e72fb2c113215e5e6a0f97deac9aae5aa67ec7a07cddb010c0f75cdf8df096ab45e9241e4b7b611acfa6d4cdfb6516 + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/visitor-keys": 5.36.2 + checksum: 93ff655f7c237c88ec6dc5911202dd8f81bd8909b27f1a758a9d77e9791040f1ee6fe2891314bde75c808ce586246e98003a1b1396937b0312f2440016dea751 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/type-utils@npm:5.33.1" +"@typescript-eslint/type-utils@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/type-utils@npm:5.36.2" dependencies: - "@typescript-eslint/utils": 5.33.1 + "@typescript-eslint/typescript-estree": 5.36.2 + "@typescript-eslint/utils": 5.36.2 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -2322,23 +2375,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ddf88835bc87b3ad946aaeb29b770a49a8e1c3c5e294ee9cb93b1936f432a1016efb97803f197eea1be61545cbc79b5526cc05e9339ca9beada22fc83801ddea + checksum: c202b7d2cd08ed7f7d1ad7e430e9e1596478e147f0d485d02babfda0211c55fa950de1dc4d1c950008a8a047a31c1e982e97fe5558f93d496830eb9d9532bc71 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/types@npm:5.33.1" - checksum: 122891bd4ab4b930b1d33f3ce43a010825c1e61b9879520a0f3dc34cf92df71e2a873410845ab8d746333511c455c115eaafdec149298a161cef713829dfdb77 +"@typescript-eslint/types@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/types@npm:5.36.2" + checksum: 736cb8a76b58f2f9a7d066933094c5510ffe31479ea8b804a829ec85942420f1b55e0eb2688fbdaaaa9c0e5b3b590fb8f14bbd745353696b4fd33fda620d417b languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.33.1" +"@typescript-eslint/typescript-estree@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/typescript-estree@npm:5.36.2" dependencies: - "@typescript-eslint/types": 5.33.1 - "@typescript-eslint/visitor-keys": 5.33.1 + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/visitor-keys": 5.36.2 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -2347,33 +2400,33 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1418e409b141c2f012bc2dd5c40d95dfd8aa572dd3e9523ed23e4371e4459d10ecd074fda75dc770ce980686b25ffc44725eebf165c494818ed4131d1ac0239f + checksum: 2827ff57a114b6107ea6d555f3855007133b08a7c2bafba0cfa0c935d8b99fd7b49e982d48cccc1c5ba550d95748d0239f5e2109893f12a165d76ed64a0d261b languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/utils@npm:5.33.1" +"@typescript-eslint/utils@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/utils@npm:5.36.2" dependencies: "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.33.1 - "@typescript-eslint/types": 5.33.1 - "@typescript-eslint/typescript-estree": 5.33.1 + "@typescript-eslint/scope-manager": 5.36.2 + "@typescript-eslint/types": 5.36.2 + "@typescript-eslint/typescript-estree": 5.36.2 eslint-scope: ^5.1.1 eslint-utils: ^3.0.0 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c550504d62fc72f29bf3d7a651bd3a81f49fb1fccaf47583721c2ab1abd2ef78a1e4bc392cb4be4a61a45a4f24fc14a59d67b98aac8a16a207a7cace86538cab + checksum: 45356cf55a8733e3ab1f2c3c19cdaefdb79857e35eb1433c29b81f3df071e9cef8a286bc407abe243889a21d9e793e999f92f03b9c727a0fac1c17a48e64c42a languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.33.1": - version: 5.33.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.33.1" +"@typescript-eslint/visitor-keys@npm:5.36.2": + version: 5.36.2 + resolution: "@typescript-eslint/visitor-keys@npm:5.36.2" dependencies: - "@typescript-eslint/types": 5.33.1 + "@typescript-eslint/types": 5.36.2 eslint-visitor-keys: ^3.3.0 - checksum: 0d32a433450f61e97b5fa6b1e167f06ed395c200b16b4dbd4490a1c4941de420689b622f8a2486f5398806fb24f57b9fab901b4cbc8fdb8853f568264b3a182a + checksum: 87ccdcfa5cdedaa3a1aac30d656969f4f5910b62bcaacdf80a514dbf0cbbd8e79b55f8e987eab34cc79ece8ce4b8c19d5caf8b0afb74e0b0d7ab39fb29aa8eba languageName: node linkType: hard @@ -2575,7 +2628,7 @@ __metadata: languageName: node linkType: hard -"abab@npm:^2.0.5, abab@npm:^2.0.6": +"abab@npm:^2.0.6": version: 2.0.6 resolution: "abab@npm:2.0.6" checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e @@ -2775,14 +2828,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.8.0": - version: 8.10.0 - resolution: "ajv@npm:8.10.0" + version: 8.11.0 + resolution: "ajv@npm:8.11.0" dependencies: fast-deep-equal: ^3.1.1 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 uri-js: ^4.2.2 - checksum: 3594728ef1e31219ef97bfacb203d0d72db8ad5c35d6d0578e38ee453e4537c2bf927dad144bb84b0c893f661d71b58337d4643e8ee2f2a6e1d63b041c92fe82 + checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef languageName: node linkType: hard @@ -3247,20 +3300,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-jest@npm:28.1.3" +"babel-jest@npm:^29.0.2": + version: 29.0.2 + resolution: "babel-jest@npm:29.0.2" dependencies: - "@jest/transform": ^28.1.3 + "@jest/transform": ^29.0.2 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^28.1.3 + babel-preset-jest: ^29.0.2 chalk: ^4.0.0 graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: 57ccd2296e1839687b5df2fd138c3d00717e0369e385254b012ccd4ee70e75f5d5c8e6cfcdf92d155015b468cfebb847b38e69bb5805d8aaf730e20575127cc6 + checksum: 33bd0b002237b1d015ee015b16f659660bf80880409b190c0e78132e7cc2a4b3443805ced9c40690d613ba425d18b4f241ffe406ed6878d4394b68e01519ede8 languageName: node linkType: hard @@ -3295,15 +3348,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-plugin-jest-hoist@npm:28.1.3" +"babel-plugin-jest-hoist@npm:^29.0.2": + version: 29.0.2 + resolution: "babel-plugin-jest-hoist@npm:29.0.2" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.1.14 "@types/babel__traverse": ^7.0.6 - checksum: 648d89f9d80f6450ce7e50d0c32eb91b7f26269b47c3e37aaf2e0f2f66a980978345bd6b8c9b8c3aa6a8252ad2bc2c9fb50630e9895622c9a0972af5f70ed20e + checksum: e02ab2c56b471940bc147d75808f6fb5d18b81382088beb36088d2fee8c5f9699b2a814a98884539191d43871d66770928e09c268c095ec39aad5766c3337f34 languageName: node linkType: hard @@ -3807,15 +3860,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-preset-jest@npm:28.1.3" +"babel-preset-jest@npm:^29.0.2": + version: 29.0.2 + resolution: "babel-preset-jest@npm:29.0.2" dependencies: - babel-plugin-jest-hoist: ^28.1.3 + babel-plugin-jest-hoist: ^29.0.2 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 8248a4a5ca4242cc06ad13b10b9183ad2664da8fb0da060c352223dcf286f0ce9c708fa17901dc44ecabec25e6d309e5e5b9830a61dd777c3925f187a345a47d + checksum: 485db525f4cd38c02c29edcd7240dd232e8d6dbcaef88bfa4765ad3057ed733512f1b7aad06f4bf9661afefeb0ada2c4e259d130113b0289d7db574f82bbd4f8 languageName: node linkType: hard @@ -4775,10 +4828,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:3.24.1": - version: 3.24.1 - resolution: "core-js@npm:3.24.1" - checksum: 6fb5bf0fd9e9f3e69d95616dd03332fea6758a715d2628c108b5faf17b48b0f580e90c4febb0a523c4665b0991a810de16289f86187fe79d70cc722dbd3edf0e +"core-js@npm:3.25.1": + version: 3.25.1 + resolution: "core-js@npm:3.25.1" + checksum: bfacb078e790913841e2d5008b9b6705ae56ed23f83c7f0ae08d330d874561012611089d53b71520105234ed0abba36f28d91b391514a16541a8c8d98c464239 languageName: node linkType: hard @@ -4930,7 +4983,7 @@ __metadata: languageName: node linkType: hard -"data-urls@npm:^3.0.1, data-urls@npm:^3.0.2": +"data-urls@npm:^3.0.2": version: 3.0.2 resolution: "data-urls@npm:3.0.2" dependencies: @@ -5122,10 +5175,10 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1019158": - version: 0.0.1019158 - resolution: "devtools-protocol@npm:0.0.1019158" - checksum: 3b40771d231597dea5d502e708ac1ea1225214d4e007e12f7f82fb1966b76d9980665481f8495df444e3632d86b0361e2625502b5ef918884a4ed7fe57518723 +"devtools-protocol@npm:0.0.1036444": + version: 0.0.1036444 + resolution: "devtools-protocol@npm:0.0.1036444" + checksum: 6975c8def95a5e1a4207d6deb05322e335d6a37bdaa3e589cbd5bde40fbbe3ab0df2cfedb1b3ad2785401f208c150fd489a6a065a4624b56e4c0c4c1bfd89172 languageName: node linkType: hard @@ -5136,6 +5189,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^29.0.0": + version: 29.0.0 + resolution: "diff-sequences@npm:29.0.0" + checksum: 2c084a3db03ecde26f649f6f2559974e01e174451debeb301a7e17199e73423a8e8ddeb9a35ae38638c084b4fa51296a4a20fa7f44f3db0c0ba566bdc704ed3d + languageName: node + linkType: hard + "dir-glob@npm:^2.0.0": version: 2.2.2 resolution: "dir-glob@npm:2.2.2" @@ -5671,13 +5731,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.22.0": - version: 8.22.0 - resolution: "eslint@npm:8.22.0" +"eslint@npm:8.23.0": + version: 8.23.0 + resolution: "eslint@npm:8.23.0" dependencies: - "@eslint/eslintrc": ^1.3.0 + "@eslint/eslintrc": ^1.3.1 "@humanwhocodes/config-array": ^0.10.4 "@humanwhocodes/gitignore-to-minimatch": ^1.0.2 + "@humanwhocodes/module-importer": ^1.0.1 ajv: ^6.10.0 chalk: ^4.0.0 cross-spawn: ^7.0.2 @@ -5687,7 +5748,7 @@ __metadata: eslint-scope: ^7.1.1 eslint-utils: ^3.0.0 eslint-visitor-keys: ^3.3.0 - espree: ^9.3.3 + espree: ^9.4.0 esquery: ^1.4.0 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 @@ -5713,32 +5774,20 @@ __metadata: strip-ansi: ^6.0.1 strip-json-comments: ^3.1.0 text-table: ^0.2.0 - v8-compile-cache: ^2.0.3 bin: eslint: bin/eslint.js - checksum: 2d84a7a2207138cdb250759b047fdb05a57fede7f87b7a039d9370edba7f26e23a873a208becfd4b2c9e4b5499029f3fc3b9318da3290e693d25c39084119c80 + checksum: ff6075daa28d817a7ac4508f31bc108a04d9ab5056608c8651b5bf9cfea5d708ca16dea6cdab2c3c0ae99b0bf0e726af8504eaa8e17c8e12e242cb68237ead64 languageName: node linkType: hard -"espree@npm:^9.3.2": - version: 9.3.2 - resolution: "espree@npm:9.3.2" - dependencies: - acorn: ^8.7.1 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.3.0 - checksum: 9a790d6779847051e87f70d720a0f6981899a722419e80c92ab6dee01e1ab83b8ce52d11b4dc96c2c490182efb5a4c138b8b0d569205bfe1cd4629e658e58c30 - languageName: node - linkType: hard - -"espree@npm:^9.3.3": - version: 9.3.3 - resolution: "espree@npm:9.3.3" +"espree@npm:^9.4.0": + version: 9.4.0 + resolution: "espree@npm:9.4.0" dependencies: acorn: ^8.8.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.3.0 - checksum: 33e8a36fc15d082e68672e322e22a53856b564d60aad8f291a667bfc21b2c900c42412d37dd3c7a0f18b9d0d8f8858dabe8776dbd4b4c2f72c5cf4d6afeabf65 + checksum: 2e3020dde67892d2ba3632413b44d0dc31d92c29ce72267d7ec24216a562f0a6494d3696e2fa39a3ec8c0e0088d773947ab2925fbb716801a11eb8dd313ac89c languageName: node linkType: hard @@ -5893,16 +5942,29 @@ __metadata: languageName: node linkType: hard -"expect@npm:^28.0.0, expect@npm:^28.1.3": - version: 28.1.3 - resolution: "expect@npm:28.1.3" +"expect@npm:^29.0.0": + version: 29.0.1 + resolution: "expect@npm:29.0.1" dependencies: - "@jest/expect-utils": ^28.1.3 - jest-get-type: ^28.0.2 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - checksum: 101e0090de300bcafedb7dbfd19223368a2251ce5fe0105bbb6de5720100b89fb6b64290ebfb42febc048324c76d6a4979cdc4b61eb77747857daf7a5de9b03d + "@jest/expect-utils": ^29.0.1 + jest-get-type: ^29.0.0 + jest-matcher-utils: ^29.0.1 + jest-message-util: ^29.0.1 + jest-util: ^29.0.1 + checksum: 103d9ecd00d5caefa0e536cde7abefa767f66d0e9ed8e00cf9e1bc1a14dfcee02080ebb9857974250dc68f3e525a85d81796fc37e405838d4cdb3613d76e48a4 + languageName: node + linkType: hard + +"expect@npm:^29.0.2": + version: 29.0.2 + resolution: "expect@npm:29.0.2" + dependencies: + "@jest/expect-utils": ^29.0.2 + jest-get-type: ^29.0.0 + jest-matcher-utils: ^29.0.2 + jest-message-util: ^29.0.2 + jest-util: ^29.0.2 + checksum: 1e2a3707cd27c3485cb2ed0f1793cfca9efa67ec1e18ca3dc36c5d09e7219ba05e948d3e91bdaa01cc2f8cf1def5711ca0e484ba665e755f9d0aeba4884eab83 languageName: node linkType: hard @@ -6001,7 +6063,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb @@ -7769,57 +7831,57 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-changed-files@npm:28.1.3" +"jest-changed-files@npm:^29.0.0": + version: 29.0.0 + resolution: "jest-changed-files@npm:29.0.0" dependencies: execa: ^5.0.0 p-limit: ^3.1.0 - checksum: c78af14a68b9b19101623ae7fde15a2488f9b3dbe8cca12a05c4a223bc9bfd3bf41ee06830f20fb560c52434435d6153c9cc6cf450b1f7b03e5e7f96a953a6a6 + checksum: 5642ace8cd1e7e4f9e3ee423b97d0b018b00ad85ea7e5864592b4657e8500ef56ec50d2189229b912223046bbf31c9196c8ef2442a917be9726a5911d40db1b2 languageName: node linkType: hard -"jest-circus@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-circus@npm:28.1.3" +"jest-circus@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-circus@npm:29.0.2" dependencies: - "@jest/environment": ^28.1.3 - "@jest/expect": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/environment": ^29.0.2 + "@jest/expect": ^29.0.2 + "@jest/test-result": ^29.0.2 + "@jest/types": ^29.0.2 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^0.7.0 is-generator-fn: ^2.0.0 - jest-each: ^28.1.3 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-runtime: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 + jest-each: ^29.0.2 + jest-matcher-utils: ^29.0.2 + jest-message-util: ^29.0.2 + jest-runtime: ^29.0.2 + jest-snapshot: ^29.0.2 + jest-util: ^29.0.2 p-limit: ^3.1.0 - pretty-format: ^28.1.3 + pretty-format: ^29.0.2 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: b635e60a9c92adaefc3f24def8eba691e7c2fdcf6c9fa640cddf2eb8c8b26ee62eab73ebb88798fd7c52a74c1495a984e39b748429b610426f02e9d3d56e09b2 + checksum: 334a74c067a8d42eb37f059a5279c58a2d10134530e4996c4d87d8bc7849bd1a141f683b6599735eac8fe30bee3ad18f2233881d0bf2363282a9f596c9f9abab languageName: node linkType: hard -"jest-cli@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-cli@npm:28.1.3" +"jest-cli@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-cli@npm:29.0.2" dependencies: - "@jest/core": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/core": ^29.0.2 + "@jest/test-result": ^29.0.2 + "@jest/types": ^29.0.2 chalk: ^4.0.0 exit: ^0.1.2 graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 + jest-config: ^29.0.2 + jest-util: ^29.0.2 + jest-validate: ^29.0.2 prompts: ^2.0.1 yargs: ^17.3.1 peerDependencies: @@ -7829,34 +7891,34 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: fb424576bf38346318daddee3fcc597cd78cb8dda1759d09c529d8ba1a748f2765c17b00671072a838826e59465a810ff8a232bc6ba2395c131bf3504425a363 + checksum: 765ca44584279d5ee6fe053ed39a298f6b48d98732e80657081e8ca086927ad5c6fb3ac15a878a2929e100982f3c1bffaf02e3f5966bf41167822fc3954b64bc languageName: node linkType: hard -"jest-config@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-config@npm:28.1.3" +"jest-config@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-config@npm:29.0.2" dependencies: "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^28.1.3 - "@jest/types": ^28.1.3 - babel-jest: ^28.1.3 + "@jest/test-sequencer": ^29.0.2 + "@jest/types": ^29.0.2 + babel-jest: ^29.0.2 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-circus: ^28.1.3 - jest-environment-node: ^28.1.3 - jest-get-type: ^28.0.2 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-runner: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 + jest-circus: ^29.0.2 + jest-environment-node: ^29.0.2 + jest-get-type: ^29.0.0 + jest-regex-util: ^29.0.0 + jest-resolve: ^29.0.2 + jest-runner: ^29.0.2 + jest-util: ^29.0.2 + jest-validate: ^29.0.2 micromatch: ^4.0.4 parse-json: ^5.2.0 - pretty-format: ^28.1.3 + pretty-format: ^29.0.2 slash: ^3.0.0 strip-json-comments: ^3.1.1 peerDependencies: @@ -7867,7 +7929,7 @@ __metadata: optional: true ts-node: optional: true - checksum: ddabffd3a3a8cb6c2f58f06cdf3535157dbf8c70bcde3e5c3de7bee6a8d617840ffc8cffb0083e38c6814f2a08c225ca19f58898efaf4f351af94679f22ce6bc + checksum: 899a5d2996f9e6b3520dcae49283b85bbddb65dcdf3f08fa97dc8da6b2be410531519e53be825185904eae6960d7055f8082d02485fa1dbb5c3781ebfcfda938 languageName: node linkType: hard @@ -7886,7 +7948,7 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:^28.0.0, jest-diff@npm:^28.1.3": +"jest-diff@npm:^28.1.3": version: 28.1.3 resolution: "jest-diff@npm:28.1.3" dependencies: @@ -7898,41 +7960,65 @@ __metadata: languageName: node linkType: hard -"jest-docblock@npm:^28.1.1": - version: 28.1.1 - resolution: "jest-docblock@npm:28.1.1" +"jest-diff@npm:^29.0.0, jest-diff@npm:^29.0.1": + version: 29.0.1 + resolution: "jest-diff@npm:29.0.1" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.0.0 + jest-get-type: ^29.0.0 + pretty-format: ^29.0.1 + checksum: f6f80ab9af14dee8046342d074ab64b1c0c4eb5d4a5d71aec0c71eba0192be1864fc5c270a33c6163184561b1fe516c0e2ecd3f21b267340cf710bab61441b3d + languageName: node + linkType: hard + +"jest-diff@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-diff@npm:29.0.2" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.0.0 + jest-get-type: ^29.0.0 + pretty-format: ^29.0.2 + checksum: fbf4f4a2502b4a5b46233fbcd77cc664de452d1612ebad670c3a4d1920985b16abdef3ebe7ce692efc3c7da8312f1b7253a4bb9027e98db1fb3c92cd53324aa9 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.0.0": + version: 29.0.0 + resolution: "jest-docblock@npm:29.0.0" dependencies: detect-newline: ^3.0.0 - checksum: 22fca68d988ecb2933bc65f448facdca85fc71b4bd0a188ea09a5ae1b0cc3a049a2a6ec7e7eaa2542c1d5cb5e5145e420a3df4fa280f5070f486c44da1d36151 + checksum: b4f81426cc0dffb05b873d3cc373a1643040be62d72cce4dfed499fbcb57c55ac02c44af7aba5e7753915ff5e85b8d6030456981156eaea20be1cb57d2719904 languageName: node linkType: hard -"jest-each@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-each@npm:28.1.3" +"jest-each@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-each@npm:29.0.2" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.2 chalk: ^4.0.0 - jest-get-type: ^28.0.2 - jest-util: ^28.1.3 - pretty-format: ^28.1.3 - checksum: 5c5b8ccb1484e58b027bea682cfa020a45e5bf5379cc7c23bdec972576c1dc3c3bf03df2b78416cefc1a58859dd33b7cf5fff54c370bc3c0f14a3e509eb87282 + jest-get-type: ^29.0.0 + jest-util: ^29.0.2 + pretty-format: ^29.0.2 + checksum: e64222fd050cbb057a8043c2546615f7ed0da22c59f54da0762e717b72489c686bf0f3be43973d74e50f0245dd4d39dcdb86b3553335fbe70e9684f73f3cf99d languageName: node linkType: hard -"jest-environment-jsdom@npm:28.1.3": - version: 28.1.3 - resolution: "jest-environment-jsdom@npm:28.1.3" +"jest-environment-jsdom@npm:29.0.2": + version: 29.0.2 + resolution: "jest-environment-jsdom@npm:29.0.2" dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/jsdom": ^16.2.4 + "@jest/environment": ^29.0.2 + "@jest/fake-timers": ^29.0.2 + "@jest/types": ^29.0.2 + "@types/jsdom": ^20.0.0 "@types/node": "*" - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - jsdom: ^19.0.0 - checksum: 32758f9b9a1fd04ec3ebaaa608d740a36b960d37d00bd3d4d83fdc4b527afc474c14f04fa860817e1fa22923e2dc3cd2b497db41af6a5d73e91327951612025e + jest-mock: ^29.0.2 + jest-util: ^29.0.2 + jsdom: ^20.0.0 + checksum: c39f64ce0f397feac0f674f4eb8ebe291abdfc6ffc6b480907c471f94a3c7b8e9bdce182494327d4b6eddf1ff1b321bbffa98e5fe8c4fb16298693fb9d853ea1 languageName: node linkType: hard @@ -7950,17 +8036,17 @@ __metadata: languageName: node linkType: hard -"jest-environment-node@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-environment-node@npm:28.1.3" +"jest-environment-node@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-environment-node@npm:29.0.2" dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/environment": ^29.0.2 + "@jest/fake-timers": ^29.0.2 + "@jest/types": ^29.0.2 "@types/node": "*" - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - checksum: 1048fe306a6a8b0880a4c66278ebb57479f29c12cff89aab3aa79ab77a8859cf17ab8aa9919fd21c329a7db90e35581b43664e694ad453d5b04e00f3c6420469 + jest-mock: ^29.0.2 + jest-util: ^29.0.2 + checksum: 7c95aa56b9b24e859e03e0625f55e2b44c99629c7a18762681066c0a837e176405cd9bb81353b32838e2f70f4620259b2cbfb49cda36bdd1276e58e4fb384386 languageName: node linkType: hard @@ -7977,51 +8063,58 @@ __metadata: languageName: node linkType: hard -"jest-extended@npm:3.0.2": - version: 3.0.2 - resolution: "jest-extended@npm:3.0.2" +"jest-extended@npm:3.1.0": + version: 3.1.0 + resolution: "jest-extended@npm:3.1.0" dependencies: - jest-diff: ^28.0.0 - jest-get-type: ^28.0.0 + jest-diff: ^29.0.0 + jest-get-type: ^29.0.0 peerDependencies: jest: ">=27.2.5" - checksum: da726bf2983e0343c70ae4450c1115d1c7cdb6041b3bd9434553fc2e2c625a705401ece0a58df5055d0578bec34d7b1d532e85e5a98773e240beed8f0f712216 + checksum: 1656670f7c58419f2ab1ff177db03b79e974faae88b4bdeaa4188fe962a623d77a78df0f9f06dc8a8a945c6e8d081fa48a8d3cf220434cc2ef7831dfa4ee9413 languageName: node linkType: hard -"jest-get-type@npm:^28.0.0, jest-get-type@npm:^28.0.2": +"jest-get-type@npm:^28.0.2": version: 28.0.2 resolution: "jest-get-type@npm:28.0.2" checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd languageName: node linkType: hard -"jest-haste-map@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-haste-map@npm:28.1.3" +"jest-get-type@npm:^29.0.0": + version: 29.0.0 + resolution: "jest-get-type@npm:29.0.0" + checksum: 9abdd11d69788963a92fb9d813a7b887654ecc8f3a3c8bf83166d33aaf4d57ed380e74ab8ef106f57565dd235446ca6ebc607679f0c516c4633e6d09f0540a2b + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-haste-map@npm:29.0.2" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.2 "@types/graceful-fs": ^4.1.3 "@types/node": "*" anymatch: ^3.0.3 fb-watchman: ^2.0.0 fsevents: ^2.3.2 graceful-fs: ^4.2.9 - jest-regex-util: ^28.0.2 - jest-util: ^28.1.3 - jest-worker: ^28.1.3 + jest-regex-util: ^29.0.0 + jest-util: ^29.0.2 + jest-worker: ^29.0.2 micromatch: ^4.0.4 walker: ^1.0.8 dependenciesMeta: fsevents: optional: true - checksum: d05fdc108645fc2b39fcd4001952cc7a8cb550e93494e98c1e9ab1fc542686f6ac67177c132e564cf94fe8f81503f3f8db8b825b9b713dc8c5748aec63ba4688 + checksum: 57798a6840b08a44b0b4bcc679aa0f65f8498426ecaf68116d9e7bd7973ebf36acccaed4da23a3324f1423f2aa51fab81734bdacb889b2db26daca10b48351a1 languageName: node linkType: hard -"jest-image-snapshot@npm:5.1.0": - version: 5.1.0 - resolution: "jest-image-snapshot@npm:5.1.0" +"jest-image-snapshot@npm:5.2.0": + version: 5.2.0 + resolution: "jest-image-snapshot@npm:5.2.0" dependencies: chalk: ^1.1.3 get-stdin: ^5.0.1 @@ -8034,21 +8127,21 @@ __metadata: ssim.js: ^3.1.1 peerDependencies: jest: ">=20 <=28" - checksum: 2ebdb257af473f89d824a834d2044a5cf7a85d00018e40cdffc528fdb79fa21321b4ce779a115878efcb5652faff1381674e66d25eb03bf02ff50ea97c53296b + checksum: 37c7e03a9969c484c963a5a7293df63ce73f69e3a54b269966b11555793fe7b21ed3de708208b5234809e2e02f8088a242e13848a6634d191fea81fc0d70fb79 languageName: node linkType: hard -"jest-leak-detector@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-leak-detector@npm:28.1.3" +"jest-leak-detector@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-leak-detector@npm:29.0.2" dependencies: - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: 2e976a4880cf9af11f53a19f6a3820e0f90b635a900737a5427fc42e337d5628ba446dcd7c020ecea3806cf92bc0bbf6982ed62a9cd84e5a13d8751aa30fbbb7 + jest-get-type: ^29.0.0 + pretty-format: ^29.0.2 + checksum: bc10d75bc6dccf82f47d1d77bb90875726327aff1b3a9a095f063d84be550cb401a287d58effd363b934ecc3ad8f2e555cad476e5435fef13dc82fee2e1367b6 languageName: node linkType: hard -"jest-matcher-utils@npm:^28.0.0, jest-matcher-utils@npm:^28.1.3": +"jest-matcher-utils@npm:^28.0.0": version: 28.1.3 resolution: "jest-matcher-utils@npm:28.1.3" dependencies: @@ -8060,6 +8153,30 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:^29.0.1": + version: 29.0.1 + resolution: "jest-matcher-utils@npm:29.0.1" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.0.1 + jest-get-type: ^29.0.0 + pretty-format: ^29.0.1 + checksum: 1ad41a91d05703b3396c9a344a4c1afd9155913403289b0d5282e42e67540418f17f802a60bae4e3931eb80a08d42b4e6f1e04835d4d122cc83ccd68fe181524 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-matcher-utils@npm:29.0.2" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.0.2 + jest-get-type: ^29.0.0 + pretty-format: ^29.0.2 + checksum: bc266a28e4d0035ae6e3c8e494056cf8253a128b93447114b7fdb9d311520a999bc83e6f6d445f3b57f67236af99e916dca9acbfb0a93f437b89ec586f711a0d + languageName: node + linkType: hard + "jest-message-util@npm:^27.5.1": version: 27.5.1 resolution: "jest-message-util@npm:27.5.1" @@ -8077,20 +8194,37 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-message-util@npm:28.1.3" +"jest-message-util@npm:^29.0.1": + version: 29.0.1 + resolution: "jest-message-util@npm:29.0.1" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.1 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^28.1.3 + pretty-format: ^29.0.1 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 + checksum: cef700aeb8746d1e55a39ba4d9bfc91d580373cf4afca22ee9499dee7ab0147ea8349ccb0c2b2d89ab5f374a9f67ec0560dc6eeb123a28795fafb6bf0ac5f9a3 + languageName: node + linkType: hard + +"jest-message-util@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-message-util@npm:29.0.2" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.0.2 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.0.2 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: f75215e1a022b3063bbe5757db5c87d3dc0c0cc43a5afcfbb15f137872d51aa98e4238c0c77302ef1e2296701660e338510e644abde2d0e3ae42f62d4bad7abd languageName: node linkType: hard @@ -8104,13 +8238,13 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-mock@npm:28.1.3" +"jest-mock@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-mock@npm:29.0.2" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.2 "@types/node": "*" - checksum: a573bf8e5f12f4c29c661266c31b5c6b69a28d3195b83049983bce025b2b1a0152351567e89e63b102ef817034c2a3aa97eda4e776f3bae2aee54c5765573aa7 + checksum: e4d2fe7e254fbb0dfa4f0b9278a9dba3db3c928bdfaf1c05dcb5afb8cacbb31070df896c643c9215a43bf0837181c5d1fd523af6ed3bf637ef225aaa5e6205a4 languageName: node linkType: hard @@ -8138,127 +8272,128 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-regex-util@npm:28.0.2" - checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add +"jest-regex-util@npm:^29.0.0": + version: 29.0.0 + resolution: "jest-regex-util@npm:29.0.0" + checksum: dce16394c357213008e6f84f2288f77c64bba59b7cb48ea614e85c5aae036a7e46dbfd1f45aa08180b7e7c576102bf4f8f0ff8bc60fb9721fb80874adc3ae0ea languageName: node linkType: hard -"jest-resolve-dependencies@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve-dependencies@npm:28.1.3" +"jest-resolve-dependencies@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-resolve-dependencies@npm:29.0.2" dependencies: - jest-regex-util: ^28.0.2 - jest-snapshot: ^28.1.3 - checksum: 4eea9ec33aefc1c71dc5956391efbcc7be76bda986b366ab3931d99c5f7ed01c9ebd7520e405ea2c76e1bb2c7ce504be6eca2b9831df16564d1e625500f3bfe7 + jest-regex-util: ^29.0.0 + jest-snapshot: ^29.0.2 + checksum: 98107bd4fc651a5ff80531e44aa49f9c5216e5ed46ebb568ffcd2e2f8632d05f4678ce09fbce6ab2a71df3c240f5022d826092ee5840f000946f072c8a83aa3c languageName: node linkType: hard -"jest-resolve@npm:28.1.3, jest-resolve@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve@npm:28.1.3" +"jest-resolve@npm:29.0.2, jest-resolve@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-resolve@npm:29.0.2" dependencies: chalk: ^4.0.0 graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 + jest-haste-map: ^29.0.2 jest-pnp-resolver: ^1.2.2 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 + jest-util: ^29.0.2 + jest-validate: ^29.0.2 resolve: ^1.20.0 resolve.exports: ^1.1.0 slash: ^3.0.0 - checksum: df61a490c93f4f4cf52135e43d6a4fcacb07b0b7d4acc6319e9289529c1d14f2d8e1638e095dbf96f156834802755e38db68caca69dba21a3261ee711d4426b6 + checksum: 857a79b1c4e8d6ddca54f318d2612a8cae528f6749e8e612e7b1e1213482a5abd0b89551c842f5193b3cf06544fc67535a533f07295eb69d6991bf6cf8d58423 languageName: node linkType: hard -"jest-runner@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runner@npm:28.1.3" +"jest-runner@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-runner@npm:29.0.2" dependencies: - "@jest/console": ^28.1.3 - "@jest/environment": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/console": ^29.0.2 + "@jest/environment": ^29.0.2 + "@jest/test-result": ^29.0.2 + "@jest/transform": ^29.0.2 + "@jest/types": ^29.0.2 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.10.2 graceful-fs: ^4.2.9 - jest-docblock: ^28.1.1 - jest-environment-node: ^28.1.3 - jest-haste-map: ^28.1.3 - jest-leak-detector: ^28.1.3 - jest-message-util: ^28.1.3 - jest-resolve: ^28.1.3 - jest-runtime: ^28.1.3 - jest-util: ^28.1.3 - jest-watcher: ^28.1.3 - jest-worker: ^28.1.3 + jest-docblock: ^29.0.0 + jest-environment-node: ^29.0.2 + jest-haste-map: ^29.0.2 + jest-leak-detector: ^29.0.2 + jest-message-util: ^29.0.2 + jest-resolve: ^29.0.2 + jest-runtime: ^29.0.2 + jest-util: ^29.0.2 + jest-watcher: ^29.0.2 + jest-worker: ^29.0.2 p-limit: ^3.1.0 source-map-support: 0.5.13 - checksum: 32405cd970fa6b11e039192dae699fd1bcc6f61f67d50605af81d193f24dd4373b25f5fcc1c571a028ec1b02174e8a4b6d0d608772063fb06f08a5105693533b + checksum: e1a74ef52156b4ce41119db4467df868a4bcba467f2a2fa1e0a8cf63866ccb1e5f49341c7e12bb4f3f6a06d5e0ae0f359649f295cf6b6a19b70e41ee314278d4 languageName: node linkType: hard -"jest-runtime@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runtime@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/globals": ^28.1.3 - "@jest/source-map": ^28.1.2 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 +"jest-runtime@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-runtime@npm:29.0.2" + dependencies: + "@jest/environment": ^29.0.2 + "@jest/fake-timers": ^29.0.2 + "@jest/globals": ^29.0.2 + "@jest/source-map": ^29.0.0 + "@jest/test-result": ^29.0.2 + "@jest/transform": ^29.0.2 + "@jest/types": ^29.0.2 + "@types/node": "*" chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 - execa: ^5.0.0 glob: ^7.1.3 graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-message-util: ^28.1.3 - jest-mock: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 + jest-haste-map: ^29.0.2 + jest-message-util: ^29.0.2 + jest-mock: ^29.0.2 + jest-regex-util: ^29.0.0 + jest-resolve: ^29.0.2 + jest-snapshot: ^29.0.2 + jest-util: ^29.0.2 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: b17c40af858e74dafa4f515ef3711c1e9ef3d4ad7d74534ee0745422534bc04fd166d4eceb62a3aa7dc951505d6f6d2a81d16e90bebb032be409ec0500974a36 + checksum: 0b0a1a23ae2b2ca9e1b4dacd45bc2ae66fb47dd0e5cbea275398e0eb6b892c784546011fad59bd7572998b1b1442cff30bdbe9e02493c1bbc5d6be01cec1c5f8 languageName: node linkType: hard -"jest-snapshot@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-snapshot@npm:28.1.3" +"jest-snapshot@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-snapshot@npm:29.0.2" dependencies: "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/traverse": ^7.7.2 "@babel/types": ^7.3.3 - "@jest/expect-utils": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/expect-utils": ^29.0.2 + "@jest/transform": ^29.0.2 + "@jest/types": ^29.0.2 "@types/babel__traverse": ^7.0.6 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^28.1.3 + expect: ^29.0.2 graceful-fs: ^4.2.9 - jest-diff: ^28.1.3 - jest-get-type: ^28.0.2 - jest-haste-map: ^28.1.3 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 + jest-diff: ^29.0.2 + jest-get-type: ^29.0.0 + jest-haste-map: ^29.0.2 + jest-matcher-utils: ^29.0.2 + jest-message-util: ^29.0.2 + jest-util: ^29.0.2 natural-compare: ^1.4.0 - pretty-format: ^28.1.3 + pretty-format: ^29.0.2 semver: ^7.3.5 - checksum: 2a46a5493f1fb50b0a236a21f25045e7f46a244f9f3ae37ef4fbcd40249d0d68bb20c950ce77439e4e2cac985b05c3061c90b34739bf6069913a1199c8c716e1 + checksum: a5cc84626b36b3cd649c11fac96f81dcc9f1b24b7969418d1a8c7c3ce792a90cc013e6077b38daf807de1f37b2eee8223c390f7c7a34517935896807f3b9529b languageName: node linkType: hard @@ -8290,47 +8425,61 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-util@npm:28.1.3" +"jest-util@npm:^29.0.1": + version: 29.0.1 + resolution: "jest-util@npm:29.0.1" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.1 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 + checksum: 7404658788d9a8f3c69b946cbf7d9a773f1b353474792ab4d63b0e7f44cf07be87999102b49f2396e205a43b1b995a742ccc1d4a23966594c4b8976d0d116935 languageName: node linkType: hard -"jest-validate@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-validate@npm:28.1.3" +"jest-util@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-util@npm:29.0.2" dependencies: - "@jest/types": ^28.1.3 + "@jest/types": ^29.0.2 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: ee7a264ac9968f5c2fc6d79b7b76c8df4b22762e3c45c92a35e66e81b9fb45c341b03e5e18d8c4de4cd19ab7faf70a67ec419e6b57b5dfc61b84e96719649838 + languageName: node + linkType: hard + +"jest-validate@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-validate@npm:29.0.2" + dependencies: + "@jest/types": ^29.0.2 camelcase: ^6.2.0 chalk: ^4.0.0 - jest-get-type: ^28.0.2 + jest-get-type: ^29.0.0 leven: ^3.1.0 - pretty-format: ^28.1.3 - checksum: 95e0513b3803c3372a145cda86edbdb33d9dfeaa18818176f2d581e821548ceac9a179f065b6d4671a941de211354efd67f1fff8789a4fb89962565c85f646db + pretty-format: ^29.0.2 + checksum: 6d33bee7209aa735257e26b2eb887f3fd8fc4c6a072e52e97c3a51d4a90797e657dbe88a4df6de717aae3509e9979398f3b2ab2d7be5b26c30eaaa0dd0783b46 languageName: node linkType: hard -"jest-watcher@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-watcher@npm:28.1.3" +"jest-watcher@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-watcher@npm:29.0.2" dependencies: - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/test-result": ^29.0.2 + "@jest/types": ^29.0.2 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.10.2 - jest-util: ^28.1.3 + jest-util: ^29.0.2 string-length: ^4.0.1 - checksum: 8f6d674a4865e7df251f71544f1b51f06fd36b5a3a61f2ac81aeb81fa2a196be354fba51d0f97911c88f67cd254583b3a22ee124bf2c5b6ee2fadec27356c207 + checksum: 3e2c02e545facffbe8e0b845e8e6d21db893aa9ed706d6ce9673553c86757dbb8aec5cbe37fb2e17599d0165b08f471fe9194d906d4251c1729e5edb4f45af9a languageName: node linkType: hard @@ -8345,25 +8494,25 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-worker@npm:28.1.3" +"jest-worker@npm:^29.0.2": + version: 29.0.2 + resolution: "jest-worker@npm:29.0.2" dependencies: "@types/node": "*" merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: e921c9a1b8f0909da9ea07dbf3592f95b653aef3a8bb0cbcd20fc7f9a795a1304adecac31eecb308992c167e8d7e75c522061fec38a5928ace0f9571c90169ca + checksum: e67fd41a25208235e27af4ad6d4b6d7a3f4eac45e4a27ba60f6c9a5ca85e0367bfcfb54d1425710b11b5a8342cf64ab8745e02a94dca106ff6d20144e9e6e175 languageName: node linkType: hard -"jest@npm:28.1.3": - version: 28.1.3 - resolution: "jest@npm:28.1.3" +"jest@npm:29.0.2": + version: 29.0.2 + resolution: "jest@npm:29.0.2" dependencies: - "@jest/core": ^28.1.3 - "@jest/types": ^28.1.3 + "@jest/core": ^29.0.2 + "@jest/types": ^29.0.2 import-local: ^3.0.2 - jest-cli: ^28.1.3 + jest-cli: ^29.0.2 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -8371,7 +8520,7 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: b9dcb542eb7c16261c281cdc2bf37155dbb3f1205bae0b567f05051db362c85ddd4b765f126591efb88f6d298eb10336d0aa6c7d5373b4d53f918137a9a70182 + checksum: b2af093f34e2e835141ba8ef3e4b3cc03e51eb05b1ed438071500ecfbf2e8681a85ef44cb331087b3f835cc050731a26b03bd40f98f2e8927a50b2e1a5806636 languageName: node linkType: hard @@ -8432,7 +8581,7 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:20.0.0": +"jsdom@npm:20.0.0, jsdom@npm:^20.0.0": version: 20.0.0 resolution: "jsdom@npm:20.0.0" dependencies: @@ -8472,46 +8621,6 @@ __metadata: languageName: node linkType: hard -"jsdom@npm:^19.0.0": - version: 19.0.0 - resolution: "jsdom@npm:19.0.0" - dependencies: - abab: ^2.0.5 - acorn: ^8.5.0 - acorn-globals: ^6.0.0 - cssom: ^0.5.0 - cssstyle: ^2.3.0 - data-urls: ^3.0.1 - decimal.js: ^10.3.1 - domexception: ^4.0.0 - escodegen: ^2.0.0 - form-data: ^4.0.0 - html-encoding-sniffer: ^3.0.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-potential-custom-element-name: ^1.0.1 - nwsapi: ^2.2.0 - parse5: 6.0.1 - saxes: ^5.0.1 - symbol-tree: ^3.2.4 - tough-cookie: ^4.0.0 - w3c-hr-time: ^1.0.2 - w3c-xmlserializer: ^3.0.0 - webidl-conversions: ^7.0.0 - whatwg-encoding: ^2.0.0 - whatwg-mimetype: ^3.0.0 - whatwg-url: ^10.0.0 - ws: ^8.2.3 - xml-name-validator: ^4.0.0 - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: 94b693bf4a394097dd96705550bb7b6cd3c8db3c5414e6e9c92a0995ed8b61067597da2f37fca6bed4b5a2f1ef33960ee759522156dccd0b306311988ea87cfb - languageName: node - linkType: hard - "jsesc@npm:^1.3.0": version: 1.3.0 resolution: "jsesc@npm:1.3.0" @@ -9931,13 +10040,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:6.0.1": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd - languageName: node - linkType: hard - "parse5@npm:^7.0.0": version: 7.0.0 resolution: "parse5@npm:7.0.0" @@ -10114,7 +10216,7 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:4.2.0, pkg-dir@npm:^4.2.0": +"pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" dependencies: @@ -10233,6 +10335,28 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.0.1": + version: 29.0.1 + resolution: "pretty-format@npm:29.0.1" + dependencies: + "@jest/schemas": ^29.0.0 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: d31e72769b0bc0453123c52259dba28551cfc3f02b4968fa286c14dcaed08c1e68e45d5383d425f1ac5ab829c908ebe18f9aee4e4df507be5fc82ab51b1e8995 + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.2": + version: 29.0.2 + resolution: "pretty-format@npm:29.0.2" + dependencies: + "@jest/schemas": ^29.0.0 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 02aa8f0e9a91d52d0ca67911b72dc44ae23f41dd50de961f9c86947046f2ced0818c4baccc806f89e78b13e8ee690f5d55a6a8cbdae03f5990c1f5e79ac81048 + languageName: node + linkType: hard + "private@npm:^0.1.6, private@npm:^0.1.8": version: 0.1.8 resolution: "private@npm:0.1.8" @@ -10370,23 +10494,22 @@ __metadata: languageName: node linkType: hard -"puppeteer@npm:16.1.0": - version: 16.1.0 - resolution: "puppeteer@npm:16.1.0" +"puppeteer@npm:17.1.2": + version: 17.1.2 + resolution: "puppeteer@npm:17.1.2" dependencies: cross-fetch: 3.1.5 debug: 4.3.4 - devtools-protocol: 0.0.1019158 + devtools-protocol: 0.0.1036444 extract-zip: 2.0.1 https-proxy-agent: 5.0.1 - pkg-dir: 4.2.0 progress: 2.0.3 proxy-from-env: 1.1.0 rimraf: 3.0.2 tar-fs: 2.1.1 unbzip2-stream: 1.4.3 ws: 8.8.1 - checksum: fca08c33f1096f15b7461326f28725f463e458190844b09dc34f55dee86b6455f0078497c861cdf0af8931797c1f60a64389f531ca9c0758ce68427d27736596 + checksum: ed3d51de2bc6587646f9021cceb45b2ca8bb6f9a332825cecfd179d1b33e85764949060b5570a850f58d951668c9b6b7df4db01c31d905afbf627974683a8900 languageName: node linkType: hard @@ -10468,7 +10591,7 @@ __metadata: languageName: node linkType: hard -"raw-loader@npm:^4.0.2": +"raw-loader@npm:4.0.2": version: 4.0.2 resolution: "raw-loader@npm:4.0.2" dependencies: @@ -10696,6 +10819,13 @@ __metadata: languageName: node linkType: hard +"resize-observer-polyfill@npm:1.5.1": + version: 1.5.1 + resolution: "resize-observer-polyfill@npm:1.5.1" + checksum: 57e7f79489867b00ba43c9c051524a5c8f162a61d5547e99333549afc23e15c44fd43f2f318ea0261ea98c0eb3158cca261e6f48d66e1ed1cd1f340a43977094 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -10860,7 +10990,7 @@ resolve@^1.9.0: languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:3.0.2, rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -10940,15 +11070,6 @@ resolve@^1.9.0: languageName: node linkType: hard -"saxes@npm:^5.0.1": - version: 5.0.1 - resolution: "saxes@npm:5.0.1" - dependencies: - xmlchars: ^2.2.0 - checksum: 5636b55cf15f7cf0baa73f2797bf992bdcf75d1b39d82c0aa4608555c774368f6ac321cb641fd5f3d3ceb87805122cd47540da6a7b5960fe0dbdb8f8c263f000 - languageName: node - linkType: hard - "saxes@npm:^6.0.0": version: 6.0.0 resolution: "saxes@npm:6.0.0" @@ -12266,23 +12387,23 @@ resolve@^1.9.0: languageName: node linkType: hard -typescript@4.7.4: - version: 4.7.4 - resolution: "typescript@npm:4.7.4" +typescript@4.8.2: + version: 4.8.2 + resolution: "typescript@npm:4.8.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df + checksum: 7f5b81d0d558c9067f952c7af52ab7f19c2e70a916817929e4a5b256c93990bf3178eccb1ac8a850bc75df35f6781b6f4cb3370ce20d8b1ded92ed462348f628 languageName: node linkType: hard -"typescript@patch:typescript@4.7.4#~builtin": - version: 4.7.4 - resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=32657b" +"typescript@patch:typescript@4.8.2#~builtin": + version: 4.8.2 + resolution: "typescript@patch:typescript@npm%3A4.8.2#~builtin::version=4.8.2&hash=32657b" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 0b078b97f27848c2d10fc0777b7cb4cb85374426620edac25b2fe62459a4344569655e7f1a989d0ce9d5618cdeb958451eb2ee9436e78f7af86a99e800df967b + checksum: fa56d8bd836ac84180c8bb908056308bebe119498e6924ca9946231fb43b0f363f5894eda604be591252693f98106467a48d3b56387b62d4ed8d3f48bd8a3161 languageName: node linkType: hard @@ -12426,13 +12547,6 @@ typescript@4.7.4: languageName: node linkType: hard -"v8-compile-cache@npm:^2.0.3": - version: 2.3.0 - resolution: "v8-compile-cache@npm:2.3.0" - checksum: adb0a271eaa2297f2f4c536acbfee872d0dd26ec2d76f66921aa7fc437319132773483344207bdbeee169225f4739016d8d2dbf0553913a52bb34da6d0334f8e - languageName: node - linkType: hard - "v8-to-istanbul@npm:^9.0.1": version: 9.0.1 resolution: "v8-to-istanbul@npm:9.0.1" @@ -12761,16 +12875,6 @@ typescript@4.7.4: languageName: node linkType: hard -"whatwg-url@npm:^10.0.0": - version: 10.0.0 - resolution: "whatwg-url@npm:10.0.0" - dependencies: - tr46: ^3.0.0 - webidl-conversions: ^7.0.0 - checksum: a21ec309c5cc743fe9414509408bedf65eaf0fb5c17ac66baa08ef12fce16da4dd30ce90abefbd5a716408301c58a73666dabfd5042cf4242992eb98b954f861 - languageName: node - linkType: hard - "whatwg-url@npm:^11.0.0": version: 11.0.0 resolution: "whatwg-url@npm:11.0.0" @@ -12959,7 +13063,7 @@ typescript@4.7.4: languageName: node linkType: hard -"ws@npm:^8.2.3, ws@npm:^8.4.2, ws@npm:^8.8.0": +"ws@npm:^8.4.2, ws@npm:^8.8.0": version: 8.8.0 resolution: "ws@npm:8.8.0" peerDependencies: